RK3568 Android12 动态修改开机Logo

文章讲述了在RK3568设备上,由于开机logo包含在固件img中,导致更换logo需要重新编译固件的不便。作者提出创建新分区存放logo,并通过修改驱动代码,利用bootloader的ext4ls和ext4load命令动态加载分区中的logo,从而实现开机logo的动态替换,即使在恢复出厂设置后仍能保持定制的logo不变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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表示分区号-十六进制)

    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;

    

### RK3568 Android 开机启动播放音频实现方法 对于RK3568平台,在Android开机过程中加入音频播放功能可以通过设置特定的配置以及利用已有的工具来完成。一种有效的方法是通过视频Logo的方式来实现在开机期间不仅显示图像还能同步发出声音。 #### 使用视频Logo方式支持音频播放 在RK3568平台上,如果希望在Android系统启动时能够播放自定义的声音文件,则可以选择制作一段带有音轨的视频作为开机Logo[^1]。这种方法允许同时展示视觉效果并提供背景音乐或其他提示声效给用户。具体来说: - 制作包含所需画面与对应音频轨道在内的短视频片段; - 将这个视频文件放置于适当位置,并调整相关参数使得其可以在系统初始化阶段被调用执行。 #### 音频调试及控制 为了确保所选音频能够在不同场景下正常工作(比如连接外部设备),还需要熟悉如何使用`tinyalsa`这类底层音频管理工具来进行必要的测试和优化[^2]。这包括但不限于了解各个子命令的作用范围及其应用场景,例如: - `tinycap`: 用于捕获来自麦克风或者其他输入源的数据流。 - `tinyplay`: 可用来回放存储好的PCM格式样本数据至扬声器或耳机端口。 - `tinymix`: 提供了一个交互式的环境让用户可以直接修改混音器的各项设定值。 这些实用程序可以帮助开发者快速定位潜在问题所在之处,并采取相应措施加以解决。 #### 自动化脚本编写 为了让整个过程更加简便高效,建议创建一些简单的Shell脚本来自动化上述提到的一些重复性的任务。下面给出了一段Python代码示例,它展示了怎样构建这样一个简易但有效的解决方案框架: ```python import os def play_audio_on_boot(): # 定义要播放的音频路径 audio_path = "/path/to/your/audio/file.wav" try: # 执行tinyplay命令以播放指定音频文件 result = os.system(f"tinyplay {audio_path}") if result != 0: raise Exception("Failed to execute tinyplay command.") print("Audio played successfully during boot process.") except Exception as e: print(f"An error occurred while trying to play the startup sound: {e}") if __name__ == "__main__": play_audio_on_boot() ``` 这段代码只是一个概念验证性质的例子,实际应用中可能需要根据具体情况做出更多细节上的调整和完善。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值