EVT_SPB_CONTROLLER_SEQUENCE回呼函式 (spbcx.h)
SPB 控制器驅動程式的 EvtSpbControllerIoSequence 事件回呼函式會執行指定目標裝置與順序要求所提供的緩衝區之間的一連串數據傳輸。
語法
EVT_SPB_CONTROLLER_SEQUENCE EvtSpbControllerSequence;
void EvtSpbControllerSequence(
[in] WDFDEVICE Controller,
[in] SPBTARGET Target,
[in] SPBREQUEST Request,
[in] ULONG TransferCount
)
{...}
參數
[in] Controller
代表SPB控制器之 架構裝置物件的 WDFDEVICE句柄。
[in] Target
此 I/O 要求的目標的 SPBTARGET 句柄。 目標是附加至總線的周邊裝置或埠。 SPB 架構延伸模組 (SpbCx) 先前在開啟目標連線的 EvtSpbTargetConnect 回呼中將此句柄指派給目標。
[in] Request
I/O 要求的 SPBREQUEST 句柄。 SPB 控制器驅動程式必須藉由執行要求的作業或傳回錯誤狀態來完成此要求。 如需詳細資訊,請參閱。
[in] TransferCount
此 I/O 傳輸順序中的個別傳輸數目。 每個個別傳輸都是簡單的讀取或寫入作業。
傳回值
無
備註
SpbCx 會管理SPB控制器的 I/O 佇列。 SpbCx 會在 SPB 控制器的用戶端 (周邊驅動程式) 時呼叫 SPB 控制器驅動程式的 EvtSpbControllerIoSequence 回呼函式,將 IOCTL_SPB_EXECUTE_SEQUENCE 要求傳送至連結至總線的目標裝置。 Request 參數值是封裝此要求的句柄。
EvtSpbControllerIoSequence 回呼不會傳回狀態值。 相反地,SPB 控制器驅動程式會指出 I/O 要求的完成狀態中順序作業的狀態。
EvtSpbControllerIoSequence 回呼是異步的。 也就是說,回呼函式應該起始要求的序列 (或序列的第一個部分) 作業,然後傳回,而不需要等待作業完成。 稍後,SPB 控制器驅動程式會繼續處理要求,或在中斷 DPC 或定時器 DPC 期間完成它。
SPB 控制器驅動程式可以從 I/O 要求擷取參數值,以判斷序列內傳輸的最大長度。 驅動程式可以使用這個長度來配置 DMA 資源,以供序列內每個傳輸重複使用。
SPB 控制器驅動程式可以呼叫 SpbRequestGetTransferParameters 方法來擷取序列中每個傳輸的控制參數和數據緩衝區。 緩衝區是 WDFMEMORY 物件,在目前的實作中,會封裝鏈結的 MDL。 如需鏈結 MDL 的詳細資訊,請參閱 使用 MDL。
SPB 控制器應保留針對整個順序作業選取的目標裝置。 如果裝置選取行選取目標,則可以從序列中的第一次傳輸開始持續判斷提示該行,直到最後一個傳輸結束為止。 這一行可以早於序列開頭的鎖定作業判斷提示,而且可以維持判斷提示,直到序列結尾的解除鎖定作業為止。
您可以針對序列中的每個傳輸指定選擇性延遲。 SPB 控制器驅動程式負責在啟動傳輸之前,至少延遲該微秒數。 如果序列中的第一次傳輸有相關聯的延遲,驅動程式應該先傳輸位址或判斷提示目標裝置的裝置選取線,然後在開始數據傳輸之前延遲一段時間。 在此延遲期間,目標應該保持選取狀態,但控制器不應該在總線上執行時鐘。
如果目標裝置在序列中的傳輸期間發出 NACK 訊號,SPB 控制器就會停止序列。 (也就是說,控制器不會重試失敗的傳輸,也不會嘗試在序列中執行其餘傳輸。) 如果發生這種情況,SPB 控制器驅動程式應該將 I/O 要求的完成狀態設定為STATUS_SUCCESS,將 I/O 狀態區塊中的 [資訊 ] 位元位設定為實際傳輸的位元組數目, (不會計算接收 NACK) 傳輸中遺失的數據, 並完成要求。
只有在發生下列其中一個情況時,SPB 控制器驅動程式才應該完成 I/O 要求,並顯示錯誤狀態代碼:
- SPB 控制器無法選取目標裝置 (例如,當控制器傳送位址位元組) 時,I2C 總線上的目標裝置會發出 NACK 訊號。
- SPB 控制器驅動程式會在處理順序作業時,從呼叫 WDF 或 WDM 服務取得錯誤狀態。
若要註冊 EvtSpbControllerIoSequence 回呼函式,請呼叫 SpbDeviceInitialize 方法。
範例
若要定義 EvtSpbControllerIoSequence 回呼函式,您必須先提供函式宣告來識別您要定義的回呼函式類型。 Windows 提供一組驅動程式的回呼函式類型。 使用回呼函式類型宣告函式有助於 驅動程式的程式代碼分析、 靜態驅動程式驗證器 (SDV) ,以及其他驗證工具會尋找錯誤,而且這是撰寫 Windows 操作系統驅動程式的需求。
例如,若要定義名為 MyEvtSpbControllerIoSequence
的 EvtSpbControllerIoSequence 回呼函式,請使用 EVT_SPB_CONTROLLER_SEQUENCE 函式類型,如下列程式代碼範例所示:
EVT_SPB_CONTROLLER_SEQUENCE MyEvtSpbControllerIoSequence;
然後,實作您的回呼函式,如下所示:
_Use_decl_annotations_
VOID
MyEvtSpbControllerIoSequence(
WDFDEVICE Controller,
SPBTARGET Target,
SPBREQUEST Request,
ULONG TransferCount
)
{ ... }
EVT_SPB_CONTROLLER_SEQUENCE函式類型定義於Spbcx.h頭檔中。 若要在執行程式代碼分析工具時更精確地識別錯誤,請務必將 Use_decl_annotations 註釋新增至函式定義。 Use_decl_annotations註釋可確保使用頭檔中套用至EVT_SPB_CONTROLLER_SEQUENCE函式類型的批註。 如需函數宣告需求的詳細資訊,請參閱 使用 KMDF 驅動程式的函式角色類型來宣告函式。 如需 Use_decl_annotations的詳細資訊,請參閱 標註函式行為。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | 從 Windows 8 開始支援。 |
目標平台 | 桌面 |
標頭 | spbcx.h |
IRQL | 在 IRQL <= DISPATCH_LEVEL呼叫。 |