在linux中,輸入子系統是由輸入子系統驅動層,輸入子系統核心層、輸入子系統事件處理層組成。其中,裝置驅動層提供對硬體各暫存器的讀寫訪問和將底層硬體對使用者輸入訪問的響應轉化為標準的輸入事件,再通過核心層提交給事件處理層。而核心層向下提供了裝置驅動層的程式設計介面,向上又提供了事件處理層的程式設計介面。而事件處理層就為使用者空間的應用程式提供了統一訪問裝置的介面和處理驅動層提交的事件。所以這使得我們的輸入裝置驅動程式不必關心對裝置檔案的操作,而是需要對各硬體暫存器的操作和提交的事件的處理。
在linux中,input輸入裝置用input_dev結構體描述
1)在驅動模組載入函式設定input裝置支援input子系統的哪些事件
2)將input裝置註冊到input子系統中
3)利用中斷在input裝置發生輸入操作時,提交所發生的事件對應的鍵值或座標
struct input_dev *input_allocate_device(void) //分配input_dev結構體
int input_register_device(struct input_dev *dev) //註冊裝置
void fastcall init_timer(struct timer_list *timer) //初始化定時器
static inline void add_timer(struct timer_list *timer) //新增定時器
int request_irq(unsigned int irq,irq_handler_t handler,unsigned long flags,const char *devname,void *dev_id) //註冊中斷
static inline void set_bit(int nr, volatile void * addr) //將位址addr的nr位置1
int mod_timer(struct timer_list *timer, unsigned long expires) //設定新的定時值
static inline void input_sync(struct input_dev *dev) //傳送事件同步事件
break;
*/}
在分配結構體函式裡
struct input_dev *input_allocate_device(void)
return dev;
}
在input_register_device函式中
int input_register_device(struct input_dev *dev)
if (!dev->getkeycode)
dev->getkeycode = input_default_getkeycode; //同理 沒有設定使用預設設定
if (!dev->setkeycode)
dev->setkeycode = input_default_setkeycode;
list_add_tail(&dev->node, &input_dev_list);
snprintf(dev->cdev.class_id, sizeof(dev->cdev.class_id),
"input%ld", (unsigned long) atomic_inc_return(&input_no) - 1);
if (!dev->cdev.dev)
dev->cdev.dev = dev->dev.parent;
error = class_device_add(&dev->cdev); //新增類
if (error)
return error;
path = kobject_get_path(&dev->cdev.kobj, gfp_kernel);
printk(kern_info "input: %s as %s\n",
dev->name ? dev->name : "unspecified device", path ? path : "n/a");
kfree(path);
list_for_each_entry(handler, &input_handler_list, node)
input_attach_handler(dev, handler);
input_wakeup_procfs_readers();
return 0;
}
在初始化定時器時 新增定時器超時處理函式
在註冊中斷時 新增中斷處理函式 並確定何時觸發中斷
新增完驅動之後需要exec 0
Linux輸入子系統框架分析及輸入裝置驅動程式設計
linux輸入子系統 linux input subsystem 從上到下由三層實現,分別為 輸入子系統事件驅動程式層 eventhandler 輸入子系統核心層 inputcore 和輸入子系統裝置驅動程式層。它們各自的功能如下 對於輸入子系統裝置驅動程式層而言,主要實現對硬體裝置的讀寫訪問,中斷...
Visual Studio構造WDM裝置驅動程式
介紹 詳細介紹了在visual studio平台下,通過建立makefile專案,啟用ddk build命令列程式構造wdm裝置驅動程式的方法。正文 wdm win32 driver model 即win32驅動程式模型,是microsoft力推的全新驅動程式模式,旨在通過提供一種靈活的方式來簡化驅...
ARM Linux開發 Linux檢視裝置驅動
驅動操作命令 insmod modprobe 載入驅動 rmmod 解除安裝驅動 lsmod 檢視系統中所有已經被載入了的所有的模組以及模組間的依賴關係 modinfo 獲得模組的資訊 檢視已經載入的驅動模組的資訊 lsmod 能夠顯示驅動的大小以及被誰使用 cat proc modules 能夠顯...