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 的(暫存器)存取位址等.
在 HIDI2C 驅動程式被掛載後, 它會開始列舉 HIDI2C 裝置:
- 透過 ACPI 驅動程式從 BIOS 取得 HIDI2C 裝置資訊.
- 根據裝置資訊中的中斷資訊, 設定 GPIO 中斷服務程序(passive-level ISR).
- 根據裝置資訊中的 I2C 位址及 clock frequency 等, 對 I2C 控制器建立 logical connection.
- 根據裝置資訊中的 HID descriptor 存取位址, 從 HIDI2C 裝置取得 HID descriptor.
- 根據 HID descriptor 中的電源設定資訊, 設定 HIDI2C 裝置電源.
- 根據 HID descriptor 中的資訊, 重置 HIDI2C 裝置.
- 根據 HID descriptor 中的 report descriptor 存取位址, 從 HIDI2C 裝置取得 report descriptor.
- HIDClass 根據 report descriptor 列舉出 HID 裝置(mouse, keyboard, vendor-specific, ...), 並由 PnP Manager 掛載對應的驅動程式.
更多資訊:
- 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
沒有留言:
張貼留言