Linux裝置驅動之 input子系統

2021-06-25 14:19:54 字數 3991 閱讀 5177

什麼是input

input子系統處理輸入事務,任何輸入裝置的驅動程式都可以通過input輸入子系統提供的介面註冊到核心,利用子系統提供的功能來與使用者空間互動。輸入裝置一般包括鍵盤,滑鼠,觸控螢幕等,在核心中都是以輸入裝置出現的。下面分析input輸入子系統的結構,以及功能實現。

linux中input系統主裝置號是13

次裝置號: 

0-31      

joystick(遊戲杆)

32-62mouse(滑鼠)

63   mice(滑鼠)

64-95     

事件(event)裝置

input子系統的結構1. input子系統是分層結構的,總共分為三層: 硬體驅動層,子系統核心層,事件處理層。

(1)其中硬體驅動層負責操作具體的硬體裝置,這層的**是針對具體的驅動程式的,需要驅動程式的作者來編寫。

(2)子系統核心層是鏈結其他兩個層之間的紐帶與橋梁,向下提供驅動層的介面,向上提供事件處理層的介面。

(3)事件處理層負責與使用者程式打交道,將硬體驅動層傳來的事件報告給使用者程式。

2.input子系統的三個重要結構體:

input_dev 是硬體驅動層,代表乙個input裝置

input_handler 是事件處理層,代表乙個事件處理器

input_handle 個人認為屬於核心層,代表乙個配對的input裝置與input事件處理器

輸入事件

各層之間通訊的基本單位就是事件,任何乙個輸入裝置的動作都可以抽象成一種事件,如鍵盤的按下,觸控螢幕的按下,滑鼠的移動等。事件有三種屬性:型別(type),編碼(code),值(value),input子系統支援的所有事件都定義在input.h中,包括所有支援的型別,所屬型別支援的編碼等。事件傳送的方向是 硬體驅動層-->子系統核心-->事件處理層-->使用者空間

裝置有著自己特殊的按鍵鍵碼,我需要將一些標準的按鍵,比如0-9,x-z等模擬成標準按鍵,比如key_0,key-z等,所以需要用到按鍵模擬,具體 方法就是操作/dev/input/event1檔案,向它寫入個input_event結構體就可以模擬按鍵的輸入了。

linux/input.h中有定義,這個檔案還定義了標準按鍵的編碼等

struct input_event ;

code:

事件的**.如果事件的型別**是ev_key,該**code為裝置鍵盤**.**植0~127為鍵盤上的按鍵**,0x110~0x116 為滑鼠上按鍵**,其中0x110(btn_ left)為滑鼠左鍵,0x111(btn_right)為滑鼠右鍵,0x112(btn_ middle)為滑鼠中鍵.其它**含義請參看include/linux/input.h檔案. 如果事件的型別**是ev_rel,code值表示軌跡的型別.如指示滑鼠的x軸方向rel_x(**為0x00),指示滑鼠的y軸方向rel_y(** 為0x01),指示滑鼠中輪子方向rel_wheel(**為0x08).

value:

事件的值.如果事件的型別**是ev_key,當按鍵按下時值為1,鬆開時值為0;如果事件的型別**是ev_ rel,value的正數值和負數值分別代表兩個不同方向的值.

type: /*

* event types

功能實現

*/#define ev_syn

0x00 // 

表示裝置支援所有的事件

#define ev_key 

0x01 // 鍵盤或者按鍵,表示乙個鍵碼

#define ev_rel 

0x02 // 滑鼠裝置,表示乙個相對的游標位置結果(相對座標)

#define ev_abs 

0x03 // 手寫板產生的值,其是乙個絕對整數值

#define ev_msc 

0x04 // 其他型別

#define ev_sw  

0x05 //

#define ev_led 

0x11 // led燈裝置

#define ev_snd 

0x12 // 輸入聲音

#define ev_rep 

0x14 // 允許重複按鍵型別

#define ev_ff  

0x15 //

#define ev_pwr 

0x16 // 電源管理事件

#define ev_ff_status

0x17

#define ev_max 

0x1f

有哪些api

分配/釋放乙個輸入裝置:

struct input_dev *input_allocate_device(void);

void input_free_device(struct input_dev *dev);

註冊/登出輸入裝置:

int __must_check input_register_device(struct input_dev *);

void input_unregister_device(struct input_dev *);

報告輸入事件:

void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value);/* 報告指定type、code的輸入事件 */

void input_report_key(struct input_dev *dev, unsigned int code, int value);

/* 報告鍵值 */

void input_report_rel(struct input_dev *dev, unsigned int code, int value);

/* 報告相對座標 */

void input_report_abs(struct input_dev *dev, unsigned int code, int value);

/* 報告絕對座標 */

void input_sync(struct input_dev *dev)

;/* 報告同步事件 */

input驅動編寫步驟

1.分配乙個輸入裝置;

2.註冊乙個輸入裝置;

3.驅動支援什麼事件;

set_bit告訴inout子系統它支援哪些事件

set_bit(ev_key,button_dev.evbit)

struct input_dev中有兩個成員,乙個是evbit;乙個是keybit.分別用來表示裝置所支援的事件型別和按鍵型別。

4.驅動事件報告;

5.釋放和登出裝置;

**:

Linux核心驅動之Input子系統裝置驅動層

android x windows qt等眾多應用對於linux系統中鍵盤 滑鼠 觸控螢幕等輸入裝置的支援都通過 或越來越傾向於標準的input輸入子系統。因為input子系統已經完成了字元驅動的檔案操作介面,所以編寫驅動的核心工作是完成input系統留出的介面,工作量不大。但如果你想更靈活的應用它...

Linux裝置驅動 input輸入子系統

不同的輸入裝置 如按鍵 鍵盤 觸控螢幕 滑鼠等 都有它們的差異性 如中斷 讀鍵值 座標值是裝置相關的 及共同性 如輸入事件的緩衝區管理以及字元裝置驅動的file operations介面則對輸入裝置是通用的 因此在linux核心中設計了input輸入子系統來完成輸入裝置之間的共性工作,而我們只需要使...

Linux裝置驅動開發 input子系統

基於linux 2.6.22.6核心,arm9 s3c2440開發板 原始碼分析 drivers input input.c input init err register chrdev input major,input input fops static const struct file op...