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成員改為:
- {
- "LDB-XGA", 60,1280, 800, 14430,
- 80, 48,
- 15, 2,
- 32, 47,
- 0,
- FB_VMODE_NONINTERLACED,
- FB_MODE_IS_DETAILED,
- },
4、 重新編譯核心uImage,並重新生成boot.image,啟動系統,設定u-boot啟動引數為:
- 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相同:
- {
- " XGA", 60,1280, 800, 14430,
- 80, 48,
- 15, 2,
- 32, 47,
- 0,
- FB_VMODE_NONINTERLACED,
- FB_MODE_IS_DETAILED,
- },
編譯,重新生成u-boot-6q.bin,啟動系統後,顯示效果仍是一樣。
4、 改u-boot-imx/board/freescale/mx6q_sabresd.c的lvds_xga變數,使之name成員為LDB-XGA:
- {
- " LDB-XGA",60, 1280, 800, 14430,
- 80, 48,
- 15, 2,
- 32, 47,
- 0,
- FB_VMODE_NONINTERLACED,
- FB_MODE_IS_DETAILED,
- },
編譯,重新生成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成員改為:
- {
- "LDB-XGA", 60,1280, 800, 14430,
- 80, 48,
- 15, 2,
- 32, 47,
- 0,
- FB_VMODE_NONINTERLACED,
- FB_MODE_IS_DETAILED,
- },
3、 按lunch選項【sabresd_6dq-eng】編譯系統,把映象燒錄到sabre-sd開發板上,連線螢幕到lvds1介面,設定u-boot引數為:
- 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如下:
- 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位呢?