一、開發環境
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...