從 Windows 8 開始,由 GPIO 控制器驅動程式控制的一般用途 I/O (GPIO) 針腳可供其他驅動程式作為系統管理的硬體資源使用。 GPIO I/O 針腳是設定為數據輸入或資料輸出的針腳,可作為新的 Windows 資源類型 GPIO I/O 資源。 此外,GPIO 插斷接腳是設定為插斷要求輸入的針腳,可作為一般 Windows 中斷資源使用。
GPIO I/O 資源代表一組或多個 GPIO 針腳,供周邊裝置的驅動程式讀取或寫入。 Windows 會隱藏 GPIO I/O 針腳的基礎實作詳細資訊,讓使用者能撰寫周邊設備驅動程式來操作抽象的 GPIO I/O 資源。 無論實作資源的 GPIO 控制器硬體為何,使用這些抽象資源的周邊設備驅動器都可以跨平台運作。 GPIO I/O 資源是由 WDFIOTARGET 句柄來表示,此資源會與擁有基礎 GPIO 針腳或針腳的特定 GPIO 控制器驅動程式產生關聯。
一般而言,GPIO 控制器上的 I/O 針腳可以針對輸入或輸出設定,視控制器硬體的功能和實際連線到針腳的裝置而定。 因此,驅動程式可以開啟此針腳的邏輯連線,以進行寫入或讀取作業,但不能同時開啟兩者。 不過,此條件約束是由硬體所強加,而不是由 GPIO 架構延伸模組 (GpioClx) 所強加。 如果硬體可同時針對輸入和輸出設定 I/O 針腳,GpioClx 可讓驅動程式針對讀取和寫入作業開啟針腳的邏輯連線。
對於配置為中斷請求輸入的 GPIO 針腳,作業系統會將這種由 GPIO 針腳而非中斷控制器或專用中斷請求線實作的中斷請求完全抽象化。 GPIO 中斷會以抽象插斷資源的形式呈現給周邊設備驅動器。 GPIO 驅動程式堆疊和硬體抽象層 (HAL) 支援這些資源的抽象化。 因此,使用插斷資源的周邊設備驅動器基本上可以忽略這些資源基礎實作的詳細數據。 如需詳細資訊,請參閱 GPIO 中斷。
下圖顯示將 GPIO 型資源指派給兩個周邊設備驅動器的範例:
在上面的圖中,以下三個基於 GPIO 的資源被分配給周邊設備驅動程式 A:
- 兩個數據輸入針腳
- 數據輸出腳位
- 中斷輸入引腳
下列兩個 GPIO 型資源會指派給周邊設備驅動器 B:
- 數據輸入引腳
- 中斷輸入引腳
驅動程式 A 和 B 會在其 EvtDevicePrepareHardware 回呼函式中接收其指派的資源。 如果驅動程式以資源的形式接收一組或多個 GPIO I/O 針腳,驅動程式可以開啟這些針腳的連線以存取它們。 驅動程式會取得 WDFIOTARGET 句柄,以識別連線,並將 I/O 要求傳送至此句柄以讀取或寫入這些針腳。
如需示範如何連線到一組 GPIO I/O 針腳並將 I/O 要求傳送至此針腳的程式代碼範例,請參閱下列主題:
在這兩個主題中,程式 IoRoutine 代碼範例中的 函式會根據 ReadOperation 參數值開啟 GPIO I/O 針腳資源以進行讀取或寫入。 如果資源已開啟以進行讀取(DesiredAccess = GENERIC_READ),則資源中的針腳會被設定為輸入,傳送至針腳資源的 IOCTL_GPIO_READ_PINS 要求會讀取這些針腳上的輸入值。 GpioClx 不允許傳送一組輸入針腳 IOCTL_GPIO_WRITE_PINS 要求,而且會以STATUS_GPIO_OPERATION_DENIED錯誤狀態完成這類要求。 同樣地,如果針腳資源開啟以進行寫入(DesiredAccess = GENERIC_WRITE),資源中的針腳會設定為輸出,而傳送至針腳資源的 IOCTL_GPIO_WRITE_PINS 要求會設定驅動這些針腳的輸出閂鎖中的值。 一般而言,將 IOCTL_GPIO_READ_PINS 要求傳送至一組輸出針腳,只會讀取寫入輸出閂鎖的最後一個值。
若要使用中斷資源來接收中斷,用戶端驅動程式必須將中斷服務例程 (ISR) 連接到中斷。 通常,驅動程式會藉由呼叫 WdfInterruptCreate 方法來建立此連線(或可能是 IoConnectInterruptEx 例程)。 如需 KMDF 中斷的詳細資訊,請參閱 建立插斷物件。
相較於可動態連接到硬體平台並斷開連結的隨插即用裝置,GPIO 控制器裝置則是永久固定。 此外,GPIO 針腳與周邊裝置之間的連接被假定為永久性。 (或者,如果外圍設備可以從插槽中解開,則此位置專用於此裝置。因此,可用的 GPIO 資源是固定的,而且可以在平臺韌體中指定。 同樣地,使用 GPIO 資源的周邊設備驅動器會假設使用專用的 GPIO 資源集。 因此,這些設備驅動器的資源需求可以在平臺韌體中指定。
當平臺韌體將一組 GPIO 針腳指定為 GPIO I/O 資源時,韌體會指出此資源中的針腳是否可以針對讀取、寫入或讀取和寫入開啟。
如果周邊設備驅動器使用一個以上的 GPIO I/O 資源,此驅動程式必須知道 PnP 管理員列舉這些資源的順序。 例如,如果驅動程式使用兩個 GPIO I/O 針腳,但這些針腳必須獨立存取,而且在不同的時間,平臺韌體應該將每個針腳描述為個別的 GPIO I/O 資源。 PnP 管理員會依照平臺韌體中所描述的順序來列舉這些資源,這必須符合驅動程式預期的順序。
周邊設備驅動器開啟了與 GPIO I/O 資源的連線之後,IOCTL_GPIO_READ_PINS 或 IOCTL_GPIO_WRITE_PINS 指令這個驅動程式傳送到這個連線會存取這個資源中的所有針腳。 如果驅動程式有時只能存取這些針腳中的某個子集,則必須將該子集指派給驅動程式,作為獨立的資源。
如需 IOCTL_GPIO_READ_PINS 要求的詳細資訊,包括將資料輸入針腳對應到要求輸出緩衝區中的位,請參閱 IOCTL_GPIO_READ_PINS。 如需了解有關 IOCTL_GPIO_WRITE_PINS 請求的詳細資訊,包括請求輸入緩衝區中的位元如何對應到數據輸出針腳,請參閱 IOCTL_GPIO_WRITE_PINS。