1. 程式人生 > >android LVDS螢幕驅動移植

android LVDS螢幕驅動移植

1      概述

平臺:freescale i.MX 6Quad 4核開發板MCIMX6Q-SDB(不帶螢幕)

作業系統:Android 4.2.2_1

核心:3.0.35

顯示屏:LG的LP101WX1-SLN2

顯示屏引數:解析度1280*800,色彩18位,色彩數262K,時鐘頻率69.3M Hz

介面:LVDS0

2      移植步驟

2.1    硬體連線

顯示屏通過LVDS0介面與開發板連線,開發板提供的LVDS0介面如下:


如上圖所示,LVDS0介面共有33Pin,包括:

1)  使能腳CABC_EN0,亮度調節DSP0_CONTRAST

2)  一組I2C Pin6~7

3)  三組資料線Pin8~Pin15,一組時鐘線Pin17~18

4)  電源、地等

顯示屏LP101WX1的硬體介面如下:



如上圖,顯示屏提供的LVDS介面共有40Pin,包括3組資料線,1組時鐘線,PWM腳和LED_EN腳等。它與開發板的連線方式如下:

1)  把LP101WX0的3組時鐘線和1組時鐘線對應連線到開發板的LVDS0介面上:

ORX0-    =>   LVDS0_TX0_N

ORX0+   =>   LVDS0_TX0_P

...

ORXC-   =>   LVDS0_CLK_N

ORXC+ =>   LVDS0_CLK_P

2) 連線電源、地

2     VCC              =>   3.3V

3     VCC      =>   3.3V

10   GND       =>   接地

13  GND       =>  接地

16  GND       =>  接地

19  GND       =>  接地

3) 連線背光

31    GND       =>   接地

35    PWM      =>   3V3(背光亮度脈衝輸出,前期先接3V3,方便除錯)

36    LED_EN =>   3V3(背光使能)

38    VLED     =>   5V

2.2    驅動移植

1、  從freescale官網下載【i.MX 6Software Updates and Releases】->【SABRE Board for Smart Devices】->【Android 4.2Jellybean】->【Source Code for i.MX 6Quad/Dual】軟體包,即android_jb4.2.2_1.0.0-ga_source,然後參考android_jb4.2.2_1.0.0-ga_source\docs\Android_User_Guide.pdf的步驟下載android-4.2.2_r1原始碼,以及kernel(版本為3.0.35)和u-boot(版本為2009.08),並打上補丁android_jb4.2.2_1.0.0-ga_source。

2、  編譯android4.2.2原始碼,lunch選項為【sabresd_6dq-eng】,生成u-boot-6q.bin,boot.img,system.img和recovery.img。

3、  修改drivers/video/mxc/ldb.c的fb_videomode型別的ldb_modedb變數,把LDB-XGA成員改為:

  1. {  
  2.     "LDB-XGA", 60,1280, 800, 14430,  
  3.     80, 48,  
  4.     15, 2,  
  5.     32, 47,  
  6.     0,  
  7.     FB_VMODE_NONINTERLACED,  
  8.     FB_MODE_IS_DETAILED,  
  9. },  

4、  重新編譯核心uImage,並重新生成boot.image,啟動系統,設定u-boot啟動引數為:

  1. setenv bootargs console=ttymxc0,115200 init=/initvideo=mxcfb0:dev=ldb,ldb=sin0video=mxcfb1:off video=mxcfb2:off fbmem=10Mfb0base=0x27b00000 vmalloc=400Mandroidboot.console=ttymxc0androidboot.hardware=freescale

5、  系統啟動後,螢幕可以點亮並輸出影象,但影象效果不好,解析度不對,顯示效果如下:

 

 


但系統輸出hdmi顯示是正常的。

3      除錯步驟

1、  去掉u-boot啟動引數bootargs中的ldb=sin0,預設顯示是sin1,然後把螢幕的資料線接到LVDS1介面上,顯示效果相同。

2、  修改u-boot啟動引數:

video=mxcfb0:dev=ldb,LDB-XGA,if=RGB666,bpp=16video=mxcfb1:off video=mxcfb2

video=mxcfb0:dev=ldb, bpp=16 video=mxcfb1:off video=mxcfb2

顯示效果仍是一樣。

3、  修改u-boot-imx/board/freescale/mx6q_sabresd.c的lvds_xga變數,使之與kernel的ldb.c裡面的fb_videomode相同:

  1. {  
  2.     " XGA", 60,1280, 800, 14430,  
  3.     80, 48,  
  4.     15, 2,  
  5.     32, 47,  
  6.     0,  
  7.     FB_VMODE_NONINTERLACED,  
  8.     FB_MODE_IS_DETAILED,  
  9. },  


編譯,重新生成u-boot-6q.bin,啟動系統後,顯示效果仍是一樣。

4、  改u-boot-imx/board/freescale/mx6q_sabresd.c的lvds_xga變數,使之name成員為LDB-XGA:

  1. {  
  2.     " LDB-XGA",60, 1280, 800, 14430,  
  3.     80, 48,  
  4.     15, 2,  
  5.     32, 47,  
  6.     0,  
  7.     FB_VMODE_NONINTERLACED,  
  8.     FB_MODE_IS_DETAILED,  
  9. },  

編譯,重新生成u-boot-6q.bin,啟動系統後,顯示效果仍是一樣。

5、因螢幕的色彩數是18位的,在bootargs中新增bpp=18,效果未有改進。

3.1    Android 4.0.4除錯

因我之前在sabrelite iMX 6Quad開發板,android 4.0.4除錯過相同的螢幕,顯示效果是正常的,所以懷疑有可能是系統版本的原因,我按以下步驟在sabre-sd開發板,android 4.0.4上驗證顯示效果:

1、     從freescale官網下載imx-android-13.4.1.tar.gz,解壓後按裡面的文件Android_User_Guide.pdf下載android-4.0.4_r1.1原始碼,以及kernel(版本為3.0.35)和u-boot(版本為2009.08),並打上補丁imx-android-13.4.1

2、     修改drivers/video/mxc/ldb.c的fb_videomode型別的ldb_modedb變數,把LDB-XGA成員改為:

  1. {  
  2.     "LDB-XGA", 60,1280, 800, 14430,  
  3.     80, 48,  
  4.     15, 2,  
  5.     32, 47,  
  6.     0,  
  7.     FB_VMODE_NONINTERLACED,  
  8.     FB_MODE_IS_DETAILED,  
  9. },  

3、     按lunch選項【sabresd_6dq-eng】編譯系統,把映象燒錄到sabre-sd開發板上,連線螢幕到lvds1介面,設定u-boot引數為:

  1. setenv bootargs console=ttymxc0,115200 androidboot.console=ttymxc0vmalloc=400M init=/init video=mxcfb0:dev=ldb,LDB-XGA,if=RGB666,bpp=16video=mxcfb1:off video=mxcfb2:off fbmem=10Mfb0base=0x27b00000

然後啟動系統。

4、     啟動系統後,螢幕顯示效果比android 4.2的較好,螢幕解析度也是對的,顯示效果如下:

 

3.2    解決方法

經過艱苦的除錯,終於發現在bootargs中新增bpp=32即可解決問題,完整的bootargs如下:

  1. console=ttymxc0,115200 init=/init video=mxcfb0:dev=ldb,bpp=32 ldb=sin0 video=mxcfb1:off video=mxcfb2:off fbmem=64M vmalloc=400M androiconsole=ttymxc0,115200 init=/init video=mxcfb0:dev=ldb,bpp=32 ldb=sin0 video=mxcfb1:off video=mxcfb2:off fbmem=64M vmalloc=400M androidboot.console=ttymxc0 androidboot.hardware=freescale fb0base=0x27b00000dboot.console=ttymxc0 androidboot.hardware=freescale fb0base=0x27b00000  

啟動系統後,解析度、色彩都顯示正常。

但仍有疑問,bpp表示畫素位數,我的螢幕的bpp是18,用的是3組資料線,為什麼是32位呢?