2012年4月12日 星期四

HID over I2C

HID over I2C 即 HID protocol 在 I2C 通訊介面上的實作, 以觸控板裝置為例, 在 Windows 8 中的驅動程式堆疊如下:
                                           Mouse Class
                                          Filter Driver
                                          (mouclass.sys)
                                                |
                                                |
                                            HID Mapper
                                           (mouhid.sys)
                                               /
                                  /===========/
                                 /    (Non-HID Class <--> HID Class)
                        HID Class
                          Driver
                      (hidclass.sys
                            +
                       mshidkmdf.sys)
             (SPB)          |              (INT)
         /===========\      |         /===========\
      I2C             \     |        /             \
   Controller          HID Minidriver               GPIO Controller
     Driver             (hidi2c.sys                     Driver
       |                    |                             |
       |                    |                             |
      ACPI                 ACPI                          ACPI


從上圖中可發現有三個驅動程式堆疊, 分別驅動 I2C 控制器, GPIO 控制器及 HIDI2C 裝置(即此例的觸控板). I2C 控制器驅動程式負責資料的傳輸, GPIO 控制器驅動程式用於提供中斷事件,  HIDI2C 驅動程式則是處理與觸控板間的 HID protocol, 其上層驅動程式將資料轉接至指標驅動程式.

由於 HIDI2C 驅動程式與 I2C 控制器驅動程式並非在同一個驅動程式堆疊, 因此沒辦法在 HIDI2C 驅動程式之下加掛 lower filter 驅動程式去過濾往來 I2C 控制器驅動程式的資料, 雖然如此, 但如果在 I2C 控制器驅動程式之上加掛 upper filter 驅動程式去過濾資料還是可行的, 只不過攔到的資料就不限於特定的 HID-I2C 裝置了, 此外, Windows 並未內建 I2C 控制器驅動程式, 須由晶片組廠商提供驅動程式, 到時還得配合各家 I2C 控制器的 hardware id 去改 INF 檔才能掛上 upper filter 驅動程式.

要讓 Windows 掛載 HIDI2C 驅動程式, BIOS 必須提供 HIDI2C 裝置的資訊, 這些資訊在 ACPI 模組中是以 ASL 物件(SMBus 規格中稱為 CMI 物件)描述, 以下為 HIDI2C 裝置的必要物件:
  • _CID: Compatible ID, 其值固定為 PNP0C50.
  • _HID: Hardware ID.
  • _HRV: Hardware Revision.
  • _CRS: Current Resource Settings, 描述裝置於 I2C/SMBus 上的位址(slave address), clock frequency 及中斷資訊等.
  • _DSM: Device Specific Method, 描述 HID descriptor 的(暫存器)存取位址等.
一般來說, PnP Manager 列舉裝置時, 會根據 hardware id / compatible id 查找相對應的 INF 檔, 進而掛載驅動程式. HIDI2C 裝置的 CID 固定為 PNP0C50, 其對應的 INF 檔為 hidi2c.inf, 因此 PnP Manager 會掛載 HIDI2C 驅動程式, 目前 Windows 只支援 inbox HIDI2C minidriver, 想要換掉它是不可行的.

在 HIDI2C 驅動程式被掛載後, 它會開始列舉 HIDI2C 裝置:
  1. 透過 ACPI 驅動程式從 BIOS 取得 HIDI2C 裝置資訊.
  2. 根據裝置資訊中的中斷資訊, 設定 GPIO 中斷服務程序(passive-level ISR).
  3. 根據裝置資訊中的 I2C 位址及 clock frequency 等, 對 I2C 控制器建立 logical connection.
  4. 根據裝置資訊中的 HID descriptor 存取位址, 從 HIDI2C 裝置取得 HID descriptor.
  5. 根據 HID descriptor 中的電源設定資訊, 設定 HIDI2C 裝置電源.
  6. 根據 HID descriptor 中的資訊, 重置 HIDI2C 裝置.
  7. 根據 HID descriptor 中的 report descriptor 存取位址, 從 HIDI2C 裝置取得 report descriptor.
  8. HIDClass 根據 report descriptor 列舉出 HID 裝置(mouse, keyboard, vendor-specific, ...), 並由 PnP Manager 掛載對應的驅動程式.
(在 I2C bus 上的 protocol 類似 SMBus 的 read byte 及 write byte, 其中 Command Code 變為 2-byte 的存取位址, 讀取或寫入的資料長度為一個或多個 byte.)


更多資訊:
HID Over I2C
SPB Peripheral Device Driver Overview
GPIO Interrupts
Supporting Passive-Level Interrupts
Guidance for developers of I2C devices
- HID over I2C Protocol Specification

沒有留言:

張貼留言