輸入裝置都能用輸入子系統來寫,比如說按鍵、觸控螢幕、滑鼠等,但是有的輸入裝置不止用到了輸入子系統,比如說usb輸入裝置,他們還用到了usb子系統。我們以最簡單的按鍵(直接接到cpu上)為例介紹一下輸入子系統。
輸入子系統將硬體相關的**與軟體相關的**分開寫,目的是為了以後編寫修改**簡便。軟體部分系統已經寫好了,而且輸入裝置就那麼幾類,軟體部分基本不用改動,我們需要寫的只是硬體相關的**。
在輸入子系統中新增乙個新硬體可以參考核心目錄drivers/input/keyboard/gpio_keys.c ,步驟如下
1. 分配乙個input_dev結構體
分配結構體的函式為input_allocate_device();
2. 設定 input_dev結構體
2.1 能產生哪類事件
2.2 能產生這類操作裡的哪些事件
可以用set_bit()函式來設定分配好的結構體
3. 註冊input_dev結構體
input_register_device(struct input_dev *dev);
經過這三步就設定好了硬體不份的**,只要呼叫一下上報函式就會有相應的結果,當然這麼直接上報事件沒有意義,我們會在按鍵中斷中呼叫上報事件,這樣每按一次按鍵就會有相應的結果
4.上報事件
input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
input_sync(struct input_dev *dev);
/* 參考drivers\input\keyboard\gpio_keys.c */
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include struct pin_desc;
struct pin_desc pins_desc[4] = ,
, ,,};
static struct input_dev *buttons_dev;
static struct pin_desc *irq_pd;
static struct timer_list buttons_timer;
static irqreturn_t buttons_irq(int irq, void *dev_id)
static void buttons_timer_function(unsigned long data)
else }
static int buttons_init(void)
return 0;
}static void buttons_exit(void)
del_timer(&buttons_timer);
input_unregister_device(buttons_dev);
input_free_device(buttons_dev);
}module_init(buttons_init);
module_exit(buttons_exit);
module_license("gpl");
Linux裝置驅動 input輸入子系統
不同的輸入裝置 如按鍵 鍵盤 觸控螢幕 滑鼠等 都有它們的差異性 如中斷 讀鍵值 座標值是裝置相關的 及共同性 如輸入事件的緩衝區管理以及字元裝置驅動的file operations介面則對輸入裝置是通用的 因此在linux核心中設計了input輸入子系統來完成輸入裝置之間的共性工作,而我們只需要使...
LINUX裝置驅動之輸入子系統 二
eric fang 2010 02 03 本站分析linux核心原始碼,版本號為2.6.32.3 二 input handler的註冊 在input device的註冊中存在下列疑問 1,匹配dev和handler時,input handler list上的handler是什麼時候掛上去的呢?2,匹...
LINUX裝置驅動之輸入子系統 二
二 input handler的註冊 在input device的註冊中存在下列疑問 1,匹配dev和handler時,input handler list上的handler是什麼時候掛上去的呢?2,匹配成功後會呼叫相應handler的connect函式,此函式做了什麼事?帶著這兩個疑問,我們以鍵盤...