在Android系统里调试UART口触摸框时,最大的问题是如何将识别到的普通串口设备结点与相应的驱动关联起来?
普通串口设备结点,不同平台方案有区别,比如在RK3288 Android5.1上面会识别为/dev/ttyS0、1、2、……这样的设备结点。
相应的驱动程序主要是用于对采集到的串口数据进行解析,转换为相应的触摸事件和坐标数据,再往上报。
在Android系统里调试UART口触摸框时,需要使用到Linux内核的SERIO框架,涉及的配置项如下:
CONFIG_SERIO=yCONFIG_SERIO_SERPORT=y
而相应的驱动会使用module_serio_driver()宏去注册驱动模块,我们是从Linux内核源码的drivers/input/touchscreen目录下找了一份相近的驱动源码,再结合客户提供的触摸框串口协议格式进行修改,让其按指定格式解析数据。(该部分按实际需要修改,我们是参考了w8001相关文件,修改出自己需要的br_ts.c)
驱动源码有了,同一目录下的Makefile和Kconfig也是需要修改的。
驱动改好了后,需要在Android上层将inputattach源码和配置添加上:
将下载的inputattach源码(在源码管理网站很容易找到,这里就不提供)放到external/inputattach/目录下,并在该目录下增加Android.mk文件,内容如下:
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES:= \ inputattach.cLOCAL_MODULE:= inputattachinclude $(BUILD_EXECUTABLE)
接下来在源码下相应的device/*/device.mk文件下添加如下内容:
PRODUCT_PACKAGES += inputattach
接下来在源码的device/*/init.*rc文件里添加如下内容:
service irtouch /system/bin/inputattach --baud 9600 --br /dev/ttyS1 class main oneshot
看到上面定义的这个service用到的inputattach这个程序和相应参数了吧,其中波特率是根据触摸框而设置的,我们的触摸框是9600,而--br是我们修改inputattach文件后添加的协议名(请根据实际使用或修改代码添加),而/dev/ttyS1为我们触摸框接到RK3288板卡上对应的串口在Linux上的设备结点名。
这些添加完成后,编译源码并重新烧录镜像,就能正常使用了。
在最开始时说到本次调试最大问题是在将串口设备与解析驱动关联起来,上面的过程有没有发现?其实就在inputattach里了,该程序源码里可以看到ioctl(fd, SPIOCSTYPE, &devt)这一操作,这就是核心所在了。END