新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > VxWorks實時操作系統的USB驅動程序原理與分析

        VxWorks實時操作系統的USB驅動程序原理與分析

        作者: 時間:2012-03-27 來源:網絡 收藏


        4.5 client回調(callback)任務

          USB操作是嚴格遵守時序的。例如為使中斷傳輸和同步傳輸正確工作.需要依靠時鐘中斷。在一個有幾個不同client出現的主系統中.總是有可能出現一個client打斷其它client傳輸事件的發生。WindRiver USBD建議用client callback任務來解決這個問題。許多USB事件可以導致一個USB client的callback任務。例如, 每當USBD 完成USB IRP后,client的IRP callback函數被激活。同樣,當USBD識別出一個動態連接事件后,會激活一個或更多的動態attach callback操作。但不是馬上激活這些回調操作, 而是安排合適的相應的USBD client的回調任務來執行callback。

          一般的情況下,每一個client的callback任務處于“休眠”態(阻塞態)。每一個client的callback,繼承了 usbdClientRegister()產生的任務優先級。這確保了每一個callback按其client的任務優先級來執行,而且可以利用優先級來寫client,保證對時間要求嚴格的USB傳輸。由于每一個client有它自己的callback任務,因此在callback期間,它們有很大的靈活性決定可以做什么。例如,允許在不破壞USBD或其它USBD client性能的條件下,使callback執行代碼運行至阻塞態。
          Client callback task有任務名:tUsbdCln。

        4.6 USBD內部Client

          當第一次初始化USBD時,由USBD產生并注冊一個內部client,以跟蹤USB請求。

          USBD 可以產生什么類型的USB請求呢? 所有USBD與USB設備的傳輸,均利用調用USBD client的形式來完成。例如,當一個設備第一次連接到系統時.USBD用一個控制管道(control pipe) 自動地創建設備需要的所有的control pipe,即USBD client要用usbdPipeCreate()來創建一個與USB endpoint0通話的通道,然后所有USBD 內部、外部client通過這個管道來發送諸如usbdDescriptorGet()或usbdFeatureGet()等的函數,進行操作。

          所以,USBD 的一個機制就是USBD 循環利用它自己的entry point,而內部chent跟蹤這些請求。

        4.7 動態連接的注冊

          每當一個特定類型的設備插入或拔出時,USBD client都通知上一層。利用調用usbdDynamicAttachRegister()操作,client可以指定一個callback操作,以便可以獲取這樣的通知。

          USB設備類型用class,subclass,protocol來區別。標準的USB 類在usb.h 中定義為USB_CLASS_XXXX。Subclass和protocol根據class來定義, 因此這些常數根據特定的class在頭文件中定義。

          有時,一個client當利用usbdDynamicAttachRegister()進行注冊時,只對特定的 class,subclass,protocol 感興趣。例如,USB鍵盤類驅動usbkeyboardLib, 注冊了Human Device Interface (HID) 類,subclass 是USB_SUBCLASS_HID_ BOOT,protocol是USB_PROTOCOL_HID_BOOT _KEYBOARD。通過callback機制的響應,每當一個設備完全符合這樣的標準, 從設備上插入或拔出時,SBD便通知給keyboard class driver。而在其它情況下,client關注的范圍更廣泛了。常量USBD_NOTIFY(定義在usbdLib.h)可以替代任意的class, subclass,protocol。例如,USB打印機,usbPrinterLib,其class等于 USB_CLASS_PRINTER,subclass 等于USB_SUBCLASS_PRINTER (usbPrinter.h),protocol等于USBD_ NOTIFY_ ALL。典型的,當一個client只調用一次usbdDynamicAttachRegister()時,對一個client能擁有的并發通知請求數目沒有限制。

        4.8 Node ID

          USB設備一般用USBD_NODE_ID來區別。從其作用來看, USBD_ NODE_ ID 是USBD 用來跟蹤一個設備的句柄。它與USB設備真正的USB地址無關。這表明client并不真正關心想要了解設備是物理上與哪一個USB主控制器相連。應用為每個設備抽象定義的Node ID, 使client可以不用考慮物理設備的連接細節以及USB地址分配, 并允許USBD 在其內部對這些進行詳細的管理。

          當一個client通知有一個設備連接或斷開時,USBD經常通過USBD_NODE_ID來定位設備。同樣,當一個client想通過USBD與一個特定的設備通信時,它必須向USBD傳遞那個設備的USBD_NODE_ID。

        4.9 總線編號(bus enumeration)操作

          usbdLib模塊提供了usbdBusCountGet(),usbdRootNodeldGet(),usbdHubPortCountGet (),usbdNodldGet()操作。它們被一起稱作總線編號操作。它們使USBD Client對連接到每一個主控制器上的設備進行編號。

          這些操作對于診斷程序和測試工具很有用,例如usbTool(WindRiver提供的一個測試工具)。但是,利用它們編號之后,調用者無法知道USB的拓撲結構是否變化。因此, 建議USB class driver的開發者不要用這些操作。

        4.10 數據傳輸

          一旦client配置完成一個設備,就開始利用USBD提供的管道和傳輸功能與設備進行數據交換。傳輸種類(分為控制、塊、中斷和同步傳輸)用一個 USB_IRP數據結構來描述。 USB_IRP 的具體描述請參見HCD_FUNC_IRP_SUBM1T。USB數據傳輸被定位于每一個設備的特定endpoint。在USBD client和特定的設備endpoint之間的通道被稱作管道(pipe)。每一個管道有以下若干特性:
          USBD_NODE_ID;
          設備的endpoim 數目;
          數據傳輸方向;
          帶寬需求;
          延時需求。


          為了和設備交換數據,client必須先創建管道。作為結果,USBD得到了一個USBD_PIPE_HANDLE,它被用于隨后對這個管道的所有client操作。

          當client企圖創建一個管道時,USBD會檢查是否有足夠的可用帶寬。對于中斷和同步傳輸,帶寬限制是必需的。USBD不允許把90%以上的可用帶寬分配給中斷和同步管道;而對于控制和塊傳輸,則沒有帶寬的限制。同時,保證至少10%的帶寬用于控制傳輸,對塊傳輸則不保證會提供任何可用帶寬。
        數據傳輸的具體過程:

          (1)創建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)發送IRP:usbdTransfer(usbdChentHandle,outPipeHandle,&irp)。

        5 、小結

          USB在VxWroks下的從下至上驅動棧分為HC、UCD、USBD和Client Module四層,每一層都相對獨立,并為上一層提供了屏蔽該層次具體特征的接口。作者所說的,實際上主要在USBD這一層次上完成。具體分為 Chent注冊,注銷,創建pipe ,配置,數據發送,以及各回調函數。當正確地依次調用時,會根據回調函數的狀態和返回值,按正確的時序進行完整的數據傳輸。

          上述設計思想構成了下USB設備應用的基礎。作者的研究詳細地分析了VxWorks的USB協議棧,證明了該方案的可行性,同時又給出了合理的實現方法。作為實踐成果,作者已在VPN網關證書讀取系統中,利用該思想編寫的驅動,順利讀出存儲在USB設備中的設備證書和管理員證書,且運行情況良好。作者認為,文中提到的模型完全可以勝任解決 USB設備在VxWorks下的應用所面臨的技術難題。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 泸定县| 河间市| 迭部县| 抚松县| 扶风县| 新邵县| 霍城县| 福清市| 旺苍县| 册亨县| 河曲县| 南宁市| 华蓥市| 尼勒克县| 汽车| 武夷山市| 云龙县| 思茅市| 达日县| 比如县| 汝阳县| 涡阳县| 乌拉特前旗| 阿克| 西畴县| 郧西县| 彩票| 红河县| 商水县| 新河县| 永顺县| 中西区| 清新县| 时尚| 宁远县| 会宁县| 永顺县| 岐山县| 锡林浩特市| 茶陵县| 凌云县|