RK3128 UBOOT-logo显示的坑

问题描述:

在调试mipi接口的显示屏的时候出现如下两种情况,

(1)在设备树arch\arm\boot\dts\rk3128-box-rk88.dts中配置在uboot阶段显示logo,会出现程序跑飞。

(2) 在在设备树arch\arm\boot\dts\rk3128-box-rk88.dts中配置在uboot阶段显示logo后,出现显示异常,颜色过度不自然,颜色不纯有色块等,并且通过PQ调试也无法解决。

阶段uboot阶段显示logo设备树配置如下:

&fb {
    rockchip,disp-mode = <NO_DUAL>;
    rockchip,uboot-logo-on = <1>;
};

问题1解决方案:

针对程序跑飞,最后发现从Log无法提供有用信息,但是通过开关uboot-logo-on发现只有开启uboot-logo-on才会出现该问题。最后通过网上资料查询得知,如果mipi发送的cmds参数太长会导致局部数组溢出导致程序跑飞。最后修改如下:

index 7679e52..368aa1f 100755
--- a/u-boot/drivers/video/screen/lcd_mipi.c
+++ b/u-boot/drivers/video/screen/lcd_mipi.c
@@ -27,6 +27,10 @@
 #include "../transmitter/mipi_dsi.h"
 #endif

+/*added by liangzhentao*/
+#define CMD_LEN 256
+/*end of adding*/
+
 #ifdef CONFIG_RK32_DSI
 #define        MIPI_SCREEN_DBG(x...)   //printf(x)
 #elif defined CONFIG_LCD_MIPI
@@ -354,7 +358,7 @@ static int rk_mipi_screen_init_dt(struct mipi_screen *screen)
        struct list_head *pos;
        struct property *prop;
        enum of_gpio_flags flags;
-       u32 value, i, debug, gpio, ret, cmds[25], length;
+       u32 value, i, debug, gpio, ret, cmds[CMD_LEN], length;

        memset(screen, 0, sizeof(*screen));

@@ -612,7 +616,7 @@ EXPORT_SYMBOL(rk_mipi_get_dsi_clk);
 static int rk_mipi_screen_init_dt(struct mipi_screen *screen)
 {
        struct mipi_dcs_cmd_ctr_list  *dcs_cmd;
-       u32 i,cmds[20];
+       u32 i,cmds[CMD_LEN];
        int length;
        int err;
        int node;

如上修改成256过后程序正常跑起来。

问题2解决方法:

问题当时困扰了很久,lcd能正常显示,并且供电电压等都正常,但是显示就是不自然,颜色过度不自然,调试pq的时候色轮明显色块不纯。UI设计同事调试PQ无法调试,认为硬件出现了问题,排查许久,最终在一次偶然的机会关闭uboot-logo的调试发现颜色几乎正常(还没调试PQ)。最终排查从uboot-logo思路方面排查调试。

通过不断打印发送cmds参数发现,在发送一次参数比较长数据的时候会出现参数跟设备树匹配的参数值不匹配的情况。最明显例如发送长度为60个cmds参数的时候,每次都会在第33,42,43这三个cmds数据出现异常。后来定位的出错的地方如下(打印出来的cmds参数跟设备树配置的不一样):

static void rk_mipi_screen_cmd_init(struct mipi_screen *screen)
{
        u8 len, i;
        u8 *cmds;
        struct list_head *screen_pos;
        struct mipi_dcs_cmd_ctr_list  *dcs_cmd;
#ifdef CONFIG_RK32_DSI
        cmds = calloc(1,0x400);
        if(!cmds) {
                printf("request cmds fail!\n");
                return;
        }
#endif

#ifdef CONFIG_LCD_MIPI
        cmds = kmalloc(0x400, GFP_KERNEL);
        if(!cmds) {
                printk("request cmds fail!\n");
                return ;
        }
#endif

        list_for_each(screen_pos, &screen->cmdlist_head){

                dcs_cmd = list_entry(screen_pos, struct mipi_dcs_cmd_ctr_list, list);
                len = dcs_cmd->dcs_cmd.cmd_len + 1;

                for( i = 1; i < len ; i++){
                        cmds[i] = dcs_cmd->dcs_cmd.cmds[i-1];
                        //printf("cmds[%d]=0x%x ",i,cmds[i]);//打印一次发送命令参数
                }
                //printf("\n");  //发送一行后分割
                MIPI_SCREEN_DBG("dcs_cmd.name:%s\n",dcs_cmd->dcs_cmd.name);
                if(dcs_cmd->dcs_cmd.type == LPDT){
                        cmds[0] = LPDT;
                        if(dcs_cmd->dcs_cmd.dsi_id == 0){
                                MIPI_SCREEN_DBG("dcs_cmd.dsi_id == 0 line=%d\n",__LINE__);
                                dsi_send_packet(0, cmds, len);//发送参数
                        }
                        ......
                 }
          }

最后想到应该也是一些数组溢出访问的问题,果然发现结构体mipi_dcs_cmd_ctr_list中的成员变量申请的数组个数是32个,这样说明为何每次都是第33个开始出错了。最后修改如下:

index f4d77a0..089a672 100755
--- a/u-boot/drivers/video/transmitter/mipi_dsi.h
+++ b/u-boot/drivers/video/transmitter/mipi_dsi.h
@@ -255,12 +255,17 @@ struct mipi_dsi_screen {

 #define INVALID_GPIO        -1

+/*added by liangzhentao*/
+#define CMD_LEN 256
+/*end of adding*/
+
 struct dcs_cmd {
        u8 type;
        u8 dtype;
     u8 dsi_id;
     u8 cmd_len;
-       int cmds[32];
+//     int cmds[32]; //原来这里只有32 int类型的储存单位,当设备树配置的cmds超过32个的时候出现异常
+    int cmds[CMD_LEN]; //sometimes len will very long
        int delay;
     char name[32];
 };
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: rk uboot logo分区是在Rockchip平台下的U-Boot bootloader中的logo区域。这个分区用于存储设备启动时显示的品牌LOGO或者其他的图形界面。在启动期间,当设备进入U-Boot bootloader时,该区域的图像将会被显示。 RK U-Boot logo分区通常包含了厂商的标志或者是其他品牌部署需要的图形,这个分区被称为boot logo分区。这里的rk是指Rockchip,一个集成电路设计公司。 RK U-Boot logo分区一般体积较小,往往只有几十KB或数百KB大小。管理这个分区可以使用命令行或者其他专门的软件,这些软件可以负责将图像文件写入分区。 RK U-Boot logo分区的重要性在于能够为厂商不仅仅提供一个标志,同时确保了良好的用户体验。现在,品牌LOGO已经成为了区分产品的一种方式,而这个分区也强调了不同平台的不同体系架构,并提供了一个共同的工具,用于管理各种设备的启动菜单和图形元素。 ### 回答2: rk uboot logo分区是申威科技公司针对RK处理器平台开发的一种开机logo显示方案。该方案采用uboot引导程序进行控制,通过分区的方式实现logo显示。 在rk uboot logo分区方案中,将显示logo的资源文件打包成一个固定格式的文件,并将其烧录至特定的分区中。uboot在启动时会自动加载该分区的logo资源文件,然后在屏幕上显示logo图案。 与传统的开机logo显示方案相比,rk uboot logo分区的优势在于其灵活性和可重用性。由于logo资源文件与系统分开存放,因此可以方便地更新或修改logo样式。同时,不同型号的产品也可以共用同一套logo资源文件,减少开发成本和时间。 总之,rk uboot logo分区是一种简单易用、灵活可靠的系统开机logo显示方案,已经得到越来越广泛的应用。 ### 回答3: rk uboot logo分区是指在嵌入式设备中,使用Rockchip处理器的uboot引导程序时,将不同的logo图标分区存储在该设备的闪存中,通过uboot程序调用不同的logo图标来显示在启动过程中。 Rockchip处理器是当前市场上使用最广泛的一款嵌入式处理器,其uboot引导程序是启动整个系统的重要组成部分。而通过使用rk uboot logo分区技术,可以为不同的设备制作独特的启动logo,提升品牌形象和用户体验。 rk uboot logo分区技术的实现过程是将多个不同的logo图标按照设备型号、版本等分类,存储在闪存的不同分区中。当设备启动时,uboot程序会根据设备的型号、版本等信息读取相应的logo图标,并将其显示在屏幕上。这样做的好处是可以提升品牌形象和用户体验,增强用户对产品的信任感和归属感。 总之,rk uboot logo分区技术是一种高效的嵌入式设备启动logo管理方式,可以为不同的设备生产独特的logo图标,提升品牌形象和用户体验。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值