ARM cortex a 的 LCD显示

来源:互联网 发布:速卖通软件 编辑:程序博客网 时间:2024/05/22 13:10
首先根据原理图找到连接液晶的IO口,第一步就是配置IO口的输入输出。
先标注各个寄存器的地址
#define GPF0CON (*(volatile unsigned long *)0xE0200120)
#define GPF1CON (*(volatile unsigned long *)0xE0200140)
#define GPF2CON (*(volatile unsigned long *)0xE0200160)
#define GPF3CON (*(volatile unsigned long *)0xE0200180)
#define GPD0CON (*(volatile unsigned long *)0xE02000A0)
#define GPD0DAT (*(volatile unsigned long *)0xE02000A4)
#define CLK_SRC1 (*(volatile unsigned long *)0xe0100204)
#define CLK_DIV1 (*(volatile unsigned long *)0xe0100304)
#define DISPLAY_CONTROL (*(volatile unsigned long *)0xe0107008)
#define VIDCON0 (*(volatile unsigned long *)0xF8000000)
#define VIDCON1 (*(volatile unsigned long *)0xF8000004)
#define VIDTCON2 (*(volatile unsigned long *)0xF8000018)
#define WINCON0 (*(volatile unsigned long *)0xF8000020)
#define WINCON2 (*(volatile unsigned long *)0xF8000028)
#define SHADOWCON (*(volatile unsigned long *)0xF8000034)
#define VIDOSD0A (*(volatile unsigned long *)0xF8000040)
#define VIDOSD0B (*(volatile unsigned long *)0xF8000044)
#define VIDOSD0C (*(volatile unsigned long *)0xF8000048)
#define VIDW00ADD0B0 (*(volatile unsigned long *)0xF80000A0)
#define VIDW00ADD1B0 (*(volatile unsigned long *)0xF80000D0)
#define VIDTCON0 (*(volatile unsigned long *)0xF8000010)
#define VIDTCON1 (*(volatile unsigned long *)0xF8000014)


#define LeftTopX     0
#define LeftTopY     0
#define RightBotX   1023
#define RightBotY   599
#define FB_ADDR (0x26000000)
#define ROW (600)
#define COL (1024)
#define HOZVAL (COL-1)
#define LINEVAL (ROW-1)
#define XSIZE COL
#define YSIZE ROW


首先是IO初始化函数,把端口都设置为LCD_VD,也就是LCD数据像素输出模式。
GPF0CON = 0x22222222;
GPF1CON = 0x22222222;
GPF2CON = 0x22222222;
GPF3CON = 0x22222222;
然后打开背光。VLED+接的是VDD_5V,VLED-接的是PWM_OUT0,我们直接让这个引脚为低电平就可以了。
GPD0CON &= ~(0xf<<0);
GPD0CON |= (1<<0);   //设置为输出模式
GPD0DAT &= ~(1<<0);  //输出低电平
然后接下来是设置播放路径,选择FIMD模式
这个寄存器只有两位有用,FIMD 的主要功能就是获取显示数据,并将数据输出到显示屏。
DISPLAY_CONTROL = 2<<0;
在VIDCON0寄存器里面,bit[26~28]设置使用RGB接口,bit[18]:RGB 并行,
bit[2]:选择时钟源为HCLK_DSYS=166MHz
VIDCON0 &= ~( (3<<26)|(1<<18)|(1<<2) );
bit[1]:使能lcd控制器,bit[0]:当前帧结束后使能lcd控制器
VIDCON0 |= ( (1<<0)|(1<<1) );
bit[4]:选择需要分频,bit[6~13]:分频系数为5,即VCLK = 166M/(4+1) = 33M
VIDCON0 |= 4<<6 | 1<<4;
液晶手册时序图中,VSYNC和HSYNC都是低脉冲,s5pv210数据手册的时序图:VSYNC和HSYNC都是高脉冲有效,所以需要反转
这两个分别为水平同步信号和垂直同步信号。
VIDCON1 |= 1<<5 | 1<<6;
设置时序,VBPD和VFPD分别为垂直同步信号的前后肩,VSPW告诉LCD一帧图像要开始了。
HSPW告诉LCD一行像素要开始了,HBPD和HFPD分别为水平同步信号的前后肩。
VIDTCON0 = VBPD<<16 | VFPD<<8 | VSPW<<0;
VIDTCON1 = HBPD<<16 | HFPD<<8 | HSPW<<0;
设置物理屏幕的长宽
    VIDTCON2 = (LINEVAL << 11) | (HOZVAL << 0);
设置window0,bit[0]:使能,bit[2~5]:24bpp(RGB888),bit[15]这个位是用来设置像素RGB顺序的。
WINCON0 |= 1<<0;
WINCON0 &= ~(0xf << 2); //先清零再填数据
WINCON0 |= (0xB<<2) | (1<<15);
设置显存空间的大小,这里直接和屏幕大小设成一样的就行了。
VIDOSD0A = (LeftTopX<<11) | (LeftTopY << 0);
VIDOSD0B = (RightBotX<<11) | (RightBotY << 0);
VIDOSD0C = (LINEVAL + 1) * (HOZVAL + 1);  //这个寄存器指定窗口的大小
设置fb的地址
VIDW00ADD0B0 = FB_ADDR;       
VIDW00ADD1B0 = (((HOZVAL + 1)*4 + 0) * (LINEVAL + 1)) & (0xffffff);
使能channel 0传输数据,使能window0,让window0覆盖其他的window
SHADOWCON = 0x1;  //这个寄存器VIDOSD0C
这样子初始化工作就完成了。
0 0
原创粉丝点击