UBoot开机图片显示

上一篇 / 下一篇  2017-09-26 17:06:16

                                                                                                 By Toradex 胡珊逢

1). 简介

在之前的文章中,我们已经介绍了如何在 Linux中添加开机图片,实现定制化的开机 Logo 显示。或许你也已经注意到了,在设备刚上电启动的时候,LCD显示屏出现下面几种现象,花屏、黑屏或者显示内容不全等。这是因为在基于 Linux 的设备上电启动时其实经历了Bootloader → U-Boot→ Linux→ Root FS→ User App 这一系列的过程。LCD 如果需要正常显示,其对应的显示控制器必须得到正确的配置。Linux 启动会加载显示驱动,配置正确的显示参数。而在 Linux 启动前一般需要花费12秒的时间运行 U-BootToradex默认的  U-Boot 在启动后会等待1秒中再加载 Linux 内核以便用户进入 U-Boot 的命令行模式。在这一段时间内,ARM 的显示控制器可能没有正确配置,所以出现了上述现象。下面我们将以 Toradex Colibri iMX6/iMX7 为例介绍如何在 U-Boot 中配置 RGB LCD 液晶显示屏使其上电后即可显示Logo 图片。

 

 

2). 配置

 Linux DeviceTree 能够为显示驱动提供正确的显示参数。如 Colibri iMX7 计算机模块的其中一个 Device Tree 配置文件imx7-colibri-eval-v3.dtsi lcdif节点中native-mode 指定了显示分辨率、时钟、时钟极性等参数。目前最新的 Linux BSP 也支持从 cmdline vidargs 设置显示参数。而U-Boot 虽然也支持 Device Tree但是目前的版本中还没有启用更多的是需要通过修改源代码以及U-Boot环境参数来配置显示输出。下面针对Colibri iMX6/iMX7两个平台进行说明。

 

a). ColibriiMX6

修改colibri_imx6.c件,在structdisplay_info_tconstdisplays[]  中添加屏幕参数对应的成员,其中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即之前structdisplay_info_tconst displays[] 中添加的成员名字,其对应的分辨率是800*480.

 

b). Colibri iMX7

由于 iMX7 SoC没有 IPU显示控制器,因此无法像 iMX6 一样直接在 U-Boot中配置 panel 参数。 Enhanced LCD Interface (eLCDIF)iMX7上控制器液晶显示屏的输出,因此我们查看lcdifU-Boot的驱动mxsfb.c。函数video_hw_init(void)实现lcdif 的初始化这里我们看到可以通过‘videomode’将显示参数传给 lcdif驱动。因此U-Boot进行如下配置

-----------------------------

setenvvideomode‘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的输出。在colibri_imx7.c中,将 GPIO_PWM_A设置为0或者1.

-----------------------------

gpio_direction_output(GPIO_PWM_A, 1);

-----------------------------

然后重新编译 U-Boot,并用其更新Colibri iMX7模块上的U-Boot文件。重启后配置上面videomode参数。

 

按照上面的方法,可以实现在U-Boot中配置LCD输出,并显示你需要的图案,你可以参考这篇文章修改U-Boot启动时的图片。

 

c). Apalis iMX6

Toradex Apalis系列模块定义了 LVDS,由于不同的SoCApalis系列模块采用不同的方式实现。Tegra 3 由于本身没有 LVDS 功能,因此Apalis T30模块采用了额外的芯片输出。而iMX6 Tegra K1 则原生支持 LVDS,可以直接使用芯片自身的控制器。下面在Apalis iMX6 上以 24bit SPWG LVDS 输出为例进行说明。

 

修改apalis_imx6.c文件,你可能需要根据实际使用的屏幕调整下面像素格式和时序等参数,这些信息一般可以从屏幕的白皮书中获得。

-----------------------------

} }, {

    .bus    = -1,

    .addr    = 0,

    .pixfmt=  IPU_PIX_FMT_RGB24,

//    .detect    = detect_i2c,

   .detect    = detect_default,

    .enable    = enable_lvds,

    .mode    = {

       .name          = "xga-lvds",

       .refresh        =60,

        .xres          = 1024,

        .yres          = 768,

        .pixclock       = 15385,

        .left_margin    = 160,

        .right_margin  = 24,

        .upper_margin  = 29,

        .lower_margin  = 3,

        .hsync_len      = 136,

        .vsync_len      = 6,

       .sync          = FB_SYNC_EXT,

       //.sync          = 0,

        .vmode          =FB_VMODE_NONINTERLACED

} } };

-----------------------------

 

U-Boot进行如下配置,其中 panel的名字和上面 .name 变量一致。

-----------------------------

setenv panelxga-lvds

saveenv

-----------------------------

 

 

3). 总结

至此,你已经能够在设备上电后更早地显示Logo。但是这个时候可能会遇到更具挑战的问题,上电后出现很短暂地白屏、花屏或者闪烁。这主要是 LCD液晶屏幕自身上电初始化时所致。这个现象在不同的LCD显示屏上都会有不同的表现,有些则不会出现。你需要挑选合适的屏幕,或者控制背光延时点亮,例如外部的电源管理芯片,合理地控制ARM计算机模块、显示屏、背光的电压启动顺序,确保在ARM计算机模块、显示屏在初始化之前,背光不会被点亮,从而避免屏、花屏或者闪烁的出现。

 

U-Boot是和SoC紧密相关的系统,需要根据不同的SoC调整代码。上面介绍的方法适用于iMX6/7 SoC模块,并且使用并口RGB LCD显示屏。使用其他平台,如Tegra系列,需要根据其显示驱动做调整。如果采用LVDS屏幕,同样需要在U-Boot开启对应 LVDS驱动,并设置显示参数。

 

开机图片显示,特别是开机立即显示,这不仅涉及到软件配置,还和显示屏、电源管理相关,因此需要从多个方面进行优化,从而达到符合要求的显示效果。


TAG: ARM Arm arm iMX6 imx6 iMX7 imx7 LCD linux Linux LINUX NXP nxp Toradex toradex splash

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2017-10-21  
1234567
891011121314
15161718192021
22232425262728
293031    

数据统计

  • 访问量: 18376
  • 日志数: 64
  • 建立时间: 2016-04-15
  • 更新时间: 2017-09-26

RSS订阅

Open Toolbar