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

本文介绍了一种在自定义SOC上移植Android 4.0.3时遇到的触摸屏问题及解决方案。该问题是由于内核版本3.14中触摸事件时间戳与Android输入子系统不兼容导致的ANR现象。通过修改evdev.c文件中的时间戳获取方式解决了这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值