基于Linux kernel 3.14版本移植安卓系统后触摸屏无法使用的问题

来源:互联网 发布:java解析xml文件实例 编辑:程序博客网 时间:2024/05/29 14:36

最近在自家的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;


1 0
原创粉丝点击