RK3568 Android12 的开机logo是打包在img中,导致在烧录之后想要更换开机logo,只能重新编译并烧录固件,这样会比较麻烦。
有一个思路,在已经运行的机器上,在某分区放在一张logo文件,在启动过程中,优先加载分区logo,在分区logo不存在的情况下,再加载默认logo
首先解决两个问题:
1. logo放在哪里?
2. 是如何加载logo的?
问题一: logo放在哪里
system,vendor 等分区是不能放的,一是因为是只读分区,即使是remount了,也无法放新文件。
还得考虑一个,放置的logo,机器在恢复出厂设置后,不应该丢失,因此data分区也是不能放的。
因此决定新建分区来保存这些定制化的内容。具体新建分区的方法可以在CSDN上搜索参考,这里不再赘述。 注:在在挂载参数中加上first_stage_mount
问题二 logo是如何加载的
a. 走读代码发现:logo加载在/u-boot/drivers/video/drm/rockchip_display.c 中的load_bmp_logo方法。
b. 找到logo处理方法只能算解决百分之五十的问题,但现在又有一个新问题:如何定位查找放在自建分区的logo文件。这时需借助bootloader下的ext4ls 命令依次查找,进入bootloader模式,执行命令:ext4ls mmc n:m, 如下图(注意n 表示设备号,m表示分区号-十六进制)

c. 找到logo文件,就可以开始修改代码了,如下:(如果uboot和kernel需要加载不同的图片,可通过bmp_name判断当前加载的是什么阶段的logo而加载分区内对应阶段的图片)
使用ext4load命令将图片加载到对应的内存地址中。
diff --git a/drivers/video/drm/rockchip_display.c b/drivers/video/drm/rockchip_display.c
old mode 100644
new mode 100755
index 51a95f8197..8f4aad0b8d
--- a/drivers/video/drm/rockchip_display.c
+++ b/drivers/video/drm/rockchip_display.c
@@ -35,6 +35,7 @@
#include <dm/of_access.h>
#include <dm/ofnode.h>
#include <asm/io.h>
+#include <command.h>
#define DRIVER_VERSION "v1.0.1"
@@ -1261,6 +1262,7 @@ static int load_kernel_bmp_logo(struct logo_info *logo, const char *bmp_name)
static int load_bmp_logo(struct logo_info *logo, const char *bmp_name)
{
+#define BUFFER_SIZE 128
#ifdef CONFIG_ROCKCHIP_RESOURCE_IMAGE
struct rockchip_logo_cache *logo_cache;
struct bmp_header *header;
@@ -1269,6 +1271,7 @@ static int load_bmp_logo(struct logo_info *logo, const char *bmp_name)
int ret = 0;
int reserved = 0;
int dst_size;
+ char cmd[BUFFER_SIZE] = {"0"};
if (!logo || !bmp_name)
return -EINVAL;
@@ -1285,10 +1288,15 @@ static int load_bmp_logo(struct logo_info *logo, const char *bmp_name)
if (!header)
return -ENOMEM;
- len = rockchip_read_resource_file(header, bmp_name, 0, RK_BLK_SIZE);
- if (len != RK_BLK_SIZE) {
- ret = -EINVAL;
- goto free_header;
+ //load logo from customizer partition firstly,
+ //if not found, read from resource
+ sprintf(cmd, "ext4load mmc 0:c 0x%p logo.bmp %x", header, RK_BLK_SIZE);
+ if(run_command(cmd, 0)){
+ len = rockchip_read_resource_file(header, bmp_name, 0, RK_BLK_SIZE);
+ if (len != RK_BLK_SIZE) {
+ ret = -EINVAL;
+ goto free_header;
+ }
}
logo->bpp = get_unaligned_le16(&header->bit_count);
@@ -1312,13 +1320,18 @@ static int load_bmp_logo(struct logo_info *logo, const char *bmp_name)
dst = pdst;
}
- len = rockchip_read_resource_file(pdst, bmp_name, 0, size);
- if (len != size) {
- printf("failed to load bmp %s\n", bmp_name);
- ret = -ENOENT;
- goto free_header;
+ memset(cmd, 0, BUFFER_SIZE);
+ sprintf(cmd, "ext4load mmc 0:c 0x%p logo.bmp %x", pdst, size);
+ if(run_command(cmd, 0)){
+ len = rockchip_read_resource_file(pdst, bmp_name, 0, size);
+ if (len != size) {
+ printf("failed to load bmp %s\n", bmp_name);
+ ret = -ENOENT;
+ goto free_header;
+ }
}
+
if (!can_direct_logo(logo->bpp)) {
/*
* TODO: force use 16bpp if bpp less than 16;