共用方式為


GpioClx DDI 中的驅動程式支援方法

GPIO 架構延伸模組 (GpioClx) 可從 Windows 8 開始提供。 GpioClx DDI 中的系統提供方法會在 GpioClx 核心模式驅動程式中實作,Msgpioclx.sys。 此驅動程式會匯出 GpioClx 驅動程式支援方法的進入點。 從Windows 8開始,Msgpioclx.sys是作業系統的標準元件。

在建置階段,GPIO 控制器驅動程式會靜態連結至 GpioClx stub 程式庫中的 DDI 進入點 Msgpioclxstub.lib。 在執行時間,此程式庫會執行必要的驅動程式版本交涉,以動態連結至Msgpioclx.sys中對應的進入點。

需要特定版本的 GPIO 控制器驅動程式,Msgpioclx.sys可以安全地連結至版本號碼較高的Msgpioclx.sys版本。 不過,此驅動程式無法連結到版本號碼較低的Msgpioclx.sys版本。

驅動程式註冊

若要註冊為 GpioClx 的用戶端,GPIO 控制器驅動程式會呼叫 GPIO_CLX_RegisterClient 方法。 一般而言,驅動程式會從 其 DriverEntry 常式呼叫這個方法。 在此呼叫期間,驅動程式會將註冊封包傳遞至 方法。 此封包包含一組驅動程式實作事件回呼函式的指標。 這些函式會存取 GPIO 控制器裝置中的硬體暫存器。 GpioClx 會呼叫這些函式來處理 I/O 要求,以及管理中斷。

GPIO 控制器驅動程式會呼叫 GPIO_CLX_UnregisterClient 方法來取消其 GpioClx 註冊。 一般而言,驅動程式會從其 EvtDriverUnload 事件回呼函式呼叫這個方法。

裝置物件初始化

若要初始化 GpioClx,GPIO 控制器驅動程式必須從其 EvtDriverDeviceAdd 回呼函式呼叫兩個 GpioClx 方法。 第一個方法 GPIO_CLX_ProcessAddDevicePreDeviceCreate必須在呼叫 WdfDeviceCreate 方法之前呼叫,以建立裝置物件。 第二個方法 GPIO_CLX_ProcessAddDevicePostDeviceCreate必須在 WdfDeviceCreate 呼叫之後呼叫。

中斷鎖定

大部分驅動程式實作的事件回呼函式只會在 GPioClx 呼叫 IRQL = PASSIVE_LEVEL。 不過,下列清單中的回呼函式會在 PASSIVE_LEVEL 或 DIRQL 呼叫,視 CLIENT_QueryControllerBasicInformation 回呼函式提供給 GpioClx 的裝置資訊而定:

這些函式會從 GPioClx 中的插斷服務常式 (ISR) 呼叫,這會在 DIRQL 或PASSIVE_LEVEL執行,視 GPIO 控制器的硬體暫存器是否為記憶體對應而定。

CLIENT_QueryControllerBasicInformation函式會以CLIENT_CONTROLLER_BASIC_INFORMATION結構的形式提供裝置資訊。 如果 MemoryMappedController 旗標位是在這個結構的 Flags 成員中設定,GpioClx ISR 會在 DIRQL 的上述清單中呼叫回呼函式。 否則,ISR 會在PASSIVE_LEVEL呼叫所有驅動程式實作的回呼函式。 如需此旗標位的詳細資訊,請參閱 中斷相關的回呼

GpioClx 會自動同步處理在 PASSIVE_LEVEL 執行的驅動程式實作回呼函式呼叫,而且不會從 GpioClx ISR 呼叫。 因此,一次只能執行其中一個函式。 不過,GpioClx 不會自動同步處理這些PASSIVE_LEVEL回呼與其 ISR 所建立的 GpioClx 回呼。 如果需要,GPIO 控制器驅動程式必須明確提供這類同步處理。

為避免潛在的同步處理錯誤,GpioClx 會實作 GPIO 控制器驅動程式可以取得和釋放的 中斷鎖定 。 中斷鎖定主要是由驅動程式 的CLIENT_EnableInterruptCLIENT_DisableInterrupt 回呼函式使用。 驅動程式會呼叫 GPIO_CLX_AcquireInterruptLock 方法來取得鎖定,並呼叫 GPIO_CLX_ReleaseInterruptLock 方法來釋放鎖定。 驅動程式會從在 PASSIVE_LEVEL 呼叫的回呼函式呼叫這些方法,而且不會從 GpioClx 中的 ISR 呼叫。 雖然驅動程式保留鎖定,但 GpioClx ISR 無法執行。 驅動程式應該只在與 ISR 同步處理的重要作業期間,才會短暫保留鎖定。

如果 GpioClx ISR 呼叫驅動程式實作的回呼函式,則此函式不需要取得 (或釋放) 中斷鎖定,因為 ISR 已經保留鎖定 (,而且會將其釋放) 。 此函式對 GPIO_CLX_AcquireInterruptLockGPIO_CLX_ReleaseInterruptLock 方法的呼叫沒有任何作用,但不會被視為錯誤。