Linux主機端API以及結構體介紹(一)

Linux上的USB簡介

        Universal Serial Bus (USB) 通用串行總線用於將主機(例如PC或工作站)連接到許多外圍設備。

        USB使用樹形結構,主機作爲根(系統的主節點),集線器作爲內部節點,外圍設備作爲葉子(和從節點)。現代PC支持幾種此類的USB設備,通常是一些USB 3.0(5 GBit / s)或USB 3.1(10 GBit / s)以及一些舊版USB 2.0(480 MBit / s)總線。

        出於多種原因USB設計者設計了主/從不對稱性,其中一個是易於使用。從物理角度上不可能在上端和下端出錯,對於TypeC類型插頭也沒關係(或者它們內置在外圍設備中)。同樣,主機軟件不需要處理分佈式自動配置,因爲預先指定的主節點可以管理所有這些。

        內核開發人員在Linux2.2內核的早期就向Linux添加了對USB支持,並且自那時起一直不斷迭代開發。除了支持每個新一代USB外,還支持各種主機控制器,同時添加了用於外設的新驅動程序,並引入了用於延遲測量和改進電源管理的高級功能。

        Linux可以在USB設備內部運行,也可以在控制設備的主機上運行。但是,在這些外圍設備中運行的USB設備驅動程序與在主機中運行的USB設備驅動程序的功能不同,因此爲它們指定了不同的名稱:gadget drivers

USB主機端API模型

       主機端的USB設備驅動程序與“ usbcore” API進行數據交換。裏面有兩組API,一個用於通用驅動程序(通過驅動程序框架公開),另一個用於核心驅動程序。這樣的核心驅動程序包括集線器驅動程序(管理USB設備的樹)和幾種不同類型的主機控制器驅動程序,它們控制單個總線。

USB驅動程序中看到的設備模型相對複雜。

  • USB支持四種數據傳輸(控制,批量,中斷和同步)。其中兩個(控制和批量)使用可用的帶寬,而其他兩個(中斷和同步)則計劃提供有保證的帶寬。

  • 設備描述模型中包括每個設備的一個或多個“配置”,一次僅激活其中一個。設備應能以低於其最高速度的速度運行,並且可以提供BOS描述符,以顯示其保持完全運行的最低速度。

  • 從USB 3.0開始,USB集成了一個或多個“功能”,這些功能提供了一種通用功能,並且爲了電源管理的目的將它們組合在一起。

  • 配置或功能具有一個或多個“接口”,每個接口可能具有“備用設置”。接口可以通過USB“ Class”規範進行標準化,或者可以特定於供應商或設備。

     USB設備驅動程序實際上綁定到接口,而不是設備。將它們視爲“接口驅動程序”,儘管您可能看不到區別很重要的許多設備。大多數USB設備都很簡單,只有一種功能,一種配置,一種接口和一種替代設置。

  • 接口具有一個或多個“端點”,每個端點都支持一種類型和方向的數據傳輸,例如“批量輸出”或“中斷輸入”。整個配置在每個方向上最多可以有16個端點,並根據需要在所有接口之間分配。

  • USB上的數據傳輸已打包;每個端點都有一個最大的數據包大小。駕駛員必須經常意識到一些慣例,例如使用“短”(包括零長度)數據包標記批量傳輸的結束。

  • Linux USB API支持對控制消息和批量消息的同步調用。它還使用稱爲“ URB”(USB請求塊)的請求結構支持用於各種數據傳輸的異步調用。

因此,暴露給設備驅動程序的USB Core API覆蓋了很多領域。您可能需要免費查閱USB 3.0規範以及類或設備規範,該規範可從www.usb.org在線獲得。

        HCD是唯一真正接觸硬件(讀取/寫入寄存器,處理IRQ等)的主機端驅動程序。從理論上講,所有HCD通過相同的API提供相同的功能。這個處理方法非常正確,但是在不同的HCD上仍然存在一些差異,尤其是在不太常見的控制器上進行故障處理時。不同的控制器報告的故障點不一定相同,並且從故障中恢復(包括由軟件引起的故障,例如斷開URB的鏈接)尚不完全一致。設備驅動程序作者應重點針對每個不同的主機控制器驅動程序進行斷開連接測試(在設備處於活動狀態時),以確保驅動程序不存在自身的錯誤,並確保它們不依賴某些錯誤。( HCD特定行爲)

發佈了21 篇原創文章 · 獲贊 19 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章