input子系統介紹
Linux內核為了能夠處理各種不同類型的輸入設備,比如: 觸摸屏 ,鼠標 , 鍵盤 , 操縱桿等設備 ,設計并實現了Linux 輸入子系統 ,它為驅動和應用提供了統一的接口函數,方便實現各種輸入設備的驅動。
input子系統架構

(1)驅動層功能 :負責和底層的硬件設備打交道,將底層硬件設備對用戶輸入的響應轉換為標準的輸入事件以后再向上發送給輸入子系統核心層。
(2)Input系統核心層 :由driver/input/input.c及相關頭文件實現,它對下提供了設備驅動層的接口,對上提供了事件處理層的編程接口。
(3)事件處理層 :將硬件設備上報的事件分發到用戶空間和內核。
重要結構體
- input_dev
//輸入設備
struct input_dev {
const char *name; //設備名稱
const char *phys; //設備的物理路徑
const char *uniq; //唯一ID
struct input_id id; //輸入ID
unsigned long propbit[BITS_TO_LONGS(INPUT_PROP_CNT)]; //設備屬性
//所支持的input事件,(鍵盤, 按鍵,坐標等)
unsigned long evbit[BITS_TO_LONGS(EV_CNT)]; //事件類型
//下面是根據具體設備來決定設置哪些
unsigned long keybit[BITS_TO_LONGS(KEY_CNT)]; //按鍵
unsigned long relbit[BITS_TO_LONGS(REL_CNT)]; //相對坐標
unsigned long absbit[BITS_TO_LONGS(ABS_CNT)]; //絕對坐標
unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)]; //其他事件(混雜事件)
unsigned long ledbit[BITS_TO_LONGS(LED_CNT)]; //帶LED
unsigned long sndbit[BITS_TO_LONGS(SND_CNT)]; //音效
unsigned long ffbit[BITS_TO_LONGS(FF_CNT)]; //力反饋效果
unsigned long swbit[BITS_TO_LONGS(SW_CNT)]; //帶開關
unsigned int hint_events_per_packet; //每個包中的平均事件數
unsigned int keycodemax;
unsigned int keycodesize;
void *keycode; //掃描碼到鍵碼的映射
int (*setkeycode)(struct input_dev *dev,
const struct input_keymap_entry *ke,
unsigned int *old_keycode);
int (*getkeycode)(struct input_dev *dev,
struct input_keymap_entry *ke);
struct ff_device *ff;
unsigned int repeat_key; //保存上次按下的按鍵
struct timer_list timer;
int rep[REP_CNT];
struct input_mt *mt; //多點觸摸狀態
struct input_absinfo *absinfo; //絕對坐標信息
//保存設備的當前狀態
unsigned long key[BITS_TO_LONGS(KEY_CNT)];
unsigned long led[BITS_TO_LONGS(LED_CNT)];
unsigned long snd[BITS_TO_LONGS(SND_CNT)];
unsigned long sw[BITS_TO_LONGS(SW_CNT)];
int (*open)(struct input_dev *dev);
void (*close)(struct input_dev *dev);
int (*flush)(struct input_dev *dev, struct file *file);
int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value);
struct input_handle __rcu *grab;
spinlock_t event_lock;
struct mutex mutex;
unsigned int users;
bool going_away;
struct device dev; //設備
struct list_head h_list;
struct list_head node;
unsigned int num_vals;
unsigned int max_vals;
struct input_value *vals;
};
input_dev代表了一個輸入設備,結構體里面就是保存了輸入設備的信息,以及不同輸入設備的不同事件。
API函數
//分配一個輸入設備
struct input_dev *input_allocate_device(void)
//釋放輸入設備
void input_free_device(struct input_dev *dev)
//注冊輸入設備到輸入核心層
int input_register_device(struct input_dev *dev)
//注銷輸入設備
void input_unregister_device(struct input_dev *dev)
/*
報告輸入事件
參數說明:
dev: 產生事件的設備
type: 事件的類型
code:事件碼
value:事件的值
*/
void input_event(struct input_dev *dev,
unsigned int type, unsigned int code, int value)
//報告按鍵事件,內部調用input_event
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)
//用來設置設備所產生的事件以及上報的按鍵值
#define set_bit(nr,p) ATOMIC_BITOP(set_bit,nr,p)
#define clear_bit(nr,p) ATOMIC_BITOP(clear_bit,nr,p)
輸入設備事件類型
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 //力反饋
EV_PWR //電源
EV_FF_STATUS //狀態
每個事件類型下面會有一些事件碼(Event Codes),它會更精準的描述事件類型。
總結
輸入設備驅動的內容并不多,主要還是要對設備的工作原理有深入的了解,才能編寫對應驅動。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
內核
+關注
關注
4文章
1468瀏覽量
42880 -
Linux
+關注
關注
88文章
11760瀏覽量
219046 -
鍵盤
+關注
關注
4文章
872瀏覽量
41890 -
子系統
+關注
關注
0文章
115瀏覽量
13505 -
結構體
+關注
關注
1文章
131瀏覽量
11372
發布評論請先 登錄
相關推薦
熱點推薦
關于Linux設備驅動中input子系統的介紹
對于輸入類設備如鍵盤、鼠標、觸摸屏之類的Linux驅動,內核提供input子系統,使得這類設備的處理變得非常便捷??傮w上來講,input子系統由三部分組成: 事件驅動
發表于 01-09 16:06
?3070次閱讀
飛凌嵌入式ElfBoard ELF 1板卡-input子系統之input子系統簡介
在Linux系統中,Input子系統是一個用于處理輸入設備的軟件框架。它提供了一種統一的接口和機制,使得各種輸入設備(如鍵盤、鼠標、觸摸屏、游戲手柄等)能夠與Linux系統進行交互。
發表于 04-15 10:27
嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-input子系統之input子系統簡介
在Linux系統中,Input子系統是一個用于處理輸入設備的軟件框架。它提供了一種統一的接口和機制,使得各種輸入設備(如鍵盤、鼠標、觸摸屏、游戲手柄等)能夠與Linux系統進行交互。
發表于 04-15 10:42
linux驅動-Input輸入子系統
以前,看過國嵌關于input子系統的視頻課程,說實話,我看完后腦子里很亂,給我的印象好像是input子系統驅動是一個全新的驅動架構,疑惑相當
發表于 05-21 00:05
Linux設備驅動之input子系統
作者:武漢華嵌嵌入式培訓中心講師李老師對于輸入類設備如鍵盤、鼠標、觸摸屏之類的Linux驅動,內核提供input子系統,使得這類設備的處理變得非常便捷。總體上來講,input子系統由三
發表于 03-15 15:28
如何使用Linux內核中的input子系統
輸入設備總類繁雜,包括按鍵,鍵盤,觸摸屏,鼠標,搖桿等等,它們本身都是字符設備,不過內核為了能將這些設備的共性抽象出來,簡化驅動的開發,建立了一個 Input 子系統。用戶只需要根據內核提供
發表于 12-29 07:20
迅為i.MX6ULL終結者Linux INPUT子系統實驗Input子系統
文章目錄1 input子系統簡介2 input驅動程序編寫流程3 input_event結構體1 input
發表于 01-11 10:41
介紹下input子系統
文章目錄前言input子系統按鍵檢測C代碼微信公眾號前言這是前3篇:嵌入式Linux i.MX開發板嵌入式Linux NFS嵌入式Linux 交叉編譯工具鏈嵌入式Linux LED GPIO本篇介紹
發表于 11-04 08:14
【OpenHarmony資料合集】Sensor子系統/圖形子系統/Ability子系統介紹
,移動互聯網的快速發展,在數字時代,傳感器在智能交通,智能工業,智能穿戴等領域有著廣闊的應用空間?! ?.1 OpenHarmony架構圖 2、OpenHarmony資料合集之圖形子系統 標準系統的圖形
發表于 03-14 16:35
Linux input 子系統范例和基本函數解析
*/ /*中斷處理函數*/ static irqreturn_t button_interrupt(int irq, void *dummy) { /*向輸入子系統報告產生按鍵事件*/ input_report_key(button_dev, BTN_0, inb(BUT
發表于 11-21 14:58
?2659次閱讀
詳細了解Linux設備模型中的input子系統
linux輸入子系統(linux input subsystem)從上到下由三層實現,分別為:輸入子系統事件處理層(EventHandler)、輸入子系統核心層(InputCore)和
發表于 05-12 09:04
?1363次閱讀
驅動之路-input子系統
一、input子系統系統框架Linux內核實現了一套input子系統,很多輸入設備,比如說按鍵、鍵盤、鼠標、觸摸屏等等都可以
發表于 04-02 14:33
?888次閱讀
OpenHarmony Dev-Board-SIG專場:OpenHarmony音頻子系統以及相機子系統架構
OpenHarmony Dev-Board-SIG專場:OpenHarmony音頻子系統以及相機子系統架構
Linux驅動學習筆記:input子系統機制
input子系統所有的設備主設備號都是13,在使用input系統的時候不需要去注冊字符設備,只需要向系統申請一個
發表于 06-23 14:28
?3555次閱讀
input子系統介紹和架構
評論