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...