Android 输入系统 --Linux input子系统-设备驱动层
上次我们说了一个安卓输入系统大致的流程,其中一个就是硬件产生了硬件中断,让输入设备的驱动去获取,并处理,但是有个问题,输入设备非常多,而且非常复杂,形态各异
比如:按键(包括扩展按键),鼠标(USB设备我们后面描述,否则表述不清),轨迹球,触摸屏(包括电阻和电容屏),后来还有了 指纹设备。为了让大家的代码能够不混乱,安卓使用的是Linux的输入驱动框架 --Linux input子系统。
这个所谓的input子系统就是支持Linux所有输入设备的驱动集合。
先看看这个子系统的结构。(图片来自网络)

首先说一下,我的代码基于 Linux 3.1 Android5.1的代码,不同版本可能有些不同,为了讲述方便统一使用这个版本。
今天我们只讲第一个部分-设备驱动层。为啥?因为首先要获得硬件中断,后续才能处理,而且这个模块必须在其他模块之前加载
第一步:我们先找到代码的位置。
位置在谷歌代码根目录,进入kernel目录(也可能是kernel-3.10),这个目录是内核目录,再进入drivers,这个是驱动目录,再进入input目录,这个就是输入子系统的代码目录。
这时候会看到一些目录,包括keyboard(按键驱动) (mouse)鼠标驱动 (touchscreen)触摸屏驱动 (joystick)操纵杆,这些目录下面有各个厂家的设备驱动。
第二步:我们在手机上如何查看设备,手机连接电脑,安装和配置好adb(这些内容我就不讲了)
adb shell
cd /dev/input
ls
这时候,就会显示所有的输入设备。
我这里是八个设备
event0
event1
event2
event3
event4
event5
event6
event7
那么这些设备又是什么输入设备,又是如何关联到硬件的呢?
我们可以一个个的测试验证,使用getevent命令,我这个手机至少两种输入设备,触摸屏和按键
getevent event3
滑动触摸屏,发现会显示很多数据。说明event3就是触摸屏
getevent event0
每次按键,发现会显示很多数据,说明event0就是按键
getevent event6
这个会一直报数据,只有灭屏才会停止,而且手机一晃动,数据就会产生变化,这个是某种传感器的在报数据
如果觉得原始数据太烦,可以使用命令转换按键的显示
getevent -l event0
老板:"小明,又在上网啊,在网上说的这么头头是道,我这里有个新按键,我让硬件帮你焊上去,重新给我驱动写好,写不好就不要再领工资了"
我一看,新按键多了一个按键,除了音量两按键 和 开机红键,多了一个搜索按键,我的天啊,不一样,这可要我怎么办啊?!
浙公网安备 33010602011771号