一、LCD液晶屏
由玻璃板夹液晶盒,外加偏光片,滤光片等组成。液晶本是不会发光的,所以还要加一个背光灯,通过层层材料处理最后得到图像。
RGB888液晶屏,每个像素点是三个小灯,红绿蓝三原色可以组合很多颜色。其像素格式是8bit,那么三个灯就是24bit。2^24=1677w种颜色。现在还有10bit的HDR10的屏幕。
二、eLCDIF
时钟信号,RGB信号线,水平同步信号,垂直同步信号,数据线。
VSYNC是垂直同步信号,当HSYNC信号出现时表示一帧像素点信号传输结束。
HSYNC是水平同步信号,当出现HSYNC信号时表示一行的像素点传输开始。
查询LCD的手册看时序图了解LCD的各个时间参数。
2.显存
显示存储空间,存储一帧的图像空间。
三、寄存器
我们使用DOTCLK接口,也就是VSYNC、HSYNC、ENABLE、DOTCLK接口
1、LCDIF_CTRLn寄存器,操作液晶屏bit0必须要置1,bit1设置数据格式24位全部有效,bit5设置工作在主机模式下,bit9:8设置输入像素格式位24比特位0x3 ,bit11:10设置数据传输宽度为24写0x3,bit13:12设置数据交换设置为0,bit15:14输入数据交换为0,bit17设置为DOTCLK模式下。bi19必须置1在运行,bit30必须置0,bit31必徐置0
2.LCDIF_CTRL1的bit19-16必须设置为0x7。24位的格式。
3.LCDIF_TRASFER_COUNT寄存器:bit15:0是LCD一行的像素数,1024。
4.LCDIF_VDCTRL0n寄存器,根据屏幕设置。bit17:0为vspw参数。bit20设置VSYNC信号的宽度单位。bit21设置VSYNC的周期单位。bit24设置ENABLE信号极性,bit25设置DOTCLK信号极性,bit26设置HSYNC信号极性,bit27设置VSYNC信号极性。bit28设置使能DOTCLK模式。bit29设置VSYNC输出置0。
5.LCDIF_VDCTRL1寄存器:为VSYNC两个下降沿信号之间的长度。
6.LCDIF_VDCTRL2寄存器:bit17:0设置两个HYSNC信号之间的长度,bit31:18设置HSPW信号的宽度。
7.LCDIF_VDCTRL3寄存器:bit15:0是vbp+vspw , bit27:16是hbp+hspw
8:LCDIF_VDCTRL4寄存器:bit17:0是一行有多少个像素点。1024
9.LCDIF_CUR_BUF寄存器:当前缓存显存首地址。
10.LCDIF_NEXT_BUF寄存器:LCD下一帧数据首地址。
四、LCD时钟配置
LCDIF_CLK_ROOT=51.2MHz配置,设置VIDEO_PLL为时钟源。
频率设置公式:PLL output frequency = Fref * (DIV_SELECT + NUM/DENOM),根据CCM_ANALOG_PLL_VIDEO寄存器设置。6:0bit 设置DIV_SELECT (27~54)。PLL_VIDEOn寄存器bit20:19,为2表示1分频。CCM_ANALOG_MISC2寄存器的31:30位。CCM_ANALOG_PLL_VIDEO_NUM分子寄存器不设置,设置为0。接下来直接看时钟树图,就不在此详细说明了。
CCM_CSCDR2的寄存17:15设置LCDIF1_PRE_CLK_SEL模式0x2。CSCDR2[LCDIF1_PRED]分频bit14:12,CBCMR[LCDIF1_PODF]分频bit25:23设置二级分频,也为1-8分频。CSCDR2[LCDIF1_CLK_SEL]的多路选择器置为0,作为之前配置的那一路时钟源。
五、LCD程序
1.elcdif初始化
初始化配置DATA00-DATA23位。
初始化配置LCD_HSYNC,LCD_VSYNC,LCD_ENABLE,LCD_CLK引脚,包括复用和电气配置(0xb9)。
2.lcd控制器接口
创建lcd接口相关的结构体,写入一些LCD必须的信息。
bsp_lcd.h
/*LCD frame address*/
#define LCD_FRAMEBUF_ADDR = (0x89000000)
#define LCD_BLACK 0x00000000
#define LCD_WHITE 0x00ffffff
/* LCD屏幕信息结构体 */
struct tftlcd_typedef{
unsigned short height; /* 屏幕高度 */
unsigned short width; /* 屏幕宽度 */
unsigned char pixsize; /* 每个像素所占用的字节数 */
unsigned short vspw;
unsigned short vbpd;
unsigned short vfpd;
unsigned short hspw;
unsigned short hbpd;
unsigned short hfpd;
unsigned int framebuffer; /* 屏幕显存起始地址 */
unsigned int forecolor; /* 前景色 */
unsigned int backcolor; /* 背景色 */
};
void Lcd_Init(void);
void LcdGpio_Init(void);
void Lcdif_reset();
void Lcdif_noreset();
void Lcd_Enabel(void);
void Lcd_ClkInit(unsigned char loopDiv ,unsigned char prediv , unsigned char div);
bsp_lcd.c
void Lcd_Init(void)
{
LcdGpio_Init();
Lcdif_reset(); /*Reset*/
delay_ms(10);
Lcdif_noreset(); /*Stop Reset*/
//根据屏幕设置
tftlcd_dev.height = 0;
tftlcd_dev.width = 0;
tftlcd_dev.vspw = 0;
tftlcd_dev.vfpd = 0;
tftlcd_dev.vbpd =