【S3C2440】第17課、LCD之學習筆記

LCD課程筆記:
1、需要編程的參數
1)根據外接的LCD數據手冊的值設置2440中LCD控制器時序的參數;
2)設置LCD控制器的寄存器;


面向對象,結構化編程!!!!
在應用編程中,要習慣面向對象編程(Object Oriented Programming),也就是把對象作爲程序的基本單元,
一個對象包含了數據和操作數據的函數,在C語言中常常用結構體(struct)來實現。

1.2綜述
三、軟件驅動實現
本設計軟件包括 ARM 啓動配置模塊、液晶驅動模塊、TVP5150 驅動模塊、視頻數據顯示模塊。其中啓動配置模塊起到 bootloader 功能,
主要完成設置 CPU 時鐘頻率、建立中斷向量表、初始化存儲空間、初始化 MMU 等引導工作。通過啓動配置模塊引導 CPU 進入主程序中。

2、問題:typedef struct lcd_params{}中對於分辨率可以也單獨構建一個結構體嗎?
對於xres = tvd, yres = thd; 爲何不放在時間參數的結構體中?

3、寄存器LCDCON3的爲何沒有水平脈衝寬度thp的設置項?
答:在LCDCON4寄存器的位[7:0]中。

4、lcd控制寄存器,LCDCON1-5, LCDSADDR1-3中,未設置的(除去不需要設置的)寄存器位:
LCDCON5寄存器中:
[12] BPP24BL    ???
[4:0] ???
[4]  INVLEND      :TFT:此位表明 LEND 信號極性???????
[2]  ENLEND      :TFT:LEND 輸出信號使能/禁止???
爲什麼沒有設置?
答:[3]/* LCDCON5[3]:PWREN:STN/TFT:LCD_PWREN 輸出信號使能 */
    LCDCON5 |= (1<<3);
/* 存儲器數據格式: [1]BSWP,[0]HWSWP,[12]BPP24BL */
pixelplace = plcdparams->bpp == 24 ? (0<<0) : \
             plcdparams->bpp == 16 ? (1<<0) : \
             (1<<1);    /* 8bpp */
對於[2][4], 未知?
答:該位,對普通的TFT屏無效,可以不考慮。

4.2 視頻操作
S3C2440A 中的 TFT LCD 控制器支持 1、2、4 或 8bpp(位每像素)調色顯示和 16 或 24 bpp 無調色真彩顯示。

4.2 設置存儲器數據格式(TFT)(BSWP = 0,HWSWP = 0,(BPP24BL = 0, 24bpp時用))的方法總結:
設置LCDCON5的位[12][1][0]:
BPP24BL      [12]    TFT:此位決定 24 bpp 視頻存儲器的順序;
BSWP          [1]        STN/TFT:字節交換控制位;
HWSWP        [0]        STN/TFT:半字節交換控制位;
4.3 設置像素深度 bpp 的方法小結:
用32bpp代替24bpp, 16bpp不變, 數據格式正確否?8bpp需要用調色板轉成16bpp;
a) 24BPP 下 VD  引腳描述
VD 23 22 21 20 19 18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
紅  [23-16];
綠  [15-8];
藍  [7-0];
b) 16BPP 下 VD  引腳描述
(5:6:5)
VD 23 22 21 20 19 18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
紅  [23-19], [18-16]-NC;
綠  [15-10], [9-8]-NC;
藍  [7-3],   [2-0]-NC;
視頻實驗成功程序:

if (bpp == 32)    //用32bpp代替24bpp;
{
    /* 讓LCD整屏輸出某一顏色 */
    /* 0xRRGGBB */
    /* red */
            *p2++ = 0xff0000;

    /* green */
            *p2++ = 0x00ff00;

    /* blue */
            *p2++ = 0x0000ff;
}
if (bpp == 16)
    {
        /* 讓LCD整屏輸出某一顏色 */
        /* 565: 0xf800 */
        /* red */
                *p++ = 0xf800;    //[15-11]=1,其他=0;

        /* green */
                *p++ = 0x7e0;    //[10-5]=1,其他=0;

        /* blue */
                *p++ = 0x1f;    //[4-0]=1,其他=0;
    }


問題:當bpp = 16/32時,實際操作的例程和2440數據手冊的說明有差異,但爲什麼還可以編
譯燒寫且實現實驗目的成功?
答:是不是LCD-2440芯片的連線的原因?查JZ2440原理圖可知,【LCD】——【2440芯片】引腳接線:
RED:    R0-GND, R1-R5對應VD19-23;    VD16-18, 空;
GREEN:    G0-G5對應VD10-VD15;            VD8-9,   空;
BLUE:    B0-GND, B1-B5對應VD3-7;        VD0-2,   空;


4.4 關於幀緩衝器 framebuffer的大小及地址(即 fb_base )的設置的問題
LCDSADDR1  位  描述  初始狀態
LCDBANK  [29:21]  初始狀態:0x00
這些位表明系統存儲器中視頻緩衝器的 bank 位置的 A[30:22]。即使當移動視口時也不能改變
LCDBANK 的值。LCD 幀緩衝器應該在 4MB連續區域內,以保證當移動視口時不會改變 LCDBANK 
的值。因此應該謹慎使用 malloc()函數。

LCDBASEU  [20:0]  初始狀態:0x00
對於雙掃描 LCD:這些位表明遞增地址計數器的開始地址的 A[21:1],它是用於雙掃描 LCD 
的遞增幀存儲器或單掃描 LCD 的幀存儲器。
對於單掃描 LCD:這些位表明 LCD 幀緩衝器的開始地址的 A[21:1]。
說明:經計算 JZ2440 開發板需要的幀緩衝器的大小爲: xres*yres*32bpp/8 = 510Kbyte;
問:這種計算方法合理嗎?還有,對於上面的寄存器說明“LCD 幀緩衝器應該在 4MB連續區域內,
以保證當移動視口時不會改變 LCDBANK 的值。”怎麼理解?=================================================================================
=================================================================================
5、4.3_LCD--s3c2440A芯片的引腳介紹:

5.1 lcd-2440引腳:
-------------------------------------------------------
1)LCD Control:
【2440引腳名】【LCD引腳名】
LEND/GPC0--L1————LEND
VCLK/GPC1--L4————VCLK
VLINE:HSYNC/GPC2--M1————VLINE
VFRAME:VSYNC/GPC3--L7————VFRAME
VM:VDEN/GPC4--M4————VM
LCD_LPCOE/GPC5--M3————USB_EN
LCD_LPCREV/GPC6--M2————LCD_LPCREV
LCD_LPCREVB/GPC7--P1————LCD_LPCREVB
LCD_PWREN/EINT12/GPG4--P11————LCD_PWREN        //LCD電源電路, 當爲高電平時把+5V生成AVDD;
小結:
GPC0-7;
GPG4;
共9個寄存器;
--------------------------------------------------------
2)LCD Data:
【2440引腳名】【LCD引腳名】
VD23/nSS0/GPD15--U5
VD22/nSS1/GPD14--N7
VD21/GPD13/USBRXD1--R6
VD20/GPD12/USBRXDN1--P6
VD19/GPD11/USBRXDP1--T5
VD18/GPD10/LPICLK1--R5
VD17/GPD9/SPIMOSI1--T4
VD16/GPD8/SPIMISO1--M7
VD15/GPD7/USBOEN1--N6
VD14/GPD6/USBTXDP1--P5
VD13/GPD5/USBTXDN1--R4
VD12/GPD4--P4
VD11/GPD3--R3
VD10/GPD2--N5
VD9/GPD1--M5
VD8/GPD0--R2
VD7/GPC15--P3
VD5/GPC13--P2
VD6/GPC14--M6
VD4/GPC12--N3
VD3/GPC11--R1
VD2/GPC10--N4
VD1/GPC9--L6
VD0/GPC8--N2
小結:
GPC8-15;
GPD0-15;
共24個寄存器;
---------------------------------------------
3)Timer引腳
【2440引腳名】【LED 背光驅動電路引腳名】
TOUT0/GPB0——J6——KEYBOARD
小結:
一個引腳;
該引腳控制當此引腳爲高電平時,給LCD提供背光電源(LED+—),LCD纔會工作;
---------------------------------------------
5)ADC引腳
【LCD引腳名】【2440引腳名】
SYM--T16--AIN4/TSYM
TSYP--T17--AIN5/TSYP
TSXM--R16--AIN6/TSXM
TSXP--P16--AIN7/TSXP
---------------------------------------------
4)其他引腳
【2440引腳名】【外電路引腳名】
PWREN————J12————PWREN;
nBATT_FLT————H14————VDD3.3V;
問:此兩引腳是否不用設置?

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5.2 LCD芯片及驅動電路
1)LCD芯片(屏幕)全部引腳(50個,有些爲NC,未用):
Von            //LCD_PWREN引腳設置爲高電平;
Voff        //LCD_PWREN引腳設置爲高電平;
小結1:該區塊通過設置GPG4--P11————LCD_PWREN爲高電平,+5V的VDD就可以生成AVDD;
是否還生成Von, Voff?
------------------------------------------
VM  √
VLINE  √
VD19-23  √
VD10-15  √
VD3-7  √

VFRAME  √
VCLK  √
小結2:該區塊和2440的GPC/D連接,可根據LCD的數據手冊的參數設置這些對應的2440寄存器,
實現2440可以正常和LCD通訊,傳輸數據等功能,使得LCD可以正常工作。
-------------------------------------------
VDD5V
AVDD
VDD3.3V
小結3:該區塊和區塊1的設置是通過同一個引腳LCD_PWREN引腳實現的,正確否?
-------------------------------------------
TSYM        //ADC模塊引腳
TSYP        //ADC模塊引腳
TSXM        //ADC模塊引腳
TSXP        //ADC模塊引腳
小結4:該區塊和2440的ADC連接,具體怎麼設置的呢?
2)LCD電源電路
LCD_PWREN/EINT12/GPG4--P11————LCD_PWREN        
小結:LCD電源電路起作用的前提是該引腳爲高電平,此時可把+5V生成AVDD;
3)LCD背光驅動電路
TOUT0/GPB0——J6——KEYBOARD ==> (LED+,LED-)
LED-        //TOUT0/GPB0當此引腳爲高電平時,給LCD提供背光電源(LED+—),LCD纔會工作;
LED+        //TOUT0/GPB0當此引腳爲高電平時,給LCD提供背光電源(LED+—),LCD纔會工作;
====================================================================================


總結:
√的是直接在LCD控制寄存器中設置的;
1. 根據s3c2440————LCD芯片(屏幕)間的連接,設置GPC/D,還有GPG4(LCD_PWREN電源), 
GPB0(KEYBOARD背光)兩個引腳,就可以設置LCD和2440間進行通信等功能;
打開s3c2440————LCD間的電源、通信引腳等硬件通道;
2. 根據具體LCD的數據參數,設置s3c2440芯片中LCD控制器裏面的寄存器,配置LCD的引腳極性、
分辨率、時序、時鐘、像素格式等等。進一步使2440的各種格式匹配該LCD,使之可以正常工作。
進行2440的數據格式等軟件配置;
即:硬件引腳通道、軟件配置、電源開關;
====================================================================================
**********************************************************************************
**********************************************************************************
====================================================================================

2、複習結構體指針:
typedef struct lcd_params
{...}lcd_params, *p_lcd_params;
其中,p_lcd_params是指向結構體lcd_params{...}; 的指針嗎?
問題1:定義
問題2:賦值, 初始化
1)先定義結構體類型,然後再定義變量並初始化:struct Student {}; struct Student b = {10011, "zhang san", 'A', "123 beijing road"};
2)定義結構體變量的同時初始化:struct Student {}b = {10011, "zhang san", 'A', "123 beijing road"};
3)對某一成員初始化: struct Student b = {.name = "zhang san"};    
//其中, .name 即 b.name, 且其他未被初始化的數值型成員被系統初始化爲0,字符型成員被系統初始化爲'\0',指針型成員被系統初始化爲NULL;
4)同一結構體類型的變量可以相互賦值,例如:
    a.  struct Student stu[], stud; ... stud = stu[1];
    b.  struct Student stu[N], *p = stu;      struct Student max(struct Student stu[]){...return stu[m];}        max(p);
        說明:傳遞地址————實參是指向結構體類型指針變量p, 形參是結構體數組,傳遞的是結構體元素的地址。
        此用指針變量p把主函數中的stu數組的首元素的地址傳遞給形參數組stu, 使形參數組stu與主函數中的stu數組具有相同的地址。
    c.    void print(struct Student stud){...}    print(max(p));
        說明:傳遞結構體變量中的信息————實參是結構體變量(結構體數組元素),形參是結構體變量,傳遞的是結構體變量中各成員的值。
        把stu[m]的值(是結構體元素)傳遞給形參stud, 這時傳遞的不是地址,而是結構體變量中的信息。在print()函數中輸出結構體變量中各成員的值。
        類似於:int a[3], i; i = a[0];
問題3:調用:指針調用,普通調用
小結:結構體變量(甚至結構體變量數組的數組名)的地址主要用作函數參數,傳遞結構體變量的地址(即間接達到傳遞數據的目的);
C程序設計中,將結構體名、共用體名和枚舉名的第一個字母用大寫表示,以表示和系統提供的類型名相區別。
此非規定,而是常用習慣。


節6:
1、爲何取值vclk = 9? 還有公式爲何那樣取?
LCDCON1[17:8] clkval  功能:決定 VCLK 的頻率和 CLKVAL[9:0];
     *             TFT:VCLK = HCLK / [(CLKVAL + 1) × 2] (CLKVAL≥0)
     *             CLKVAL = HCLK/VCLK/2 - 1;向上取整,四捨五入;
int clkval = (double)HCLK/plcdparams->time_seq.vclk/2 - 1 + 0.5;
爲何不取vclk = 10?這樣不就取整更好計算?
答:可以取值vclk = 10; 但至於公式,不知。


2、問題:LCD_4_3_add的作用?
1)lcd_controller.c通過控制s3c2440_lcd_controller.c等, 根據傳入的LCD參數(即lcd_4_3_params結構體等
具體LCD產品的硬件參數設置LCD控制器結構體 xxx_lcd_controller 的內部寄存器組)設置LCD控制器,初始化
s3c2440_lcd_controller等具體LCD控制器; 實現達到LCD可以正常工作的條件並滿足使用需求的目的。
2)lcd.c通過選擇調用lcd_4_3.c,lcd_controller.c等,  註冊lcd_xx.c、lcd_controller.c,選擇lcd_xx.c、
xxx_lcd_controller.c並(根據具體LCD參數)初始化LCD控制器。


3、問:忘記lcd_controller、lcd名字怎麼辦?還怎麼調用?
答:可以給提示選擇列表菜單;

4、LCD、lcd_controller都是先註冊,然後選擇,再之後初始化LCD、lcd_controller;


5、編譯錯誤:

lcd/lcd.c: In function `lcd_menu':
lcd/lcd.c:98: error: request for member `name' in something not a structure or union
lcd/lcd.c:102: error: `p_array_lcd_controller' undeclared (first use in this function)
lcd/lcd.c:102: error: (Each undeclared identifier is reported only once
lcd/lcd.c:102: error: for each function it appears in.)
Makefile:17: recipe for target 'lcd/lcd.o' failed
make: *** [lcd/lcd.o] Error 1


問題代碼:

/*
 * 功能: 打印LCD、LCD控制器菜單,供使用者調用測試所需的LCD、LCD控制器;
 */
void lcd_menu(void)
{
    int i;
    printf("LCD menu:\n\r");
    for(i = 0; p_array_lcd[i]; i++)
    {
        printf("%d:  %s\n\r", i, p_array_lcd->name);    //98行
    }
    
    printf("LCD controller menu:\n\r");
    for(i = 0; p_array_lcd_controller[i]; i++)
    {
        printf("%d:  %s\n\r", i, p_array_lcd_controller->name);
    }
}


原因查找:


節七、簡單測試
1、lcd不顯示的原因查找:
void s3c2440_lcd_controller_init(p_lcd_params plcdparams)
{    ...
    jz2440_lcd_pin_init();        //未添加;
    ...
}
答:LCD-2440引腳未初始化;


2、.LCD頻閃的原因
問題代碼:
    addr>>1;
    addr &= 0x1fffff;    //保留21位;
    LCDSADDR2 = addr;
修改:    
    addr>>=1;
    addr &= 0x1fffff;    //保留21位;
    LCDSADDR2 = addr;
    
3、 關於LCDSADDR2設置的 幀緩衝器的結束地址疑問?
    /* LCDSADDR2  位  描述  初始狀態
     LCDBASEL  [20:0]
     對於單掃描 LCD:這些位表明 LCD 幀緩衝器的結束地址的 A[21:1]。
     LCDBASEL = ((幀結束地址) >> 1) + 1
     = LCDBASEU + (PAGEWIDTH+OFFSIZE) × (LINEVAL+1);
     0x0000
    */
視頻代碼:
  1)addr = plcdparams->fb_base + plcdparams->xres*plcdparams->yres*plcdparams->bpp/8;
    addr >>=1;
    addr &= 0x1fffff;
    LCDSADDR2 = addr;                 //幀緩衝器的結束地址;
代碼問什麼不應該是:
  2)addr = plcdparams->fb_base + plcdparams->xres*plcdparams->yres*plcdparams->bpp/8;
    LCDSADDR2 = (addr>>1) + 1;        //幀緩衝器的結束地址;
或者:(此項,可以不測試,無什麼意義)
  3)addr = plcdparams->fb_base + plcdparams->xres*plcdparams->yres*plcdparams->bpp/8;
    addr >>=1;
    addr &= 0x1fffff;
    LCDSADDR2 = addr + 1;         //幀緩衝器的結束地址;
測試現象及結果?
答:1)正常;   2)快速花屏+紅綠藍屏並且閃屏;    
2)花屏原因查找:    LCDSADDR2 = (addr>>1) + 1;    '+1'是導致花屏的原因,且addr &= 0x1fffff;有沒有都一樣!


4、構建lcd_params結構體時,應根據控制器和LCD雙方的時序表/圖,具體構建需要的結構體成員。

5、編程錯誤:

/* 初始化引腳 */
    /* 背光引腳(LED±): GPB0  GPBCON[0]:01 = 輸出  */
    GPBCON &= ~(3<<0);
    GPBCON |= (1<<0);    //不是GPBCON |= (2<<0);    

6、編譯錯誤:

[email protected]:~/workbook/hardware/LCD/lcd_test_3$ make
cc     lcd/lcd_4.3.c   -o lcd/lcd_4.3
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
/tmp/ccPxbK0I.o: In function `lcd_4_3_add':
lcd_4.3.c:(.text+0xa): undefined reference to `register_lcd'
collect2: error: ld returned 1 exit status
<builtin>: recipe for target 'lcd/lcd_4.3' failed
make: *** [lcd/lcd_4.3] Error 1


查找原因:
objs += lcd/lcd_4.3.o 寫成 objs += lcd/lcd_4.3.
總結:這時最近發現(.text+0x20): undefined reference to `main'之類的錯誤了,歸納都是文件沒有真正編譯;
應仔細檢查 Makefile 文件,查找錯誤!


7、LCD花屏原因
答:(網上資料)建議大家初始化的時候不要使能LCD的數據輸出,不然會花屏。

8、對於不同存儲器數據格式內的數據存儲和轉換的困惑
bpp == 32,/* 0xRRGGBB格式*/  紅綠藍:*p2++ = 0xff0000;  0x00ff00;  0x0000ff;
bpp == 16,    /* 565格式:*/     紅綠藍:*p++  = 0xf800;     0x7e0;        0x1f;
    問題1:幀緩衝器 xxbit 的數據到 VD 引腳組成的數據的轉換過程?
答:bpp == 32,幀緩衝器的每字節數據和VD[23:0]引腳組成的數據的每 bit 貌似是一一對應且相等關係:
    fb_bit[23:0]→VD[23:0]:藍-fb_bit[7:0]→VD[7:0],  綠-fb_bit[15:8]→VD[15:8],  紅-fb_bit[23:16]→VD[23:16]。
但是對於bpp == 16,幀緩衝器的每字節數據和VD[23:0]引腳組成的數據的關係:
    藍-fb_bit[4:0]→VD[7:3],  綠-fb_bit[10:5]→VD[15:10],  紅-fb_bit[15:11]→VD[23:19]。
而且,已知s3c2440芯片的VD引腳的一組數據和LCD屏幕一個像素的數據(即色彩)是一一對應關係,但是,對於幀緩衝器32/16/8bit的數據
和傳送至數據端口VD[23:0]的數據的關係則是未知的,對於其數據的轉換機制,需要了解VIDPRCS寄存器的作用和用法!
16bpp時,將幀緩衝器16bit的數據,轉換成0x565格式數據,通過數據端口VD[23:0]寫入到→LCD驅動器→→
    問題2:數據端口VD[23:0]→LCD驅動器(即Hitachi 3.5" LCD Connector芯片的R0-5, G0-5, B0-5)的轉換過程?
答:對於JZ2440開發板, 2440芯片->LCD驅動器:
紅-VD[23:19]→R[5:1],綠-D[15:10]→G[5:0],藍VD[7:3]→B[5:1]; 另,GND——R[0]/B[0]。以下答案無需深究。
32bpp模式下,紅-VD[23:16]→R[7:0],綠-VD[15:8]→G[7:0],藍VD[7:0]→B[7:0];
16BPP模式下,紅-VD[23:19]→R[7:0],綠-VD[15:10]→G[7:0],藍VD[7:3]→B[7:0]VD引腳NC——VD[18:16][9:8][2:0];
【補:文獻資料】數據的傳輸過程是:
c:LCDCDMA是一個專用的DMA,它能自動地把在偵內存中的視頻數據傳送到LCD驅動器,通過使用這個DMA通道,視頻數據在不需要CPU的干預的情況下顯示在LCD屏上;
d:VIDPRCS接收來自LCDCDMA的數據,將數據轉換爲合適的數據格式,比如說4/8位單掃,4位雙掃顯示模式,然後通過數據端口VD[23:0]傳送視頻數據到LCD驅動器;
即: 幀緩衝器數據→DMA通道→VIDPRCS寄存器(轉換爲合適的數據格式,如4/8位單掃,4位雙掃顯示模式)→數據端口VD[23:0]→
LCD驅動器(即Hitachi 3.5" LCD Connector芯片的R0-5, G0-5, B0-5)

補8:
32/24bpp下,在ram中的幀緩衝器的數據是以4字節爲單位緊密排列的; 每個單位的數據對應VD[23:0];
16bpp下,   在ram中的幀緩衝器的數據是以2字節爲單位緊密排列的; 每個單位的數據(2字節)也對應VD[23:0];
8bpp下,未知;


節八、framebuffer
問題1:case16:的功能
問題2:變量 int color; color=顏色=幀緩衝器的數據?

節十一、調色板
1、設置調色板之前先關閉LCD控制器,在調色板設置函數內先關閉LCD控制器使能,設置完之後再打開LCD控制器使能。
問題:先關後開對LCD控制器的工作有沒有影響?
答:

2、  256  調色板使用 (TFT):8bpp轉16bpp:565RGB

static const unsigned short DEMO256pal[]={
    0x0b5e,0xce9a,0xffd9,0x9d99,0xb63a,0xae7c,0xdd71,0x6c57,0xfd4d,0x00ae,0x9c4d,0xb5f8,0xad96,0x0131,0x0176,0xefff,0xcedd,0x9556,0xe4bf,0x00b6,0x22b7,0x002b,0x89de,0x002c,0x57df,0xab5f,0x3031,0x14bf,0x797e,0x5391,0x93ab,0x7239,0x7453,0xafdf,0x71b9,0x8c92,0x014d,0x302e,0x5175,0x0029,0x0969,0x004e,0x2a6d,0x0021,0x3155,0x4b6e,0xd677,0xf6b6,0x9b5f,0x4bb5,0xffd5,0x0027,0xdfdf,0x74d8,0x1256,0x6bcd,0x9b08,0x2ab2,0xbd72,0x84b5,0xfe52,0xd4ad,0x00ad,0xfffc,0x422b,0x73b0,0x0024,0x5246,0x8e5e,0x28b3,0x0050,0x3b52,0x2a4a,0x3a74,0x8559,0x3356,0x1251,0x9abf,0x4034,0x40b1,
    0x8cb9,0x00b3,0x5c55,0xdf3d,0x61b7,0x1f5f,0x00d9,0x4c59,0x0926,0xac3f,0x925f,0x85bc,0x29d2,0xc73f,0xef5c,0xcb9f,0x827b,0x5279,0x4af5,0x01b9,0x4290,0xf718,0x126d,0x21a6,0x515e,0xefbd,0xd75e,0x42ab,0x00aa,0x10b3,0x7349,0x63b5,0x61a3,0xaadf,0xcb27,0x87df,0x6359,0xc7df,0x4876,0xb5bc,0x4114,0xfe2e,0xef5e,0x65be,0x43b9,0xe5df,0x21c9,0x7d16,0x6abb,0x5c11,0x49f7,0xbc0b,0x9e1a,0x3b0f,0x202b,0xff12,0x821b,0x842f,0xbccf,0xdefb,0x8a3e,0x68fa,0xa4f1,0x38ae,0x28b7,0x21ad,0x31d7,0x0073,0x182b,0x1831,0x3415,0xbdf6,0x2dbf,0x0a5d,0xc73d,0x182c,0x293e,0x7b3d,0x643d,0x3cbd,
    0x92dd,0x09d4,0x1029,0x7cdd,0x6239,0x182e,0x5aea,0x11eb,0x8abc,0x7bfa,0x00a7,0x2153,0x1853,0x1318,0x0109,0x54fa,0x72a7,0x89e3,0x01cf,0x3a07,0x7b17,0x1a14,0x2150,0x23dc,0x4142,0x1b33,0x00a4,0xf6df,0x08fc,0x18ae,0x3a7e,0x18d1,0xa51c,0xff5a,0x1a0f,0x28fa,0xdfbe,0x82de,0x60d7,0x1027,0x48fa,0x5150,0x6213,0x89d6,0x110d,0x9bbb,0xbedd,0x28e1,0x1925,0xf449,0xaa79,0xd5f4,0x693c,0x110a,0x2889,0x08a2,0x923d,0x10a6,0xd9bc,0x5b2e,0x32ec,0xcf7f,0x1025,0x2148,0x74b4,0x6d59,0x9d14,0x0132,0x00f0,0x56bf,0x00f1,0xffff,0x0173,0x0133,0x00b0,0x00b1,0xf7ff,0x08b1,0xfffe,0x08b0,
    0x0171,0xf7bf,0x10f3,0xf7fe,0x08ef,0x1192,0xefbe,0x1131,0x2177,0xff9f,0x1116,0xffbc,0x5914,0x22ef,0xb285,0xa6df,
};

3、32bpp/16bpp時,寫一個值 i 到framebuffer,數字 i 即代表rgb的值;
8bpp時,寫一個值 i 到framebuffer,即自動讀取palette[i]嗎?
答:不知。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章