嵌入式linux驅動 輸入子系統筆記

2021-07-29 11:40:30 字數 3507 閱讀 1931

一、開發環境

1、核心:linux

2.6.22.6;

2、jz2440

3、ubuntu 9.10

二、過程

1、分配input_dev結構體

使用input_allocate_device函式,如:

先定義乙個input_dev 結構體型別變數:static struct input_dev *key_dev;

使用input_allocate_device函式分配:

key_dev=input_allocate_device();

2、設定input_dev

input_dev結構體成員有:

struct input_dev

先設定哪類操作,再設定這類操作的哪些事件,如

/* 2.1 設定按鍵能產生哪類事件 */ 

set_bit(ev_key,key_dev->evbit);//

ev_key表示按鍵操作

set_bit(ev_rep,key_dev->evbit);//

ev_rep表示按鍵重複操作

/* 2.2 設定能產生這類操作的哪些事件 */  

set_bit(key_l,key_dev->keybit);//

key_l表示按了l鍵

set_bit(key_s,key_dev->keybit);//

key_s表示按了s鍵

set_bit(key_enter,key_dev->keybit);//

enter表示按了enter鍵

set_bit(key_leftshift,key_dev->keybit);//

key_leftshift表示按了左邊的shift鍵

另外:input.h裡有以下類

#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) 

3、註冊

使用input_register_device(struct input_dev *dev)函式來註冊,如:input_register_device(key_dev);

4、硬體相關操作

具體應用具體寫了。比如本實驗中使用到定時器,初始化定時器,使用按鍵註冊中斷等。

5、程式

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include struct key_desc;

struct key_desc key_desc[4]=,,,

,};static struct input_dev *key_dev;

static struct key_desc *irq_tmp;

static struct timer_list key_timer;

static irqreturn_t key_irq(int irq, void *dev_id)

static void key_timer_func(unsigned long __data)

keyval=s3c2410_gpio_getpin(keysdesc->pin);

if(keyval)

else

}static int  key_init(void)

return 0;

}static void key_exit(void)

del_timer(&key_timer);

input_unregister_device(key_dev);

input_free_device(key_dev);

}module_init(key_init);

module_exit(key_exit);

module_license("gpl");

三、架構相關

1、驅動中按鍵鬆開、按下時呼叫input_event()

函式把keysdesc->key_val即結構體

struct key_desc key_desc[4]=,,,

,};中的key_l,key_s,key_enter,key_leftshift,傳遞給核心。

在input_event()

函式中有:

list_for_each_entry(handle, &dev->h_list, d_node)

if (handle->open)

handle->handler->event(handle, type, code, value);

實現了從input_dev到input_

handle到input_

handler的呼叫。即從硬體層到兩者的連線層到驅動層的呼叫。我們寫的程式呼叫input_event()函式,input_event中通過

dev->h_list找到input_

handle,input_

handle通過其成員handler找到event。

2、韋分層框架截圖

四、命令

hexdump /dev/event1 hex顯示/dev/event1

exec 0五、問題

1、載入模組後,沒有event,如下

# ls -l /dev/event*

ls: /dev/event*: no such file or directory

載入子系統後,結果如下

六、結果

linux驅動子系統之輸入子系統 5

5.總結 5.1 事件資訊的上報過程分析 l 上報的大致過程 裝置驅動層 核心層 事件處理層 應用層 l 具體呼叫的函式 以evdev為例 input event input handle event input pass event handle handler event handle,type...

linux裝置驅動 輸入子系統

輸入裝置都能用輸入子系統來寫,比如說按鍵 觸控螢幕 滑鼠等,但是有的輸入裝置不止用到了輸入子系統,比如說usb輸入裝置,他們還用到了usb子系統。我們以最簡單的按鍵 直接接到cpu上 為例介紹一下輸入子系統。輸入子系統將硬體相關的 與軟體相關的 分開寫,目的是為了以後編寫修改 簡便。軟體部分系統已經...

linux驅動之輸入子系統

輸入子系統框架,把核心開啟 搜尋input.c 輸入子系統的 在 driver input目錄下面 最上一層,我們稱它為核心層 要看乙個驅動程式我們應該從他的入口函式開始看 有一行 err register chrdev region mkdev input major,0 input max ch...