1.触摸屏硬件原理
1.1电阻触摸屏
中断产生。触摸屏芯片根据触摸按下时电阻分压值发生变化而产生中断,该中断输入给CPU。产生的条件很简单,主要有VDD,GND信号即可。因此,我们在调试时,可以在没有驱动的情况下去测量中断脚,是否在有触摸时发生变化,以前验证模块的好坏。
1.2电容触摸屏
中断产生和电阻屏类似,只不过电容屏是由于人体接触时形成耦合电容,从而电流发生变化。
电容屏的接口一般都会有一个nRST信号,便于驱动里对模块做复位操作。
2.Linux驱动
这里以i2c接口的电阻屏为例,并采用中断加轮询获取坐标值。
2.1注册i2c设备
注册i2c_board_info结构体。在machine_xxx_board_init(位于arch/arm/mach-xxx路径下)里面,包括type(driver name),Slave address,irq(中断引脚)和platform_data等。
注册i2c设备。在驱动文件先填充i2c_driver结构体,包括driver.name,id_table,probe。然后再调用i2c_add_driver即可以注册一个i2c设备。
2.2注册中断
接下来,我们要在probe函数里面做一些其他的初始化工作。
初始化一个delayed work。调用INIT_DELAYED_WORK。
探测设备。可以使用i2c_smbus_read_byte_data读取设备的ID寄存器,当然如果没有ID寄存器,也可以随便读取一个寄存器,如果返回值小于0,那可以认为该设备不存在。
注册中断。过程为申请GPIO(即中断引脚)-->设置GPIO方向-->设置GPIO上拉(或者下拉)-->申请irq。这里的调用接口为gpio_request-->gpio_direction_input-->gpio_pull_updown-->gpio_to_irq-->request_irq。
2.3注册输入子系统
分配内存。调用input_allocate_device。
设置触摸屏参数。调用input_set_abs_params,设置ABS_X,ABS_Y等参数。
注册input。调用input_register_device。
2.4校准参数初始化
2.5添加sysfs接口
可以按需求添加一个sysfs接口,如打印调试信息开关。调用driver_create_file。
2.6添加一级休眠处理
一级休眠是android的休眠策略。填充early_suspend结构体,调用接口register_early_suspend。
最后进行芯片的初始化,如配置设备的寄存器等。
3.Android层处理
驱动程序将输入设备以/dev/input的节点呈现给上层,对于触摸屏输入事件,android层经过Native framwork的EventHub处理和Java framework的KeyInputDevice-->KeyEvent(滑动时为RawInputEvent-->MotionEvent)处理,上报给应用程序,上报的形式为onKeyDown/onKeyUp或者onTouchEvent/onTrackballEvent。
源文件:
frameworks/base/libs/ui/EventHub.cpp