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