Android中Input型输入设备驱动原理分析

话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反正这个是没变的,在android的底层开发中对于Linux的基本驱动程序设计还是没变的,当然Android底层机制也增加几个属于android自己的机制。典型的IPC

Android中的input设备驱动主要包括:游戏杆(joystick)、鼠标(mouse)和事件设备(Event)。

1、Input输入子系统的构架,在网上找到两幅灰常漂亮的图。

   

Android中Input型输入设备驱动原理分析

    下面这幅更漂亮,更直观的能看出input型输入子系统究竟是什么咚咚,更能够体现出,用户空间,内核空间,驱动程序是怎么关联起来的。。。

   

Android中Input型输入设备驱动原理分析


Input驱动同样也是字符设备,主设备号是13,次设备号是64~95之间自动生成的,这个Input驱动程序那是相当相当的复杂。在android内核中主要需要关注一下几个文件

    a)include/linux/input.h(驱动头文件)

    b)driver/input/input.c (驱动核心实现,包含大量的操作接口)

   c)driver/input/event.c (事件驱动)

    d)driver/input/joydev.c(游戏杆驱动)

    e)driver/input/mousedev.c(鼠标驱动)

其实上面这些东西都不要我们自己去实现内核已经帮我们实现好了,不过我们在写硬件驱动的时候需要和Inputcore交互,所以需要用到上面这些函数中的接口,也就是说上面这些函数是透明的

2、Event事件驱动原理及其实现

在内核中,用input_dev来描述一个Input设备,该结构的定义如下,

其中内核中使用input_register_device(struct input_dev *dev)来注册一个input设备

这个结构体好长,所以就列了几个。。。。它的定义在input.h当中

struct input_dev {

 。。。。。。。。。。。
    struct input_id id;/*指向input_id结构*/
    bool sync;             
    struct device dev;/**这些设备都归属总线设备模型*/
    struct list_head    h_list; //
    struct list_head    node;  //input_handle链表的list节点
};

用input_handler表示input设备的接口,使用input_register_handler(struct input_handler *handler)注册

struct input_handler {

    void *private;

。。。。。。。。。。
    int (*connect)(struct input_handler *handler, struct input_dev *dev, const struct input_device_id *id);
    void (*disconnect)(struct input_handle *handle);
    void (*start)(struct input_handle *handle);

    const struct file_operations *fops;
    int minor;
    const char *name;

    const struct input_device_id *id_table;

    struct list_head    h_list;
    struct list_head    node;
};

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyszgd.html