一、概述
1、 飞思卡尔 imx6的显示屏驱动架构:
2、目标:
因sabrelite开发板本身已提供LVDS接口,目标屏幕是LG的LP101WX1-SLN2,其主要参数为:
分辨率:1280*800
色彩:18位
色彩数:262K
时钟频率:69.3M Hz
二 移植过程
1、首先把屏幕的接口接到sabrelite开发板的lvds接口上。sabrelite开发板提供的lvds接口如下:
如上图所示,lvds共有20个pin,其中有4组数据线,1组时钟线,其他还有背光控制、电源、地等接口。
我们再看LP101WX1的接口:
它共有40个pin口,共有3组数据线,1组时钟线。下面是接线步骤:
1)把LP101WX1的3组数据线和1组时钟线对应接到开发板的lvds接口上:
ORX0- => LVDS0_TX0_N
ORX0+ => LVDS0_TX0_P
...
ORXC- => LVDS0_CLK_N
ORXC+ => LVDS0_CLK_P
2)把LP101WX1的电源、地等接上:
2 VCC=>3.3V
3 VCC=>3.3V
10 GND=>接地
13 GND=>接地
16 GND=>接地
19 GND=>接地
3)把LP101WX1的背光接上:
31 GND=>接地
35 PWM=>3.3V(背光亮度调节)
36 LED_EN=>背光使能脚,接1个10k电阻,接到3.3V电源
38 VLED=>背光电源,接到5V电源
2、修改android的内核源码。
1)找到drivers/video/mxc/ldb.c的fb_videomode数组变量,它定义了屏幕的相关参数,fb_videomode结构体的定义在include/linux/fb.h中:
struct fb_videomode {
const char *name; /* 名字 */
u32 refresh; /* 刷新频率 */
u32 xres; //行像素
u32 yres; //列像素
u32 pixclock; //时钟频率,单位ps,14430
u32 left_margin; // HBPD(horizontal back porch):80
u32 right_margin; // HFPD(horizontal front porth):48
u32 upper_margin; // VBPD(vertical back porch),15
u32 lower_margin; // VFBD(vertical front porch),2
u32 hsync_len; // HSPW(horizontal sync pulse width):32
u32 vsync_len; // VSPW(vertical sync pulse width):47
u32 sync;
u32 vmode;
u32 flag;
};
2)修改drivers/video/mxc/ldb.c的fb_videomode数组变量,使它的参数适应LP101WX1的屏幕参数。
static struct fb_videomode ldb_modedb[] = {
#if 0
{
"LDB-XGA", 60, 1024, 768, 15385,
220, 40,
21, 7,
60, 10,
0,
FB_VMODE_NONINTERLACED,
FB_MODE_IS_DETAILED,},
#endif
//add by tonny@2012-06-04 13:43
{
"LDB-XGA", 60, 1280, 800, 14430,
80, 48,
15, 2,
32, 47,
0,
FB_VMODE_NONINTERLACED,
FB_MODE_IS_DETAILED,},
{
"LDB-1080P60", 60, 1920, 1080, 7692,
100, 40,
30, 3,
10, 2,
0,
FB_VMODE_NONINTERLACED,
FB_MODE_IS_DETAILED,},
};
名称:LDB-XGA
刷新频率:60
分辨率:1280*800
时钟:10^12/69300000 = 14430
sync:0
vmode:FB_VMODE_NONINTERLACED
flag:FB_MODE_IS_DETAILED
3)重新编译kernel,生成boot.img,烧录到sabrelite开发板中。
4)启动开发板,进入u-boot,在u-boot命令行中设置启动参数为:
setenv bootargs console=ttymxc0,115200 androidboot.console=ttymxc0 vmalloc=400M init=/init video=mxcfb0:dev=ldb,LDB-XGA, if=RGB666,bpp=16 video=mxcfb1:off video=mxcfb2:off fbmem=10M
saveenv
其中video = mxcfb0:dev=ldb,LDB-XGA表示选用fb0的ldb驱动
if=RGB666,bpp=16表示16位色彩
设置好后,用printenv查看一下启动参数:
X6Q SABRELITE U-Boot > printenv
bootdelay=3
baudrate=115200
ipaddr=192.168.1.103
serverip=192.168.1.101
netmask=255.255.255.0
loadaddr=0x10800000
rd_loadaddr=0x11000000
netdev=eth0
ethprime=FEC0
bootcmd=booti mmc1
ethact=FEC0
bootargs=console=ttymxc0,115200 androidboot.console=ttymxc0 vmalloc=400M init=/init video=mxcfb0:dev=ldb,LDB-XGA, if=RGB666,bpp=16 video=mxcfb1:off video=mxcfb2:off fbmem=10M
stdin=serial
stdout=serial
stderr=serial
Environment size: 419/8188 bytes
MX6Q SABRELITE U-Boot >
然后用run bootcmd命令启动开发板,随后可以在log中看到android启动的信息,并可以看到屏幕正常显示android系统。