1. 程式人生 > >UBoot開機圖片顯示

UBoot開機圖片顯示

By Toradex胡珊逢

1). 簡介

在之前的文章中,我們已經介紹瞭如何在 Linux中新增開機圖片,實現定製化的開機 Logo 顯示。或許你也已經注意到了,在裝置剛上電啟動的時候,LCD顯示屏出現下面幾種現象,花屏、黑屏或者顯示內容不全等。這是因為在基於 Linux 的裝置上電啟動時其實經歷了Bootloader → U-Boot→ Linux→ Root FS→ User App 這一系列的過程。LCD 如果需要正常顯示,其對應的顯示控制器必須得到正確的配置。Linux 啟動會載入顯示驅動,配置正確的顯示引數。而在 Linux 啟動前一般需要花費12秒的時間執行 U-Boot

Toradex 預設的U-Boot 在啟動後會等待1秒中再載入 Linux 核心以便使用者進入 U-Boot 的命令列模式。在這一段時間內,ARM 的顯示控制器可能沒有正確配置,所以出現了上述現象。下面我們將以 Toradex ARM計算機模組Colibri iMX6/iMX7 為例介紹如何在U-Boot 中配置 RGB LCD 液晶顯示屏,使其上電後即可顯示Logo 圖片。

 Linux 中,Device Tree 能夠為顯示驅動提供正確的顯示引數。如 Colibri iMX7 計算機模組的其中一個Device Tree 配置檔案 lcdif 節點中native-mode 指定了顯示解析度、時鐘、時鐘極性等引數。目前最新的

 Linux BSP 也支援從 cmdline vidargs 設定顯示引數。而U-Boot 雖然也支援 Device Tree,但是目前的版本中還沒有啟用,更多的是需要通過修改原始碼以及U-Boot環境引數來配置顯示輸出。下面針對 Colibri iMX6/iMX7兩個平臺進行說明。

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或者1U-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上控制器液晶顯示屏的輸出,因此我們檢視lcdifU-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驅動,並設定顯示引數。

開機圖片顯示,特別是開機立即顯示,這不僅涉及到軟體配置,還和顯示屏、電源管理相關,因此需要從多個方面進行優化,從而達到符合要求的顯示效果。