UBOOT LOGO增加PNG格式的支持
前言
在大多数的项目中, 客户都会有修改开机LOGO的需求, 而且最好是能动态修改.
这里就分享一下在Rockchip平台的UBOOT中, 增加开始LOGO支持PNG格式的一些流程和思路.
流程
一些背景
- 平台是Rockchip的安卓平台, 原则上Linux之类的也通用
- UBOOT版本是uboot-next
- RK的平台, 开机LOGO默认使用的是kernel下的 logo.bmp 和 logo_kernel.bmp, 被编译到 boot.img 中, 再被UBOOT以Resource的方式加载
- UBOOT中加载和显示LOGO的代码主要在
drivers/video/drm/rockchip_display.c中
文件读取方式
首先我们不再使用默认的Resource方式, 改为从外部读取.
一般有两种方式:
- 使用RAW分区
- 使用EXT4/FAT32文件系统分区
RAW分区的方式比较简单, 但分区里不方便存放其它数据, 所以这里选择了使用EXT4的工厂分区方式.
读取EXT分区文件的方式
- 先设置要读取的设备类型和分区:
fs_set_blk_dev("mmc", "0:factory", FS_TYPE_EXT)- 注: 这里的 0:factory 代表第1个mmc设备的factory分区, 这个函数默认不支持按分区名来指定, 需要做一定的修改
- 读取文件内容
ext4_read_file(filename, dst, offset, size, &actread)
PNG解码库
UBOOT只支持C语言, 所以这里选择了 LodePNG (lodev.org) 这个纯C的解码库.
下载后将 lodepng.cpp 改名为 lodepng.c, 另外 logdepng.h 可以按需做一些配置修改, 以让UBOOT能成功编译.
修改显示LOGO的流程
在 rockchip_display.c 的 rockchip_show_logo() 函数中, 可以看到对 load_bmp_logo() 的调用, 只需要修改对应的流程就可以了.
调用 lodepng_decode24() 来对PNG进行解码.
这里需要注意的是, lodepng 解码出来的像素格式是 rgb24, 而 UBOOT 中使用的格式是 bgr24, 需要做一下转换, 不然颜色不正确.
总结
这里对整个流程做了一些思路上的介绍, 具体在实现时还需要仔细查看 UBOOT 和 lodepng 的 API. 欢迎交流讨论.

