天天看點

linux輸入子系統簡述【轉】

1,linux輸入子系統簡述

    其實驅動這部分大多還是轉載别人的,linux輸入子系統後面再詳細分析。

在Linux中,輸入子系統是由輸入子系統裝置驅動層、輸入子系統核心層(InputCore)和輸入子系統事件處理層(Event Handler)組成。其中裝置驅動層提供對硬體各寄存器的讀寫通路和将底層硬體對使用者輸入通路的響應轉換為标準的輸入事件,再通過核心層送出給事件處理層;而核心層對下提供了裝置驅動層的程式設計接口,對上又提供了事件處理層的程式設計接口;而事件處理層就為我們使用者空間的應用程式提供了統一通路裝置的接口和驅動層送出來的事件處理。是以這使得我們輸入裝置的驅動部分不在用關心對裝置檔案的操作,而是要關心對各硬體寄存器的操作和送出的輸入事件。下面用圖形來描述一下這三者的關系吧!

輸入子系統與驅動關系

2、輸入子系統裝置驅動層實作原理

   在Linux中,Input裝置用input_dev結構體描述,定義在input.h中。裝置的驅動隻需按照如下步驟就可實作了。

(1)、在驅動子產品加載函數中設定Input裝置支援input子系統的資料;

(2)、将Input裝置注冊到input子系統中;

(3)、在Input裝置發生輸入操作時(如:鍵盤被按下/擡起、觸摸屏被觸摸/擡起/移動、滑鼠被移動/單擊/擡起時等),送出所發生的事件及對應的鍵值/坐标等狀态。

Linux中輸入裝置的事件類型有(這裡隻列出了常用的一些,更多請看linux/input.h中):

[cpp] view plain copy

  1. EV_SYN     0x00     同步事件
  2. EV_KEY     0x01     按鍵事件
  3. EV_REL     0x02     相對坐标(如:滑鼠移動,報告的是相對最後一次位置的偏移)
  4. EV_ABS     0x03     絕對坐标(如:觸摸屏和操作杆,報告的是絕對的坐标位置)
  5. EV_MSC     0x04     其它
  6. EV_LED     0x11     LED
  7. EV_SND     0x12     聲音
  8. EV_REP     0x14     Repeat
  9. EV_FF      0x15     力回報

用于送出較常用的事件類型給輸入子系統的函數有:

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系統,裝置驅動已經發出了一個完整的報告:
void input_sync(struct input_dev *dev)      

繼續閱讀