Quantcast
Channel: Recent Discussions — Advantech IoT Developer Forum
Viewing all articles
Browse latest Browse all 263

Yocto 1.8 penmount 触摸屏频繁触摸卡顿问题讨论

$
0
0

附件资料:

         链接:http://pan.baidu.com/s/1miuGbmK 密码:xxj2

最近广州昂立客户在测试“penmount 6000系列电阻式串口触摸屏”的时候发现这样的问题:在频繁触点的情况下,会出现短暂的卡顿。见附件视频。

平台信息:

         ROM-5420B1 四核2G

         Yocto1.8 ,kernel 3.14.52

触摸屏上报串口数据的格式:

         [0x30][..][..][..][..][..] [0x70][..][..][..][..][..]..  [0x70][..][..][..][..][..].. (省略)[0x30][..][..][..][..][..]

第一个0x03代表按下的动作;接着0x07是上报的触点数据,0x07的数据好多,而且具有随机性,对于这种现象,penmount方面也没有给出一个很明确的说法;最后一个0x30是代表松开的动作。

Penmount的触摸屏驱动是工作在serio总线驱动的基础上的,并通过在驱动penmount.c的 pm_interrupt 函数加打印坐标信息。我们发现两点情况:

1、信息打印很频繁,串口每接收一个“0x03”或“0x07”都会促使驱动进入一次中断。

2、在触点卡顿的情况下,即使没点击触摸屏,驱动还是源源不断的打印坐标信息。

于是,得出以下结论:

1、  进中断的次数很频繁,内核在pm_interrupt里面的时间开销很大。

2、  由于linux是非实时性内核,而且pm_interrupt是软中断,很容易被一些优先级更高的中断抢占,如外部中断。

3、  根据上面两点,可以得出卡顿的出现,正是由于在pm_interrupt函数里面的时间开销太大导致的。换句话说,也就是整个触摸屏的工作方式导致这个问题出现。

为了证明上面第三点,我们使用了penmount提供的一个测试报点的程序:pm-sniff,其工作原理是,每隔0.1秒轮询串口数据,使用方式:

         ./pm-sniff /dev/ttymxc3 19200 6000     //触摸屏接到了ttymxc3上

结果发现,pm-sniff轮询的方式打印很平均,不会出现上面的问题现象。

这似乎证明了我们的结论,但是又很奇怪,难道penmount的触摸屏没人遇到过这样的问题?还是说在其他IC平台上不会出现这样的问题?会跟imx6的串口工作方式有关系?

最后,尝试采取可以改善的措施:

1、  调小imx6串口接收buffer的大小,使中断处理加快。

2、  修改penmount驱动pm_interrupt中断函数的处理逻辑,减少中断的时间开销。

第一点、        是penmount给我们的建议,但查看了imx6的Datasheet,看到UART的“The RxFIFO contains 32 half-word entries”,但是没找到相关的修改方法,驱动里面也没找到有定义RXFIFO大小的地方。请台北同事协助看看。

第二点、        调整驱动pm_interrupt中断函数的处理逻辑,减少中断的时间开销。Patch见附件。修改后,问题得到改善,出现概率降低,复现时间更长。但也不能根本解决问题。

所以,最后得到的状态是,只能改善,不能根治。如果想问题彻底得到解决,是否需要重新编写驱动程序,采用轮询的方式处理串口数据?


Viewing all articles
Browse latest Browse all 263