准备给Dragonboard 410c接一个mtch6102触摸板,但在调试过程中遇到了几个问题,花费了较多时间,记录下来为以后碰到类似问题可以得到快速解决,也把调试经验分享给大家。 mtch6102是一款比较简单的触摸IC,没有太复杂的软硬件需求。 它的驱动直接按照linux驱动框架就很容易编写出来了。 在kernel中正确配置相关dtsi文件,驱动成功运行后,操作触摸板发现两个问题: 1、驱动中能接收到TP触摸中断,但通过input子系统上报后,在应用端无法接收到相应的键值和坐标。 发现这个问题时真是觉得很奇怪,用adb shell getevent查看明显是有数据上报上来的,跟踪log也发现在hal层是已经收到数据的,但在应用层确实收不到相关坐标值。 后面分析了一下代码,发现只上报了TP的按压动作,但没有上报松开动作,这会导致上层认为这次事件不是一个完整的触摸事件,从而不会把坐标分发给相应的应用 。 只要修改一下代码就OK了 2、mtch6102的驱动我编写的是中断方式上报的,可是后面发现即使不按压TP,上报数据的中断处理函数也会被一直触发调用,也就是一直有检测到有中断信号。 检查硬件是正常的,相关的dtsi配置也是正常的,驱动里对寄存器的配置也都是对的。 这个问题困扰了好长时间,后面通过把TP的中断线飞线出来连接示波器抓波形查看,确认中断信号是从TP IC端主动生成。 最终分析发现,在每次触摸中断触发后,读取TP坐标相关的寄存器时,必须全部读全,如果有些寄存器没有读取数据,TP IC会认为此次的触摸数据还没有被读取从而一直产生中断。 修改中断处理函数中的读取寄存器值相关代码后,TP正常工作,不会在没有触摸的情况下再继续产生中断。