1). 簡介
在之前的文章中,我們已經(jīng)介紹了如何在 Linux中添加開機(jī)圖片,實(shí)現(xiàn)定制化的開機(jī) Logo 顯示?;蛟S你也已經(jīng)注意到了,在設(shè)備剛上電啟動(dòng)的時(shí)候,LCD顯示屏出現(xiàn)下面幾種現(xiàn)象,花屏、黑屏或者顯示內(nèi)容不全等。這是因?yàn)?,在基?Linux 的設(shè)備上電啟動(dòng)時(shí),其實(shí)經(jīng)歷了Bootloader → U-Boot→ Linux→ Root FS→ User App 這一系列的過程。LCD 如果需要正常顯示,其對(duì)應(yīng)的顯示控制器必須得到正確的配置。Linux 啟動(dòng)會(huì)加載顯示驅(qū)動(dòng),配置正確的顯示參數(shù)。而在 Linux 啟動(dòng)前,一般需要花費(fèi)1到2秒的時(shí)間運(yùn)行 U-Boot,Toradex 默認(rèn)的 U-Boot 在啟動(dòng)后會(huì)等待1秒中再加載 Linux 內(nèi)核,以便用戶進(jìn)入 U-Boot 的命令行模式。在這一段時(shí)間內(nèi),ARM 的顯示控制器可能沒有正確配置,所以出現(xiàn)了上述現(xiàn)象。下面我們將以 Toradex ARM計(jì)算機(jī)模塊Colibri iMX6/iMX7 為例介紹如何在 U-Boot 中配置 RGB LCD 液晶顯示屏,使其上電后即可顯示Logo 圖片。
在 Linux 中,Device Tree 能夠?yàn)轱@示驅(qū)動(dòng)提供正確的顯示參數(shù)。如 Colibri iMX7 計(jì)算機(jī)模塊的其中一個(gè) Device Tree 配置文件 imx7-colibri-eval-v3.dtsi , lcdif 節(jié)點(diǎn)中native-mode 指定了顯示分辨率、時(shí)鐘、時(shí)鐘極性等參數(shù)。目前最新的 Linux BSP 也支持從 cmdline的 vidargs 設(shè)置顯示參數(shù)。而U-Boot 雖然也支持 Device Tree,但是目前的版本中還沒有啟用,更多的是需要通過修改源代碼以及U-Boot環(huán)境參數(shù)來配置顯示輸出。下面針對(duì) Colibri iMX6/iMX7兩個(gè)平臺(tái)進(jìn)行說明。
2). Colibri iMX6
修改 colibri_imx6.c文件,在 struct display_info_t const displays[] 中添加屏幕參數(shù)對(duì)應(yīng)的成員,其中mode.name 不能重復(fù),U-Boot會(huì)根據(jù)該參數(shù)選擇對(duì)應(yīng)的參數(shù)配置。
---------------------------------------
{
.bus= -1,
.addr= 0,
.pixfmt= IPU_PIX_FMT_RGB666,
.enable= enable_rgb,
.mode= {
.name = "wvga-rgb",
.refresh = 60,
.xres = 800,
.yres = 480,
.pixclock = 25000,
.left_margin = 40,
.right_margin = 88,
.upper_margin = 33,
.lower_margin = 10,
.hsync_len = 128,
.vsync_len = 2,
.sync = 0,
.vmode = FB_VMODE_NONINTERLACED
}
---------------------------------------
你完全可以參考代碼中現(xiàn)有的配置,根據(jù)實(shí)際使用屏幕的參數(shù)做調(diào)整。
然后設(shè)置背光和亮度控制,屏幕亮度根據(jù) PWM 的占空比調(diào)節(jié),根據(jù)屏幕手冊(cè),將RGB_BACKLIGHTPWM_GP 調(diào)整為0或者1。U-Boot是一個(gè)相對(duì)精簡的系統(tǒng),為了減少啟動(dòng)時(shí)間,許多不必要的外設(shè)并沒有被初始化,例如 PWM,在U-Boot一般簡單地把PWM輸出高、低電平。
---------------------------------------
gpio_direction_output(RGB_BACKLIGHT_GP, 1);
gpio_direction_output(RGB_BACKLIGHTPWM_GP, 0);
---------------------------------------
完成上述修改后,重新編譯 U-Boot,并用其更新 Colibri iMX6 模塊上的U-Boot文件。重啟后在U-Boot配置下面參數(shù)
---------------------------------------
setenv panel wvga-rgb
saveenv
---------------------------------------
wvga-rgb 即之前在struct display_info_t const displays[] 中添加的成員名字,其對(duì)應(yīng)的分辨率是800*480.
3). Colibri iMX7
由于 iMX7 SoC 沒有 IPU顯示控制器,因此無法像 iMX6 一樣直接在 U-Boot中配置 panel 參數(shù)。 Enhanced LCD Interface (eLCDIF)在iMX7上控制器液晶顯示屏的輸出,因此我們查看lcdif在U-Boot的驅(qū)動(dòng)mxsfb.c。函數(shù)video_hw_init(void)實(shí)現(xiàn)lcdif 的初始化,這里我們看到可以通過‘videomode’將顯示參數(shù)傳給 lcdif驅(qū)動(dòng)。因此,在U-Boot進(jìn)行如下配置
---------------------------------------
setenv videomode‘video=ctfb:x:800,y:480,depth:18,pclk:29851,le:89,ri:164,up:23,lo:10,hs:10,vs:10,sync:0,vmode:0’
saveenv
---------------------------------------
同時(shí)配置背光亮度 PWM的輸出。在colibri_imx7.c中,將 GPIO_PWM_A設(shè)置為0或者1.
---------------------------------------
gpio_direction_output(GPIO_PWM_A, 1);
---------------------------------------
然后重新編譯 U-Boot,并用其更新 Colibri iMX7 模塊上的U-Boot文件。重啟后配置上面videomode參數(shù)。
按照上面的方法,可以實(shí)現(xiàn)在U-Boot中配置LCD輸出,并顯示你需要的圖案,你可以參考這篇文章修改U-Boot啟動(dòng)時(shí)的圖片。
5). 總結(jié)
至此,你已經(jīng)能夠在設(shè)備上電后更早地顯示Logo。但是這個(gè)時(shí)候可能會(huì)遇到更具挑戰(zhàn)的問題,上電后出現(xiàn)很短暫地白屏、花屏或者閃爍。這主要是 LCD液晶屏幕自身上電初始化時(shí)所致。這個(gè)現(xiàn)象在不同的LCD顯示屏上都會(huì)有不同的表現(xiàn),有些則不會(huì)出現(xiàn)。你需要挑選合適的屏幕,或者控制背光延時(shí)點(diǎn)亮,例如用外部的電源管理芯片,合理地控制ARM計(jì)算機(jī)模塊、顯示屏、背光的電壓軌啟動(dòng)順序,確保在ARM計(jì)算機(jī)模塊、顯示屏在初始化之前,背光不會(huì)被點(diǎn)亮,從而避免屏、花屏或者閃爍的出現(xiàn)。
U-Boot是和SoC緊密相關(guān)的系統(tǒng),需要根據(jù)不同的SoC調(diào)整代碼。上面介紹的方法適用于 iMX6/7 SoC模塊,并且使用并口RGB LCD顯示屏。使用其他平臺(tái),如Tegra系列,需要根據(jù)其顯示驅(qū)動(dòng)做調(diào)整。如果采用 LVDS屏幕,同樣需要在U-Boot開啟對(duì)應(yīng) LVDS驅(qū)動(dòng),并設(shè)置顯示參數(shù)。
開機(jī)圖片顯示,特別是開機(jī)立即顯示,這不僅涉及到軟件配置,還和顯示屏、電源管理相關(guān),因此需要從多個(gè)方面進(jìn)行優(yōu)化,從而達(dá)到符合要求的顯示效果。