linux裝置驅動 輸入子系統

2021-06-23 06:12:26 字數 1655 閱讀 3679

輸入裝置都能用輸入子系統來寫,比如說按鍵、觸控螢幕、滑鼠等,但是有的輸入裝置不止用到了輸入子系統,比如說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函式,此函式做了什麼事?帶著這兩個疑問,我們以鍵盤...