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:56 编辑
硬件要修改的内容如下图
把这个几个选通电阻都切换过去,要不不是gpio功能
实际制作的也在下面,背光没管理,也没限流,实在没gpio了
liu11yang11 发表于 2014-2-14 09:54 static/image/common/back.gif
硬件要修改的内容如下图
把这个几个选通电阻都切换过去,要不不是gpio功能
实际制作的也在下面,背光没管理 ...
楼主,这个选通要怎么搞?是要重新拆下来焊吗?
内核驱动学学学 发表于 2014-5-27 22:34 static/image/common/back.gif
楼主,这个选通要怎么搞?是要重新拆下来焊吗?
楼主调的哪一种型号的屏啊
。
内核驱动学学学 发表于 2014-5-27 22:34 static/image/common/back.gif
楼主,这个选通要怎么搞?是要重新拆下来焊吗?
是要动烙铁的
请问TTL-50p 7寸的屏
怎么接啊能指导一二吗?谢谢!!
zy276574299 发表于 2014-7-27 22:00 static/image/common/back.gif
请问TTL-50p 7寸的屏
怎么接啊能指导一二吗?谢谢!!
要看手册
liu11yang11 发表于 2014-8-7 14:18 static/image/common/back.gif
要看手册
针脚定义我有了,都说手册?什么是手册?请高手解释。
官方技术指导手册
这个内容不错,需要收藏。
页:
[1]
2