文章目录
001LCD硬件原理
LCD操作原理
- LCD屏幕上的点称为像素
- 屏幕后面有电子枪【红绿蓝】:一边移动,一边发出颜色
- 每来一个clk,移动一个像素
- R、G、B三组线确定颜色
- 接收到HSYNC(水平同步信号)脉冲,电子枪从最右边跳到最左边。(跳到下一行)
- 接收到VSYNC[垂直同步信号]从最下边跳到最上边。(跳到原点)
LCD时序图
LCD硬件原理图
006 LCD设置
打开LCD4.3芯片手册,根据芯片手册设置
2440_LCD时序图
LCD display config
可以通过调整四边黑框调整屏幕边框
BPP(bit per pixel)
BPP:在FrameBuffer中每个像素占据多少位,
- 硬件上LCD的BPP是确定的
但是可以对LCD进行封装 - 16条线,每个像素占16位数据,16BPP
002 S3C2440_LCD控制器
功能:
- 1.从内存中(FrameBuffer)取出某个像素的数据:
把FrameBuffer的地址告诉LCD控制器,BPP,分辨率
- 2.配合其他信号把数据发送给LCD:
把时序告诉LCD控制器,设置引脚的极性
BLOCK DIAGRAM
16BPP
在这里插入图片描述
调色板[ palette]
- 本质:内存
- 16BPP中,本来用16bit表示1像素,也可用利用调色板,用8位表示;8BPP:伪彩色;16/24BPP:真彩色。
那么当使用像素深度为8pp时候,像素深度和我们的带宽不一致,我们的颜色要用16位表示,如果直接用上肯定不可能,那我们就可以选择用调色板,调色板中存放了256种16bpp的颜色,这时候我们color存放的就不是真实的颜色值了,而是存放的是调色板中256种颜色的索引,成线性关系一一对应,这样我们大大减轻了系统的负担。用16bpp还是8bpp这得取决实际情况,16bpp肯定比8pp清晰,但同时带来的负荷也更加重。
- 过程:FrameBuffer中8bit —> LCD控制器 —> 调色板中取16bit【用8bit作为索引,取出真正的颜色】 —> LCD
003LCD编程_框架与准备
- 目标:
- 讲解后续程序的框架
- 准备一个支持NAND、NOR启动的程序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pMYeoa9H-1580909221579)(en-resource://database/1932:1)]
定义结构体
- 定义引脚极性结构体
typedef struct pins_polarity{
int vclk; /* normal:在下降沿获取 */
int rgb; /* normal:高电平表示1 */
int hsync; /* normal:高脉冲 */
int vsync; /* normal:高脉冲 */
}pins_polarity,*p_pins_polarity;
- 定义时序结构体
typedef struct time_sequence{
/* 垂直方向 */
int tvp;/* vysnc脉冲宽度 */
int tvb;/* 上边黑框,Vertical Back porch */
int tvf;/* 下边黑框,Vertical Front porch */
/* 水平方向 */
int thp;/* hysnc脉冲宽度 */
int thb;/* 左边黑框,Horizontal Back porch */
int thf;/* 右边黑框,Horizontal Front porch */
}time_sequence,*p_time_sequence;
- 定义lcd参数结构体
typedef struct lcd_params{
/* 引脚极性 */
pins_polarity pins_pol;
/* 时序 */
pins_sequence time_seq;
/* 分辨率,bpp */
int xres;
int yres;
int bpp;
/* framebuffer的地址 */
unsigned int fb_base;
}lcd_params,*p_lcd_params;
004LCD_编程_抽象出重要结构体
结构体传参
005LCD_LCD控制器
- S3C2440_controller.c:根据S3C2440数据手册,设置LCD控制器相关寄存器
引脚初始化
void jz2440_lcd_pin_init(void)
{
/* 初始化引脚 : 背光引脚*/
GPBCON &= ~0x3;
GPBCON |= 0x01;
/* 初始化引脚 : LCD专用引脚*/
GPCCON = 0xaaaaaaaa;
GPDCON = 0xaaaaaaaa;
/* PWREN */
GPGCON |= (3<<8);
}
LCDCON1
/* [17 : 8] :clkval,VCLK = HCLK / [(CLKVAL+1) x 2]
* 9 = 100M/ [(CLKVAL+1) x 2] ,clkval = 4.5 = 5
* clkval = 100/vclk/2-1
* [6 : 5]:0b11,TFT lcd
* [4:1]: bpp mode
* [0] : LCD video output and the logic enable/disable.
*/
int clkval = (double)HCLK/plcdparams ->time_seq.vclk/2-1+0.5;
int bppmode = plcdparams->bpp == 8 ? 0xb :\
plcdparams->bpp == 16 ? 0xc:\
0xd; /* 0xd:24bpp */
LCDCON1 = (clkval << 8) | (3<<5) | (bppmode<<1);
LCDCON2
/* [ 31:24 ] :VBPD = tvb - 1
* [ 23:14 ] :lineval = line - 1
* [ 13:6 ] :vfpd = tvf