Linux USB 驅(qū)動(dòng)

Linux USB 驅(qū)動(dòng)

ID:40496432

大?。?8.89 KB

頁數(shù):20頁

時(shí)間:2019-08-03

Linux USB 驅(qū)動(dòng)_第1頁
Linux USB 驅(qū)動(dòng)_第2頁
Linux USB 驅(qū)動(dòng)_第3頁
Linux USB 驅(qū)動(dòng)_第4頁
Linux USB 驅(qū)動(dòng)_第5頁
資源描述:

《Linux USB 驅(qū)動(dòng)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。

1、LinuxUSB驅(qū)動(dòng)框架分析初次接觸和OS相關(guān)的設(shè)備驅(qū)動(dòng)編寫,感覺還挺有意思的,為了不至于忘掉看過的東西,筆記跟總結(jié)當(dāng)然不可缺,更何況我決定為嵌入式賣命了。好,言歸正傳,我說一說這段時(shí)間的收獲,跟大家分享一下Linux的驅(qū)動(dòng)研發(fā)。但這次只先針對Linux的USB子系統(tǒng)作分析,因?yàn)橹芪逖杏懤习宕哓?。?dāng)然,還會(huì)順帶提一下其他的驅(qū)動(dòng)程式寫法。事實(shí)上,Linux的設(shè)備驅(qū)動(dòng)都遵循一個(gè)慣例??表征驅(qū)動(dòng)程式(用driver更貼切一些,應(yīng)該稱為驅(qū)動(dòng)器比較好吧)的結(jié)構(gòu)體,結(jié)構(gòu)體里面應(yīng)該包含了驅(qū)動(dòng)程式所需要的所有資源。用術(shù)語來說,就是這個(gè)驅(qū)動(dòng)器對象所擁有的屬性及成員。由于Linux的內(nèi)核用c來

2、編寫,所以我們也按照這種結(jié)構(gòu)化的思想來分析代碼,但我還是希望從OO的角度來闡述這些細(xì)節(jié)。這個(gè)結(jié)構(gòu)體的名字有驅(qū)動(dòng)研發(fā)人員決定,比如說,鼠標(biāo)可能有一個(gè)叫做mouse_dev的struct,鍵盤可能由一個(gè)keyboard_dev的struct(devfordevice,我們做的只是設(shè)備驅(qū)動(dòng))。而這次我們來分析一下Linux內(nèi)核源碼中的一個(gè)usb-skeleton(就是usb驅(qū)動(dòng)的骨架咯),自然,他定義的設(shè)備結(jié)構(gòu)體就叫做usb-skel:structusb_skel{structusb_device*udev;/*theusbdeviceforthisdevice*/structu

3、sb_interface*interface;/*theinterfaceforthisdevice*/structsemaphorelimit_sem;/*limitingthenumberofwritesinprogress*/unsignedchar*bulk_in_buffer;/*thebuffertoreceivedata*/size_tbulk_in_size;/*thesizeofthereceivebuffer*/__u8bulk_in_endpointAddr;/*theaddressofthebulkinendpoint*/__u8bulk_out_e

4、ndpointAddr;/*theaddressofthebulkoutendpoint*/structkrefkref;};這里我們得補(bǔ)充說明一下一些USB的協(xié)議規(guī)范細(xì)節(jié)。USB能夠自動(dòng)監(jiān)測設(shè)備,并調(diào)用相應(yīng)得驅(qū)動(dòng)程式處理設(shè)備,所以其規(guī)范實(shí)際上是相當(dāng)復(fù)雜的,幸好,我們不必理會(huì)大部分細(xì)節(jié)問題,因?yàn)長inux已提供相應(yīng)的解決方案。就我目前的理解來說,USB的驅(qū)動(dòng)分為兩塊,一塊是USB的bus驅(qū)動(dòng),這個(gè)東西,Linux內(nèi)核已做好了,我們能不管,但我們至少要了解他的功能。形象得說,USB的bus驅(qū)動(dòng)相當(dāng)于鋪出一條路來,讓所有的信息都能通過這條USB通道到達(dá)該到的地方,這部分工作由u

5、sb_core來完成。當(dāng)USB設(shè)備接到USB控制器接口時(shí),usb_core就檢測該設(shè)備的一些信息,例如生產(chǎn)廠商ID和產(chǎn)品的ID,或是設(shè)備所屬的class、subclass跟protocol,以便確定應(yīng)該調(diào)用哪一個(gè)驅(qū)動(dòng)處理該設(shè)備。里面復(fù)雜細(xì)節(jié)我們不用管,我們要做的是另一塊工作??usb的設(shè)備驅(qū)動(dòng)。也就是說,我們就等著usb_core告訴我們要工作了,我們才工作。從研發(fā)人員的角度看,每一個(gè)usb設(shè)備有若干個(gè)設(shè)置(configuration)組成,每個(gè)設(shè)置又能有多個(gè)接口(interface),每個(gè)接口又有多個(gè)設(shè)置(setting圖中沒有給出),而接口本身可能沒有端點(diǎn)或多個(gè)端點(diǎn)(e

6、ndpoint)。USB的數(shù)據(jù)交換通過端點(diǎn)來進(jìn)行,主機(jī)和各個(gè)端點(diǎn)之間建立起單向的管道來傳輸數(shù)據(jù)。而這些接口能分為四類:控制(control)用于設(shè)置設(shè)備、獲取設(shè)備信息、發(fā)送命令或獲取設(shè)備的狀態(tài)報(bào)告中斷(interrupt)當(dāng)USB宿主需求設(shè)備傳輸數(shù)據(jù)時(shí),中斷端點(diǎn)會(huì)以一個(gè)固定的速率傳送少量數(shù)據(jù),還用于發(fā)送數(shù)據(jù)到USB設(shè)備以控制設(shè)備,一般不用于傳送大量數(shù)據(jù)。批量(bulk)用于大量數(shù)據(jù)的可靠傳輸,如果總線上的空間不足以發(fā)送整個(gè)批量包,他會(huì)被分割成多個(gè)包傳輸。等時(shí)(isochronous)大量數(shù)據(jù)的不可靠傳輸,不確保數(shù)據(jù)的到達(dá),但確保恒定的數(shù)據(jù)流,多用于數(shù)據(jù)采集。Linux中用s

7、tructusb_host_endpoint來描述USB端點(diǎn),每個(gè)usb_host_endpoint中包含一個(gè)structusb_endpoint_descriptor結(jié)構(gòu)體,當(dāng)中包含該端點(diǎn)的信息及設(shè)備自定義的各種信息,這些信息包括:bEndpointAddress(bforbyte)8位端點(diǎn)地址,其地址還隱藏了端點(diǎn)方向的信息(之前說過,端點(diǎn)是單向的),能用掩碼USB_DIR_OUT和USB_DIR_IN來確定。bmAttributes端點(diǎn)的類型,結(jié)合USB_ENDPOINT_XFERTYPE_MASK能確定端點(diǎn)是

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時(shí)聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請聯(lián)系客服處理。