linux輸入子系統

來源:互聯網
上載者:User
輸入子系統由 驅動層、輸入子系統核心、事件處理層 三部分組成。一個輸入事件,如滑鼠移動、鍵盤按下等通過Driver->Inputcore->Event handler->userspace的順序到達使用者控制項的應用程式。

 

 

 

 

驅動層:將底層的硬體輸入轉化為統一事件形式,想輸入核心(Input Core)彙報。

 

輸入子系統核心:承上啟下。為驅動層提供輸入裝置註冊與操作介面,如:input_register_device;通知事件處理層對事件進行處理;在/Proc下產生相應的裝置資訊

 

 

 

事件處理層:主要是和使用者空間互動。(Linux中在使用者空間將所有的裝置都當初檔案來處理,由於在一般的驅動程式中都有提供fops介面,以及在/dev下產生相應的裝置檔案nod,這些操作在輸入子系統中由事件處理層完成)

 

 

裝置描述:

input_dev結構

 

實現裝置驅動核心工作是:向系統報告按鍵、觸控螢幕等輸入事件(event,通過input_event結構描述),不再需要關心檔案操作介面。驅動報告事件經過inputCore和Eventhandler到達使用者空間。

 

 

註冊輸入裝置函數:

int input_register_device(struct input_dev *dev)

 

登出輸入裝置函數:

void input_unregister_device(struct input_dev *dev)

 

驅動實現——初始化(事件支援):

set_bit()告訴input輸入子系統支援哪些事件,哪些按鍵。例如:

 

set_bit(EV_KEY,button_dev.evbit)  (其中button_dev是struct
input_dev類型)

struct input_dev中有兩個成員為:

evbit:

事件類型(包括

EV_RST,EV_REL,EV_MSC,EV_KEY,EV_ABS,EV_REP等)

keybit:

按鍵類型(當事件類型為EV_KEY時包括

BTN_LEFT,BTN_0,BTN_1,BTN_MIDDLE等)

 

驅動實現——報告事件:

用於報告EV_KEY,EV_REL,EV_ABS事件的函數分別為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)

 

驅動實現——報告結束:

input_sync()同步用於告訴input core子系統報告結束。

 

執行個體:觸控螢幕裝置驅動中,一次點擊的整個報告過程如下:

input_reprot_abs(input_dev,ABS_X,x);   //x座標

input_reprot_abs(input_dev,ABS_Y,y);   // y座標

input_reprot_abs(input_dev,ABS_PRESSURE,1);

input_sync(input_dev);//同步結束

 

 

執行個體分析(按鍵中斷程式):

//按鍵初始化

static int __init button_init(void)

{//申請中斷

if(request_irq(BUTTON_IRQ,button_interrupt,0,”button”,NUll))

      return –EBUSY;

set_bit(EV_KEY,button_dev.evbit); //支援EV_KEY事件

 

set_bit(BTN_0,button_dev.keybit); //支援裝置兩個鍵

 

set_bit(BTN_1,button_dev.keybit); //

 

input_register_device(&button_dev);//註冊input裝置

}

/*在按鍵中斷中報告事件*/

Static void button_interrupt(int irq,void *dummy,struct pt_regs *fp)

{

input_report_key(&button_dev,BTN_0,inb(BUTTON_PORT0));//讀取寄存器BUTTON_PORT0的值

input_report_key(&button_dev,BTN_1,inb(BUTTON_PORT1));

input_sync(&button_dev);

}

總結:input子系統仍然是字元裝置驅動程式,但是代碼量減少很多,input子系統只需要完成兩個工作:初始化和附隨報告(這裡在linux中是通過中斷來實現的)。讀者不妨用sourceinsignt 輸入input_init去搜關於輸入子系統的實現

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.