從 Windows 8 開始,GPIO 架構延伸模組 (GpioClx) 可簡化撰寫 GPIO 控制器裝置驅動程式的工作。 此外,GpioClx 提供驅動程式支援,以連接至 GPIO 腳位的周邊裝置。 GpioClx 是核心模式驅動程式架構 (KMDF) 的系統提供擴充功能,會執行 GPIO 裝置類別成員通用的處理工作。
本概觀討論下列文章:
GPIO 控制器驅動程式
硬體廠商提供驅動程式來控制其 GPIO 控制器。 GPIO 控制器驅動程式是 KMDF 驅動程式,可管理 GPIO 控制器的所有硬體特定作業。 GPIO 控制器驅動程式會配合 GpioClx 來處理已設定為數據輸入和資料輸出之 GPIO 針腳群組的 I/O 要求。 此外,此驅動程式會配合 GpioClx 來處理從設為中斷輸入的 GPIO 針腳發出的中斷請求。
GPIO 控制器裝置有若干 GPIO 針腳。 這些針腳可以連接到周邊裝置。 GPIO 引腳可以設定為資料輸入、資料輸出或中斷要求輸入。 一般而言,GPIO 針腳是專用於周邊裝置,而不是由兩個以上的裝置共用。 GPIO 針腳與周邊裝置之間的連線是固定的,用戶無法變更(例如,移除周邊裝置,並以另一個裝置取代它)。 因此,可以在平台韌體中描述 GPIO 針腳如何指派給周邊裝置。
下圖顯示 GPIO 控制器驅動程式和 GpioClx。
GPIO 控制器驅動程式和 GpioClx 會透過 GpioClx 裝置驅動器介面 (DDI) 彼此通訊。 GPIO 控制器驅動程式會呼叫 GpioClx 所實作的 驅動程序支援方法 。 GpioClx 會呼叫由 GPIO 控制器驅動程式實作的 事件回呼函式。
GPIO 控制器驅動程式會直接存取 GPIO 控制器裝置的硬體暫存器。
GpioClx 會處理周邊裝置驅動程式的 I/O 要求,這些周邊裝置是實際連接到 GPIO 引腳的。 GpioClx 會將這些 I/O 要求轉譯成簡單的硬體作業,其執行方式是呼叫 GPIO 控制器驅動程式所實作的事件回呼函式。 例如,若要從一組 GPIO 引腳讀取數據或將數據寫入其中,GpioClx 會呼叫事件回呼函式,例如 CLIENT_ReadGpioPins 和 CLIENT_WriteGpioPins。 GpioClx 會管理 GPIO 控制器的 I/O 佇列,藉此減輕這項工作的 GPIO 控制器驅動程式。
此外,GpioClx 會處理 GPIO 控制器裝置的主要中斷,並將這些中斷對應至周邊設備驅動器所處理的次要中斷。 主要中斷是硬體裝置所產生的中斷。 次要中斷是由作業系統產生,以回應特定的主要中斷。 主要和次要中斷都是由全域系統中斷 (GSIS) 所識別。 硬體平臺的 ACPI 韌體會將 GSI 指派給主要中斷,並且在執行時,作業系統會將 GSI 指派給次要中斷。
例如,韌體會將 GSI 指派給 GPIO 控制器的硬體中斷,而作業系統會將 GSI 指派給設定為中斷輸入的 GPIO 針腳。
GpioClx 會實作 ISR,以處理由 GPIO 控制器裝置所產生的硬體主要中斷。 當周邊裝置在 GPIO 針腳上觸發中斷,而該針腳上的中斷已被啟用且未被遮罩時,GPIO 控制器會中斷處理器。 回應中,核心陷阱處理程式會排程 GpioClx ISR 來執行。 為了識別造成中斷的 GPIO 針腳,GpioClx ISR 會呼叫由 GPIO 控制器驅動程式實作 的 CLIENT_QueryActiveInterrupts 事件回呼函式。 GpioClx ISR 接著查找分配給此針腳的 GSI,並將 GSI 傳遞至硬體抽象層(HAL)。 HAL 會藉由呼叫已註冊此 GSI 的 ISR 來產生次要中斷。 這個ISR屬於最初發出中斷信號的周邊裝置的驅動程式。
如需主要和次要中斷的詳細資訊,請參閱 GPIO 中斷。
使用 GPIO 針腳之周邊裝置的驅動程式
啟動時,即插即用 (PnP) 管理員會列舉 PnP 裝置和非 PnP 裝置。 對於具有 GPIO 針腳固定連線的非 PnP 裝置,PnP 管理員會查詢平臺韌體,以判斷哪些 GPIO 針腳會指派為系統管理的硬體資源給這些裝置。
周邊裝置的 KMDF 驅動程式會在 EvtDevicePrepareHardware 回呼期間接收其指派的硬體資源。 這些資源可能包含設定為數據輸出、數據輸入或中斷請求輸入的 GPIO 針腳。
GPIO I/O 資源是 Windows 8 中的新 Windows 資源類型。 此資源包含一組一或多個 GPIO 針腳,可用來作為數據輸入或資料輸出。 如果周邊設備的驅動程式開啟 GPIO I/O 資源來進行讀取,驅動程式會使用資源中的所有針腳作為資料輸入。 如果驅動程式開啟 GPIO I/O 資源以進行寫入,驅動程式會使用該資源中所有的針腳作為資料輸出。 如需示範周邊設備驅動程式如何開啟一組 GPIO I/O 針腳的邏輯連接的程式代碼範例,請參閱下列主題:
設定為中斷輸入的 GPIO 針腳會被指派給驅動程式,以作為普通的 Windows 中斷資源。 中斷資源抽象概念會隱藏一個事實,該中斷可能是通過 GPIO 引腳實作的,而不是通過可程式插斷控制器。 因此,驅動程式可以處理以 GPIO 為基礎的中斷資源,與任何其他中斷資源相同。
若要存取 GPIO I/O 資源中的 GPIO 針腳,周邊裝置驅動程式必須建立與針腳的邏輯連線。 KMDF 驅動程式會呼叫 WdfIoTargetOpen 方法來開啟連線。 透過此連線,驅動程式可以將 I/O 要求傳送至 GPIO 針腳。 驅動程式會傳送 IOCTL_GPIO_READ_PINS 要求,以從這些針腳讀取數據(如果他們是輸入針腳),或 IOCTL_GPIO_WRITE_PINS 要求將數據寫入它們(如果他們是輸出針腳)。
若要從插斷資源中的 GPIO 針腳接收中斷,周邊設備驅動器必須註冊其插斷服務例程 (ISR),才能從這個針腳實作的中斷資源接收中斷。 KMDF 驅動程式會呼叫 WdfInterruptCreate 方法,與中斷建立 ISR 聯繫。