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
SPBREQUEST I/O 要求的句柄。 您的SPB控制器驅動程式必須藉由執行要求的作業或傳回錯誤狀態來完成此要求。 如需詳細資訊,請參閱<
[in] TransferCount
此 I/O 傳輸順序中的個別傳輸數目。 每個個別傳輸都是簡單的讀取或寫入作業。
傳回值
沒有
言論
SpbCx 會管理SPB控制器的 I/O 佇列。 SpbCx 會在SPB控制器的用戶端(周邊驅動程式)將 IOCTL_SPB_EXECUTE_SEQUENCE 要求傳送至連結至總線的目標裝置時,呼叫SPB控制器的 EvtSpbControllerIoSequence 回呼函式。 要求 參數值是封裝此要求的句柄。
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 呼叫。 |