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。这里的调用 接口为 www.sctarena.com  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