04 Linux輸入子系統

2021-09-01 23:39:30 字數 3848 閱讀 6909

input 子系統層次框架

輸入(input)子系統是分層架構的,總共分為 3 層,從上到下分別是:事件處理層(event handler)、輸入子系統核心層(input core)、硬體驅動層(input driver)。

硬體驅動層負責操作具體的硬體裝置,這層的**是針對具體的驅動程式的,比如你的裝置是觸控輸入裝置,還是滑鼠輸入裝置,還是鍵盤輸入裝置,這些不同的裝置,自然有不同的硬體操作,驅動工程師往往只需要完成這層的**編寫。

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

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

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

三個重要的結構體

struct input_dev
evbit[bits_to_longs(ev_cnt)]陣列, 這個陣列以位掩碼的形式,代表了這個裝置支援哪類事件,比如:

#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

#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

#define ev_cnt (ev_max+1)

keybit[bits_to_longs(key_cnt)]陣列,這個陣列也是以位掩碼的形式,代表這個裝置支援哪些按鍵,比如:

#define key_esc 		1

#define key_1 2

#define key_2 3

#define key_3 4

#define key_tab 15

#define key_enter 28

#define key_a 30

#define key_b 48

#define key_c 46

……

relbit[bits_to_longs(rel_cnt)]陣列,這個陣列也是以位掩碼的形式,代表這個裝置支援哪些相對位移事件,比如:

#define abs_x 	0x00

#define abs_y 0x01

struct input_handler ;
struct input_handle ;
/* 向核心註冊乙個 input 裝置 */

int input_register_device(struct input_dev *dev)

/* 向核心註冊乙個事件處理器 */

int input_register_handler(struct input_handler *handler)

/* 向核心註冊乙個 handle 結構 */

int input_register_handle(struct input_handle *handle)

初始化

上報

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include struct input_dev *button_dev = null;

struct button_irq_desc ;

static struct button_irq_desc button_irqs = , /* s1 */

, /* s2 */

, /* s3 */

, /* s4 */

, /* s5 */

, /* s6 */

, /* s7 */

, /* s8 */

};static volatile int ev_press;

static struct button_irq_desc *irq_pd = null;

struct work_struct *button_work = null;

struct timer_list button_timer;

static void button_timer_function(unsigned long data)

else

/* 上報同步事件 */

input_sync(button_dev);

}static void button_work_fun(struct work_struct *work)

irqreturn_t button_interrupt(int irq, void *dev_id)

/* 驅動程式的入口函式 */

static int __init button_init(void)

/* 使用 request_irq 函式註冊中斷 */

for(i = 0; i < sizeof(button_irqs) / sizeof(button_irqs[0]); i++)

if(err)

return -ebusy;

}/* 建立工作 */

button_work = kmalloc(sizeof(struct work_struct), gfp_kernel);

init_work(button_work, button_work_fun);

/* 初始化定時器 */

init_timer(&button_timer);

button_timer.function = button_timer_function;

/* 註冊定時器 */

add_timer(&button_timer);

return 0;

}/* 驅動程式的出口函式 */

static void __exit button_exit(void)

}/* 用於修飾入口/出口函式,換句話說,相當於

* 告訴核心驅動程式的入口/出口函式在**

*/module_init(button_init);

module_exit(button_exit);

/* 該驅動支援的協議 */

module_license("gpl");

04 Linux簡單命令

命令 作用halt 關機reboot 重啟shutdown shutdown r reboot shutdown h halt shutdown c cancel shutdown h m m分鐘後關機 關機或重啟 nano 文字編輯 screen 字元介面共享 echo 顯示字元 bc調出計算器 ...

Linux輸入子系統

1.1.input子系統概述 輸入裝置 如按鍵,鍵盤,觸控螢幕,滑鼠等 是典型的字元裝置,其一般的工作機制是低層在按鍵,觸控等動作發生時產生乙個中斷 或驅動通過timer定時查詢 然後cpu通過spi,i2c或者外部儲存器匯流排讀取鍵值,座標等資料,放乙個緩衝區,字元裝置驅動管理該緩衝區,而驅動的r...

Linux輸入子系統

linux系統提供了input子系統,按鍵 觸控螢幕 鍵盤 滑鼠等輸入都可以利用input介面函式來實現裝置驅動,最重要的資料結構是struct input dev 在linux 核心中,input裝置用input dev 結構 體描述,使用input子系統實現輸入裝置驅動的時候,驅動的核心工作是向...