一,過程概述
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_dev->evbit);
3. 設定 input_dev 裡按鍵事件 ev_key 支援的按鍵 如 l 鍵 key_l
set_bit(key_l, key_input_dev->keybit);
4. 註冊 input_dev
input_register_device(key_input_dev)
5. 註冊完之後還要向我們的 key_input_dev 傳送訊息
input_event(key_input_dev, ev_key, desc->number, 0);
input_sync(key_input_dev);
二. 例項**
#include //module_license,module_author
#include //module_init/module_exit
#include //file_operations
#include //cdev
#include //wait_event_interruptible(wait_queue_head_t q,int condition) wake_up_interruptible(struct wait_queue **q)
#include //request_irq,free_irq
#include //irq_type_edge_falling
#include //request_irq,free_irq
#include //class device
#include #include #include //copy_to_user
#include //ioread32,iowrite32
#include //定義了s3c64xx_va_gpio
#include //定義了gpio-bank-n中使用的s3c64xx_gpn_base
#include //定義了gpncon
#include //定義了gpncon
#include "s3c6410.h"
typedef struct key_irq_desc_t;
volatile unsigned long *gpndat;
volatile unsigned long *gpncon;
static key_irq_desc_t key_irqs =
, ,
, ,
}; static struct input_dev *key_input_dev;
static struct timer_list key_timer;
static key_irq_desc_t *key_desc = null;
static void key_timer_function(unsigned long data)
else
input_sync(key_input_dev);
printk(kern_info"pin_val %d pin %d\n", pin_val, desc->pin); }
static irqreturn_t keys_drv_irq(int irq, void* dev_id)
static int key_drv_input_init(void)
} gpncon = (volatile unsigned long *)ioremap(elfin_gpio_base+gpncon_offset, 12);
gpndat = gpncon+1;
printk(kern_debug"key_drv_input_init\n");
return 0;
}static void key_drv_input_exit(void)
del_timer(&key_timer);
input_unregister_device(key_input_dev);
input_free_device(key_input_dev);
printk(kern_debug"key_drv_input_exit\n");
}module_init(key_drv_input_init);
module_exit(key_drv_input_exit);
module_license("gpl");
8 輸入子系統 鍵盤按鍵驅動程式
我們在為某種裝置的編寫驅動層,只需要關心裝置驅動層,即如何驅動裝置並獲得硬體資料 如按下的按鍵資料 然後呼叫核心層提供的介面,核心層就會自動把資料提交給事件處理層。在輸入子系統中,事件驅動是標準的,適用於所有輸入類的。我們的裝置可以利用乙個已經存在的,合適的輸入事件驅動,通過輸入核心,和使用者應用程...
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上 為例介紹一下輸入子系統。輸入子系統將硬體相關的 與軟體相關的 分開寫,目的是為了以後編寫修改 簡便。軟體部分系統已經...