8 輸入子系統 鍵盤按鍵驅動程式

2022-05-04 23:00:07 字數 3292 閱讀 8427

我們在為某種裝置的編寫驅動層,只需要關心裝置驅動層,即如何驅動裝置並獲得硬體資料(如按下的按鍵資料),然後呼叫核心層提供的介面,核心層就會自動把資料提交給事件處理層。在輸入子系統中,事件驅動是標準的,適用於所有輸入類的。我們的裝置可以利用乙個已經存在的,合適的輸入事件驅動,通過輸入核心,和使用者應用程式介面。

一、編寫裝置驅動層的流程

1.分配乙個input——dev結構體

2.設定input_dev的成員

3.註冊input_dev 驅動裝置

4.硬體相關**

1)初始化定時器和中斷

2)寫中斷服務函式

3)寫定時器超時函式

4)在出口函式中 釋放中斷函式,刪除定時器,解除安裝釋放驅動

二、相關結構體及函式

input_dev驅動裝置結構體中常用成員及相關函式如下:(include/linux/input.h)

1

struct

input_dev

三、編寫裝置驅動程式

1

//參考:linux-2.6.22.6\linux-2.6.22.6\drivers\input\keyboard\gpio_keys.c2//

pre1.包含標頭檔案

3 #include 4 #include 5

6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 #include 19 #include 20 #include 21

2223

struct

pin_desc;

2930

/*定義四個按鍵

*/31

struct pin_desc pins_desc[4] =,

33 ,

34 ,

35 ,

36};

3738

static

struct pin_desc *irq_pd; //

指標irq_pd用來儲存dev_id

39static

struct timer_list buttons_timer; //

定時器結構體

40static

struct input_dev *buttons_dev; //

定義乙個input_dev結構體指標

4142

/*中斷服務函式

*/43

static irqreturn_t buttons_irq(int irq, void *dev_id)

4450

51/*

定時器超時函式

*/52

static

void buttons_timer_function(unsigned long

data)

5370

else

7176}77

7879

80//

pre2.寫入口函式

81static

int buttons_init(void)82

110111

return0;

112}

113114

//pre3.寫出口函式

115static

void buttons_exit(void

)116

122 del_timer(&buttons_timer); //

刪除定時器

123 input_unregister_device(buttons_dev); //

解除安裝裝置

124 input_free_device(buttons_dev); //

釋放分配給input_dev裝置的空間

125}

126127

128129

130//

pre4.修飾,新增屬性

131module_init(buttons_init);

132module_exit(buttons_exit);

133134 module_license("

gpl");

四、測試1.掛載掛載鍵盤驅動後, 如下圖,可以通過  ls -l /dev/event*   命令檢視已掛載的裝置節點:

載入了驅動之後,多出事件event1,代表我們的按鍵驅動

其中主裝置號13,次裝置號是65,

在事件處理驅動的函式中,如evdev.c中的evdev_connect函式中,

for (minor = 0; minor < evdev_minors && evdev_table[minor];minor++);
,其中event驅動本身的此裝置號是從64開始的,如上圖,核心啟動時,會載入自帶觸控螢幕驅動,所以我們的鍵盤驅動的次裝置號=64+1

2.執行

測試執行有兩種,一種是直接開啟/dev/tyy1,第二種是使用exec命令

方法1:

cat /dev/tty1     //tty1:lcd終端,就會通過tty_io.c來訪問鍵盤驅動,然後列印在tty1終端上

方法2:

exec 0/dev/tty1掛載到-sh程序描述符0下,此時的鍵盤驅動就會直接列印在tty1終端上

3.除錯:

若測試不成功,板子又在qt下進行的:

1)可以使用vi命令,在板子上開啟記事本,按按鍵測試

2)或者刪除/etc/init.d/rcs 裡面有關qt自啟動的命令,然後重啟

若板子沒在qt下進行,也無法測試成功:

1)可以使用hexdump命令來除錯**

詳見nqian博主的文章))

參考:13.linux鍵盤按鍵驅動 (詳解)

linux 輸入子系統驅動程式

一,過程概述 1.分配乙個struct input dev key input dev input allocate device 2.設定 input dev 支援的事件 event types 主要有按鍵事件 ev key 重複事件 ev rep set bit ev key,key input...

linux輸入子系統之按鍵驅動

上一節中,我們講解了linux input子系統的框架,到核心原始碼裡詳細分析了輸入子系統的分離分層的框架等。這一節,我們來以輸入子系統的框架來寫乙個按鍵驅動。問 怎麼寫符合輸入子系統框架的驅動程式?答 1.分配乙個input dev結構體 2.設定 3.註冊 4.硬體相關的 比如在中斷服務程式裡上...

按鍵驅動之使用輸入子系統架構

有關輸入子系統我們可以參考 gpio keys.c這個 注 這只是乙個例子,沒有實際的作用 static struct input dev button dev 1.分配乙個input device結構體 參考gpio keys.c這個例子,可以知道其分配函式是input allocate devi...