GPIO 控制器驅動程式的中斷同步處理
GPIO 控制器驅動程式可以呼叫 GPIO_CLX_AcquireInterruptLock 和 GPIO_CLX_ReleaseInterruptLock 方法來取得和釋放 GPIO 架構延伸模組在內部實作的中斷鎖定, (GpioClx) 。 在 IRQL = PASSIVE_LEVEL 執行的驅動程式程式碼可以呼叫這些方法,以同步處理至 GpioClx 中的 ISR) 中斷服務例 (程。 GpioClx 會針對 GPIO 控制器中的每個針腳行建立個別中斷鎖定。
如果 GPIO 控制器的硬體暫存器已對應記憶體,GpioClx 中的 ISR 會在 DIRQL 呼叫特定驅動程式實作的事件回呼函式;GpioClx 會在 PASSIVE_LEVEL呼叫其餘的回呼函式。 存取暫存器銀行的被動層級回呼函式可能需要使用中斷鎖定來同步處理在 DIRQL 上執行的回呼函式,以及存取相同暫存器。
例如,被動層級 CLIENT_EnableInterrupt 和 CLIENT_DisableInterrupt 回呼函式會修改影響在 DIRQL 上執行之其他中斷相關回呼常式作業的硬體設定。 CLIENT_EnableInterrupt和CLIENT_DisableInterrupt函式通常會使用銀行中斷鎖定來同步其暫存器存取。
GpioClx 會自動序列化在 DIRQL 上發生的中斷相關和 I/O 相關回呼。 GpioClx 會在呼叫 DIRQL 的回呼函式之前取得目標銀行的中斷鎖定,並在函式傳回之後釋放鎖定。 在 DIRQL 呼叫的回呼函式發生錯誤,藉由呼叫 GPIO_CLX_AcquireInterruptLock來嘗試重新取得銀行中斷鎖定。
同樣地,GpioClx 會自動序列化PASSIVE_LEVEL發生的回呼。 GpioClx 會在內部實作每個銀行的等候鎖定。 GpioClx 會在PASSIVE_LEVEL呼叫回呼函式之前取得目標銀行的等候鎖定,並在函式傳回時釋放鎖定。 對於記憶體對應的 GPIO 控制器,GpioClx 會代表驅動程式管理銀行等候鎖定,但不會讓驅動程式明確取得和釋放鎖定。
不過,對於非記憶體對應的 GPIO 控制器, GPIO_CLX_AcquireInterruptLock 和 GPIO_CLX_ReleaseInterruptLock 取得並釋放等候鎖定,而不是中斷鎖定。 GpioClx 會針對 GPIO 控制器中的每個針腳行實作個別的等候鎖定。 因為暫存器不是記憶體對應,所以所有中斷相關和 I/O 相關的回呼函式都會在PASSIVE_LEVEL呼叫,以便使用 I/O 要求透過序列匯流排存取暫存器,例如 IーC。 GpioClx 會在呼叫其中一個回呼函式之前取得目標銀行的等候鎖定,並在函式傳回之後釋放鎖定。
非記憶體對應控制器的回呼函式發生錯誤,藉由呼叫 GPIO_CLX_AcquireInterruptLock來嘗試重新取得銀行等候鎖定。 不過,回呼函式以外的被動層級驅動程式程式碼可以呼叫 GPIO_CLX_XxxInterruptLock 方法,以同步處理回呼函式。 由於 GpioClx 會在PASSIVE_LEVEL呼叫所有中斷相關和 I/O 相關回呼函式,因此銀行等候鎖定會有效地取代非記憶體對應控制器的銀行中斷鎖定。
非記憶體對應控制器的另一個選項是讓控制器驅動程式實作一組等候鎖定。 這些等候鎖定可能會讓回呼常式執行更精細的鎖定和解除鎖定共用資源,而不是 GpioClx 所實作的等候鎖定。
在呼叫 CLIENT_QueryControllerBasicInformation 回呼常式期間,GPIO 控制器驅動程式會向 GpioClx 報告控制器暫存器是否為記憶體對應。 如需詳細資訊,請參閱CLIENT_CONTROLLER_BASIC_INFORMATION中MemoryMappedController旗標的描述。
如需中斷鎖定和等候鎖定的詳細資訊,請參閱 使用架構鎖定。
下表提供有關在 DIRQL 呼叫哪些回呼函式,而不是在PASSIVE_LEVEL如果暫存器是記憶體對應的,則提供更詳細的資訊。 下表後面的附注說明被動層級回呼函式何時應該使用插斷鎖定。
中斷相關的回呼函式
為了支援設定為中斷輸入的 GPIO 針腳,GPIO 控制器驅動程式會實作一組事件回呼函式,以透過這些針腳管理中斷要求。 在下表中,中間資料行指出如果 GPIO 控制器的硬體暫存器已對應記憶體,則會呼叫函式的 IRQL。 最右邊的資料行表示如果暫存器不是記憶體對應,而且必須透過序列匯流排存取,則會呼叫函式的 IRQL。
回呼函式 | 如果記憶體對應 (MemoryMappedController = 1) IRQL | 如果以串列方式存取 (MemoryMappedController = 0) |
---|---|---|
PASSIVE_LEVEL (請參閱附注 1.) |
PASSIVE_LEVEL (請參閱附注 2.) |
|
DIRQL (請參閱附注 3.) |
PASSIVE_LEVEL (請參閱附注 4.) |
|
DIRQL (請參閱附注 5.) |
DIRQL (請參閱附注 6.) |
注意事項
GpioClx 在呼叫此回呼函式之前,不會取得銀行中斷鎖定。 回呼函式可以視需要取得銀行中斷鎖定,以同步存取在 DIRQL 上執行的回呼函式所共用的暫存器。
GpioClx 會將呼叫這個回呼函式序列化為其他中斷相關和 I/O 相關回呼函式,這些函式會在PASSIVE_LEVEL呼叫。 因此,回呼函式不應該嘗試取得銀行等候鎖定。
GpioClx 會在呼叫此回呼函式之前取得銀行中斷鎖定,並在函式傳回之後釋放鎖定。 因此,回呼函式不應該嘗試取得銀行中斷鎖定。
GpioClx 會將呼叫這個回呼函式序列化為其他中斷相關和 I/O 相關回呼函式,這些函式會在PASSIVE_LEVEL呼叫。 因此,回呼函式不應該嘗試取得銀行等候鎖定。
GpioClx 會在呼叫此回呼函式之前取得銀行中斷鎖定,並在函式傳回之後釋放鎖定。 因此,回呼函式不應該嘗試取得銀行中斷鎖定。
GpioClx 在呼叫此回呼函式之前,不會取得銀行中斷鎖定。 GPIO 控制器驅動程式負責提供任何可能需要的同步處理。
I/O 相關回呼函式
為了支援設定為數據 I/O 針腳的 GPIO 針腳,GPIO 控制器驅動程式會實作一組事件回呼函式,以透過這些針腳管理 I/O 作業。 在下表中,中間資料行指出如果 GPIO 控制器的硬體暫存器已對應記憶體,則會呼叫函式的 IRQL。 最右邊的資料行表示如果暫存器不是記憶體對應,而且必須透過序列匯流排存取,則會呼叫函式的 IRQL。
回呼函式 | 如果記憶體對應 (MemoryMappedController = 1) IRQL | 如果以串列方式存取 (MemoryMappedController = 0) |
---|---|---|
PASSIVE_LEVEL (請參閱附注 1.) |
PASSIVE_LEVEL (請參閱附注 2.) |
|
DIRQL (請參閱附注 3.) |
PASSIVE_LEVEL (請參閱附注 4.) |
注意事項
GpioClx 在呼叫此回呼函式之前,不會取得銀行中斷鎖定。 如有必要,回呼函式可以取得中斷鎖定,以同步存取在 DIRQL 上執行的回呼函式共用的暫存器。
GpioClx 會將此回呼函式的呼叫序列化為其他中斷相關和 I/O 相關回呼函式,這些函式會在PASSIVE_LEVEL呼叫。 因此,回呼函式不應該嘗試取得銀行等候鎖定。
GpioClx 會在呼叫此回呼函式之前取得銀行中斷鎖定,並在函式傳回之後釋放鎖定。 因此,回呼函式不應該嘗試取得銀行中斷鎖定。
GpioClx 會將此回呼函式的呼叫序列化為其他中斷相關和 I/O 相關回呼函式,這些函式會在PASSIVE_LEVEL呼叫。 因此,回呼函式不應該嘗試取得銀行等候鎖定。
GPIO 初始化和設定相關的回呼函式
若要設定 GPIO 控制器來執行 I/O 和中斷作業,GPIO 控制器驅動程式會實作一組事件回呼函式來初始化控制器。 在下表中,中間資料行指出如果 GPIO 控制器的硬體暫存器已對應記憶體,則會呼叫函式的 IRQL。 最右邊的資料行表示如果暫存器未對應記憶體,且必須透過序列匯流排存取函式,則會呼叫函式的 IRQL。
回呼函式 | 如果記憶體對應 (MemoryMappedController = 1) IRQL | 如果串列存取 (MemoryMappedController = 0) |
---|---|---|
PASSIVE_LEVEL (請參閱附注 1.) |
PASSIVE_LEVEL (請參閱附注 2.) |
注意事項
當 GpioClx 呼叫上述任何回呼函式時,無法使用銀行中斷鎖定。 因此,這些回呼函式不應該嘗試取得銀行中斷鎖定。
呼叫這些回呼函式時,無法使用 GpioClx 銀行等候鎖定。 因此,驅動程式不應該嘗試取得銀行等候鎖定以同步處理至這些回呼函式。
GPIO 電源管理相關回呼函式
若要讓 GPIO 控制器變更裝置電源狀態,GPIO 控制器驅動程式會實作一組事件回呼函式,以在這些變更期間儲存和還原硬體設定。 在下表中,中間資料行指出如果 GPIO 控制器的硬體暫存器已對應記憶體,則會呼叫函式的 IRQL。 最右邊的資料行表示如果暫存器未對應記憶體,且必須透過序列匯流排存取函式,則會呼叫函式的 IRQL。
回呼函式 | 如果記憶體對應 (MemoryMappedController = 1) IRQL | 如果串列存取 (MemoryMappedController = 0) |
---|---|---|
DIRQL 或HIGH_LEVEL (請參閱 Notes.) |
不支援。 |
注意事項
- 針對一般 F 狀態轉換:儲存/還原回呼函式會在 DIRQL 使用 GpioClx 所持有的銀行中斷鎖定來呼叫。 因此,兩個回呼函式都不應該嘗試取得銀行中斷鎖定。
- 對於重要的 F 狀態轉換:當叫用電源引擎外掛程式 (PEP) 來儲存和還原 GPIO 狀態時,會呼叫儲存/還原回呼。 儲存/還原回呼函式會在最後一個處理器的內容中呼叫HIGH_LEVEL閒置,這會在平臺深層閒置轉換順序中晚期發生。 因此,兩個回呼函式都不應該嘗試取得銀行中斷鎖定。
如需 F 狀態的詳細資訊,請參閱 元件層級電源管理。 如需 PEP 的詳細資訊,請參閱 PoFxPowerControl。
其他回呼函式
若要讓 GPIO 控制器支援控制器特定的作業,GPIO 控制器驅動程式會實作 CLIENT_ControllerSpecificFunction 事件回呼函式。 在下表中,中間資料行表示如果 GPIO 控制器的硬體暫存器已對應記憶體,則會呼叫函式的 IRQL。 最右邊的資料行表示如果暫存器不是記憶體對應且必須透過序列匯流排存取,則會呼叫函式的 IRQL。
回呼函式 | 如果記憶體對應 (MemoryMappedController = 1) IRQL | 如果串列存取 (MemoryMappedController = 0) |
---|---|---|
PASSIVE_LEVEL (請參閱附注 1.) |
PASSIVE_LEVEL (請參閱附注 2.) |
注意事項
GpioClx 在呼叫此回呼函式之前,不會取得銀行中斷鎖定。 回呼函式可以視需要取得銀行中斷鎖定,以同步處理與在 DIRQL 上執行的回呼函式共用的暫存器存取。
GpioClx 會將此回呼函式的呼叫序列化為其他中斷相關和 I/O 相關回呼函式,這些函式會在PASSIVE_LEVEL呼叫。 因此,回呼函式不應該嘗試取得銀行等候鎖定。