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子系統實現輸入裝置驅動的時候,驅動的核心工作是向...