




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第19章USB設(shè)備驅(qū)動程序USB設(shè)備是計算機中一種非常常見的設(shè)備。日常生活中,常見的U盤,就是其中之一。USB設(shè)備只使用4條線進行連接,數(shù)據(jù)在線路中的傳輸規(guī)范已經(jīng)從1.0升級到3.0,OTG規(guī)范也在完善之中。從長遠來看,USB設(shè)備將稱為計算機上主流的可插拔設(shè)備,越來越多的外設(shè)會使用USB規(guī)范來設(shè)計。從常見的外置光驅(qū)、移動硬盤、鼠標(biāo)、鍵盤、手寫筆,到外置網(wǎng)卡、藍牙、手機數(shù)據(jù)接口、數(shù)碼相機等,可見USB設(shè)備的使用會多么的廣泛,不久的將來,甚至可以想象兩臺電路之間可以直接通過USB線進行數(shù)據(jù)傳輸,其速度可以達到480Mbit/s。隨著USB設(shè)備在日常生活的廣泛應(yīng)用,學(xué)習(xí)USB設(shè)備驅(qū)動的價值也越來越大,本章將對編寫USB設(shè)備驅(qū)動進行詳細的闡述。19.1USB概述USB作為一種重要的通訊規(guī)范,目前應(yīng)用越來越廣泛。USB協(xié)議中,除了定義了通訊物理層和電氣層的標(biāo)準(zhǔn)外,還定義了一套比較完整的軟件協(xié)議棧。這樣就使大多數(shù)符合協(xié)議的USB設(shè)備能夠很容易的工作在各種平臺上?;旧?,各個平臺上的USB設(shè)備驅(qū)動的邏輯都很相似。由于USB協(xié)議是一套規(guī)范的協(xié)議,所以編寫各種USB設(shè)備的驅(qū)動程序也非常相似,本節(jié)對USB協(xié)議的相關(guān)內(nèi)容做一個簡要的介紹。19.1.1USB概念USB是一個外部總線標(biāo)準(zhǔn),用于規(guī)范電腦與外部設(shè)備的連接和通訊。USB接口支持設(shè)備的即插即用和熱插拔功能。USB接口可用于連接多達127種外設(shè),如鼠標(biāo)、調(diào)制解調(diào)器和鍵盤等。USB是在1994年底由英特爾、康柏、IBM、Microsoft等多家公司聯(lián)合提出的,自1996年推出后,已成功替代串口和并口,并成為當(dāng)今個人電腦和大量智能設(shè)備的必配的接口之一。從1994年11月11日發(fā)表了USBV0.7版本以后,USB版本經(jīng)歷了多年的發(fā)展,到現(xiàn)在已經(jīng)發(fā)展為3.0版本。19.1.2USB的特點USB設(shè)備應(yīng)用非常廣泛,例如USB鍵盤、USB鼠標(biāo)、USB光驅(qū)、U盤等,并且許多手持設(shè)備上也提供了USB接口,方面與電腦或其他設(shè)備傳遞數(shù)據(jù)。USB設(shè)備之所以會被大量應(yīng)用,主要具有以下優(yōu)點,這些優(yōu)點在編程中是需要注意的。1、可以熱插拔。2、攜帶方便。3、標(biāo)準(zhǔn)統(tǒng)一。4、可以連接多個設(shè)備。19.1.2USB總線拓撲結(jié)構(gòu)USB設(shè)備的連接如圖所示,對于每個PC來說,都有一個或者多個稱為主機(Host)控制器的設(shè)備,該主機控制器和一個根集線器(Hub)作為一個整體。這個根Hub下可以接多級的Hub,每個子Hub又可以接子Hub。每個USB設(shè)備作為一個節(jié)點接在不同級別的Hub上。19.1.3USB驅(qū)動總體架構(gòu)在Linux系統(tǒng)中,USB驅(qū)動由USB主機控制器驅(qū)動和USB設(shè)備驅(qū)動組成。USB主機控制器驅(qū)動,主要用來驅(qū)動芯片上的主機控制器硬件。USB設(shè)備驅(qū)動是具體的USB設(shè)備驅(qū)動,例如USB鼠標(biāo)、USB攝像頭等。如圖是USB驅(qū)動的總體架構(gòu)。19.2USB設(shè)備驅(qū)動模型19.2.1USB驅(qū)動初探Linux操作系統(tǒng)提供了大量的缺省驅(qū)動程序。一般來說,這些驅(qū)動程序適用于大多數(shù)硬件,但也有許多特殊功能的硬件不能在操作系統(tǒng)中找到相應(yīng)的驅(qū)動程序。這時,驅(qū)動開發(fā)人員一般在內(nèi)核中找到一份相似的驅(qū)動代碼,再根據(jù)實際的硬件情況進行修改。所以通過什么樣的方法找到相似的驅(qū)動程序非常重要。19.2.2USB設(shè)備驅(qū)動模型理解USB驅(qū)動程序,首先需要理解什么是USB設(shè)備驅(qū)動模型。Linux的設(shè)備驅(qū)動模型在前面的章節(jié)中已經(jīng)講述過,USB設(shè)備驅(qū)動模型是Linux設(shè)備驅(qū)動模型的擴展,這里主要介紹USB設(shè)備驅(qū)動的模型。1.總線、設(shè)備和驅(qū)動2.設(shè)備與驅(qū)動的綁定19.2.3usb驅(qū)動結(jié)構(gòu)usb_driver在USB設(shè)備驅(qū)動模型中,usb設(shè)備驅(qū)動使用usb_driver結(jié)構(gòu)體來表示。該結(jié)構(gòu)體中包含了與具體設(shè)備相關(guān)的核心函數(shù),對于不同的USB設(shè)備,驅(qū)動開發(fā)人員需要實現(xiàn)不同功能的函數(shù),USB核心通過在框架中調(diào)用這些自定義的函數(shù)來完成相應(yīng)的功能。下面對usb_driver結(jié)構(gòu)體進行簡要的介紹。1.usb_driver結(jié)構(gòu)體2.驅(qū)動支持的設(shè)備列表結(jié)構(gòu)體usb_device_id3.初始化usb_device_id結(jié)構(gòu)的宏4.USB驅(qū)動注冊函數(shù)usb_register()19.3USB設(shè)備驅(qū)動程序USB驅(qū)動程序相對比較復(fù)雜,最為簡單的是加載和卸載函數(shù)。在加載函數(shù)中完成了USB設(shè)備的大部分初始化工作,同時涉及到很多重要的數(shù)據(jù)結(jié)構(gòu)。下面對這些概念進行詳細的解釋。19.3.1USB設(shè)備驅(qū)動加載和卸載函數(shù)USB設(shè)備驅(qū)動程序?qū)?yīng)一個usb_driver結(jié)構(gòu)體,這個結(jié)構(gòu)體相當(dāng)于Linux設(shè)備驅(qū)動模型中的driver結(jié)構(gòu)體。19.3.2USB協(xié)議中的設(shè)備USB核心調(diào)用probe()函數(shù)并傳遞進struct
usb_interface和struct
usb_device_id*類型的參數(shù),要理解struct
usb_interface參數(shù)的意義,就必須了解什么是USB設(shè)備(usb_device)。要了解什么是usb_device,就必須了解什么是USB協(xié)議。19.3.4端點的傳輸方式上文中已經(jīng)對設(shè)備、接口、配置和端點進行了說明。但是對于USB驅(qū)動來說,端點的說明還不足夠。USB通信的最基本的形式就是通過端點來進行的。這里以U盤為例,其至少有一個控制端點和兩個傳輸端點。那么端點到底是用來干什么的呢?簡單的說,端點就是用來傳輸數(shù)據(jù)的。19.3.5設(shè)置一個手機可能有多個配置,例如震動還是鈴聲可以算兩種配置。當(dāng)配置確定后,還可以調(diào)節(jié)其大小,如鈴聲的大小,這可以算是一種設(shè)置。通常用大小關(guān)系來表示USB協(xié)議中的概念更好理解,設(shè)備大于配置,配置大于接口,接口大于設(shè)置。也就是說,一個設(shè)備可以有多個配置,一個配置可以有一個或者多個接口,一個接口也可以有一個或者多個設(shè)置。19.3.6探測函數(shù)storage_probe()
對于本章簡述的usb-storage模塊,usb_stor_init()函數(shù)是它的開始,已經(jīng)在上文中講過了。但是對于U盤驅(qū)動程序,真正驅(qū)動U盤正常工作的是storage_probe()函數(shù)。storage_probe()函數(shù)是在usb_storage_driver中指定的。如果讀者還不知道這個函數(shù)的由來,那么一定是你跳過了前面的章節(jié),而忽略了一些重要內(nèi)容了。USB核心為設(shè)備尋找合適的驅(qū)動程序并不是一件簡單的事情。當(dāng)設(shè)備插入時,USB核心會為每一個設(shè)備調(diào)用總線上所有驅(qū)動的probe()函數(shù)。在probe()函數(shù)中檢查驅(qū)動是否真的和設(shè)備相適應(yīng)。在probe()函數(shù)中應(yīng)該盡量去了解設(shè)備足夠多的信息,這樣才能知道驅(qū)動是否能夠支持這種設(shè)備。19.4獲得USB設(shè)備信息在主機與USB設(shè)備通信之前,需要獲得USB設(shè)備的信息。這個過程中,涉及一次USB通信,理解一次USB通信,就能夠理解整個USB通信。下面對這個過程介紹進行詳細的介紹。19.4.1設(shè)備關(guān)聯(lián)函數(shù)associate_dev()在探測函數(shù)storage_probe()的第25行有一個關(guān)聯(lián)設(shè)備的函數(shù)associate_dev(),這個函數(shù)主要使用usb_interface結(jié)構(gòu)體來初始化us指針。19.4.2獲得設(shè)備信息函數(shù)get_device_info()在整個usb-storage模塊的代碼中,其中最為重要的函數(shù)是usb_stor_control_thread()。它創(chuàng)建一個線程,并控制主機與U盤的信息交互。這個函數(shù)在usb_stor_acquire_resources()函數(shù)中調(diào)用。這個函數(shù)在storage_probe()函數(shù)的第40行被調(diào)用。在調(diào)用這個函數(shù)之前,有4個函數(shù)擺在我們面前,它們是get_device_info(),get_transport(),get_protocol(),get_pipes()。這4個函數(shù)是讓驅(qū)動去認識設(shè)備,例如了解設(shè)備的一些信息,它的傳輸方式,傳輸管道等。這些函數(shù)只是做了一些準(zhǔn)備工作,并不沒有完成主機控制器和設(shè)備的交互功能。這幾個函數(shù)只是對后面的數(shù)據(jù)傳輸做好一些鋪墊。19.4.3得到傳輸協(xié)議get_transport()函數(shù)在探測函數(shù)storage_probe()的第31行有一個get_transport()函數(shù),這個函數(shù)主要獲得USB設(shè)備支持的通信協(xié)議,并設(shè)置USB驅(qū)動的傳輸類型。19.4.4獲得協(xié)議信息函數(shù)get_protocol()get_protocol()函數(shù)用來設(shè)置協(xié)議傳輸函數(shù),根據(jù)不同的協(xié)議,使用不同的傳輸函數(shù)。get_protocol()函數(shù)根據(jù)us->subclass來判斷,應(yīng)該給us->protocol_name和us->proto_handler賦什么值。對于U盤來說,USB協(xié)議中規(guī)定us->subclass為US_SC_SCSI,所以這里的switch()中的兩條語句,一個是令us的protocol_name為"TransparentSCSI",另一個是給us的proto_handler賦值為usb_stor_transparent_scsi_command(),這里暫不對這個函數(shù)進行說明,當(dāng)用到時在詳細闡述。19.4.5獲得管道信息函數(shù)get_pipes()get_pipes()函數(shù)用來獲得傳輸管道。這個函數(shù)用涉及到接口、端點、管道等概念。簡單的說,接口代表設(shè)備的一種功能。端點是USB通信的最基本形式。主機只能通過端點與USB設(shè)備進行通信,也就是只能通過端點傳輸數(shù)據(jù)。19.5資源的初始化19.5.1storage_probe()函數(shù)調(diào)用過程對于storage_probe()函數(shù),前面用來很長的篇幅來分析,因為它是USB設(shè)備最主要的函數(shù)之一。首先,分配了一個重要的struct
us_data結(jié)構(gòu)體。如圖19.7所示,在storage_probe()函數(shù)中,主要調(diào)用了五個重要的函數(shù),分別是assocaite_dev(),get_device_info(),get_transport(),get_protocol()和get_pipes()。這些函數(shù)的唯一目的就是為us結(jié)構(gòu)體賦初值,這樣us結(jié)構(gòu)體就可以帶上這些重要的數(shù)據(jù),來回于USB核心之間,完成特定的任務(wù)。當(dāng)為us賦上正確的初始值后,會調(diào)用usb_stor_acquire_resources()函數(shù),得到設(shè)備需要的動態(tài)資源。19.5.2資源獲取函數(shù)usb_stor_acquire_resources()在storage_probe()函數(shù)中,最為重要的一個函數(shù)就是usb_stor_acquire_resources()了。該函數(shù)的主要功能是初始化設(shè)備,并創(chuàng)建數(shù)據(jù)傳輸?shù)目刂凭€程。在這個函數(shù)中,調(diào)用了kthread_run()函數(shù),用來創(chuàng)建一個內(nèi)核線程。在Linux驅(qū)動中,有時候找不到驅(qū)動執(zhí)行的流程,這時候如果發(fā)現(xiàn)了kthread_run()函數(shù),那么就表示驅(qū)動另外創(chuàng)建了一個線程,主要的邏輯就有可能是在這個新線程里執(zhí)行了。19.5.3USB請求塊(urb)USB請求塊(USBrequestblock,urb)是USB主機控制器和設(shè)備通訊的主要數(shù)據(jù)結(jié)構(gòu),主機與設(shè)備之間通過urb來進行數(shù)據(jù)傳輸。在urb中,包含了執(zhí)行usb傳輸所需要的所有信息。當(dāng)主機控制器需要與設(shè)備交互時,只需填充一個urb結(jié)構(gòu),然后將其提交給USB核心,由USB核心負責(zé)對其進行處理。在Linux中,USB請求塊有struct
urb結(jié)構(gòu)體來描述。19.6控制子線程控制子線程用來完成數(shù)據(jù)的接收和發(fā)送。這個線程會一直運行,直到驅(qū)動程序退出。本節(jié)將對控制子線程進行詳細的介紹。19.6.1控制線程控制線程usb_stor_control_thread()是一個守護線程。在Linux中,與Windows不同,是不區(qū)分線程和進程的概念的,因為線程也是用進程來實現(xiàn)的。usb_stor_control_thread()函數(shù)是整個USB模塊中最有意思的函數(shù),這個函數(shù)中執(zhí)行一個for(;;),這是一個死循環(huán),也就是這個函數(shù)作為一些線程用不停
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 核定運輸合同范本
- 會議打光服務(wù)合同
- 防皺折劑不氈合劑企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略研究報告
- 醋酸富鐿企業(yè)ESG實踐與創(chuàng)新戰(zhàn)略研究報告
- 電暖鞋企業(yè)ESG實踐與創(chuàng)新戰(zhàn)略研究報告
- 中藥鎮(zhèn)靜催眠針劑企業(yè)制定與實施新質(zhì)生產(chǎn)力戰(zhàn)略研究報告
- 基因檢測云服務(wù)行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報告
- 農(nóng)產(chǎn)品交易合作協(xié)議
- 健康環(huán)境監(jiān)測評估和檢查AI智能設(shè)備企業(yè)制定與實施新質(zhì)生產(chǎn)力戰(zhàn)略研究報告
- 長鏈脂肪酸企業(yè)縣域市場拓展與下沉戰(zhàn)略研究報告
- 小學(xué)生課程表模板可編輯78
- 政府招商大使合作協(xié)議書
- 營養(yǎng)科專業(yè)知識考核試卷
- AQ/T 9009-2015 生產(chǎn)安全事故應(yīng)急演練評估規(guī)范(正式版)
- NB-T47044-2014電站閥門-標(biāo)準(zhǔn)
- 火鍋店運營管理的問題與解決方案
- 安全技術(shù)管理專業(yè)畢業(yè)實習(xí)報告范文
- 病媒生物防治操作規(guī)程
- 2024年社會工作者《社會工作實務(wù)(中級)》考試真題必考題
- 德育教育研究課題申報書
- (高清版)JTG 3810-2017 公路工程建設(shè)項目造價文件管理導(dǎo)則
評論
0/150
提交評論