linux 輸入子系統驅動程式

2021-08-04 21:44:05 字數 2379 閱讀 5899

一,過程概述

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上 為例介紹一下輸入子系統。輸入子系統將硬體相關的 與軟體相關的 分開寫,目的是為了以後編寫修改 簡便。軟體部分系統已經...