Linux驅動之input輸入子系統

2021-09-23 23:29:36 字數 3295 閱讀 8437

input輸入子系統在實際專案中用的也比較多,按鍵,觸控螢幕,滑鼠,鍵盤等,用來實現核心層和應用層資料之間的傳遞,這裡得說明不只有input,還有copy_to_user等,利用input的好處是我們用自己上傳資料到應用程式, 我們直接上報這個事件發生了,input自帶的機制會實現上傳的功能。還有很多開源的工具也是基於input輸入來製作的,像tslib觸控檢測程式和提取資料。

tips:不要啟動qt程式,否則會出錯,用cat /dev/tty1 來測試。

驅動程式:

/* 參考drivers\input\keyboard\gpio_keys.c */

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include /*核心有關的*/

#include

#include

#include

#include //copy_to_user

#include /*暫存器設定*/

#include //s3c2410_gpio_getpin等的定義

#include //irq_eint0等的定義

#include

struct pin_desc;

struct pin_desc pins_desc[4] = ,,,

,};static struct input_dev *buttons_dev;     /* 定義input_dev型別的結構體指標 */

static struct pin_desc *irq_pd;

static struct timer_list buttons_timer;

static irqreturn_t buttons_irq(int irq, void *dev_id)   /* 定時器,這裡用來消除抖動 */

static void buttons_timer_function(unsigned long data)

else

}static int buttons_init(void)   /* 初始化函式,硬體初始化,註冊中斷,分配記憶體 */

return 0;

}static void buttons_exit(void)   /* 退出函式,取消中斷的註冊,釋放記憶體 */

del_timer(&buttons_timer);

input_unregister_device(buttons_dev);   /* 取消註冊的結構體 */

input_free_device(buttons_dev);           /* 取消分配的結構體 */

}module_init(buttons_init);

module_exit(buttons_exit);

module_license("gpl");

註冊input_dev或input_handler時,會兩兩比較左邊的input_dev和右邊的input_handler,

根據input_handler的id_table判斷這個input_handler能否支援這個input_dev,

如果能支援,則呼叫input_handler的connect函式建立"連線"

上面呼叫input上報事件最終都將呼叫到input_sync最終也將呼叫input_envent,該**還有乙個問題,細心的朋友應該看到了,怎麼沒有看到休眠和喚醒之類的**呢?這些穩定的部分核心裡面已經自帶了,在input_event裡面來實現喚醒的,這些核心在穩定部分已經實現了,我們只需讀到資料直接上報就行了,具體應用程式怎麼取讀是應用層的事情。

unsigned long evbit[nbits(ev_max)];  // 表示能產生哪類事件

unsigned long keybit[nbits(key_max)]; // 表示能產生哪些按鍵

unsigned long relbit[nbits(rel_max)]; // 表示能產生哪些相對位移事件, x,y,滾輪

unsigned long absbit[nbits(abs_max)]; // 表示能產生哪些絕對位移事件, x,y

#define ev_syn 0x00      /* 同步類事件 */

#define ev_key 0x01/* 按鍵類事件 */

#define ev_rel 0x02/* 相對位移類事件 */

#define ev_abs 0x03/* 絕對位移類事件 */

set_bit(ev_key, buttons_dev->evbit);                    /* 能產生按鍵類事件 */

set_bit(ev_rep, buttons_dev->evbit); /* 能產生重複類事件 */

set_bit(key_l, buttons_dev->keybit);            /*能產生(key_l這些事件*/

set_bit(key_s, buttons_dev->keybit); /*能產生key_s這些事件*/

set_bit(key_enter, buttons_dev->keybit);    /*能產生key_enter這些事件*/

set_bit(key_leftshift, buttons_dev->keybit);   /*能產生key_leftshift這些事件*/

input_sync(buttons_dev);            /* 上報同步類事件 */

測試方法如下:

1. hexdump /dev/event1  (open(/dev/event1), read(), )

秒        微秒    類  code    value

0000000 0bb2 0000 0e48 000c 0001 0026 0001 0000

0000010 0bb2 0000 0e54 000c 0000 0000 0000 0000

0000020 0bb2 0000 5815 000e 0001 0026 0000 0000

0000030 0bb2 0000 581f 000e 0000 0000 0000 0000

2. 如果沒有啟動qt:

cat /dev/tty1

按:s2,s3,s4

就可以得到ls

或者:exec 0

linux驅動 Input 輸入子系統

1,哪些驅動裝置使用驅動子系統更方便簡單?像按鍵,觸控螢幕,滑鼠等輸入裝置我們可以採用input介面函式來實現裝置驅動,那麼採用input輸入子系統有什麼優點?其實一句話,採用input輸入子系統可以使驅動程式變得異常簡單。2,input輸入子系統的體系結構 主要包括三大體系結構 裝置驅動層driv...

Linux裝置驅動 input輸入子系統

不同的輸入裝置 如按鍵 鍵盤 觸控螢幕 滑鼠等 都有它們的差異性 如中斷 讀鍵值 座標值是裝置相關的 及共同性 如輸入事件的緩衝區管理以及字元裝置驅動的file operations介面則對輸入裝置是通用的 因此在linux核心中設計了input輸入子系統來完成輸入裝置之間的共性工作,而我們只需要使...

input 輸入裝置平台驅動

1,主機環境 vmare下linux5.7 384記憶體。2,編譯編譯環境 arm linux gcc v4.4.3 3,開發板 fl2440,4m nor flash,256m nand flash。移植參照mini2440的示例 1 首先是平台裝置的註冊 include include incl...