子系统框架

@startmindmap

* Input
** 设备驱动层
*** 转化统一事件,上报输入核心(Input Core)
** Input Core
** 事件层
*** 和用户空间交互(/dev/input)

@endmindmap

驱动主要工作:

  • 设备注册
    //注册输入设备函数:
    int input_register_device(struct input_dev *dev)
    //注销输入设备函数:
    void input_unregister_device(struct input_dev *dev)
  • 初始化(事件支持):
    set_bit()//告诉input输入子系统支持哪些事件,哪些按键,例如:
     
    /*  设置按键能产生哪类事件 */  
    set_bit(EV_KEY,buttons_dev->evbit);   
    
    /* 设置能产生这类操作的哪些事件 */  
    set_bit(KEY_ENTER,buttons_dev->keybit);  
    set_bit(KEY_LEFTSHIFT,buttons_dev->keybit); 
    /*
    struct input_dev中有两个成员为:
        evbit:事件类型(包括EV_RST,EV_REL,EV_MSC,EV_KEY,EV_ABS,EV_REP等)
        在input.h中有这些类的定义:      
            #define EV_SYN          0x00     //同步事件
            #define EV_KEY          0x01     //按键类,如键盘或按钮 
            #define EV_REL          0x02     //绝对结果,如鼠标设备  
            #define EV_ABS          0x03     //绝对位移类 ,如操纵杆、书写板 
            #define EV_MSC          0x04     //其他类  
            #define EV_SW           0x05     //开关事件
            #define EV_LED          0x11     //LED或其他指示设备
            #define EV_SND          0x12    //声音类,如蜂鸣器  
            #define EV_REP          0x14     //重复类,允许按键自重复
            #define EV_FF           0x15      //力反馈 
            #define EV_PWR          0x16    //电源管理事件 
            #define EV_FF_STATUS        0x17  
            #define EV_MAX          0x1f  
            #define EV_CNT          (EV_MAX+1)  
        keybit:按键类型(当事件类型为EV_KEY时包括BTN_LEFT,BTN_0,BTN_1,BTN_MIDDLE等)
    */
  • 报告事件:
    用于报告EV_KEY,EV_REL,EV_ABS事件的函数分别为:
    void input_report_key (struct input_dev *dev, unsigned int code, int value)
    void input_report_rel (struct input_dev *dev, unsigned int code, int value)
    void input_report_abs (struct input_dev *dev, unsigned int code, int value)
     
  • 报告结束:
    input_sync() //同步用于告诉input core子系统报告结束。

以汇顶TP为例

平台:RK3399-Android7.1(Kernel:v4.4.103)
路径:kernel/drivers/input/touchscreen
过程:DTS("goodix,gt9xx")->I2C.compatible(of_device)->probe->input_register_device

关键步骤:

  1. probe中初始化触摸屏参数(I2C操作),下发或者使用默认参数

  2. 通过input_set_abs_params初始化一些屏的参数,主要是X,Y最大值等

  3. 通过set_bit初始化事件类型等

  4. input_register_device注册输出设备

  5. 请求中断(gtp_request_irq),创建处理线程,中断线程化(devm_request_threaded_irq)

  6. 中断来之后,在中断线程(goodix_ts_irq_handler)中,会先禁用中断(gtp_irq_disable),然后开始工作队列(queue_work), goodix_ts_work_func中读取参数参数(I2C操作),处理参数,上报(input_report_abs),然后结束上报(input_sync),使能中断

参考

https://blog.csdn.net/qq_35865125/article/details/80637809
https://www.cnblogs.com/lifexy/p/7542989.html