處理Client-Implemented序列
選用 的 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 函式的驅動程式不支援用戶端實作的序列。