2009年8月9日 星期日

淺談 USB 通訊架構之定義(一)

Standard
USB(Universal Serial Bus) 的應用範疇以及價值已經不需要再多做說明,其身影從 HID(Human Interface Device)、隨身碟(USB Stick、Flash drive、Pen drive)到各種類比式或非連續訊號接收器(如: Webcam、Microphone、DVB Receiver),更進一步可以講到各種通訊裝置或外接設備,甚至是取代和模擬舊式通訊傳輸線(Serial Port)。USB 所有的 Spec 和相關資訊 ,可參考 http://www.usb.org/

USB 整體運作模式

一般來說 USB 的通訊結構有如 Server/Client,以 PC 上的情形為例,位於主機上的 USB 裝置稱為『USB Host』,我們可以在上面外接上數個裝置(與 USB Host 相連的裝置通常被稱為 USB Device 或 USB Client)。

底層上,『Host 負責主導整個 USB 結構的通訊』,它會輪詢所有的 USB Deivce 以檢查是否有裝置需要傳送資料,所有 USB Device 都必需要等待 Host 的命令,唯有 Host 同意時,USB Device 才可以開始傳送資料。



Host 的行為通常是由 USB Host Controller 在做控制,其控制器是一組控制晶片,而對於現代 PC ,USB Host Controller 的晶片通常都被 Layout 在主機板上,以 PCI Bus 的形式存在供作業系統控制,我們可以使用 lspci 看到它的存在:
00:1a.0 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #4 (rev 03)
00:1a.1 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #5 (rev 03)
00:1a.2 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #6 (rev 03)
00:1a.7 USB Controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #2 (rev 03)

註:UHCI 全名為 Universal Host Controller Interface。

USB Device 的結構

瞭解了整體的運作模式後,便可以開始解析 USB 裝置的架構,其囊括了模式(Configurations)、介面(Interfaces)、設定值(Settings)和端點(Endpoints),其架構圖如下:


以上示意圖只是說明 USB 架構的規範,至於細節部份可由硬體設計者自由發揮。比較常見的『模式(Configurations)』和『介面(Interfaces)』定義的應用。
  • 模式(Configurations):

    一次只能使用一種模式,不可能同時有兩種模式並行的運作狀態,常見的應用是將 USB 裝置切換至 Firmware 的更新模式,做韌體升級,此時該硬體的一般模式將沒有作用。

  • 介面(Interfaces):

    一個 USB 裝置可能有很多個輸入或輸出介面,舉例來說,若是有一個帶麥克風的耳機,就會有兩個介面,分別為『聲音 Input』和『聲音 Output』所使用。用一個特殊的例子『3G Modem』可更容易說明:

    3G Modem 擁有至少三個介面:
    • Serial for modem
    • Serial for information update
    • Mass Storage

    這也是為什麼尚未安裝驅動程式前,OS Kernel(無論是 MS Windows 還是 Linux) 會預設將 3G Modem 視為一個儲存媒體。而在驅動程式安裝設定後,驅動程式才會使 USB 裝置的其他介面,此時才可開始藉由這些介面做 3G 撥號。
從 sysfs 觀察 USB 裝置

若想要驗證以上的定義,在 Linux 下可以很輕易透過 sysfs 達成。以下是以 USB 3G Modom 所產生的 sys 路徑為例:
/sys/devices/pci0000:00/0000:00:1d.0/usb6/6-2/6-2:1.0
/sys/devices/pci0000:00/0000:00:1d.0/usb6/6-2/6-2:1.1
/sys/devices/pci0000:00/0000:00:1d.0/usb6/6-2/6-2:1.2

因為一個 USB Host Controller 晶片通常可以處理多組 USB 來源,每一組來源都可再分接連上更多的 USB 裝置。因此,在控制晶片內部會有數個『根集線器(Root Hub) 』以供多組 USB 來源連接,而在例子中的 3G Modem 是插在 usb6 (第 6 號『根集線器(Root Hub) 』)的第二個 Port 上(這邊又標示為 6-2)。

而後面的 1.0、1.1、1.2 分別代表了有三組介面(Interfaces),其命名所代表的意義是:
<模式號碼>.<介面號碼>


因為例子中的 3G Modem 是 Huawei E220,硬體上的這三組介面都是 Serial Port,Kernel 會辯識它然後產生三個裝置描述檔:ttyUSB0、ttyUSB1、ttyUSB2 以對應。

後記

會以 3G Modem 當做例子,是因為它確實比一些單純的 HID(單一 Interface)複雜,可以較容易說明 USB 的架構細節。而對於 USB 的東西,到這裡只記錄了一個開頭,真正與驅動程式息息相關的 Endpoint 可還沒上場。