按鍵、滑鼠、鍵盤、觸控螢幕都屬於輸入裝置,針對這些裝置linux核心提供了乙個叫做input的子系統框架來處理輸入時間,本質上還是字元裝置,只是在此基礎上加上了input框架,使用者只需要負責上報輸入事件,input核心層負責處理這些事件。
input子系統分為input驅動層、input核心層、input事件處理層,最終給使用者空間提供可訪問的裝置節點。採用了驅動分層模型,系統框圖如下:
這三層的分工如下:
驅動層:輸入裝置的具體驅動程式,比如按鍵驅動程式,向核心層報告輸入內容
核心層:為驅動層提供裝置註冊和操作介面,通知事件層對輸入事件進行處理
事件層:主要和使用者控制項進行互動
input核心層會向linux核心註冊乙個字元裝置,drivers/input/input.c就是input輸入子系統的核心層,系統啟動後,會在sys/class下有乙個input目錄。
input子系統所有的裝置的主裝置號是13。因此我們在使用input子系統處理輸入裝置就不需要註冊字元裝置了,我們只需要向系統註冊乙個input裝置即可。
input_dev結構體表示input裝置,需要先使用input_allocate_device函式申請乙個input_dev結構體,
結構體定義如下:
evbit表示輸入事件型別,有以下事件
申請好乙個input_dev以後需要初始化這個input_dev,需要初始化的內容主要為事件型別和事件值,初始化完需要向linux核心註冊input_dev,使用input_register_device函式
釋放input裝置使用input_free_device函式
登出input裝置使用input_unregister_device函式
整體流程如下:
使用input_allocate_deevice函式申請乙個input_dev結構體;
初始化input_dev的事件型別以及事件值
使用input_register_device函式向linux系統註冊初始化好的input_dev
解除安裝input驅動時先使用input_unregister_device函式登出input_dev,再使用input_free_device函式釋放點之前申請的input_dev結構體。
在向linux核心註冊好input_dev後還需要獲取具體的輸入值,或者是輸入事件,然後將輸入事件上報給linux核心,一般可以在中斷處理函式或者定時器中斷處理函式中上報給linux核心,這樣linux核心才能獲取正確輸入值。不同的事件,上報事件的函式不同。
input_event函式,此函式用於上報指定事件以及對應的值,函式如下:
input_evnet函式可以上報所有的事件型別和事件值,其他針對具體事件的上報函式最終都會呼叫input_event函式。
當上報事件以後可以使用input_sync函式來告知linux核心input子系統上報結束,本質上是上報乙個同步事件。
**如下:
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define keyinput_name "keyinput"
#define key0value 0x01
#define invakey 0xff
/*中斷io描述結構體*/
struct irq_keydesc;
/*keyinput裝置結構體*/
struct keyinput_dev;
struct keyinput_dev keyinputdev;
static irqreturn_t key0_handler(int irq,void *dev_id)
static void timer_function(unsigned long arg)else
}static int keyio_init(void)
keyinputdev.irqkeydesc.gpio = of_get_named_gpio(keyinputdev.nd,"key-gpios",0);
if(keyinputdev.irqkeydesc.gpio<0)
sprintf(keyinputdev.irqkeydesc.name,"key0");
gpio_request(keyinputdev.irqkeydesc.gpio,keyinputdev.irqkeydesc.name);
gpio_direction_input(keyinputdev.irqkeydesc.gpio);
/*獲取中斷號*/
keyinputdev.irqkeydesc.irqnum = irq_of_parse_and_map(keyinputdev.nd,0);
/*申請中斷*/
keyinputdev.irqkeydesc.handler = key0_handler;
keyinputdev.irqkeydesc.value = key0value;
ret = request_irq(keyinputdev.irqkeydesc.irqnum,keyinputdev.irqkeydesc.handler,
irqf_trigger_falling|irqf_trigger_rising,
keyinputdev.irqkeydesc.name,&keyinputdev);
if(ret < 0)
/*建立定時器*/
init_timer(&keyinputdev.timer);
keyinputdev.timer.function = timer_function;
/*申請input dev*/
keyinputdev.input_dev = input_allocate_device();
keyinputdev.input_dev->name = keyinput_name;
keyinputdev.input_dev->evbit[0] = bit_mask(ev_key)|bit_mask(ev_rep);
keyinputdev.input_dev->keybit[bit_word(key_0)] |= bit_mask(key_0);
ret = input_register_device(keyinputdev.input_dev);
if(ret)
return 0;
}static int __init keyinput_init(void)
static void __exit keyinput_exit(void)
module_init(keyinput_init);
module_exit(keyinput_exit);
module_license("gpl");
module_author("huachao");
Linux Input子系統 概述
輸入裝置總類繁雜,包括按鍵,鍵盤,觸控螢幕,滑鼠,搖桿等等,它們本身都是字元裝置,不過核心為了能將這些裝置的共性抽象出來,簡化驅動的開發,建立了乙個input子系統。input子系統分為三層,從下至上分別是輸入裝置驅動層,輸入核心層以及輸入事件驅動層。這三層中的輸入核心層和輸入事件驅動層都是核心已經...
linux input 子系統例項分析
一,前言 1,近日要寫乙個很特殊的鍵盤驅動,故對linux的input子系統分析了一番,寫下分析筆記,以防不日即忘。2,使用input子系統的一般流程為 input allocate device 申請乙個input dev裝置 初始化該input dev input register device...
linux input子系統驅動(一)
linux input子系統分析 概述與資料結構 input子系統處理輸入事務,任何輸入裝置的驅動程式都可以通過input輸入子系統提供的介面註冊到核心,利用子系統提供的功能來與使用者空間互動。輸入裝置一般包括鍵盤,滑鼠,觸控螢幕等,在核心中都是以輸入裝置出現的。下面分析input輸入子系統的結構,...