android/linux平台动态替换开机动画

问题背景

        公司制作的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交流哦。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值