話說Android中Event輸入設備驅動原理分析還不如說Linux輸入子系統呢,反正這個是沒變的,在android的底層開發中對於Linux的基本驅動程序設計還是沒變的,當然Android底層機制也增加幾個屬於android自己的機制。典型的IPC
Android中的input設備驅動主要包括:游戲桿(joystick)、鼠標(mouse)和事件設備(Event)。
1、Input輸入子系統的構架,在網上找到兩幅灰常漂亮的圖。
下面這幅更漂亮,更直觀的能看出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;
};