選用的 EvtSpbControllerLock 和 EvtSpbControllerUnlock 事件回呼函式會執行互補作業。 EvtSpbControllerLock 函式是IOCTL_SPB_LOCK_CONTROLLER要求的處理程式。 EvtSpbControllerUnlock 函式是IOCTL_SPB_UNLOCK_CONTROLLER要求的處理程式。 用戶端(也就是總線上周邊裝置的驅動程式)會傳送這些要求,以啟動和結束 I/O 傳輸序列。 大部分的SPB控制器驅動程式都不支援 IOCTL_SPB_LOCK_CONTROLLER 和 IOCTL_SPB_UNLOCK_CONTROLLER 要求,因此,請勿實作 EvtSpbControllerLock 和 EvtSpbControllerUnlock 函式。
用戶端可以執行 I/O 傳輸順序作為一系列的簡單傳輸要求(也就是 IRP_MJ_READ 和 IRP_MJ_WRITE 要求)。 序列中的第一個傳輸前面必須加上 IOCTL_SPB_LOCK_CONTROLLER 要求,此要求會告知SPB控制器驅動程式在I/O傳輸序列期間鎖定總線。 最後一次轉移必須接著 IOCTL_SPB_UNLOCK_CONTROLLER 要求,這會告訴驅動程式解鎖匯流排。 這種類型的 I/O 傳輸順序稱為 用戶端實作的序列 ,以區別它與 單一要求序列,它會使用 IOCTL_SPB_EXECUTE_SEQUENCE 要求,而不是 IOCTL_SPB_LOCK_CONTROLLER 和 IOCTL_SPB_UNLOCK_CONTROLLER 要求。
當某個周邊裝置的驅動程式在總線上保留鎖定時,總線控制器不允許存取總線上的其他周邊裝置。 總線鎖定作業的詳細數據取決於總線類型。 針對 I2C 控制器,傳輸方向的變更(讀取後面接著寫入,反之亦然)需要 I2C 重新啟動作業。 若為 SPI 控制器,目標裝置的晶片選取必須保持判斷提示,而控制器鎖定仍有效。 如需詳細資訊,請參閱 原子性總線作業。
支援客戶端實作的傳輸順序是選擇性的。 只有在控制器可以執行下列動作時,SPB 控制器驅動程式才應該宣告支援它們:
- 鎖定客戶端實作序列持續時間的總線。
- 隨時解除鎖定公共汽車。 例如,如果解除鎖定要求發生在位元組傳輸之間,控制器應該能夠解除鎖定總線,而不需要等候總線上的下一個字節傳輸。
當總線鎖定時,用戶端可以傳送任意序列的簡單傳輸要求。 也就是說,序列可以是任意長度,而且可以是讀取和寫入的任何組合。
為了指出對客戶端實作序列的支援,SPB 控制器驅動程式會實作 EvtSpbControllerUnlock 函式。 如果您的驅動程序實作此函式,SPB 架構延伸模組 (SpbCx) 會接受 來自用戶端的IOCTL_SPB_LOCK_CONTROLLER 和 IOCTL_SPB_UNLOCK_CONTROLLER 要求。 否則,SpbCx 會以 STATUS_NOT_SUPPORTED 狀態代碼完成這些要求,導致其失敗。
實作 EvtSpbControllerUnlock 函式的 SPB 控制器驅動程式不需要實作 EvtSpbControllerLock 函式。 不過,實作 EvtSpbControllerLock 函式的 SPB 控制器驅動程式也必須實作 EvtSpbControllerUnlock 函 式。
如果您的驅動程式實作 EvtSpbControllerUnlock 函式,但不是 EvtSpbControllerLock 函式,SpbCx 會呼叫 EvtSpbControllerUnlock 函式來處理 IOCTL_SPB_UNLOCK_CONTROLLER 要求,但只要完成 具有 STATUS_SUCCESS狀態代碼的IOCTL_SPB_LOCK_CONTROLLER要求即可。
您的驅動程式有兩種方式可偵測用戶端實作序列的開頭。 首先,如果您的驅動程序實作 EvtSpbControllerLock 函式,SpbCx 會呼叫此函式來處理來自用戶端 的IOCTL_SPB_LOCK_CONTROLLER 要求。 驅動程式可以依賴此呼叫在序列中的第一個傳輸要求之前發生。 其次,如果您的驅動程式未實作 EvtSpbControllerLock 函式,當驅動程式處理來自客戶端的簡單傳輸要求時,驅動程式可以呼叫 SpbRequestGetParameters 方法。 若要指出要求的傳輸是序列中的第一個傳輸,這個方法會將方法輸出結構中的 Position 成員設定為 SpbRequestSequencePositionFirst。
EvtSpbControllerUnlock 回呼是驅動程序判斷序列何時結束的唯一方式。 未實作 EvtSpbControllerUnlock 函式的驅動程式不支援客戶端實作的序列。