「技术干货」工业触摸屏之驱动开发及异常分析(连载)

2022年06月10日 11:00    发布者:武汉万象奥科
触摸屏作为嵌入式产品中常用的交互设备,具有交互直观,编程简易等特点,本系列文章将以多种角度分析如何选择合适的触摸屏方案及常见的故障解决方法。本文主题为电阻屏的驱动组成以及多数触摸屏的异常分析。1.1 测试环境处理器:AM335x内核版本:Linux-3.2硬件条件:四线电阻屏、五线电阻屏1.2 驱动组成部分触摸屏的处理流程离不开,响应中断上报事件,对于电容屏同样有效的。所以对于触摸屏,只需仅仅把握中响应中断上报事件的流程,即可定位是软件还是硬件故障。以AM335x的电阻屏为例,涉及的驱动子系统列表如表1.1所示。触摸子系统是对触摸屏的抽象层,输入子系统提供符合上层应用使用的接口,中断子系统负责接收外设的中断信号,ADC子系统负责提供电场信号以及采集电压值。表1.1 电阻屏相关驱动https://mp.toutiao.com/mp/agw/article_material/open_image/get?code=MDJiNTM3MzQ0YjdjZWVlN2ZmOWQ5MThhNTY0OGFlYTQsMTY1NDgyNjA3MjU1Mw==
1.3 AM335x电阻屏驱动相关代码位置如表1.2所示。表1.2 电阻屏代码路径https://mp.toutiao.com/mp/agw/article_material/open_image/get?code=MmEyZjQxYTUwN2U5OGU0ZWJmMzhlZWUyOTdkZDIxZTYsMTY1NDgyNjA3MjU1Mw==
板级文件记录下ADC模组中哪些通道用作触摸功能,哪些通道用作模数转换功能,如代码清单1.1所示。代码清单1.1 板级描述文件路径:arch/arm/mach-omap2/board-am335xevm.chttps://mp.toutiao.com/mp/agw/article_material/open_image/get?code=MDQyOTZkMDJlY2Y1MmU3NDVhNjMwZDM4MDc4MmMzYzIsMTY1NDgyNjA3MjU1Mw==
ADC模块驱动是对ADC通道的抽象整理,会涉及部分触摸的寄存器。例如《【应用技术】触摸屏技术之二:原理分析》中提到CTRL Register的AFE_Pen_Ctrl Bits用于选择中断触发信号输入脚,如代码清单1.2所示。代码清单1.2 ADC模块驱动路径:drivers/mfd/ti_tscadc.chttps://mp.toutiao.com/mp/agw/article_material/open_image/get?code=OGEyODZmMzUzZDVkYWU5YjE3NGU3MjIwOTQwMzkwOGUsMTY1NDgyNjA3MjU1Mw==
最后就来介绍负责抽象整个触摸设备的触摸屏驱动文件,触摸驱动内封装了中断、ADC模组的寄存器操作、输入事件的上报工作。设置X轴采集时的配置如代码清单1.3所示。结合《【应用技术】触摸屏技术之二:原理分析》的《四线屏寄存器配置》和《五线屏寄存器配置》内容可知,stepconfigx为X轴采集时的通用配置,当系统设备为四线模式时,开启XPP、XNN形成电场,INP值代表采集引脚为AN2。当系统设备为五线模式时,开启XPP、YNN、XNN、YPP形成电场,INP_5代表采集引脚为AN4。代码清单1.3 X轴ADC配置路径:drivers/input/touchscreen/ti_tsc.chttps://mp.toutiao.com/mp/agw/article_material/open_image/get?code=Nzc0ZDg5ZDA3ZDU0YzE2ZmMyMzJiZjY2Nzc0YTI2ZDIsMTY1NDgyNjA3MjU1Mw==
设置Y轴采集时的配置如代码清单1.4所示,stepconfigy为Y轴采集时的通用配置,当系统设备为四线模式时,开启YPP、YNN形成电场,INP值没有设置,默认使用AN0。当系统设备为五线模式时,开启XPP、YNN、XNP、YPN形成电场,INP_5代表采集引脚为AN4。代码清单1.4 Y轴ADC配置路径:drivers/input/touchscreen/ti_tsc.chttps://mp.toutiao.com/mp/agw/article_material/open_image/get?code=Yjc1NmEwYTI1ZTAwMzBjNzdjMjQzNTNmMDUxOWEwNDksMTY1NDgyNjA3MjU1Mw==
处理器完成ADC采集后,需要触发一个中断,中断处理函数的注册代码如代码清单1.5所示。对于用户层来说,最直观的就是查看此中断在系统中触发几次,所以此时的中断名就是request_irq内传入的中断名参数。代码清单1.5 中断函数设计路径:drivers/input/touchscreen/ti_tsc.chttps://mp.toutiao.com/mp/agw/article_material/open_image/get?code=MjRhNzNkYTI2YzRhMTJhYmZjZmI3YmYxYmUyOWE5NWQsMTY1NDgyNjA3MjU1Mw==
最后一点就是对输入子系统的封装,在触摸屏代码内必不可少的就是input子系统的调用,代码如代码清单1.6所示,input_report即为输入子系统上报函数族,上报事件包括:按键按下、按键弹起、绝对坐标、相对坐标等。所以对于系统来说,最终只要input_report能顺利执行,那么触摸信号就能正常获取。代码清单1.6 输入子系统设计路径:drivers/input/touchscreen/ti_tsc.chttps://mp.toutiao.com/mp/agw/article_material/open_image/get?code=ZWI0ZWFjNDczZjhlODJhZDA0YmM4OTRlMGQxZjM3NWUsMTY1NDgyNjA3MjU1Mw==
1.4 用户空间的排查方法此处整理了电阻屏的问题定位方法,如表1.3所示。表1.3 用户空间排查方法https://mp.toutiao.com/mp/agw/article_material/open_image/get?code=YjllNGJlNDE1M2U0MzA5YjFhMmZmNWIyYjdjNmNhZjksMTY1NDgyNjA3MjU1Mw==
接下来我们结合一些具体案例来具体看看如何排查触摸问题。1.4.1 触摸没反应问题:接上触摸屏没反应。分析步骤:
[*]查看dmesg | grep touch,查看系统是否有加载触摸驱动;此部分有内核配置选择,没有信息则定位为驱动异常,查看内核配置或初始化函数。
[*]查看/proc/interrupts文件,看中断计数是否有变化。若点击屏幕,中断计数没变化,根据之前所说的中断输入引脚,说明此情况下中断引脚没有接到对应引脚上。
1.4.2 触摸抖动问题:使用ts_test查看,发现光标在不停闪烁。分析思路:通过cat /proc/interrupts,查看中断计数,若一直有增加,再用hexdump命令查看输出信息,一般这种不规则情况,是由于中断信号输入引脚接到错误位置,例如五线屏的感应引脚,接到地之后,相当于屏幕一直被按下,所以会不断上报错误事件。也有可能是感应引脚接到不稳定的电平,一直产生高低变化的扰动,系统把这种高低变化的扰动当作触摸屏被按下的信号。1.4.3 触摸不准问题:使用五线屏时,四个边角总有一个无法触摸得到。分析思路:ADC模组有一个输入的参考电压,一般接1.8V,但有些意外情况,将其接到GND,相当于采集点一直无法采集到正常数据。1.4.4 触摸异常问题:使用五线屏时,数据乱跳。分析思路:由上篇文章“【应用技术】触摸屏技术之原理分析”分析可知,五线屏的正常四个角如图1.1所示,(H,H)与(L,L)形成对角分布,在这样X、Y轴的电场才能形成相互垂直的分布,但如果出现图1.2中(H,H)与(L,L)在同一个方向时,就无法形成相互垂直的电场,此时采集出来的感应点数据就是紊乱的。https://mp.toutiao.com/mp/agw/article_material/open_image/get?code=NWEyZjAzZTY4M2MyMjQyMjU3Njk2MDMzMDRjMDZlYWUsMTY1NDgyNjA3MjU1NA==
图1.1 正常五线屏电极分布https://mp.toutiao.com/mp/agw/article_material/open_image/get?code=ZDg5NGRmMTJmYTY4NjhlMTUwNmE0MWZmYzQzNzU5ZDAsMTY1NDgyNjA3MjU1NA==
图1.2 异常五线屏电极分布