亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > Linux設備模型之input子系統詳解

Linux設備模型之input子系統詳解

熱門標簽:成都米蘭申請 百度地圖地圖標注客服多少 iphone地圖標注我的店鋪 廣東電話機器人開戶 哪種品牌的400電話申請 旅游路書地圖標注 百度ai電銷機器人排名 適用的400電話辦理 ai智能外呼系統是什么

本節從整體上講解了輸入子系統的框架結構。有助于讀者從整體上認識linux的輸入子系統。在陷入代碼分析的過程中,通過本節的知識能夠找準方向,明白原理。

本節重點:

  •          輸入子系統的框架結構
  •          各層對應內核中的文件位置
  •          輸入子系統的事件處理機制
  •          輸入子系統的驅動層基本操作流程
  •          輸入子系統的驅動層常用函數

本節難點:

輸入子系統的事件處理機制

輸入子系統的驅動工作流程

1 初識linux輸入子系統

linux輸入子系統(linux input subsystem)從上到下由三層實現,分別為:輸入子系統事件處理層(EventHandler)、輸入子系統核心層(InputCore)和輸入子系統設備驅動層。

對于輸入子系統設備驅動層而言,主要實現對硬件設備的讀寫訪問,中斷設置,并把硬件產生的事件轉換為核心層定義的規范提交給事件處理層。

對于核心層而言,為設備驅動層提供了規范和接口。設備驅動層只要關心如何驅動硬件并獲得硬件數據(例如按下的按鍵數據),然后調用核心層提供的接口,核心層會自動把數據提交給事件處理層。

對于事件處理層而言,則是用戶編程的接口(設備節點),并處理驅動層提交的數據處理。

對于linux輸入子系統的框架結構如下圖1所示:

圖1 linux輸入子系統框架結構

由上圖所展現的內容就是linux輸入子系統的分層結構。

/dev/input目錄下顯示的是已經注冊在內核中的設備編程接口,用戶通過open這些設備文件來打開不同的輸入設備進行硬件操作。

事件處理層為不同硬件類型提供了用戶訪問及處理接口。例如當我們打開設備/dev/input/mice時,會調用到事件處理層的Mouse Handler來處理輸入事件,這也使得設備驅動層無需關心設備文件的操作,因為Mouse Handler已經有了對應事件處理的方法。

輸入子系統由內核代碼drivers/input/input.c構成,它的存在屏蔽了用戶到設備驅動的交互細節,為設備驅動層和事件處理層提供了相互通信的統一界面。

下圖2簡單描述了linux輸入子系統的事件處理機制:

圖2 linux輸入子系統事件處理機制

由上圖可知輸入子系統核心層提供的支持以及如何上報事件到input event drivers。

作為輸入設備的驅動開發者,需要做以下幾步:

1、在驅動加載模塊中,設置你的input設備支持的事件類型,類型參見表1設置 

2、 注冊中斷處理函數,例如鍵盤設備需要編寫按鍵的抬起、放下,觸摸屏設備需要編寫按下、抬起、絕對移動,鼠標設備需要編寫單擊、抬起、相對移動,并且需要在必要的時候提交硬件數據(鍵值/坐標/狀態等等) 

3、 將輸入設備注冊到輸入子系統中

表1 Linux輸入子系統支持的數據類型

EV_SYN     0x00    同步事件
EV_KEY     0x01    按鍵事件
EV_REL     0x02    相對坐標(如:鼠標移動,報告相對最后一次位置的偏移)
EV_ABS     0x03    絕對坐標(如:觸摸屏或操作桿,報告絕對的坐標位置)
EV_MSC     0x04    其它
EV_SW      0x05    開關
EV_LED     0x11    按鍵/設備燈
EV_SND     0x12    聲音/警報
EV_REP     0x14    重復
EV_FF      0x15    力反饋
EV_PWR    0x16    電源
EV_FF_STATUS    0x17   力反饋狀態
EV_MAX    0x1f    事件類型最大個數和提供位掩碼支持

由表1可知,設備所能表示的事件種類,一個設備可以選擇一個或多個事件類型上報給輸入子系統。

Linux輸入子系統提供了設備驅動層上報輸入事件的函數,在include/linux/input.h中:

voidinput_report_key(struct input_dev *dev, unsigned int code, int value);      //上報按鍵事件
voidinput_report_rel(struct input_dev *dev, unsigned int code, int value);       //上報相對坐標事件
voidinput_report_abs(struct input_dev *dev, unsigned int code, int value);              //上報絕對坐標事件

當提交輸入設備產生的輸入事件之后,需要調用下面的函數來通知輸入子系統,以處理設備產生的完整事件:

void input_sync(struct input_dev *dev); 

2 輸入設備驅動的簡單案例

在Linux內核文檔的documentation/input下,有一個input-programming.txt文件,講解了編寫輸入設備驅動程序的核心步驟。

提供的案例代碼描述了一個button設備,產生的事件通過BUTTON_PORT引腳獲取,當有按下/釋放發生時,BUTTON_IRQ被觸發,以下是驅動的源代碼:

#include                                                                                                           
 #include   
 #include   
  
 #include   
 #include   
  
 static struct input_dev *button_dev;  
  
 static void button_interrupt(int irq, void*dummy, struct pt_regs *fp)  
 {  
        input_report_key(button_dev, BTN_1, inb(BUTTON_PORT)  1);  
        input_sync(button_dev);  
 }        
  
 static int __init button_init(void)  
 {  
        int error;  
          
        if (request_irq(BUTTON_IRQ, button_interrupt, 0, "button",NULL)) {  
                 printk(KERN_ERR"button.c: Can't allocate irq %d\n", button_irq);  
                 return -EBUSY;  
        }        
          
         button_dev = input_allocate_device();  
        if (!button_dev) {  
                 printk(KERN_ERR"button.c: Not enough memory\n");  
                 error = -ENOMEM;  
                 goto err_free_irq;  
        }  
  
        button_dev->evbit[0] = BIT(EV_KEY);  
        button_dev->keybit[LONG(BTN_0)] = BIT(BTN_0);  
  
        error = input_register_device(button_dev);  
        if (error) {  
                 printk(KERN_ERR"button.c: Failed to register device\n");  
                 goto err_free_dev;  
        }  
  
        return 0;  
  
 err_free_dev:  
        input_free_device(button_dev);  
 err_free_irq:  
        free_irq(BUTTON_IRQ, button_interrupt);  
        return error;  
 }  
  
 static void __exit button_exit(void)  
 {  
       input_unregister_device(button_dev);  
        free_irq(BUTTON_IRQ, button_interrupt);  
}  
  
module_init(button_init);  
module_exit(button_exit);  

編寫基于輸入子系統的設備驅動程序需要包含,因為它包含了輸入子系統的接口和所有的宏定義,這些內容在編寫輸入設備驅動程序時需要用到。

button_init函數說明:

當模塊加載(insmod)或內核引導過程中,button_init函數會被調用。首先做的工作是獲取能夠正確控制硬件設備的硬件資源(例如內存、IO內存、中斷和DMA),在代碼中BUTTON_IRQ作為BUTTON設備的中斷資源,通過request_irq()函數被申請注冊。當有按鍵按下/釋放時,調用button_interrupt()中斷處理函數獲取按鍵值BUTTON_PORT(BUTTON設備的I/O資源)。

那么輸入子系統怎么能夠知道這個設備為輸入設備呢?通過第8行為設備定義一個用于描述一個輸入設備對象。

static struct input_dev *button_dev;  

定義了button_dev之后,如何通知輸入子系統有新的輸入設備了呢?或者說如何把一個新的輸入設備加入到輸入子系統中呢?可以通過輸入子系統核心層input.c中提供的函數分配一個輸入設備,在代碼的第25行。

button_dev= input_allocate_device();  

有了輸入設備的描述,當事件產生時,輸入子系統怎么能夠知道設備產生的事件類型呢?通過32和33行的代碼。

button_dev->evbit[0]= BIT(EV_KEY);  
button_dev->keybit[LONG(BTN_0)]= BIT(BTN_0);  

其中evbit和keybit成員分別代表設備產生的事件類型和上報的按鍵值。其中輸入子系統的一些位操作NBITS、BIT、LONG經常被用到:

#defineNBITS(x) (((x)/BITS_PER_LONG)+1)                 //通過位x獲取數組的長度  
#defineBIT(x)       (1UL((x)%BITS_PER_LONG))       //返回位x在數組中的位域  
#defineLONG(x) ((x)/BITS_PER_LONG)                        //返回位x的索引  

以上的工作做完之后,即可注冊為輸入設備了,代碼的35行。

input_register_device(button_dev);  

這個函數把button_dev輸入設備掛入輸入設備鏈表中,并且通知事件處理層調用connect函數完成設備和事件處理的綁定,當用戶打開設備時,便能夠調用到相應的事件處理接口獲得硬件上報的數據了。input_register_device()函數是會睡眠的函數,因此不能夠在中斷上下文和持有自旋鎖的代碼中調用。

當我們把上面的工作做完之后,設備驅動中唯一值得關注的就是button_interrupt()中斷處理函數了。當按鍵動作發生,button_interrupt()函數被調用,完成事件的上報由其中的兩條語句完成。

input_report_key(button_dev, BTN_1, inb(BUTTON_PORT)  1);  
input_sync(button_dev);  

其中input_report_key上報了這是一個按鍵事件,且它的值為inb(BUTTON_PORT) 1,由于案例代碼只產生一個按鍵的值,因此input_sync()在這里不起關鍵作用。但如果是一個觸摸屏,即有x坐標和y坐標,則需要通過input_sync()函數把x和y坐標完整地傳遞給輸入子系統。

用于測試的應用層代碼:

testkeyread_jb51.rar

標簽:茂名 遼陽 玉林 紹興 汕頭 大連 陜西 泰安

巨人網絡通訊聲明:本文標題《Linux設備模型之input子系統詳解》,本文關鍵詞  Linux,設備,模型,之,input,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Linux設備模型之input子系統詳解》相關的同類信息!
  • 本頁收集關于Linux設備模型之input子系統詳解的相關信息資訊供網民參考!
  • 推薦文章
    日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 韩国三级视频在线观看| 亚欧视频在线| 九九九网站| 久久国产影院| 精品久久久久久免费影院| 国产不卡在线播放| 99热精品一区| 国产91视频网| 欧美日本韩国| 精品视频一区二区| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 久久国产影视免费精品| 成人免费观看网欧美片| 高清一级片| 日韩免费片| 日韩男人天堂| 成人免费一级毛片在线播放视频| 成人免费福利片在线观看| 国产一区二区精品| 美女被草网站| 精品在线视频播放| 久久精品店| 久久99中文字幕| 精品久久久久久中文| 国产美女在线观看| 欧美激情一区二区三区在线播放 | 一级女人毛片人一女人| 亚洲第一页色| 久久精品成人一区二区三区| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 免费一级片在线观看| 日韩综合| 国产成a人片在线观看视频| 你懂的福利视频| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产精品免费精品自在线观看| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 九九干| 精品国产一区二区三区精东影业 | 久久99中文字幕| 日韩综合| 国产视频一区二区在线观看| 中文字幕Aⅴ资源网| 天天做日日爱夜夜爽| 国产一区二区精品| 国产视频一区二区在线观看| 欧美激情影院| 国产韩国精品一区二区三区| 国产福利免费视频| 国产高清在线精品一区二区| 九九久久国产精品| 成人影院久久久久久影院| 日韩专区亚洲综合久久| 免费一级片在线| 沈樵在线观看福利| 97视频免费在线| 国产91丝袜在线播放0| 日韩av片免费播放| 九九免费高清在线观看视频| 欧美国产日韩久久久| 日本免费看视频| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日韩一级黄色| 99热精品在线| 欧美国产日韩在线| 四虎影视久久久| 91麻豆精品国产自产在线观看一区| 精品久久久久久综合网| 天天做日日爱| 日韩av片免费播放| 亚洲 欧美 91| 欧美激情一区二区三区视频 | 免费的黄视频| 亚洲 激情| 久久99欧美| 免费毛片基地| 国产成人啪精品| 亚洲精品永久一区| 日韩欧美一二三区| 青草国产在线| 国产原创中文字幕| 日韩专区第一页| 亚洲 男人 天堂| 四虎久久影院| 精品视频在线观看一区二区三区| 国产一区免费在线观看| 日本特黄一级| 久久国产影院| 精品国产一区二区三区久 | 精品久久久久久中文字幕一区 | 九九精品在线| 黄色免费三级| 韩国三级视频网站| 国产视频一区二区三区四区 | 久久久久久久免费视频| 免费毛片基地| 亚飞与亚基在线观看| 午夜欧美成人久久久久久| 国产a毛片| 国产一区二区福利久久| 欧美激情中文字幕一区二区| 免费毛片基地| 99热精品一区| 午夜欧美福利| 日韩在线观看视频免费| 日韩综合| 精品国产一区二区三区久 | 精品国产一区二区三区久久久蜜臀| 久草免费在线视频| 久久精品成人一区二区三区| 一级女性大黄生活片免费| 999精品视频在线| 青青久久网| 中文字幕97| 国产a视频精品免费观看| 999久久久免费精品国产牛牛| 精品在线视频播放| 九九精品在线播放| 免费国产在线观看不卡| 国产视频久久久久| 黄视频网站免费| 国产不卡在线播放| 精品国产一区二区三区久 | 国产伦精品一区三区视频| 精品视频在线观看一区二区| 精品视频一区二区三区免费| 久久国产精品只做精品| 欧美大片一区| 色综合久久天天综合绕观看| 成人在免费观看视频国产| 国产不卡在线播放| 99久久精品国产麻豆| 青青青草影院| 精品在线观看一区| 免费国产在线观看| 日韩av成人| 精品国产香蕉在线播出| 午夜精品国产自在现线拍| 九九久久国产精品| 日韩在线观看视频免费| 免费一级片在线| 亚洲第一色在线| 青青青草影院 | 国产不卡高清| 成人免费一级纶理片| 精品国产香蕉伊思人在线又爽又黄| 美女免费精品高清毛片在线视 | 超级乱淫伦动漫| 亚洲 男人 天堂| 四虎论坛| 99热热久久| 四虎影视库| 欧美激情一区二区三区视频 | 免费国产在线观看不卡| 久久国产精品自由自在| 91麻豆国产级在线| 91麻豆国产| 九九久久99综合一区二区| 九九久久99| 成人免费观看的视频黄页| 色综合久久天天综合| 欧美国产日韩在线| 亚洲第一页色| 日韩欧美一及在线播放| 麻豆系列国产剧在线观看| 亚欧成人乱码一区二区| 国产麻豆精品免费密入口| 欧美一区二区三区在线观看| 999久久久免费精品国产牛牛| 成人免费观看网欧美片| 精品视频在线看| 中文字幕Aⅴ资源网| 黄色免费网站在线| 天天做日日爱| 91麻豆国产级在线| 久久精品人人做人人爽97| 国产综合成人观看在线| 999精品在线| 国产一区国产二区国产三区| 久久成人综合网| 国产视频久久久| 99色播| 精品国产一区二区三区免费| 在线观看成人网| 国产一区免费在线观看| 国产精品自拍在线观看| 国产91素人搭讪系列天堂| 青青青草影院| 一级片片| 国产91精品露脸国语对白| 日本在线不卡视频| 国产不卡精品一区二区三区| 午夜激情视频在线观看| 九九精品在线播放| 国产视频一区在线| 999久久66久6只有精品| 青青久久国产成人免费网站| 九九免费高清在线观看视频|