liu11yang11 发表于 2014-2-14 09:50:20

CT U-boot驱动16位并口LCD(320*480)

本帖最后由 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倍!!

最后实现的效果已经在之前的帖子里贴过图片了
再引用一下吧



liu11yang11 发表于 2014-2-14 09:54:19

本帖最后由 liu11yang11 于 2014-2-14 09:56 编辑

硬件要修改的内容如下图
把这个几个选通电阻都切换过去,要不不是gpio功能
实际制作的也在下面,背光没管理,也没限流,实在没gpio了


内核驱动学学学 发表于 2014-5-27 22:34:18

liu11yang11 发表于 2014-2-14 09:54 static/image/common/back.gif
硬件要修改的内容如下图
把这个几个选通电阻都切换过去,要不不是gpio功能
实际制作的也在下面,背光没管理 ...

楼主,这个选通要怎么搞?是要重新拆下来焊吗?

sunbeyond 发表于 2014-5-30 19:10:03

内核驱动学学学 发表于 2014-5-27 22:34 static/image/common/back.gif
楼主,这个选通要怎么搞?是要重新拆下来焊吗?

楼主调的哪一种型号的屏啊

liu11yang11 发表于 2014-7-7 08:35:02

内核驱动学学学 发表于 2014-5-27 22:34 static/image/common/back.gif
楼主,这个选通要怎么搞?是要重新拆下来焊吗?

是要动烙铁的

zy276574299 发表于 2014-7-27 22:00:24

请问TTL-50p 7寸的屏
怎么接啊能指导一二吗?谢谢!!

liu11yang11 发表于 2014-8-7 14:18:06

zy276574299 发表于 2014-7-27 22:00 static/image/common/back.gif
请问TTL-50p 7寸的屏
怎么接啊能指导一二吗?谢谢!!

要看手册

zy276574299 发表于 2014-8-12 20:41:18

liu11yang11 发表于 2014-8-7 14:18 static/image/common/back.gif
要看手册

针脚定义我有了,都说手册?什么是手册?请高手解释。

liu11yang11 发表于 2014-8-14 14:14:43

官方技术指导手册

cxjnet 发表于 2014-9-18 22:22:04

这个内容不错,需要收藏。
页: [1] 2
查看完整版本: CT U-boot驱动16位并口LCD(320*480)