VxWorks下USB驅動總結1
1、USB設備
物理特征:4條電纜,電源線、地線、數據線、脈衝線;
速 度:低速1.5Mbps,全速12Mbps,高速480Mbps;
規範版本:1998年USB1.1,2000年USB2.0;
連 接:PCI總線<->USB控製器(OHCI/UHCI/EHCI)<->USB設備;
單個USB控製器最大連接個數:127;
距離限製:USB單條線纜長度不能超過5m,通過hub可延長至30m。
重要概念:主機-USB設備采用master-slave方式分工,所有通信都是主機發起的;在某一時刻,隻有一個設備與主機通信。
一個USB物理設備可以抽象為一個或多個邏輯設備。
USB邏輯設備層次:邏輯設備->配置(configuration)->接口(interface)->端點(end point);
端點是一個地址標實,是驅動和設備數據交換的一個終點,類似於網絡編程中的客戶短套接字或者服務器端套接字。在USBD client和特定的設備endpoint之間的通道被稱作管道(pipe),一個從驅動到設備的數據傳輸管道包括以下幾個要素:
設備的端點(通過讀取/設置配置、接口得到);
設備號(設備動態插入後由USBD分配);
傳輸方向(從設備到主機、或從主機到設備);
帶寬要求;
延遲要求。
主機與USB間有4種傳輸方式:
控製(小批量數據、保證到達);
同步(大批量數據、定時傳輸、不能保證到達);
批量(大批量數據、保證到達);
中斷(小批量數據、不定時產生、保證到達);
? 控製用於讀取/設置USB設備,所有USB設備的端口0默認(或者說強製)給控製管道使用;
? 同步主要用時視頻設備如攝像頭定時產生的批量數據,允許在帶寬不足的情況下丟棄部分數據包;
? 批量用於一次性的大批量數據傳輸;
? 中斷用於異步數據入鍵盤(或鼠標)按下事件發生等。
係統為不同傳輸類型分配不同的可使用帶寬。因此,控製管道必須占有10%的可用帶寬,而批量管道不能達到USB的理想速率,實際中USB設備與主機的傳輸速率比理想速率低很多。
2、VxWorsk下USB協議棧
下圖提供了一個USB主驅動棧結構的簡單概括,共四層。

數據發送路線及格式:客戶驅動(USB_IRP包)->USBD(URB包)->HCD(HRB包)。
>>>>在棧最底層的是硬件:USB主控製器(USB host controller),USB主控製器在嵌入式主機係統中控製USB,實現USB主機功能。目前,USB控製器主要有3類:
(1)(UHCI,universal host controller interface)通用的主控製器,由Intel最先設計並製定相應規範;
(2)(OHCI,open host controller interface)開放的主控製器,由Microsoft,C2ompaq和National Semicondtlctor最先設計並製定相應規範;
(3)(EHCI,enhanced host controller interface)增強的主控製器,該控製器支持USB2.O。
>>>>每一主控製器在其上都有相對應的主控製器驅動程序(HCD),這些設備驅動程序與底層的硬件相關,為上層提供統一的功能接口。相應的驅動分別在usbHcdOhciLib.c和usbHcdUhciLib.c中定義。
USB主機驅動(USBD)與底層硬件無關,通過HCD與底層控製器通信。USBD管理連接到主機上的每一個USB連接,並提供高層與USB設備通信的通道。除此之外,USB[)還自動對USB設備進行電源管理和分配帶寬。在USB係統中,集線器(HUB)對USB係統的正常操作起到關鍵性作用,因此USBD直接對集線器進行控製。這就意味著USBD還具有控製USB設備和集線器動態插拔的能力。(USBD)是客戶驅動和HCD之間的中介,接受客戶發送來命令,發送給HCD,HCD在驅動硬件接受。USBD入口函數usbdCoreEntry(pURB_HEADER
pUrb),所有請求函數都先進入此函數,根據pUrb->function的值調用相應函數。
在主機棧的最頂層是USB設備驅動程序。設備驅動程序依賴USBD提供的通信通道,驅動連接到USB係統中的USB設備。
下圖2顯示了USB主驅動棧的各模塊之間的功能聯係。
通過圖1/2的結構,可以看出USB主機棧的設計關鍵是USB主機驅動(USBD)的設計,USBD為USB設備驅動程序提供標準的USBD API;為主機控製器驅動提供HCDAPI。
一個用戶設置interface例子(僅僅說明在執行一個操作的過程中Stack的數據流):
A:usbdInterfaceSet() 生成URB_INTERFACE_GET_SET結構的變量Urb,結構中第一個變量是URB_HEADER;
B:調用urbExecBlock(&Urb.header) USB消息隊列??
C:調用usbdCoreEntry(pUrb) 進行消息派發;
D:由於pUrb->function=USBD_FNC_INTERFACE_SET,調用fncInterfaceSet(pUrb)->(USBD);
E:調用controlRequest()->(USBD)生成USB_IRP,USB_SETUP包;
F:調用usbdTransfer()->(USBD)生成URB_TRANSFER結構的變量Urb;
G:調用urbExecBlock(&Urb.header)->usbdCoreEntry(pUrb);
H:由於pUrb->function=USBD_FNC_TRANSFER,調用fncTransfer()->(USBD)生成USB_IRP包;
I:調用usbHcdIrpSubmit()->(HCD)生成HRB_IRP_SUBMIT結構hrb,
J:結構中第一個變量是HRB_HEADER,執行(*pNexus->hcdExecFunc) ((pVOID) &hrb); 這裏HCD中也隻有一個入口函數,在HCD注冊時提供給係統,這裏也就是hcdExecFunc所指向的函數。根據HCD類型選擇注冊usbHcdOhciExec()或者usbHcdUhciExec(),這兩個函數都接受HRB數據,根據pHrb->function類型進行不同的處理。
上麵例子中(*pNexus->hcdExecFunc) ((pVOID) &hrb);(在jx2410開發板采用ohciHCD)相當於執行usbHcdOhciExec((pVOID) &hrb)->(HCD),由於hrb->function=HCD_FNC_IRP_SUBMIT,調用fncIrpSubmit()->(HCD)在fncIrpSubmit裏真正完成數據傳送:
步驟包括:
(根據數據塊個數)USER_FLUSH();
if (pPipe->busAddress == pHost->rootAddress)
rootIrpHandler() ;
else
busIrpHandler();
setIrpResult();
應用程序的關鍵在於發送合適的USB_IRP包,完成控製USB設備,獲取數據的功能。
最後更新:2017-04-03 12:55:36