UBoot開機圖片顯示
By Toradex胡珊逢
1). 簡介
在之前的文章中,我們已經介紹瞭如何在 Linux中新增開機圖片,實現定製化的開機 Logo 顯示。或許你也已經注意到了,在裝置剛上電啟動的時候,LCD顯示屏出現下面幾種現象,花屏、黑屏或者顯示內容不全等。這是因為,在基於 Linux 的裝置上電啟動時,其實經歷了Bootloader → U-Boot→ Linux→ Root FS→ User App 這一系列的過程。LCD 如果需要正常顯示,其對應的顯示控制器必須得到正確的配置。Linux 啟動會載入顯示驅動,配置正確的顯示引數。而在 Linux 啟動前,一般需要花費1到2秒的時間執行 U-Boot
在 Linux 中,Device Tree 能夠為顯示驅動提供正確的顯示引數。如 Colibri iMX7 計算機模組的其中一個Device Tree 配置檔案, lcdif 節點中native-mode 指定了顯示解析度、時鐘、時鐘極性等引數。目前最新的
2). Colibri iMX6
修改 件,在 struct display_info_t const displays[]中新增螢幕引數對應的成員,其中mode.name 不能重複,U-Boot會根據該引數選擇對應的引數配置。
--------------------------------------- { .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 } |
---------------------------------------
你完全可以參考程式碼中現有的配置,根據實際使用螢幕的引數做調整。
然後設定背光和亮度控制,螢幕亮度根據 PWM 的佔空比調節,根據螢幕手冊,將RGB_BACKLIGHTPWM_GP 調整為0或者1。U-Boot是一個相對精簡的系統,為了減少啟動時間,許多不必要的外設並沒有被初始化,例如 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配置下面引數
---------------------------------------
setenv panel wvga-rgb saveenv |
---------------------------------------
wvga-rgb即之前在struct display_info_t const displays[] 中新增的成員名字,其對應的解析度是800*480.
3). Colibri iMX7
由於 iMX7 SoC 沒有 IPU顯示控制器,因此無法像 iMX6 一樣直接在 U-Boot中配置 panel 引數。 Enhanced LCD Interface (eLCDIF)在iMX7上控制器液晶顯示屏的輸出,因此我們檢視lcdif在U-Boot的驅動。函式video_hw_init(void)實現lcdif的初始化,這裡我們看到可以通過‘videomode’將顯示引數傳給 lcdif驅動。因此,在U-Boot進行如下配置
---------------------------------------
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 |
---------------------------------------
同時配置背光亮度 PWM的輸出。在中,將 GPIO_PWM_A設定為0或者1.
---------------------------------------
gpio_direction_output(GPIO_PWM_A, 1); |
---------------------------------------
然後重新編譯 U-Boot,並用其更新 Colibri iMX7 模組上的U-Boot檔案。重啟後配置上面videomode引數。
按照上面的方法,可以實現在U-Boot中配置LCD輸出,並顯示你需要的圖案,你可以參考這篇文章修改U-Boot啟動時的圖片。
5). 總結
至此,你已經能夠在裝置上電後更早地顯示Logo。但是這個時候可能會遇到更具挑戰的問題,上電後出現很短暫地白屏、花屏或者閃爍。這主要是 LCD液晶螢幕自身上電初始化時所致。這個現象在不同的LCD顯示屏上都會有不同的表現,有些則不會出現。你需要挑選合適的螢幕,或者控制背光延時點亮,例如用外部的電源管理晶片,合理地控制ARM計算機模組、顯示屏、背光的電壓軌啟動順序,確保在ARM計算機模組、顯示屏在初始化之前,背光不會被點亮,從而避免屏、花屏或者閃爍的出現。
U-Boot是和SoC緊密相關的系統,需要根據不同的SoC調整程式碼。上面介紹的方法適用於 iMX6/7 SoC模組,並且使用並口RGB LCD顯示屏。使用其他平臺,如Tegra系列,需要根據其顯示驅動做調整。如果採用 LVDS螢幕,同樣需要在U-Boot開啟對應 LVDS驅動,並設定顯示引數。
開機圖片顯示,特別是開機立即顯示,這不僅涉及到軟體配置,還和顯示屏、電源管理相關,因此需要從多個方面進行優化,從而達到符合要求的顯示效果。