Linux 輸入子系統分析(二)

2021-10-21 08:25:52 字數 3482 閱讀 8634

linux 輸入子系統分析(一)

linux 輸入子系統分析(二)

分析乙個核心提供的input_handler

input_dev驅動程式的工作主要是:申請一些硬體資源,如註冊中斷等,申請input_dev並設定,然後呼叫核心層提供的input_register_device函式進行註冊。

裝置有資料時,呼叫input_event函式向核心層報告事件,如鍵盤按下,讀取按鍵值,然後上報事件。

前面提到input_dev會與input_handler進行匹配,具體怎麼匹配呢?呼叫input_register_device函式註冊input_dev時會進行匹配的,該函式定義如下:

int

input_register_device

(struct input_dev *dev)

input_dev與input_handler的匹配:

static

intinput_attach_handler

(struct input_dev *dev,

struct input_handler *handler)

input_match_device:

static

const

struct input_device_id *

input_match_device

(struct input_handler *handler,

struct input_dev *dev)

return

null

;}

總結下input_register_device函式,執行流程圖如下:

裝置上報事件後,核心層會轉交給input_handler處理,下面通過分析input_event函式看看其中的一些細節,input_event函式的整體執行流程如下:

原始碼分析

/* type,上報的事件型別

code,上報的事件

value,事件的value,如按鍵按下value為1,按鍵鬆開value為0

*/void

input_event

(struct input_dev *dev,

unsigned

int type,

unsigned

int code,

int value)

}

input_handle_event:

static

void

input_handle_event

(struct input_dev *dev,

unsigned

int type,

unsigned

int code,

int value)

input_pass_values:

static

void

input_pass_values

(struct input_dev *dev,

struct input_value *vals,

unsigned

int count)

else

}rcu_read_unlock()

;/* input_dev的evbit設定了ev_rep和ev_key,表示該輸入裝置是鍵盤類裝置,且支援長按

什麼情況下表示長按呢?如下例子:

input_event(dev, ev_key, key_l, 1),傳入的value為1,表示按下,之後會通過定時器實現不斷

地繼續上報該事件,直到input_event(dev, ev_key, key_l, 0)為止

*/if(

test_bit

(ev_rep, dev->evbit)

&&test_bit

(ev_key, dev->evbit))}

}}

input_to_handler:

static

unsigned

intinput_to_handler

(struct input_handle *handle,

struct input_value *vals,

unsigned

int count)

count = end - vals;}if

(!count)

return0;

//最終呼叫input_handle->events函式進行處理事件

if(handler->events)

handler->

events

(handle, vals, count)

;else

if(handler->event)

for(v = vals; v != vals + count; v++

) handler->

event

(handle, v->type, v->code, v->value)

;return count;

}

裝置上報的事件交由input_handler處理後,如果該是鍵盤類裝置會涉及長按等情況,核心通過定時器實現長按。

input_start_autorepeat:

static

void

input_start_autorepeat

(struct input_dev *dev,

int code)

}static

void

input_repeat_key

(unsigned

long data)

, input_value_sync

};//繼續執行input_pass_values

input_pass_values

(dev, vals,

array_size

(vals));

//重新修改時間

if(dev->rep[rep_period]

)mod_timer

(&dev->timer, jiffies +

msecs_to_jiffies

(dev->rep[rep_period]))

;}spin_unlock_irqrestore

(&dev->event_lock, flags);}

//直到input_event(..., 0)

static

void

input_stop_autorepeat

(struct input_dev *dev)

Linux輸入子系統分析一

輸入裝置分散不堪,用input子系統可以對分散的,不同類別的輸入裝置進行統一驅動。好處 1.統一了物理形態各異的輸入裝置相似的裝置處理,例如各種滑鼠,鍵盤,觸控螢幕。2.提供了用於分發輸入報告給使用者應用程式的簡單事件介面。你的驅動不必建立管理 dev節點以及相關的訪問方法。因此他能夠很方便的呼叫輸...

input輸入子系統分析

1.檢視input子系統支援哪些裝置 cat proc bus input devices 2.應用程式如何使用 fd mouse open dev input event0 o rdwr event1表示滑鼠事件,input下的裝置檔案主裝置號都為13,如下圖所示 根據開啟裝置的主裝置號為13,知...

pinctrl子系統分析(二)

pinctrl子系統分析 一 pinctrl子系統分析 二 pinctrl子系統分析 三 pin控制器驅動的主要工作是,列舉pin控制器的資訊,如控制器有多少個引腳,支援多少個function,每個function對應幾個group,支援多少個group等,建立table儲存這些資訊,最後呼叫pin...