RK3568 Android12 动态修改开机Logo

RK3568 Android12 的开机logo是打包在img中,导致在烧录之后想要更换开机logo,只能重新编译并烧录固件,这样会比较麻烦。

有一个思路,在已经运行的机器上,在某分区放在一张logo文件,在启动过程中,优先加载分区logo,在分区logo不存在的情况下,再加载默认logo

首先解决两个问题:

 1. logo放在哪里?

 2. 是如何加载logo的?

问题一: logo放在哪里

  1. system,vendor 等分区是不能放的,一是因为是只读分区,即使是remount了,也无法放新文件。

  1. 还得考虑一个,放置的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表示分区号-十六进制)

RK3568 Android12 动态修改开机Logo_第1张图片

    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 
 #include 
 #include 
+#include 
 
 #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;

    

你可能感兴趣的:(产品,linux,运维,服务器)