|
本帖最后由 liu11yang11 于 2014-2-14 09:57 编辑
CT的LCD显示没有引出,为了学习linux如何驱动LCD只能用GPIO驱动了
u-boot比较简单,先修改它,kernel的修改在别的板块
修改流程如下:
u-boot中最终实现刷屏的函数是- common/lcd.c
- void lcd_sync(void)
复制代码 原来实现的是写显存,硬件控制器自动把显存数据显示到LCD,我用分配的显存当BUF改成直驱- void lcd_sync(void)
- {
- LCD_Draw_All(lcd_base);
- }
- void LCD_Draw_All(unsigned short * lcdbase)
- {
- LCD_GPIO_CS_LOW;
- LCD_Set_Disp_Area(0,0,480,320);
- LCD_Write_Disp_Data(lcdbase,320*480);
- LCD_GPIO_CS_HIGH;
- }
复制代码 主要实现这个函数就可以,效率不是很高,每次都全屏刷,以后有时间再详细研究效率。
初始化也是很重要的,这个要修改makefile,把原来的屏文件换成自己的,初始化函数入口在- common/lcd.c
- static int lcd_init(void *lcdbase)
- {
- ....
- lcd_ctrl_init(lcdbase);
- ....
- }
复制代码 屏的初始化函数写过驱动的人就都会了,具体初始化参数就不写了,每个屏都不一样
下面说一下硬件接口- /************片选************/
- #define LCD_GPIO_CS "PG0"
- /************写***********/
- #define LCD_GPIO_WR "PG2"
- /************读***********/
- //#define LCD_GPIO_RD "PG1"
- #define LCD_GPIO_RESET "PG1"
- /************命令数据选择***********/
- #define LCD_GPIO_RS "PG3"
- /************数据总线***********/
- #define LCD_GPIO_D0 "PG4"
- #define LCD_GPIO_D1 "PG5"
- #define LCD_GPIO_D2 "PG6"
- #define LCD_GPIO_D3 "PG7"
- #define LCD_GPIO_D4 "PG8"
- #define LCD_GPIO_D5 "PG9"
- #define LCD_GPIO_D6 "PG10"
- #define LCD_GPIO_D7 "PG11"
- #define LCD_GPIO_D8 "PB5"
- #define LCD_GPIO_D9 "PB6"
- #define LCD_GPIO_D10 "PB7"
- #define LCD_GPIO_D11 "PB8"
- #define LCD_GPIO_D12 "PB9"
- #define LCD_GPIO_D13 "PB10"
- #define LCD_GPIO_D14 "PB11"
- #define LCD_GPIO_D15 "PB12"
复制代码 在CT的开发板上要把几个电阻的位置换一下,要不gpio都没接到针脚上,具体的后面补充
最低层的屏驱动接口- #define dat_low_sel 0x00000ff0
- #define dat_low_usel 0xfffff00f
- #define dat_high_sel 0x00001fe0
- #define dat_high_usel 0xffffe01f
- #define dat_low_addr 0x1c208e8
- #define dat_high_addr 0x1c20834
- void LCD_ILI9486_CMD(u32 cmd)
- {
- u32 dat_low_reg=readl(dat_low_addr);
- u32 dat_high_reg=readl(dat_high_addr);
- dat_low_reg &= ~ (dat_rs|dat_wr);
-
- dat_low_reg &= dat_low_usel;
- dat_low_reg |= ((cmd & 0x000000ff)<<4);
- writel(dat_low_reg,dat_low_addr);
-
- dat_low_reg |= (dat_rs|dat_wr);
- writel(dat_low_reg,dat_low_addr);
- }
- void LCD_ILI9486_DATA(u32 data)
- {
- u32 dat_low_reg=readl(dat_low_addr);
- u32 dat_high_reg=readl(dat_high_addr);
- dat_low_reg &= ~ dat_wr;
-
- dat_low_reg &= dat_low_usel;
- dat_low_reg |= ((data & 0x000000ff)<<4);
- writel(dat_low_reg,dat_low_addr);
- dat_high_reg &= dat_high_usel;
- dat_high_reg |= ((data & 0x0000ff00)>>3);;
- writel(dat_high_reg,dat_high_addr);
-
- dat_low_reg |= dat_wr;
- writel(dat_low_reg,dat_low_addr);
- }
复制代码 这实际上已经是优化过的接口,直接操作输出数据寄存器(地址是dat_low_addr和dat_high_addr),比官方带的gpio速度至少快10倍!!
最后实现的效果已经在之前的帖子里贴过图片了
再引用一下吧
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|