linux輸入子系統(input subsystem)
1.1.input子系統概述
輸入裝置(如按鍵,鍵盤,觸控螢幕,滑鼠等)是典型的字元裝置,其一般的工作機制是低層在按鍵,觸控等動作發生時產生乙個中斷(或驅動通過timer定時查詢),然後cpu通過spi,i2c或者外部儲存器匯流排讀取鍵值,座標等資料,放乙個緩衝區,字元裝置驅動管理該緩衝區,而驅動的read()介面讓使用者可以讀取鍵值,座標等資料。
在linux中,輸入子系統是由輸入子系統裝置驅動層、輸入子系統核心層(input core)和輸入子系統事件處理層(event handler)組成。其中裝置驅動層提供對硬體各暫存器的讀寫訪問和將底層硬體對使用者輸入訪問的響應轉換為標準的輸入事件,再通過核心層提交給事件處理層;而核心層對下提供了裝置驅動層的程式設計介面,對上又提供了事件處理層的程式設計介面;而事件處理層就為我們使用者空間的應用程式提供了統一訪問裝置的介面和驅動層提交來的事件處理。所以這使得我們輸入裝置的驅動部分不在用關心對裝置檔案的操作,而是要關心對各硬體暫存器的操作和提交的輸入事件。
1.2. input子系統結構圖
input子系統結構圖如下圖1所示:
圖1 輸入子系統結構圖
1.3.linux中輸入裝置驅動的分層
linux中輸入裝置驅動的分層如下圖2所示:
圖2 linux中輸入裝置的分層
1.4. 輸入子系統裝置驅動層實現原理
在linux中,input裝置用input_dev結構體描述,定義在input.h中。裝置的驅動只需按照如下步驟就可實現了。
1).在驅動模組載入函式中設定input裝置支援input子系統的哪些事件;
2).將input裝置註冊到input子系統中;
3).在input裝置發生輸入操作時(如:鍵盤被按下/抬起、觸控螢幕被觸控/抬起/移動、滑鼠被移動/單擊/抬起時等),提交所發生的事件及對應的鍵值/座標等狀態。
1.5.軟體設計流程
軟體設計流程如下圖3所示
圖 3 input子系統軟體設計流程
1.6.與軟體設計有關的api函式
1.6.1.分配乙個輸入裝置
struct input_dev *input_allocate_device*(void);
1.6.2.註冊乙個輸入裝置
int input_register_device(struct input_dev *dev);
1.6.3.驅動實現-事件支援
set_bit告訴inout子系統它支援哪些事件
set_bit(ev_key,button_dev.evbit)
struct input_dev中有兩個成員,乙個是evbit;乙個是keybit.分別用來表示裝置所支援的事件型別和按鍵型別。
1.6.3.1事件型別
linux中輸入裝置的事件型別有(這裡只列出了常用的一些,更多請看linux/input.h中):ev_syn 0x00 同步事件
ev_key 0x01 按鍵事件
ev_rel 0x02 相對座標
ev_abs 0x03 絕對座標
ev_msc 0x04 其它
ev_led 0x11 led
ev_snd 0x12 聲音
ev_rep 0x14 repeat
ev_ff 0x15 力反饋
1.6.4.驅動實現-報告事件
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_report_abs(input_dev,abs_x,x);//x座標
input_report_abs(input_dev,abs_y,y);//y座標
input_report_abs(input_dev,abs_pressure,pres);//壓力
input_sync(struct input_dev *dev);//同步
1.6.5釋放與登出裝置
void input_free_device(struct input_dev *dev);
void input_unregister_device(struct input_dev *);
**:
linux裝置驅動那點事兒之平台裝置理論篇
一 platform匯流排 1.1概述 乙個現實的linux裝置驅動通常需要掛接在一種匯流排上,對於本身依附於pci,usb,iic,spi等的裝置而言,這自然不是問題,但是在嵌入式系統裡面,soc系統中整合的獨立的外設控制器,掛接在soc記憶體空間的外設等確不依附於此類匯流排。基於這一背景,lin...
Linux裝置驅動之《字元裝置驅動》
linux裝置中最大的特點就是裝置操作猶如檔案操作一般,在應用層看來,硬體裝置只是乙個裝置檔案。應用程式可以像操作檔案一樣對硬體裝置進行操作,如open close read write 等。下面是乙個字元裝置驅動程式的簡單實現test.c 模組分析 1.初始化裝置驅動的結構體 struct fil...
Linux裝置驅動之字元裝置驅動
一 linux裝置的分類 linux系統將裝置分成三種基本型別,每個模組通常實現為其中某一類 字元模組 塊模組或網路模組。這三種型別有 字元裝置 字元裝置是個能夠像位元組流 類似檔案 一樣被訪問的裝置,由字元裝置驅動程式來實現這種特性。字元裝置可以通過檔案系統節點來訪問,比如 dev tty1等。這...