最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

簡(jiǎn)單分析USB設(shè)備驅(qū)動(dòng)框架(秒懂~)

2022-09-27 17:55 作者:補(bǔ)給站Linux內(nèi)核  | 我要投稿

在生活、工作中經(jīng)常會(huì)接觸到USB設(shè)備,如鼠標(biāo)、鍵盤(pán)、攝像頭、可移動(dòng)硬盤(pán)、掃碼槍等。這些設(shè)備通過(guò)USB接口連接到電腦上后,電腦會(huì)立刻提示“檢測(cè)到新硬件...”、安裝驅(qū)動(dòng)等。這里需要強(qiáng)調(diào)下USB設(shè)備使用的是USB總線,window或Linux內(nèi)核中都會(huì)自帶usb總線驅(qū)動(dòng),所以接上USB設(shè)備后,主機(jī)能夠立刻檢測(cè)到,提醒需要安裝設(shè)備驅(qū)動(dòng)是指安裝USB設(shè)備驅(qū)動(dòng)。

USB設(shè)備驅(qū)動(dòng)使用USB總線,所以很多操作由USB總線驅(qū)動(dòng)幫我們完成了,我們只需要的按照總線、設(shè)備、驅(qū)動(dòng)框架來(lái)實(shí)現(xiàn)USB設(shè)備的驅(qū)動(dòng)既可。USB設(shè)備數(shù)據(jù)的讀寫(xiě)操作由總線驅(qū)動(dòng)現(xiàn)在,我們可以直接使用總線讀取到的數(shù)據(jù),然后解析這些數(shù)據(jù)的含義、再進(jìn)行相關(guān)的操作就可以了(這里需要注意的一點(diǎn)是USB總線驅(qū)動(dòng)只提供USB設(shè)備的讀寫(xiě)操作函數(shù),這函數(shù)是通用的,即里面的數(shù)據(jù)的含義總線驅(qū)動(dòng)并不知道)。

USB設(shè)備驅(qū)動(dòng)的框架圖下,具體的代碼可以參考內(nèi)核中的/drivers/hid/usbhid/usbmouse.c

分配/設(shè)置usb_driver結(jié)構(gòu)體,填充里面的.id_table、.probe、.disconnect成員。 調(diào)用usb_register把usb_driver結(jié)構(gòu)體注冊(cè)到內(nèi)核中。

struct usb_driver中的id_table成員是用與和usb設(shè)備進(jìn)行匹配的選項(xiàng),表示這個(gè)驅(qū)動(dòng)支持的設(shè)備。


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺(jué)得比較好的學(xué)習(xí)書(shū)籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!?。。ê曨l教程、電子書(shū)、實(shí)戰(zhàn)項(xiàng)目及代碼)? ? ?

.probe成員為函數(shù)指針,就是在設(shè)備和驅(qū)動(dòng)匹配成功的時(shí)候執(zhí)行。

.disconnect成員也為函數(shù)指針,在設(shè)備和驅(qū)動(dòng)關(guān)聯(lián)成功后再斷開(kāi)執(zhí)行,如拔了USB設(shè)備或卸載USB設(shè)備驅(qū)動(dòng)。

.probe函數(shù)中我們需要處理的事情如下(這里以鼠標(biāo)為例子):

創(chuàng)建input_dev設(shè)備 設(shè)置input_dev支持的類,需要支持按鍵類、相對(duì)位移類。 設(shè)置input_dev支持的事件,能夠產(chǎn)生左、中、右、以及側(cè)邊附加按鍵事件,還有xy方向上的相對(duì)位移事件和滾輪滑動(dòng)事件。 注冊(cè)input_dev到input輸入子系統(tǒng)中。 硬件相關(guān)的操作,不同的設(shè)備的操作存在差異 USB總線為組從結(jié)構(gòu),USB總線驅(qū)動(dòng)只能輪詢?nèi)カ@取USB設(shè)備上的數(shù)據(jù),USB設(shè)備不能主動(dòng)通知USB主機(jī)傳輸數(shù)據(jù)。在USB驅(qū)動(dòng)中需要構(gòu)建urb(usb request block)結(jié)構(gòu)體,然后填充使用。urb中要指定USB設(shè)備數(shù)據(jù)存放到主機(jī)上的物理地址以及虛擬地址,還有USB數(shù)據(jù)傳輸?shù)姆较?、長(zhǎng)度,和設(shè)備通信的端點(diǎn)等。

使用usb_alloc_urb()函數(shù)分配urb結(jié)構(gòu)體,結(jié)束后使用usb_free_urb()釋放這個(gè)結(jié)構(gòu)體。

USB設(shè)備的數(shù)據(jù)要存放在主機(jī)上的什么地方,USB設(shè)備驅(qū)動(dòng)中需要指明。

找到對(duì)應(yīng)的設(shè)備端點(diǎn)和數(shù)據(jù)長(zhǎng)度

現(xiàn)在數(shù)據(jù)傳輸?shù)娜兀ㄔ?、長(zhǎng)度、目的)都確定了,剩下的就是要進(jìn)行填充urb結(jié)構(gòu)體,即告訴主機(jī)數(shù)據(jù)傳輸?shù)娜亍?/p>

調(diào)用usb_fill_int_urb(),其中complete_fn相當(dāng)于中斷函數(shù),即主機(jī)讀取完數(shù)據(jù)會(huì)放到指定的內(nèi)存data_dma中。然后通知CPU處理這些數(shù)據(jù),這些數(shù)據(jù)只有USB設(shè)備驅(qū)動(dòng)程序知道其含義。所以要在這個(gè)完成函數(shù)中處理這些數(shù)據(jù),如上報(bào)。

最后就是提交usr請(qǐng)求塊了。

到這里基本上就結(jié)束了,剩下的就是disconnect函數(shù)的操作。這個(gè)函數(shù)和.probe完全相反,申請(qǐng)了的資源需要在這里釋放。

看到這里是不是感覺(jué)USB驅(qū)動(dòng)很簡(jiǎn)單??!框架確實(shí)很簡(jiǎn)單!很簡(jiǎn)單!很簡(jiǎn)單!重要的事情要說(shuō)三遍,要相信你們的實(shí)力。

下面的代碼是我在ARM板子上的針對(duì)usb鼠標(biāo)寫(xiě)的。

測(cè)試如下圖,按鍵和移動(dòng)鼠標(biāo)都能產(chǎn)生相應(yīng)的事件碼。這里/dev/event0的格式就不說(shuō)了,要是不太清楚的可以參考input輸入子系統(tǒng)。

usb驅(qū)動(dòng)設(shè)備使用了input輸入子系統(tǒng)框架,這個(gè)和之前的輸入子系統(tǒng)(按鍵、觸摸屏)之類的存在一點(diǎn)差異。之前的都是在中斷服務(wù)函數(shù)中直接獲取到數(shù)據(jù)然后調(diào)用input_event上報(bào),而USB設(shè)備驅(qū)動(dòng)中的數(shù)據(jù)來(lái)源是USB總線驅(qū)動(dòng),在完成函數(shù)中調(diào)用input_event上報(bào)數(shù)據(jù)。

事情就是這么個(gè)事情,情況就是這么個(gè)情況。

這就是usb設(shè)備驅(qū)動(dòng)的簡(jiǎn)單框架,后面有空在把寫(xiě)操作(數(shù)據(jù)由主機(jī)發(fā)送到設(shè)備)的驅(qū)動(dòng)模型以及各種傳輸類型的驅(qū)動(dòng)更新下




簡(jiǎn)單分析USB設(shè)備驅(qū)動(dòng)框架(秒懂~)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
图木舒克市| 新宾| 茂名市| 赤城县| 靖远县| 金塔县| 咸丰县| 灵寿县| 阳高县| 丽水市| 大荔县| 古丈县| 隆德县| 宾阳县| 临西县| 荔波县| 葫芦岛市| 进贤县| 合水县| 巴塘县| 体育| 资阳市| 泗阳县| 天台县| 西平县| 宜宾市| 高尔夫| 遂宁市| 克山县| 永靖县| 城固县| 河南省| 杭州市| 内丘县| 武隆县| 神池县| 大渡口区| 合阳县| 虞城县| 儋州市| 宜城市|