附件资料:
链接: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见附件。修改后,问题得到改善,出现概率降低,复现时间更长。但也不能根本解决问题。
所以,最后得到的状态是,只能改善,不能根治。如果想问题彻底得到解决,是否需要重新编写驱动程序,采用轮询的方式处理串口数据?