Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

    【FAQ】全志V85x芯片 如何使用tiger lcd时lti锐化功能时程序abort?

    V Series
    v853 t113 tiger lcd abort faq
    1
    1
    1352
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • q1215200171
      budbool LV 9 last edited by q1215200171

      1.主题

      使用tiger lcd时lti锐化功能时程序abort

      2.问题背景

      产品:T113
      软件:tina5.0
      其他:使用tiger lcd调试lti参数

      3.问题描述

      3.1复现步骤

      1. m kerne_menuconfig选中按照如下方式选中pq驱动
      Device Drivers  --->
          Graphics support  --->
              Frame buffer Devices  --->
                  Video support for sunxi  --->
                      [*]   Support PQ driver
      
      1. m menuconfig按照如下方式勾选下位机软件
      Allwinner  --->
              Display  --->
                  <*> pqd.................................................................. pqd
      
      1. 编译烧录后进入控制台,输入usbdevice命令打开切换usb role后,再输入pqd运行上位机软件。
      2. 电脑端打开tiger lcd,点击open后切换到lti调试界面,调节参数后点write写入
        e20cf15b5e8b46ab8004addabb73d8ac.jfif

      3.2具体表现
      下位机程序abort退出,结果如图所示。
      3e7ad95f27f441ffbb9a2dc1126fec5f.jfif

      4.问题分析

      1. unsorted double linked list corrupted表明malloc时链表的被破坏,找不到下一个节点,该问题可能是越界写内存导致。
      2. 可以选择使用libasan进行调试,需要在Makefile中加入如下选项,
        594c1e6aa9634f5fa0889f6bf1e909cc.jfif
        并且在menuconfig按照如下方式配置
      Base system  ---> 
          [*]   Use external toolchain  ---> 
              -*- libc........................................................... C library
                  Configuration  --->
                      (./lib/ld{-*.so,-linux*.so.*} ./lib/lib{anl,c,gomp,cidn,crypt,dl,m,nsl,nss_dns,nss_files,resolv,util,ssp,asan}{-*.so,.so.*}) libc shared library files (use wildcards)
      
      1. 重新编译并将未strip过的可执行文件用adb推至/usr/bin下,重新复现问题,得到如下信息。
        22fee4598ca0491394d4a60b4babca17.jfif

      2. 可以看出问题在platform/allwinner/display/pqd/hardwares/de20x/de20x.c文件中的de20x_set_lti里。实际上这里malloc的数组是用来存储lti 11个寄存器的值
        b6d158e74f9347afb8ad71ef9726b4be.jfif 3fde3fa4f1e0476cb518530dda35f7b7.jfif

      再通过ioctl写入物理寄存器,但是malloc的长度PEAK_REG_NUM只有6,因此这里会发生写越界。同时如下代码处也要改过来
      08b4c7dc8693483a974d208bc965baf9.jfif

      5.根本原因

      寄存器数量配置错误,导致写内存越界,破坏了链表结构LTI_REG_NUM

      6.解决办法

      修改platform/allwinner/display/pqd/hardwares/de20x/de20x.c中de20x_set_lti和de20x_get_lti函数malloc的大小为LTI_REG_NUM,具体方式可参考如下补丁。

      diff --git a/hardwares/de20x/de20x.c b/hardwares/de20x/de20x.c
      index c8a1084..7aa66be 100644
      --- a/hardwares/de20x/de20x.c
      +++ b/hardwares/de20x/de20x.c
      @@ -328,7 +328,7 @@ int de20x_set_lti(const char* data, int size)
           int ret;
           UNUSED(size);
           struct lti_sharp *lti = (struct lti_sharp *)data;
      -    struct register_data* rdata = malloc(sizeof(struct register_data) * PEAK_REG_NUM);
      +    struct register_data* rdata = malloc(sizeof(struct register_data) * LTI_REG_NUM);
           get_lti_register_offset(rdata);
           ret = de20x_get_registers(rdata, LTI_REG_NUM);
           if (ret) {
      @@ -371,7 +371,7 @@ int de20x_get_lti(char* data, int size)
           int ret;
           UNUSED(size);
           struct lti_sharp *lti = (struct lti_sharp *)data;
      -    struct register_data* rdata = malloc(sizeof(struct register_data) * PEAK_REG_NUM);
      +    struct register_data* rdata = malloc(sizeof(struct register_data) * LTI_REG_NUM);
           get_lti_register_offset(rdata);
           ret = de20x_get_registers(rdata, LTI_REG_NUM);
           if (ret) {
      
      1 Reply Last reply Reply Quote Share 2
      • Referenced by  q1215200171 q1215200171 
      • 1 / 1
      • First post
        Last post

      Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

      行为准则 | 用户协议 | 隐私权政策