8,嵌入式Linux之LCD

2019-07-12 16:45发布

Jz2440开发板的LCD的接线方式:
LCD的时序:
LCD的原理图:
2440有关LCD的控制寄存器:








Led代码解析: /* * 初始化用于LCD的引脚 */ void Lcd_Port_Init(void) { GPCUP = 0xffffffff; // 禁止内部上拉 GPCCON = 0xaaaaaaaa; // GPIO管脚用于VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND GPDUP = 0xffffffff; // 禁止内部上拉 GPDCON = 0xaaaaaaaa; // GPIO管脚用于VD[23:8] GPBCON &= ~(GPB0_MSK); // Power enable pin GPBCON |= GPB0_out; GPBDAT &= ~(1<<0); // Power off printf("Initializing GPIO ports.......... "); } case MODE_TFT_8BIT_640480: /* * 设置LCD控制器的控制寄存器LCDCON1~5 * 1. LCDCON1: * 设置VCLK的频率:VCLK(Hz) = HCLK/[(CLKVAL+1)x2] * 选择LCD类型: TFT LCD * 设置显示模式: 8BPP * 先禁止LCD信号输出 * 2. LCDCON2/3/4: * 设置控制信号的时间参数 * 设置分辨率,即行数及列数 * 现在,可以根据公式计算出显示器的频率: * 当HCLK=100MHz时, * Frame Rate = 1/[{(VSPW+1)+(VBPD+1)+(LIINEVAL+1)+(VFPD+1)}x * {(HSPW+1)+(HBPD+1)+(HFPD+1)+(HOZVAL+1)}x * {2x(CLKVAL+1)/(HCLK)}] * = 60Hz * 3. LCDCON5: * 设置显示模式为8BPP时,调 {MOD}板中的数据格式: 5:6:5 * 设置HSYNC、VSYNC脉冲的极性(这需要参考具体LCD的接口信号): 反转 * 字节交换使能 */ LCDCON1 = (CLKVAL_TFT_640480<<8) | (LCDTYPE_TFT<<5) | (BPPMODE_8BPP<<1) | (ENVID_DISABLE<<0); LCDCON2 = (VBPD_640480<<24) | (LINEVAL_TFT_640480<<14) | (VFPD_640480<<6) | (VSPW_640480); LCDCON3 = (HBPD_640480<<19) | (HOZVAL_TFT_640480<<8) | (HFPD_640480); LCDCON4 = HSPW_640480; LCDCON5 = (FORMAT8BPP_565<<11) | (HSYNC_INV<<9) | (VSYNC_INV<<8) | (BSWP<<1); LCDSADDR1 = ((LCDFRAMEBUFFER>>22)<<21) | LOWER21BITS(LCDFRAMEBUFFER>>1); LCDSADDR2 = LOWER21BITS((LCDFRAMEBUFFER+ (LINEVAL_TFT_640480+1)*(HOZVAL_TFT_640480+1)*1)>>1); LCDSADDR3 = (0<<11) | (LCD_XSIZE_TFT_640480/2); /* 禁止临时调 {MOD}板寄存器 */ TPAL = 0; fb_base_addr = LCDFRAMEBUFFER; bpp = 8; xsize = 640; ysize = 480; break; case MODE_TFT_16BIT_640480: /* * 设置LCD控制器的控制寄存器LCDCON1~5 * 1. LCDCON1: * 设置VCLK的频率:VCLK(Hz) = HCLK/[(CLKVAL+1)x2] * 选择LCD类型: TFT LCD * 设置显示模式: 16BPP * 先禁止LCD信号输出 * 2. LCDCON2/3/4: * 设置控制信号的时间参数 * 设置分辨率,即行数及列数 * 现在,可以根据公式计算出显示器的频率: * 当HCLK=100MHz时, * Frame Rate = 1/[{(VSPW+1)+(VBPD+1)+(LIINEVAL+1)+(VFPD+1)}x * {(HSPW+1)+(HBPD+1)+(HFPD+1)+(HOZVAL+1)}x * {2x(CLKVAL+1)/(HCLK)}] * = 60Hz * 3. LCDCON5: * 设置显示模式为16BPP时的数据格式: 5:6:5 * 设置HSYNC、VSYNC脉冲的极性(这需要参考具体LCD的接口信号): 反转 * 半字(2字节)交换使能 */ LCDCON1 = (CLKVAL_TFT_640480<<8) | (LCDTYPE_TFT<<5) | (BPPMODE_16BPP<<1) | (ENVID_DISABLE<<0); LCDCON2 = (VBPD_640480<<24) | (LINEVAL_TFT_640480<<14) | (VFPD_640480<<6) | (VSPW_640480); LCDCON3 = (HBPD_640480<<19) | (HOZVAL_TFT_640480<<8) | (HFPD_640480); LCDCON4 = HSPW_640480; LCDCON5 = (FORMAT8BPP_565<<11) | (HSYNC_INV<<9) | (VSYNC_INV<<8) | (HWSWP<<1); /* * 设置LCD控制器的地址寄存器LCDSADDR1~3 * 帧内存与视口(view point)完全吻合, * 图像数据格式如下: * |----PAGEWIDTH----| * y/x 0 1 2 639 * 0 rgb rgb rgb ... rgb * 1 rgb rgb rgb ... rgb * 1. LCDSADDR1: * 设置LCDBANK、LCDBASEU * 2. LCDSADDR2: * 设置LCDBASEL: 帧缓冲区的结束地址A[21:1] * 3. LCDSADDR3: * OFFSIZE等于0,PAGEWIDTH等于(640*2/2) */ LCDSADDR1 = ((LCDFRAMEBUFFER>>22)<<21) | LOWER21BITS(LCDFRAMEBUFFER>>1); LCDSADDR2 = LOWER21BITS((LCDFRAMEBUFFER+ (LINEVAL_TFT_640480+1)*(HOZVAL_TFT_640480+1)*2)>>1); LCDSADDR3 = (0<<11) | (LCD_XSIZE_TFT_640480*2/2); /* 禁止临时调 {MOD}板寄存器 */ TPAL = 0; fb_base_addr = LCDFRAMEBUFFER; bpp = 16; xsize = 640; ysize = 480; break;