很多情况下都需要在UBOOT的阶段就要显示LOGO,直到内核启动完毕后UI接管FrameBuffer为止。这样可以避免内核启动过程的这段时间大约5-8秒内的黑屏。
UBOOT中的LCD驱动比较简单。
[start_armboot@Board.c] -> [devices_init@device.c] -> [drv_video_init@cfb_console.c] -> [video_init]
这部分就是真正我们要修改的地方,video_init 主要作的内容初始化硬件 video_hw_init,然后显示LOGO图片video_logo。
- 初始化LCD video_hw_init的调用代码一般是在driver/video/$CPU_fb.c中。 只要是设定好LCD的各个IO口,并且初始化一个GraphicDevice的设备空间。这部分需要改动的地方是Videomodes.c/.h中的mesa_modes和res_mode_init 参数, 这些参数可以从LCD硬件手册中找到。
- GraphicDevice 需要设定LCD的X/Y/BPP/显存地址及大小等参数。
- 真正进行LCD各IO口初始化的部分为调用 board_video_init(pGD), 这个函数定义在$BoardName/$TARGET.c 中, 初始化PWM,VDn,显存地址大小对齐及其使能等等的各个寄存器,这个部分需要参考具体的LCD手册。
- 硬件初始化完后,我们可以从Nor/Nand或其他某处得到LOGO信息加载到内存处,在video_logo的代码处进行显示 video_display_bitmap
图片显示完毕后,如果后续没有对FB进行处理,则LOGO会一直保持, 这样我们可以在Kernel处进行LCD驱动初始化时无须初始化寄存器和显存,因为UBOOT已经作了这个步骤,我们这样就可以保持LOGO直到UI接管FB为止。