三.
測試**
至此為止,我們已經講完了輸入子系統的裝置驅動層,核心層,事件處理層的關係和相關**,現在,我們通過基於mini2440的開發板,將輸入子系統融入按鍵驅動,編寫裝置驅動程式,動態載入到核心,並且編寫應用層程式,測試按鍵驅動。
我們已經配置了mini2440的串列埠配置,然後根據mini2440開發板的硬體電路知道s3c2440總共有6個使用者測試用按鍵,它們均從cpu中斷引腳直接引出,屬於低電平觸發,這些引腳也可以復用為gpio和特殊功能口,為了使用者把它們引出作為其他用途,這6個引腳也通過con12 引出,6個按鍵和con12的定義如下:
在該實驗中,我們只測試key1,對應的中斷號為eint8。
實驗環境:核心linux2.6.32.2,arm-linux-gcc交叉編譯器,mini2440開發板
核心配置:選中evdev.c,主要input.c是已經預設配置進核心的,配置介面如下所示
3.1裝置驅動層**:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
struct gpio_button_data ;
static struct input_dev *channel=null;
static struct gpio_button_data *button_dev=null; //私有資料
static volatile int ev_press = 0; //按鍵值
static volatile char key_values = ; //按鍵標識
static void gpio_keys_report_event(struct work_struct *work)
static void gpio_keys_timer(unsigned long a)
static irqreturn_t gpio_keys_isr(int irq, void *dummy)
schedule_work(&button_dev->work); //排程工作佇列處理函式
mod_timer(&button_dev->timer,jiffies+1); //修改定時時間
return irq_handled; }
static int button_open(struct input_dev *dev)
setup_timer(&button_dev->timer, gpio_keys_timer, (unsigned long)button_dev); //設定定時器
init_work(&button_dev->work, gpio_keys_report_event); //設定工作佇列
return 0; }
static void button_close(struct input_dev *dev)
static int __init button_init(void)
return 0;
err_free_dev:
input_free_device(channel);
return error; }
static void __exit button_exit(void)
module_init(button_init);
module_exit(button_exit);
module_license("gpl");
3.2應用層測試**
#include
#include
#include
#include
#include
int main(int argc, char *argv)
while(1)
if (ev_key==ev.type) //讀取的是否是按鍵內容
} close(fd);
return 0; }
3.3測試過程和結果
虛擬機器:
1.編譯driver.c生成driver.ko
如下為編譯驅動的makefile
obj-m := driver.o
kerneldir := /home/install-file/kernel/linux-2.6.32.2 // linux-2.6.32.2核心路徑
pwd := $(shell pwd)
default:
$(make) -c $(kerneldir) m=$(pwd) modules
2.編譯測試程式test.c
arm-linux-gcc test.c –o test
超級終端:
insmod driver.ko
./test
測試結果:(按下key1鍵)
key is pressed
key is released
Linux下 INPUT子系統
1.申請input dev結構體變數 在編寫 input 裝置驅動的時候我們需要先申請乙個 input dev 結構體變數,使用input allocate device 函式來申請乙個 input dev 函式原型 struct input dev input allocate device vo...
linux核心input子系統解析
android x windows qt等眾多應用對於linux系統中鍵盤 滑鼠 觸控螢幕等輸入裝置的支援都通過 或越來越傾向於標準的input輸入子系統。因為input子系統已經完成了字元驅動的檔案操作介面,所以編寫驅動的核心工作是完成input系統留出的介面,工作量不大。但如果你想更靈活的應用它...
linux核心input子系統解析
華清遠見嵌入式學院 講師。android x windows qt等眾多應用對於linux系統中鍵盤 滑鼠 觸控螢幕等輸入裝置的支援都通過 或越來越傾向於標準的input輸入子系統。因為input子系統已經完成了字元驅動的檔案操作介面,所以編寫驅動的核心工作是完成input系統留出的介面,工作量不大...