共用方式為


Interrupt-Related回呼

作為選項,一般用途 I/O 的驅動程式 (GPIO) 控制器可以提供 GPIO 中斷的支援。 為了支援 GPIO 中斷,GPIO 控制器驅動程式會實作一組回呼函式來管理這些中斷。 驅動程式會將這些回呼函式的指標包含在驅動程式將本身註冊為 GPIO 架構擴充 (用戶端) 時所提供的註冊封包中的這些回呼函式。 如需此註冊封包的詳細資訊,請參閱 GPIO_CLIENT_REGISTRATION_PACKET

根據規則,GPIO 控制器是 Chip (SoC) 晶片上系統整合的一部分,具有記憶體對應硬體暫存器,可由 SoC 晶片中的處理器直接存取。 不過,個別的 GPIO 控制器裝置可能會透過序列匯流排外部連線到 SoC 晶片,如下圖所示。

整合式 gpio 控制器和外部 gpio 控制器。

在此圖表中,外部 GPIO 控制器會連線到 I¹C 匯流排。 此匯流排是由 I¹C 匯流排控制器所控制,這是 SoC 晶片的整合部分。 來自外部 GPIO 控制器的中斷要求行會連接到整合式 GPIO 控制器上的針腳。 在此範例中 ,GpioClx DDI 可以容納整合式 GPIO 控制器和外部 GPIO 控制器。

如果 GPIO 控制器裝置已對應記憶體,GPIO 控制器驅動程式可以在 DIRQL 直接存取控制器的硬體暫存器。 不過,如果 GPIO 控制器已串列連線,GPIO 控制器驅動程式只能在 IRQL = PASSIVE_LEVEL 存取硬體註冊,如 被動層級 ISR中所述。

具有記憶體對應硬體暫存器的 GPIO 控制器驅動程式應該在驅動程式提供給 GpioClx 的裝置資訊中設定 MemoryMappedController 旗標位。 否則,GpioClx 會假設硬體暫存器不是記憶體對應,而且驅動程式只能在 IRQL = PASSIVE_LEVEL存取這些暫存器。 如需此旗標位的詳細資訊,請參閱 CONTROLLER_ATTRIBUTE_FLAGS

GpioClx 會在 ISR) 實作中斷服務例 (程,以服務 GPIO 控制器中的中斷要求。 此 ISR 會呼叫下列中斷相關的回呼函式:

CLIENT_ClearActiveInterruptsCLIENT_MaskInterruptsCLIENT_QueryActiveInterrupts CLIENT_QueryEnabledInterrupts CLIENT_UnmaskInterrupt這些函式是在 DIRQL 或PASSIVE_LEVEL呼叫,視 GpioClx 中的 ISR 是在 DIRQL 或 PASSIVE_LEVEL 執行而定。 如果 MemoryMappedController = 1,ISR 會在 DIRQL 呼叫這些函式,如果 MemoryMappedController = 0,則呼叫PASSIVE_LEVEL。 不論是哪一種情況,ISR 都會自動序列化其回呼,讓其中一個函式的呼叫不會發生在呼叫其中一個函式的中間。

不論是否已設定 MemoryMappedController 旗標,GPIO 架構擴充功能只會在PASSIVE_LEVEL呼叫下列中斷相關的回呼函式:

CLIENT_DisableInterruptCLIENT_EnableInterrupt 如果未設定 MemoryMappedController 旗標,則會在PASSIVE_LEVEL呼叫所有中斷相關的回呼函式。 GpioClx 會自動序列化對這些函式的呼叫,讓其中一個函式的呼叫不會在呼叫其中一個函式的中間發生。

不過,如果已設定 MemoryMappedController 旗標, CLIENT_EnableInterruptCLIENT_DisableInterrupt 函式必須明確地將其中斷啟用和停用作業同步至 GpioClx ISR,這會在 DIRQL 呼叫其他四個中斷相關的回呼函式。

一般而言,其他CLIENT_Xxx 回呼函式 (名稱不包含 「Interrupt」) 不會執行中斷相關的處理,因此不需要同步處理至 GpioClx ISR。 不過,如果在PASSIVE_LEVEL呼叫其中任何函式,並且包含程式碼,該程式碼會存取 DIRQL 中斷相關函式所存取的中斷設定,則必須將此程式碼同步處理至 ISR。

為了支援中斷同步處理,GpioClx 會實作一組中斷鎖定。 在 PASSIVE_LEVEL 執行的回呼函式可以呼叫 GPIO_CLX_AcquireInterruptLock 方法來取得中斷鎖定,並呼叫 GPIO_CLX_ReleaseInterruptLock 方法來釋放鎖定。 當函式保存中斷鎖定時,GpioClx ISR 無法執行,而且此 ISR 無法呼叫任何中斷相關的回呼函式。 若要讓 GPIO 中斷及時處理,驅動程式應該保留中斷鎖定的時間不超過必要。

如需詳細資訊,請參閱 GPIO 控制器驅動程式的中斷同步處理。