ACPI 5.0 規格會定義數種可用來管理裝置的命名空間物件類型。 例如,裝置識別物件包含連線到匯流排的裝置識別資訊,例如 I2C,這些匯流排不支援子裝置的硬體列舉。 其他類型的命名空間物件可以指定系統資源、描述裝置相依性,以及指出哪些裝置可以停用。
Windows 中的裝置識別
Windows 隨插即用會根據裝置列舉值所提供的裝置識別碼來尋找並載入裝置驅動程式。 列舉器是匯流排驅動程式,知道如何從裝置擷取識別資訊。 某些總線(例如 PCI、SD 和 USB)具有硬體設計的機制來執行此擷取。 對於不具備相應特性的總線(例如處理器總線或簡單的周邊總線),ACPI 會在命名空間中定義識別物件。
Windows ACPI 驅動程式 Acpi.sys,會將這些物件中找到的值組合成各種裝置識別碼字串,這些字串可以根據驅動程式的需求,特定或一般地識別裝置。 為識別 ACPI 列舉裝置而建立的某些字串樣式如下:
ACPI\VEN_vvv[v]&DEV_dddd&SUBSYS_sss[s]nnnn&REV_rrrr
ACPI\VEN_vvv[v]&DEV_dddd&SUBSYS_sss[s]nnnn
ACPI\VEN_vvv[v]&DEV_dddd&REV_rrrr
ACPI\VEN_vvv[v]&DEV_dddd
ACPI\vvv[v]dddd
您可以開啟裝置管理員,並檢查列舉裝置的 硬體識別碼 和 相容識別碼 屬性,以查看 Windows 為裝置建立的裝置識別碼。 每個字串都可以在 INF 檔案中指定,以識別要載入裝置的驅動程式。 INF 比對的順序是從最具體的硬體識別碼 (最慣用的驅動程式) 到最不具體的標識碼 (最不慣用的驅動程式) ,讓瞭解裝置特定功能的驅動程式可以取代那些不太具體的驅動程式 (,因此只支援裝置功能的子集) 。
裝置識別碼應該只用於 INF 比對,而且裝置驅動程式絕不應該剖題或處理。 如果裝置驅動程式需要識別載入的特定硬體,建議的方法是讓 INF 檔案在安裝時設定適當的登錄機碼。 然後,驅動程式可以在初始化期間存取這些金鑰以取得所需的資訊。
ACPI 中的裝置識別
硬體識別碼 (_HID)
在 ACPI 中識別裝置的最低需求是硬體識別碼 (_HID) 物件。 _HID 會傳回格式為「ABC[D]xxxx」的字串,其中「ABC[D]」是 3 個字元或 4 個字元的字串,可識別裝置製造商 (「廠商 ID」),而 xxxx 是十六進位數字,可識別該廠商製造的特定裝置 (「裝置 ID」)。 供應商 ID 在整個行業中必須是唯一的。 Microsoft 會配置這些字串,以確保它們是唯一的。 供應商 ID 可從 隨插即用 ID - PNPID 請求中獲取。
ACPI 5.0 也支援在 _HID 和其他識別物件中使用 PCI 指派的廠商識別碼,因此您可能不需要從Microsoft取得廠商識別碼。 如需硬體識別需求的詳細資訊,請參閱 ACPI 5.0 規格的第 6.1.5 節「_HID (硬體識別碼)」。
相容 ID (_CID)
Microsoft 已為與 Windows 隨附的收件匣驅動程式相容的裝置保留廠商識別碼「PNP」。 Windows 會定義一些裝置識別碼,以搭配此廠商識別碼使用,可用來載入 Windows 提供的裝置驅動程式。 個別物件 (相容識別碼 (_CID) 物件) 可用來傳回這些識別碼。 Windows 一律偏好硬體識別碼 (由 _HID 傳回) ,而不是相容識別碼 (由 _CID 傳回) 在 INF 比對和驅動程式選取中。 此設定選項可讓 Windows 提供的驅動程式作為預設驅動程式,如果廠商提供的裝置特定驅動程式無法使用。 下表中的相容識別碼是新建立的,可與 SoC 平台搭配使用。
| 相容標識碼 | 說明 |
|---|---|
| PNP0C40 | Windows 相容的按鈕陣列 |
| PNP0C50 | 符合 HID-over-I2C 標準的裝置 |
| PNP0C60 | 可轉換筆記型電腦顯示感測器裝置 |
| PNP0C70 | 基座感應裝置 |
| PNP0D10 | 符合 XHCI 標準的 USB 控制器,具有標準除錯功能 |
| PNP0D15 | 符合 XHCI 標準的 USB 控制器,無需標準偵錯 |
| PNP0D20 | 符合 EHCI 標準的 USB 控制器,無需標準除錯 |
| PNP0D25 | 符合 EHCI 標準的 USB 控制器,具有標準除錯功能 |
| PNP0D40 | 符合 SDA 標準的 SD 主機控制器 |
| PNP0D80 | Windows 相容系統電源管理控制器 |
子系統 ID (_SUB)、硬體修訂 (_HRV) 及類別 (_CLS)
ACPI 5.0 會定義可與_HID一起使用的 _SUB、_HRV和 _CLS 物件,以建立識別碼,以更唯一地識別裝置的特定版本、整合或硬體修訂,或指出 PCI 定義裝置類別中的成員資格。 這些物件通常是選擇性的,但 Windows 中的某些裝置類別可能需要這些物件。 如需這些物件的詳細資訊,請參閱 ACPI 5.0 規格的第 6.1 節「裝置識別物件」。
為了維護性,Windows 硬體認證工具包 (HCK) 要求 OEM 系統上的裝置識別碼是「四部分」識別碼。 這四個部分是廠商識別碼、裝置識別碼、子系統廠商 (OEM) 識別碼,以及子系統 (OEM) 裝置識別碼。 因此,OEM 平臺需要子系統識別碼 (_SUB) 物件。
Device-Specific 方法(_DSM)
_DSM方法定義於 ACPI 5.0 規格的第 9.14.1 節「_DSM (裝置特定方法)」。 這個方法提供個別的裝置特定數據和控制功能,這些函式可由設備驅動器呼叫,而不會與其他這類裝置特定方法發生衝突。 特定裝置或裝置類別的_DSM會定義保證不會與其他 UUID 衝突的 UUID (GUID)。 針對每個 UUID,有一組已定義的函式,_DSM 方法可以實作這些函式來提供資料或執行驅動程式的控制函式。 類別特定的數據和數據格式會在個別的裝置類別特定規格中提供,而且也會在 ACPI Device-Specific 方法中討論。
地址 (_ADR) 和唯一 ID (_UID)
裝置識別還有三個額外需求:
- 對於連接到可枚舉的硬體父匯流排(例如SDIO、USB HSIC),但具有平台特定功能或控制(例如側帶電源或喚醒中斷)的裝置,不會使用 _HID。 相反地,裝置識別碼是由父匯流排驅動程式所建立的(如先前所述)。 不過,在此情況下,位址物件 (_ADR) 必須位於裝置的 ACPI 命名空間中。 此物件可讓作業系統將匯流排列舉裝置與其 ACPI 描述的功能或控件產生關聯。
- 在使用特定 IP 區塊的多個實例的平台上,因此每個區塊都具有相同的裝置識別物件,因此需要唯一識別碼 (_UID) 物件才能讓作業系統區分區塊。
- 特定命名空間範圍內的兩個裝置都不能具有相同的名稱。
裝置組態物件
針對命名空間中識別的每個裝置,裝置所耗用的系統資源 (記憶體位址、中斷等等) 也必須由目前的資源設定 (_CRS) 物件報告。 支援報告多種可能的資源配置(_PRS)以及控制更改設備資源配置(_SRS),但為選擇性功能。
SoC 平台中新增的功能是裝置可以使用的 GPIO 和簡單周邊匯流排(SPB)資源。 如需詳細資訊,請參閱 一般用途 I/O (GPIO) 和簡單周邊匯流排 (SPB)。
SoC 平台的另一個新功能是通用固定 DMA 描述符。 FixedDMA 描述元支援許多系統裝置共用 DMA 控制器硬體。 靜態配置給特定系統裝置的 DMA 資源 (要求行和通道暫存器) 會列在 FixedDMA 描述元中。 如需詳細資訊,請參閱 ACPI 5.0 規格的第 19.5.49 節「FixedDMA (DMA 資源描述元宏)」。
裝置狀態變更
ACPI 列舉裝置可能會因為各種原因而停用或移除。 提供 Status (_STA) 物件,讓這類狀態變更能夠傳達給作業系統。 如需_STA的描述,請參閱 ACPI 5.0 規格的第 6.3.7 節。 Windows 會使用 _STA 來判斷裝置是否應該列舉、顯示為已停用,或使用者看不到。 韌體中的此控制項適用於許多應用,包括對接和 USB OTG 主機對功能切換。
此外,ACPI 提供通知機制,ASL 可用來通知驅動程式平臺中的事件,例如將裝置移除為停靠站的一部分。 一般而言,當 ACPI 裝置的狀態變更時,韌體必須執行「裝置檢查」或「匯流排檢查」通知,讓 Windows 重新列舉裝置並重新評估其 _STA。 如需 ACPI 通知的相關資訊,請參閱 ACPI 5.0 規格的第 5.6.6 節「裝置物件通知」。
啟用/停用
作為 Windows 隨插即用的一部分,驅動程式必須能夠由使用者或系統動態啟用和停用 (例如,更新驅動程式) 。
On-SoC 裝置已整合至 SoC 晶片中,無法移除。 大部分 SoC 上裝置的驅動程式都可以免除啟用和停用的需求。 對於未免除的驅動程式,有驅動程式介面可指出驅動程式支援有序移除。 如需詳細資訊,請參閱 Microsoft Connect 網站上標題為「減少 SoC 驅動程式的 PNP 需求」檔。
如果驅動程式支援有序移除,而且可以停用裝置硬體 (,也就是說,裝置可以設定為停止存取其指派的資源) ,則裝置的 ACPI 命名空間節點可以包含 Disable (_DIS) 物件。 每當移除驅動程式時,作業系統都會評估此方法。 使用 _DIS 有下列額外需求:
- 每當裝置停用時,_STA都必須清除「啟用並解碼其資源」位。
- 裝置必須提供 [設定資源設定 (_SRS) 物件] 物件,才能重新啟用裝置硬體,並在_STA中設定上述位。
如需詳細資訊,請參閱 ACPI 5.0 規格的第 6.2.3 (_DIS)、6.2.15 (_SRS) 和 6.3.7 (_STA) 節。
裝置相依性
通常,特定平台上的裝置之間存在硬體相依性。 Windows 需要描述所有這類相依性,以確保所有裝置都能正常運作,因為系統中會動態變更 (移除裝置電源、驅動程式停止和啟動等等) 。 在 ACPI 中,裝置之間的相依性會以下列方式描述:
命名空間階層。 任何屬於子裝置的裝置 (列為另一個裝置命名空間內的裝置) 都相依於父裝置。 例如,USB HSIC 裝置依賴於它所連接的埠(父節點)和控制器(祖父節點)。 同樣地,系統記憶體管理單元 (MMU) 裝置命名空間內列出的 GPU 裝置相依於 MMU 裝置。
資源連線。 連線到 GPIO 或 SPB 控制器的裝置相依於這些控制器。 這種類型的相依性是透過在裝置_CRS中包含連線資源來描述。
OpRegion 相依性。 對於使用 OpRegions 執行 I/O 的 ASL 控制方法,作業系統不會隱含地知道相依性,因為它們只會在控制方法評估期間決定。 此問題適用於 GeneralPurposeIO 和 GenericSerialBus OpRegions,其中隨插即用驅動程式提供區域的存取權。 為了減輕此問題,ACPI 會定義 OpRegion 相依性 (_DEP) 物件。 _DEP應該用於控制方法參考 OpRegion (硬體資源) 的任何裝置命名空間,且上述 1 或 2 都不適用於參考的 OpRegion 連線資源。 如需詳細資訊,請參閱 ACPI 5.0 規格的第 6.5.8 節「_DEP (作業區域相依性)」。
裝置驅動程式之間也可能存在軟體相依性。 也必須描述這些相依性。
如需詳細資訊,請參閱下列資源:
如需驅動程式載入順序相依性,請參閱 指定驅動程式載入順序。
如需了解電源相關相依性,請參閱:
IoInvalidateDeviceRelations (要觸發建立電源關聯性,請以DEVICE_RELATION_TYPE列舉值 PowerRelations 呼叫IoInvalidateDeviceRelations常式。)