This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

请教关于AM335x lcd framebuffer驱动的问题



项目平台相关
     硬件平台是在BBB方案的基础上设计的,删除了hdmi,lcd驱动改用lvds接口,使用引脚LCD_DATA[15:0]及相关辅助引脚,进入差分驱动芯片DS90C365AMT,LVDS接口单6输出。其他基本没有改动什么。PDK版本:03.02.00.05,内核版本4.4.32  uboot和kernel的移植均在里面完成,原本是采用PDK内置的toolchain ,无奈在文件系统编译时候,TI给的编译器buildroot不支持,为了整体统一编译器,内核移植和文件系统使用linaro官网下载了PDK相同版本的toolchain-5.3,底层uboot依然使用PDK自带toolchain.
驱动部分,在omap2plus_defconfig配置的基础上的 参考processors.wiki.ti.com/.../Linux_Core_LCD_Controller_User_Guide的说明,配置好了内核中LCDC DRM Display Drive的相关选项。 lcd 相关的dts如下:

panel {
compatible = "ti,tilcdc,panel";
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&lcd_pins_s0>;
panel-info {
ac-bias = <255>;
ac-bias-intrpt = <0>;
dma-burst-sz = <16>;
bpp = <32>;
fdd = <0x80>;
sync-edge = <0>;
sync-ctrl = <1>;
raster-order = <0>;
fifo-th = <0>;
};

display-timings {
1024x768p62 {
clock-frequency = <30000000>;
hactive = <1024>;
vactive = <768>;
hfront-porch = <39>;
hback-porch = <39>;
hsync-len = <47>;
vback-porch = <29>;
vfront-porch = <13>;
vsync-len = <2>;
hsync-active = <1>;
vsync-active = <1>;
};
};
};

fbset命令显示如下:

mode "1024x768-0"
# D: 0.000 MHz, H: 0.000 kHz, V: 0.000 Hz
geometry 1024 768 1024 768 32
timings 0 0 0 0 0 0 0
accel true
rgba 8/16,8/8,8/0,0/0
endmode


实验平台及现象

            显示界面基于QT5.6.3(与文件系统内核相同的编译器编译)。做一个简单的界面也崩溃,时间不等。从10分钟到2小时。总是报经典的segmentation fault,或者直接内核崩溃。core dump 进行查找,故障地址多次排查均指向QT库,而不是自写的工程代码bug,很显然不是工程代码的指针类错误或者内存泄露之类的。基本都是指向QT库源代码。在内核移植之前也DDR的配置也按照Steven Liu的在论坛介绍做了详细的ddr3 software leveling. memtest基本ok(没有做过严格的长时间的压力测试,但qt程序基本无法跑,别的测试程序可以跑,我感觉与DDR稳定性应该关联不大)。

               网上查下了大量QT应用崩溃的帖子,我估计两种可能性:一就是frramebuffer 驱动处理的不好,导致应用程序在写framebufer的时候内存出错。二:QT库的编译出了问题,与内核不兼容??(没有用TI的sdk供的QT库和文件系统,体积太大只能自己定制)。

      希望TI工程师帮我看看,非常感谢。

      若有不详细的项目信息我会马上补充。

  • 使用ti提供的QT库试试有没有这个问题,库太大的话可以选择你要的放到板子上
  • 非常感谢@yongqing wang 提供的思路。经过我反复确认排查,初步断定应该不是库的原因,也不是framebuffer驱动的问题。原因在于:为了测试应用程序稳定性,在界面上放了一个日期时间控件查看运行时间:QdateTimeEdit,是输入型控件。并且设定了一个50ms的定时函数,执行刷新时间:ui->dateTimeEdit->setDateTime(curDateTime.currentDateTime()); 如果去掉这个,程序就不会崩溃。按我推测,因为这个控件是输入控件,可能定时执行这一行,qt内部函数压栈了时间数据内部并没有来得及释放或者没有释放,导致堆栈出错。
  • 这个bug折腾了好久好久,大家都知道segmentation fault是内存问题,堆栈或者指针。但coredump就是看不出来,总是指向QT源代码,不是自写的代码,没法调试。因为经验不足吧这条语句很难看出有问题。最终来回排查才发现。
  • 故障是大致找出来了,根本原因尚不明确,在定时触发的槽函数里面,不能刷新输入控件嘛?说为了避免内存泄露,除了通常的指针处理以及用户自定义对象及变量的管理,在QT框架下是否还有哪些值得十分注意的地方以及禁区。有路过的兄弟多多留意建议。谢谢。
  • 不客气,感谢你解决了问题又能将经验分享出来
  • 经常的出现segmentation fault,这种bug确实非常麻烦
  • 在定时器可以刷新控件,但是不能堵塞,你试试刷个简单的空间
  • 你的思路的确是对的。我做了两个测试:1、在应用程序里面把定时器时间设定到500ms,仍然刷新QdateTimeEdit控件。持续运行了12个小时(条件限制没有测试更长时间)不崩溃了。2、新建一个空的QWidget工程,啥都不干,就添加一个QdateTimeEdit控件,但是把刷新时间设定为10ms,依然崩溃。
    这样才看,应该是定时运行的槽函数里面,对QdateTimeEdit对象的内存处理,有堵塞。这样来看给的经验 就是,在定时运行的槽函数里面处理QT对象要十分小心。防止无法调试和检测的内存泄露。很难去调试QT源代码,毕竟使用QT重要的工作是去做好应用需求,而不是研究qt本身。