Linux INPUT子系統實驗

2021-10-08 16:18:18 字數 3868 閱讀 8993

按鍵、滑鼠、鍵盤、觸控螢幕都屬於輸入裝置,針對這些裝置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輸入子系統的結構,...