VxWorks實(shí)時(shí)操作系統的USB驅動(dòng)程序原理與分析
4.5 client回調(callback)任務(wù)
USB操作是嚴格遵守時(shí)序的。例如為使中斷傳輸和同步傳輸正確工作.需要依靠時(shí)鐘中斷。在一個(gè)有幾個(gè)不同client出現的主系統中.總是有可能出現一個(gè)client打斷其它c(diǎn)lient傳輸事件的發(fā)生。WindRiver USBD建議用client callback任務(wù)來(lái)解決這個(gè)問(wèn)題。許多USB事件可以導致一個(gè)USB client的callback任務(wù)。例如, 每當USBD 完成USB IRP后,client的IRP callback函數被激活。同樣,當USBD識別出一個(gè)動(dòng)態(tài)連接事件后,會(huì )激活一個(gè)或更多的動(dòng)態(tài)attach callback操作。但不是馬上激活這些回調操作, 而是安排合適的相應的USBD client的回調任務(wù)來(lái)執行callback。
一般的情況下,每一個(gè)client的callback任務(wù)處于“休眠”態(tài)(阻塞態(tài))。每一個(gè)client的callback,繼承了 usbdClientRegister()產(chǎn)生的VxWorks任務(wù)優(yōu)先級。這確保了每一個(gè)callback按其client的任務(wù)優(yōu)先級來(lái)執行,而且可以利用優(yōu)先級來(lái)寫(xiě)client,保證對時(shí)間要求嚴格的USB傳輸。由于每一個(gè)client有它自己的callback任務(wù),因此在callback期間,它們有很大的靈活性決定可以做什么。例如,允許在不破壞USBD或其它USBD client性能的條件下,使callback執行代碼運行至阻塞態(tài)。
Client callback task有VxWorks任務(wù)名:tUsbdCln。
4.6 USBD內部Client
當第一次初始化USBD時(shí),由USBD產(chǎn)生并注冊一個(gè)內部client,以跟蹤USB請求。
USBD 可以產(chǎn)生什么類(lèi)型的USB請求呢? 所有USBD與USB設備的傳輸,均利用調用USBD client的形式來(lái)完成。例如,當一個(gè)設備第一次連接到系統時(shí).USBD用一個(gè)控制管道(control pipe) 自動(dòng)地創(chuàng )建設備需要的所有的control pipe,即USBD client要用usbdPipeCreate()來(lái)創(chuàng )建一個(gè)與USB endpoint0通話(huà)的通道,然后所有USBD 內部、外部client通過(guò)這個(gè)管道來(lái)發(fā)送諸如usbdDescriptorGet()或usbdFeatureGet()等的函數,進(jìn)行操作。
所以,USBD 的一個(gè)機制就是USBD 循環(huán)利用它自己的entry point,而內部chent跟蹤這些請求。
4.7 動(dòng)態(tài)連接的注冊
每當一個(gè)特定類(lèi)型的設備插入或拔出時(shí),USBD client都通知上一層。利用調用usbdDynamicAttachRegister()操作,client可以指定一個(gè)callback操作,以便可以獲取這樣的通知。
USB設備類(lèi)型用class,subclass,protocol來(lái)區別。標準的USB 類(lèi)在usb.h 中定義為USB_CLASS_XXXX。Subclass和protocol根據class來(lái)定義, 因此這些常數根據特定的class在頭文件中定義。
有時(shí),一個(gè)client當利用usbdDynamicAttachRegister()進(jìn)行注冊時(shí),只對特定的 class,subclass,protocol 感興趣。例如,USB鍵盤(pán)類(lèi)驅動(dòng)usbkeyboardLib, 注冊了Human Device Interface (HID) 類(lèi),subclass 是USB_SUBCLASS_HID_ BOOT,protocol是USB_PROTOCOL_HID_BOOT _KEYBOARD。通過(guò)callback機制的響應,每當一個(gè)設備完全符合這樣的標準, 從設備上插入或拔出時(shí),SBD便通知給keyboard class driver。而在其它情況下,client關(guān)注的范圍更廣泛了。常量USBD_NOTIFY(定義在usbdLib.h)可以替代任意的class, subclass,protocol。例如,USB打印機USB驅動(dòng),usbPrinterLib,其class等于 USB_CLASS_PRINTER,subclass 等于USB_SUBCLASS_PRINTER (usbPrinter.h),protocol等于USBD_ NOTIFY_ ALL。典型的,當一個(gè)client只調用一次usbdDynamicAttachRegister()時(shí),對一個(gè)client能擁有的并發(fā)通知請求數目沒(méi)有限制。
4.8 Node ID
USB設備一般用USBD_NODE_ID來(lái)區別。從其作用來(lái)看, USBD_ NODE_ ID 是USBD 用來(lái)跟蹤一個(gè)設備的句柄。它與USB設備真正的USB地址無(wú)關(guān)。這表明client并不真正關(guān)心想要了解設備是物理上與哪一個(gè)USB主控制器相連。應用為每個(gè)設備抽象定義的Node ID, 使client可以不用考慮物理設備的連接細節以及USB地址分配, 并允許USBD 在其內部對這些進(jìn)行詳細的管理。
當一個(gè)client通知有一個(gè)設備連接或斷開(kāi)時(shí),USBD經(jīng)常通過(guò)USBD_NODE_ID來(lái)定位設備。同樣,當一個(gè)client想通過(guò)USBD與一個(gè)特定的設備通信時(shí),它必須向USBD傳遞那個(gè)設備的USBD_NODE_ID。
4.9 總線(xiàn)編號(bus enumeration)操作
usbdLib模塊提供了usbdBusCountGet(),usbdRootNodeldGet(),usbdHubPortCountGet (),usbdNodldGet()操作。它們被一起稱(chēng)作總線(xiàn)編號操作。它們使USBD Client對連接到每一個(gè)主控制器上的設備進(jìn)行編號。
這些操作對于診斷程序和測試工具很有用,例如usbTool(WindRiver提供的一個(gè)測試工具)。但是,利用它們編號之后,調用者無(wú)法知道USB的拓撲結構是否變化。因此, 建議USB class driver的開(kāi)發(fā)者不要用這些操作。
4.10 數據傳輸
一旦client配置完成一個(gè)設備,就開(kāi)始利用USBD提供的管道和傳輸功能與設備進(jìn)行數據交換。傳輸種類(lèi)(分為控制、塊、中斷和同步傳輸)用一個(gè) USB_IRP數據結構來(lái)描述。 USB_IRP 的具體描述請參見(jiàn)HCD_FUNC_IRP_SUBM1T。USB數據傳輸被定位于每一個(gè)設備的特定endpoint。在USBD client和特定的設備endpoint之間的通道被稱(chēng)作管道(pipe)。每一個(gè)管道有以下若干特性:
USBD_NODE_ID;
設備的endpoim 數目;
數據傳輸方向;
帶寬需求;
延時(shí)需求。
為了和設備交換數據,client必須先創(chuàng )建管道。作為結果,USBD得到了一個(gè)USBD_PIPE_HANDLE,它被用于隨后對這個(gè)管道的所有client操作。
當client企圖創(chuàng )建一個(gè)管道時(shí),USBD會(huì )檢查是否有足夠的可用帶寬。對于中斷和同步傳輸,帶寬限制是必需的。USBD不允許把90%以上的可用帶寬分配給中斷和同步管道;而對于控制和塊傳輸,則沒(méi)有帶寬的限制。同時(shí),保證至少10%的帶寬用于控制傳輸,對塊傳輸則不保證會(huì )提供任何可用帶寬。
數據傳輸的具體過(guò)程:
(1)創(chuàng )建pipe :usbdPipeCreate(usbdClient Handle,nodeld,endpoint,configvalue,interface, USB_XFRTYPE_BULK,USB_ DIR_OUT,maxPacketSize,0,0,outPipeHandle);
(2)定義callback:ourlrpCallback(pvoid P);
(3)初始化IRP的數據結構;
(4)發(fā)送IRP:usbdTransfer(usbdChentHandle,outPipeHandle,&irp)。
5 、小結
USB在VxWroks下的從下至上驅動(dòng)棧分為HC、UCD、USBD和Client Module四層,每一層都相對獨立,并為上一層提供了屏蔽該層次具體特征的接口。作者所說(shuō)的USB驅動(dòng),實(shí)際上主要在USBD這一層次上完成。具體分為 Chent注冊,注銷(xiāo),創(chuàng )建pipe ,配置,數據發(fā)送,以及各回調函數。當正確地依次調用時(shí),會(huì )根據回調函數的狀態(tài)和返回值,按正確的時(shí)序進(jìn)行完整的數據傳輸。
上述設計思想構成了VxWorks下USB設備應用的基礎。作者的研究詳細地分析了VxWorks的USB協(xié)議棧,證明了該方案的可行性,同時(shí)又給出了合理的實(shí)現方法。作為實(shí)踐成果,作者已在VPN網(wǎng)關(guān)證書(shū)讀取系統中,利用該思想編寫(xiě)的驅動(dòng),順利讀出存儲在USB設備中的設備證書(shū)和管理員證書(shū),且運行情況良好。作者認為,文中提到的模型完全可以勝任解決 USB設備在VxWorks下的應用所面臨的技術(shù)難題。 linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論