问题背景
公司制作的android/linux主板会卖给不同的客户,得根据不同客户定制相应的开机动画。而目前我们的开机动画是绑定在了系统的img文件中,开机后就不能更换。这样就导致每个客户就得维护一个系统版本,大大增加了系统维护工作量。所以就打算开发一个动态更换开机logo的功能,系统烧录完成后,客户可自行更换。
解决方案
一、在emmc中划分一块区域用于存放logo文件
二、系统启动后,挂载文件系统至这片区域中,用户可通过adb push将显示图片导入到这片区域中
三、在uboot显示开机动画时,先去上述区域找logo文件,找到后再读取并显示.找不到则用系统自带的logo显示。
技术细节
这里使用的处理器是RK3588,系统是ubuntu20.04,其他平台在技术细节上可能有些差异。
一、创建分区
修改项目目录下的parameter.txt文件
CMDLINE:mtdparts=rk29xxnand:0x00200000@0x00004000(rom),0x00010000@0x00204000(logo),0x00002000@0x00214000(uboot),0x00002000@0x00216000(misc),0x00080000@0x00218000(boot:bootable),0x00040000@0x00298000(recovery),0x00010000@0x002D8000(backup),0x00C00000@0x002E8000(rootfs),-@0x00EE8000(userdata:grow)
上述的logo就是我新增分区,大小是32MB。
二、挂载分区
1.先在dev/下找到块设备,我这里是mmcblk0p2。(如果不知道自己新增的是哪块分区,则可以用blkid 命令将分区信息打印出来)
2.首次挂载,需先对分区进行格式化:
mkfs.ext4 /dev/mmcblk0p2
3.创建文件夹logo,并将分区挂载到这个文件夹上.
mkdir /logo
mount /dev/mmcblk0p2 /logo
4.使用adb 将logo文件导入logo文件夹中即可
三、修改uboot代码,这里的核心是通过ext4load命令读取文件
1.命令使用方法: ext4load mmc 0:2 logo.bmp 0x80000 [ 从第0个存储设备的第2个分区的根目录读出logo.bmp文件到内存地址0x80000]
2.明白了命令怎么使用,下面的代码应该就能看懂了
代码路径\u-boot\drivers\video\drm\rockchip_display.c
static int load_bmp_logo(struct logo_info *logo, const char *bmp_name)
{
struct rockchip_logo_cache *logo_cache;
struct bmp_header *header;
void *dst = NULL, *pdst;
int size, len;
int ret = 0;
int reserved = 0;
int dst_size;
char cmd[256] = {0};
enum LOGO_SOURCE logo_source;
if (!logo || !bmp_name)
return -EINVAL;
logo_cache = find_or_alloc_logo_cache(bmp_name);
if (!logo_cache)
return -ENOMEM;
if (logo_cache->logo.mem) {
memcpy(logo, &logo_cache->logo, sizeof(*logo));
return 0;
}
header = malloc(RK_BLK_SIZE);
if (!header)
return -ENOMEM;
//将mmc0:2 2号分区对应的就是上述的mmcblk0p2中的logo.bmp文件加载到内存中,地址存于header
sprintf(cmd, "ext4load mmc 0:2 0x%p %s %x",header,bmp_name, RK_BLK_SIZE);
if(run_command(cmd, 0) == 0 ){
printf("ext4load %s succeed! \n",bmp_name);
logo_source = FROM_RESOURCE;
}else
小结
对于其他平台修改思路与本文也类似,若遇到问题可在评论区给我留言或加我VX交流哦。