一般用途 I/O (GPIO)
晶片 (SoC 上的系統) 整合電路會廣泛使用一般用途 I/O (GPIO) 針腳。 針對 SoC 型平臺,Windows 會定義 GPIO 硬體的一般抽象概念,而且此抽象概念需要進階設定和 Power Interface (ACPI) 命名空間的支援。
本文所列的 ACPI 5.0 規格 定義支援 GPIO 抽象概念。
若要確認 GPIO 控制器符合所有 Windows 平臺需求,請參閱 GPIO 控制器需求檢查清單。
GPIO 控制器裝置
Windows 支援 GPIO 控制器。 GPIO 控制器為周邊裝置提供各種功能,包括中斷、輸入訊號和輸出訊號。 GPIO 功能會模型化為命名空間中的 GPIO 控制器裝置。 GPIO 架構延伸模組 (GpioClx) 將 GPIO 控制器裝置分割成一些針腳。 每個針腳銀行都有 64 或更少可設定的針腳。 GPIO 控制器中的銀行會根據其針腳在控制器相對 GPIO 針腳空間中的位置進行排序。 例如,銀行 0 包含控制器上的針腳 0-31、銀行 1 包含針腳 32-63 等等。 除了最後一個銀行之外,所有銀行都有相同的針腳數目,這可能會較少。 銀行對於 ACPI 韌體很重要,因為韌體必須報告系統中斷資源與銀行的對應,如下列 GPIO 命名空間物件 一節所述。
銀行上的每一個針腳都有一組參數 (例如輸出、區分層級的插斷、取消彈跳輸入等) ,描述針腳的設定方式。
GPIO 控制器和 ActiveBoth 中斷
某些 GPIO 控制器的功能是能夠在訊號的兩個邊緣產生中斷, (增加、ActiveHigh 邊緣和下降,或 ActiveLow 邊緣) 。 這適用于各種應用程式,包括按鈕介面,其中按鈕按下事件 (一個邊緣) 和按鈕釋放事件, (相反邊緣) 有意義。 這項功能稱為「ActiveBoth」。
在邏輯上,ActiveBoth 訊號同時具有判斷提示和未驗證的狀態,無論是暫時的判斷提示, (、推播按鈕) ,或無限長的判斷提示 (例如,耳機插孔插入) 。 ActiveBoth 中斷的邊緣偵測可能會在 GPIO 控制器硬體 (硬體 ActiveBoth) 中實作,或在 GPIO 驅動程式 (軟體中模擬 ActiveBoth) 。 Windows 要求實作 ActiveBoth 的 GPIO 控制器必須使用模擬的 ActiveBoth。 這必須確保針對所有案例進行雙邊緣中斷的健全處理。 為了支援 ActiveBoth 模擬,適用下列硬體需求:
支援 ActiveBoth 中斷的 GPIO 控制器必須支援層級模式中斷,而且必須支援在執行時間動態重新設計中斷的極性。
為了將 I/O 錯誤的風險降到最低,Windows 偏好使用記憶體對應 GPIO 控制器,而不是 SPB 連接的 GPIO 控制器。 事實上,對於 Windows 按鈕陣列裝置 (PNP0C40) ,此裝置的 ActiveBoth GPIO 中斷會連線到記憶體對應的 GPIO 控制器,而不是連線到 SPB 連線的裝置。 若要判斷哪個按鈕中斷必須是 ActiveBoth,請參閱其他 ACPI 命名空間物件主題中的按鈕裝置一節。
為了建立 ActiveBoth 中斷訊號的決定性初始狀態,Windows GPIO 裝置堆疊保證驅動程式中斷連接之後所產生的第一個中斷一律會針對訊號的判斷提示狀態。 堆疊會進一步假設所有 ActiveBoth 中斷線的判斷提示狀態預設為低邏輯層級, (ActiveLow edge) 。 如果這不是您平臺上的情況,您可以藉由在控制器的命名空間中包含 GPIO 控制器Device-Specific方法 (_DSM) 來覆寫預設值。 如需此方法的詳細資訊,請參閱 GPIO 控制器 Device-Specific 方法 (_DSM) 。
上述清單中的第三個需求表示,如果 GPIO 針腳的訊號在該時間處於判斷提示狀態,則使用 ActiveBoth 的裝置驅動程式可能會在初始化 (連線到) 中斷之後立即收到中斷。 這很可行,甚至可能在某些裝置 (例如,耳機) ,而且必須在驅動程式中受到支援。
若要支援模擬的 ActiveBoth,GPIO 控制器驅動程式必須藉由實作CLIENT_ReconfigureInterrupt回呼函式,以及在驅動程式CLIENT_QueryControllerBasicInformation回呼函式提供的基本資訊結構中設定模擬ActiveBoth旗標,以啟用 (「加入宣告」) ActiveBoth模擬。 如需詳細資訊,請參閱 一般用途 I/O (GPIO) 驅動程式。
GPIO 命名空間物件
ACPI 會列舉 GPIO 控制器和與其連線的周邊。 它們之間的連線會使用 GPIO 連線資源描述元來描述。 如需詳細資訊,請參閱 ACPI 5.0 規格的 6.4.3.8 節。
裝置識別和設定物件
GPIO 控制器裝置的 ACPI 命名空間包含下列專案:
- 廠商指派的 ACPI 相容硬體識別碼 (_HID) 物件。
- 一組耗用的資源 (_CRS) 物件。
- 唯一識別碼 (_UID) 物件,如果命名空間中有一個以上的 GPIO 控制器實例 (也就是兩個或多個具有相同裝置識別物件的命名空間節點) 。
GPIO 控制器_CRS包含登錄、系統中斷等所有資源 (位址空間,) 由 GPIO 控制器中的所有銀行所取用。 中斷資源對銀行對應會以中斷資源列在_CRS的順序來表示,也就是說,列出的第一個中斷會指派給銀行 0、下一個列出的中斷指派給銀行 1,依此類故。 銀行可以共用中斷資源,在此情況下,中斷會針對連線到它的每個銀行列出一次,並以銀行訂單設定為共用。
GPIO 連線資源描述元
周邊與它們所連接的 GPIO 針腳之間的關聯性會由 GPIO 連線資源描述項描述至作業系統。 這些資源描述元可以定義兩種類型的 GPIO 連線:GPIO 中斷連線和 GPIO I/O 連線。 周邊包括 GPIO 連線描述元在其_CRS中,用於連線的所有 GPIO I/O 和中斷接點。 如果連線中斷具有喚醒功能, (能夠從低電源閒置狀態喚醒系統) ,則必須將其設定為 ExclusiveAndWake 或 SharedAndWake。 如需詳細資訊,請參閱 裝置電源管理。
描述項定義于 ACPI 5.0 規格的 6.4.3.8.1 節「GPIO 連線描述元中。 這些描述項的 ASL 資源範本宏會在 ACPI 5.0 規格的 19.5.53 節中說明:「GpioInt (GPIO 中斷連線資源描述元宏) 」。
GPIO 訊號的 ACPI 事件
ACPI 會定義平臺事件模型,讓平臺中的硬體事件能夠發出訊號並傳達給 ACPI 驅動程式。 Windows 提供通知服務,以將平臺事件傳達給設備磁碟機。 許多收件匣驅動程式依賴此服務來支援 ACPI 定義的裝置,例如控制方法電源按鈕、LID 裝置、控制方法電池、熱區域等等。 For more information about notifications, see section 5.6.5, "GPIO-Signaled ACPI Events", of the ACPI specification.
針對 SoC 平臺,GPIO 中斷可用來發出平臺事件的訊號。 任何命名空間裝置 (「ACPI 事件來源」裝置) 使用 ASL Notify 運算子向驅動程式發出事件訊號時,都需要下列專案:
ACPI 事件訊號所連接的 GPIO 控制器命名空間節點必須在其 ACPI 事件資訊 (_AEI) 物件中包含該釘選的 GpioInt 資源, (請參閱以下) 一節 2.4.2.3.A3_AEI) 1。 GpioInt 資源必須設定為非共用 (獨佔) 。
控制器的節點也必須包含 _AEI 物件中列出的每個針腳的 Edge (_Exx) 、Level (_Lxx) 或 Event (_EVT) 控制方法。
ACPI 驅動程式會處理列出的 GPIO 中斷,並評估其 Edge、層級或事件控制方法。 控制項方法會視需要停止硬體事件,並在事件來源裝置的命名空間節點上執行必要的 Notify 運算子。 Windows 接著會將通知傳送至裝置的驅動程式。 如果事件控制方法可以查詢硬體來判斷發生的事件,則多個事件可以透過相同的 GpioInt 資源發出訊號。 方法接著必須使用正確的通知碼來通知正確的裝置。
ACPI 事件資訊 (_AEI) 物件 如先前所述,GPIO 控制器的命名空間必須包含 _AEI 物件,才能支援 ACPI 事件。 _AEI物件 (請參閱 ACPI 5.0 規格中的第 5.6.5.2 節,) 只傳回資源樣板緩衝區,其中包含只包含透過這個 GPIO 控制器發出 ACPI 事件的 GpioInt 描述元。 每個描述元都會對應至一個 ACPI 事件來源裝置,且專用於該裝置 (裝置) 之間未共用。
OpRegions (OpRegions) 的 GeneralPurposeIO 作業區域
平臺韌體通常會使用 GPIO 控制器來支援任意數目的平臺硬體功能,例如控制電源和時鐘,或在裝置上設定模式。 為了支援從 ASL 控制項方法使用 GPIO I/O,ACPI 5.0 會定義新的 OpRegion 類型 「GeneralPurposeIO」。
GeneralPurposeIO OpRegions (請參閱 ACPI 5.0 規格的第 5.5.2.4.4 節) 宣告在驅動程式將處理 I/O 的 GPIO 控制器裝置命名空間範圍內。 一般用途IO 欄位宣告 (請參閱 ACPI 5.5.2.4.4.1 一節,) 將名稱指派給一般PurposeIO OpRegion 內要存取的 GPIO 針腳。 GpioIO 連線資源 (請參閱 ACPI 5.0 規格的第 19.5.53 節,) 用於 Field 宣告內,以指定特定 Field 參考 () 和設定的針腳編號。 連接描述元後面的具名欄位位總數必須等於描述項中列出的針腳數目。
OpRegion 中的欄位可以在命名空間中的任何位置宣告,並從命名空間中的任何方法存取。 對 GeneralPurposeIO OpRegion 的存取方向取決於第一個存取 (讀取或寫入) ,而且無法變更。
由於 GPIO 控制器裝置驅動程式會提供 OpRegion 存取 (「OpRegion Handler」) ,因此在驅動程式可用之前,方法必須小心不要存取 OpRegion。 ASL 程式碼可以在 GPIO 控制器裝置下包含 Region (_REG) 方法,以追蹤 OpRegion 處理常式的狀態 (請參閱 ACPI 5.0 規格) 的 6.5.4 節。 此外, OpRegion 相依性 (_DEP) 物件 (視需要,請參閱 ACPI 5.0 規格的第 6.5.8 節,) 可以在具有存取 GPIO OpRegion 欄位之方法的任何裝置下使用。 如需何時使用_DEP的討論,請參閱裝置管理命名空間物件主題中的裝置相依性一節。 請務必不要將驅動程式指派給 GeneralPurposeIO OpRegions 的 GPIO I/O 資源。 Opregion 適用于 ASL 控制項方法的獨佔用途。