共用方式為


GPIO-Based硬體資源

從Windows 8開始,GPIO (GPIO) 由 GPIO 控制器驅動程式控制的一般用途 I/O,可供其他驅動程式作為系統管理的硬體資源使用。 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 為基礎的資源指派範例。

在上圖中,下列三個 GPIO 型資源會指派周邊設備磁碟機 A:

  • 兩個資料輸入針腳
  • 資料輸出針腳
  • 中斷輸入針腳

下列兩個 GPIO 型資源會指派給周邊設備磁碟機 B:

  • 資料輸入針腳
  • 中斷輸入針腳

驅動程式 A 和 B 會在其 EvtDevicePrepareHardware 回呼函式中接收其指派的資源。 如果驅動程式收到一組資源,也就是一組一或多個 GPIO I/O 針腳,驅動程式可以開啟這些針腳的連線來存取它們。 驅動程式會取得 WDFIOTARGET 控制碼,以識別連線,並將 I/O 要求傳送至此控制碼,以讀取或寫入這些針腳。

如需示範如何連線到一組 GPIO I/O 針腳並將 I/O 要求傳送至此針腳的程式碼範例,請參閱下列主題:

將 KMDF 驅動程式連線到 GPIO 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 針腳與周邊裝置之間的連線會假設為永久連線。 (或者,如果周邊裝置可以從位置解除叢集,則此位置專用於此 device.) 因此,可用的 GPIO 資源是固定的,而且可以在平臺韌體中指定。 同樣地,會假設使用 GPIO 資源的周邊設備磁碟機使用專用的 GPIO 資源集。 因此,您可以在平臺韌體中指定這些設備磁碟機的資源需求。

當平臺韌體將一組 GPIO 針腳指定為 GPIO I/O 資源時,韌體會指出是否可以開啟此資源中的針腳以進行讀取、寫入或同時讀取和寫入。

如果周邊設備磁碟機使用一個以上的 GPIO I/O 資源,此驅動程式必須知道 PnP 管理員列舉這些資源的順序。 例如,如果驅動程式使用兩個 GPIO I/O 針腳,但這些針腳必須獨立存取,而且在不同的時間,平臺韌體應該將每個針腳描述為個別的 GPIO I/O 資源。 PnP 管理員會依照平臺韌體中所述的順序來列舉這些資源,這必須符合驅動程式預期的順序。

周邊設備磁碟機開啟 GPIO I/O 資源的連線之後, IOCTL_GPIO_READ_PINSIOCTL_GPIO_WRITE_PINS 要求此驅動程式傳送至此連線時,會存取資源中的所有針腳。 如果驅動程式有時只能存取這些針腳的子集,則必須將此子集指派給驅動程式作為個別資源。

如需 IOCTL_GPIO_READ_PINS 要求的詳細資訊,包括資料輸入針腳對應至要求輸出緩衝區中的位,請參閱 IOCTL_GPIO_READ_PINS。 如需 IOCTL_GPIO_WRITE_PINS 要求的詳細資訊,包括要求輸入緩衝區中位與資料輸出針腳的對應,請參閱 IOCTL_GPIO_WRITE_PINS