国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

迅為i.MX6ULL終結(jié)者Linux INPUT子系統(tǒng)實(shí)驗(yàn)Input子系統(tǒng)

發(fā)布時(shí)間:2021-1-11 10:29    發(fā)布者:就是塔塔
關(guān)鍵詞: 迅為 , Linux , INPUT
文章目錄
1 input子系統(tǒng)簡(jiǎn)介
2 input驅(qū)動(dòng)程序編寫流程
3 input_event結(jié)構(gòu)體
1 input子系統(tǒng)簡(jiǎn)介
input 子系統(tǒng)就是管理輸入的子系統(tǒng),和 pinctrl 和 gpio 子系統(tǒng)一樣,都是 Linux 內(nèi)核針對(duì)某一類設(shè)備而創(chuàng)建的框架。 input子系統(tǒng)處理輸入事務(wù),任何輸入設(shè)備的驅(qū)動(dòng)程序都可以通過input輸入子系統(tǒng)提供的接口注冊(cè)到內(nèi)核,利用子系統(tǒng)提供的功能來與用戶空間交互。輸入設(shè)備一般包括鍵盤,鼠標(biāo),觸摸屏等,在內(nèi)核中都是以輸入設(shè)備出現(xiàn)的。
input子系統(tǒng)是分層結(jié)構(gòu)的,總共分為三層: 硬件驅(qū)動(dòng)層,子系統(tǒng)核心層,事件處理層。
(1)硬件驅(qū)動(dòng)層負(fù)責(zé)操作具體的硬件設(shè)備,這層的代碼是針對(duì)具體的驅(qū)動(dòng)程序的,需要驅(qū)動(dòng)程序的作者來編寫。
(2)子系統(tǒng)核心層是鏈接其他兩個(gè)層之間的紐帶與橋梁,向下提供驅(qū)動(dòng)層的接口,向上提供事件處理層的接口。
(3)事件處理層負(fù)責(zé)與用戶程序打交道,將硬件驅(qū)動(dòng)層傳來的事件報(bào)告給用戶程序。

各層之間通信的基本單位就是事件,任何一個(gè)輸入設(shè)備的動(dòng)作都可以抽象成一種事件,如鍵盤的按下,觸摸屏的按下,鼠標(biāo)的移動(dòng)等。事件有三種屬性:類型(type),編碼(code),值(value),input子系統(tǒng)支持的所有事件都定義在input.h中,包括所有支持的類型,所屬類型支持的編碼等。事件傳送的方向是 硬件驅(qū)動(dòng)層–>子系統(tǒng)核心–>事件處理層–>用戶空間。
2 input驅(qū)動(dòng)程序編寫流程
首先來看一下在input核心層實(shí)現(xiàn)了哪些功能,input核心層文件是input.c,路徑:drivers/input/input.c,部分內(nèi)容如下:

第2418行,注冊(cè)了一個(gè)input類,在系統(tǒng)啟動(dòng)后會(huì)在/sys/class目錄下生成一個(gè)input類的子目錄,如圖 2.1所示:

第2428、2489行,注冊(cè)了一個(gè)字符設(shè)備,所以input子系統(tǒng)本質(zhì)上也是字符設(shè)備驅(qū)動(dòng),主設(shè)備號(hào)為 INPUT_MAJOR,INPUT_MAJOR 定義在 include/uapi/linux/major.h 文件中,定義如下:
#define INPUT_MAJOR 13
所以input 子系統(tǒng)的所有設(shè)備主設(shè)備號(hào)都為 13,在使用 input 子系統(tǒng)處理輸入設(shè)備的時(shí)候就不需要去注冊(cè)字符設(shè)備了,我們只需要向系統(tǒng)注冊(cè)一個(gè) input_device 即可。
1、input_dev 結(jié)構(gòu)體
input_dev結(jié)構(gòu)體是input設(shè)備基本的設(shè)備結(jié)構(gòu),每個(gè)input驅(qū)動(dòng)程序中都必須分配初始化這樣一個(gè)結(jié)構(gòu),結(jié)構(gòu)體定義在 include/linux/input.h 文件中,定義如下:

第 129 行,evbit 表示輸入事件類型,可選的事件類型定義在 include/uapi/linux/input.h 文件中,事件類型如下:

根據(jù)使用的不同設(shè)備選擇不同的事件類型,在本章的實(shí)驗(yàn)中我們會(huì)用到按鍵設(shè)備,那么我們就需要選擇EV_KEY 事件類型。
在看input_dev結(jié)構(gòu)體中的第129~137行的evbit、keybit等成員變量,都是對(duì)應(yīng)的不同事件類型的值。比如按鍵事件對(duì)應(yīng)的keybit成員,keybit 就是按鍵事件使用的位圖,Linux 內(nèi)核定義了很多按鍵值,這些按鍵值定義在 include/uapi/linux/input.h 文件中,按鍵值如下:

當(dāng)我們編寫input設(shè)備驅(qū)動(dòng)時(shí)需要先創(chuàng)建一個(gè)input_dev 結(jié)構(gòu)體變量,但是不用我們手動(dòng)創(chuàng)建,input子系統(tǒng)提供了下面兩個(gè)函數(shù)用于創(chuàng)建和注銷input_dev 結(jié)構(gòu)體變量。

申請(qǐng)完input_dev結(jié)構(gòu)體后,需要進(jìn)行初始化,根據(jù)自己的設(shè)備來指定事件類型和事件值,比如按鍵設(shè)備的事件類型是evbit,事件值是keybit。
input_dev結(jié)構(gòu)體初始化完成后,使用input_register_device 函數(shù)向Linux內(nèi)核注冊(cè)input_dev設(shè)備。函數(shù)原型如下:
int input_register_device(struct input_dev *dev)
dev:要注冊(cè)的 input_dev 。
返回值:0,input_dev 注冊(cè)成功;負(fù)值,input_dev 注冊(cè)失敗。
同樣的,注銷 input 驅(qū)動(dòng)的時(shí)候也需要使用 input_unregister_device 函數(shù)來注銷掉前面注冊(cè)的 input_dev,input_unregister_device 函數(shù)原型如下:
void input_unregister_device(struct input_dev *dev)
總結(jié)上面的內(nèi)容,input_dev注冊(cè)過程分為下面幾步:
① 首先使用 input_allocate_device 函數(shù)申請(qǐng)一個(gè) input_dev。
② 初始化 input_dev 的事件類型以及事件值。
③ input_register_device()函數(shù)是輸入子系統(tǒng)核心(input core)提供的函數(shù)。該函數(shù)將input_dev結(jié)構(gòu)體注冊(cè)到輸入子系統(tǒng)核心中
④ input_register_device()函數(shù)如果注冊(cè)失敗,必須調(diào)用input_free_device()函數(shù)釋放分配的空間。如果該函數(shù)注冊(cè)成功,在卸載函數(shù)中應(yīng)該調(diào)用input_unregister_device()函數(shù)來注銷輸入設(shè)備結(jié)構(gòu)體。
input_dev注冊(cè)過程實(shí)例代碼如下:


第 10~23 行都是初始化 input 設(shè)備事件和按鍵值,這里用了三種方法來設(shè)置事件和按鍵值。
2、上報(bào)輸入事件
在input設(shè)備驅(qū)動(dòng)中申請(qǐng)、注冊(cè)完成input_dev結(jié)構(gòu)體后,還不能正常使用input子系統(tǒng),因?yàn)閕nput設(shè)備是輸入一些信息,但是Linux內(nèi)核還不清楚輸入的信息表示什么意思,有什么作用,所以我們需要驅(qū)動(dòng)獲取到具體的輸入值,或者說輸入事件,然后將輸入事件上報(bào)給Linux內(nèi)核。比如按鍵設(shè)備,我們需要在按鍵產(chǎn)生后將按鍵值上報(bào)給Linux內(nèi)核,Linux內(nèi)核獲取到具體的按鍵值后,才會(huì)執(zhí)行相應(yīng)的功能。不同的事件上報(bào)的函數(shù)不同,我們分別來看一下有哪些常用的API函數(shù)。
input_event函數(shù):用于上報(bào)指定的事件以及對(duì)應(yīng)的值。函數(shù)原型如下:

函數(shù)參數(shù)和返回值含義如下:
dev:需要上報(bào)的 input_dev。
type: 上報(bào)的事件類型,比如 EV_KEY。
code:事件碼,也就是我們注冊(cè)的按鍵值,比如 KEY_0、KEY_1 等等。
value:事件值,比如 1 表示按鍵按下,0 表示按鍵松開。
返回值:無。
input_event函數(shù)可以用于所有事件類型和事件值的上報(bào)。
input_report_key 函數(shù):上報(bào)按鍵事件。具體函數(shù)內(nèi)容如下:

可以看出,input_report_key 函數(shù)的本質(zhì)就是 input_event 函數(shù),當(dāng)然使用哪個(gè)函數(shù)都沒有問題,不同的設(shè)備使用對(duì)應(yīng)的函數(shù)更加合適一點(diǎn)。
同樣的還有一些其他事件對(duì)應(yīng)的上報(bào)函數(shù):

input_sync 函數(shù):用來告訴Linux內(nèi)核input子系統(tǒng)上報(bào)結(jié)束。input_sync 函數(shù)本質(zhì)上是上報(bào)一個(gè)同步事件,函數(shù)原型如下:
void input_sync(struct input_dev *dev)
列舉了好幾個(gè)函數(shù),以按鍵設(shè)備為例,看一下如何使用:

獲取按鍵的值,然后判斷按鍵是否按下,通過input_report_key函數(shù)上報(bào)按鍵的值,input_sync函數(shù)表示上報(bào)結(jié)束。
3 input_event結(jié)構(gòu)體
Linux 內(nèi)核使用 input_event 這個(gè)結(jié)構(gòu)體來表示所有的輸入事件,input_envent 結(jié)構(gòu)體定義在include/uapi/linux/input.h 文件中,結(jié)構(gòu)體內(nèi)容如下:

依次來看一下 input_event 結(jié)構(gòu)體中的各個(gè)成員變量:
time:時(shí)間,也就是此事件發(fā)生的時(shí)間,為 timeval 結(jié)構(gòu)體類型,timeval 結(jié)構(gòu)體定義如下:

tv_sec 和 tv_usec 這兩個(gè)成員變量都為 long 類型,也就是 32位,這個(gè)一定要記住,后面我們分析 event 事件上報(bào)數(shù)據(jù)的時(shí)候要用到。
type:事件類型,比如 EV_KEY,表示此次事件為按鍵事件,此成員變量為 16 位。
code:事件碼,比如在 EV_KEY 事件中 code 就表示具體的按鍵碼,如:KEY_0、KEY_1等等這些按鍵。此成員變量為 16 位。
value:值,比如 EV_KEY 事件中 value 就是按鍵值,表示按鍵有沒有被按下,如果為 1 的話說明按鍵按下,如果為 0 的話說明按鍵沒有被按下或者按鍵松開了。
input_envent 這個(gè)結(jié)構(gòu)體非常重要,因?yàn)樗械妮斎朐O(shè)備最終都是按照 input_event 結(jié)構(gòu)體呈現(xiàn)給用戶的,用戶應(yīng)用程序可以通過 input_event 來獲取到具體的輸入事件或相關(guān)的值,比如按鍵值等。


終結(jié)者資料全開源,不買也可以自由下載軟硬件資源
您只需要關(guān)注VX公眾號(hào):迅為電子 ,  回復(fù) :終結(jié)者,免費(fèi)獲取產(chǎn)品資料

本文地址:http://www.qingdxww.cn/thread-753973-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專區(qū)
  • 了解一下Microchip強(qiáng)大的PIC18-Q24 MCU系列
  • 為何選擇集成電平轉(zhuǎn)換?
  • PIC18-Q71系列MCU概述
  • 安靜高效的電機(jī)控制——這才是正確的方向!
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 色播五月激情五月 | 家庭教师2| 99精品国产兔费观看66 | 特黄aaaaaa久久片 | 韩国本免费一级毛片免费 | 朋友的母亲hd中字在线观看 | 免费看美女部位隐私 | 99九九国产精品免费视频 | aaa一区二区三区 | 91精品视频免费观看 | 69色堂| 四虎影院的网址 | 蜜柚在线观看免费高清 | 可以免费看污视频的网站 | 97香蕉网 | 久久精品蜜芽亚洲国产a | 国产欧美在线观看精品一区二区 | 视频二区欧美 | 欧美另类69xxxxx 视频 | 夜夜摸视频网 | 色视网站 | 亚洲免费视频播放 | 国产女人好爽好多水 | 国产一区二区三区播放 | 在线免费黄视频 | 番剧高清在线观看 | 日韩第五页 | 精品国产一区二区三区不卡在线 | 91精品国产福利尤物免费 | 亚洲v视频 | 国产三级精品三级在线观看 | 精品视频香蕉尹人在线 | 国产精品福利一区二区亚瑟 | 在线观看精品视频一区二区三区 | 亚洲伦理天堂 | 国产福利一区二区在线观看 | 久久99久久99精品免费看动漫 | 亚洲国产天堂久久综合226 | 久久99精品久久久久久 | 久久精品国产精品亚洲婷婷 | 免费h福利动漫网站在线 |