最近在自家的SOC上移植安卓系统,kernel版本使用3.14,Android版本使用4.0.3。
移植后发现触摸屏无法使用,而安卓输入子系统的源码是没有改过的。通过跟踪触摸屏上报事件的整个流程和机制发现,是因为触摸时间的时间格式和安卓系统使用的时间格式不兼容导致,由于上报的触摸事件时间戳太滞后,导致输入子系统没有及时收到应用程序的应答,导致系统产生了ANR。究其根本原因,发现是3.14的kernel的input子系统在往buffer存数据时获取时间的接口调用不当导致的。
此问题很隐蔽,如果不是对整个流程很清楚,不是很好查,所以将此问题的解决方法记录下来。
evdev.c
static void evdev_pass_values(......)
修改前:
event.time = ktime_to_timeval(client->clkid == CLOCK_MONOTONIC ?
mono : real);
修改后:
struct timespec ts;
ktime_get_ts(&ts);
event.time.tv_sec = ts.tv_sec;
event.time.tv_usec = ts.tv_nsec / NSEC_PER_USEC;