【S3C2440】第16课、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]吗?
答:不知。

猜你喜欢

转载自blog.csdn.net/weixin_39420903/article/details/81326334
今日推荐