[KMDF에만 적용]
WdfDmaTransactionDmaCompleted 메서드는 디바이스의 DMA 전송 작업이 완료되었음을 프레임워크에 알립니다.
구문론
BOOLEAN WdfDmaTransactionDmaCompleted(
[in] WDFDMATRANSACTION DmaTransaction,
[out] NTSTATUS *Status
);
매개 변수
[in] DmaTransaction
WdfDmaTransactionCreate에 대한 이전 호출에서 드라이버가 가져온 DMA 트랜잭션 개체에 대한 핸들은.
[out] Status
DMA 전송 상태를 받는 위치에 대한 포인터입니다. 자세한 내용은 다음 설명 섹션을 참조하세요.
반환 값
WdfDmaTransactionDmaCompletedFALSE 반환하고 DMA 트랜잭션을 완료하기 위해 추가 전송이 필요한 경우 상태 STATUS_MORE_PROCESSING_REQUIRED 받습니다. 추가 전송이 필요하지 않은 경우 메서드는 TRUE 반환합니다.
드라이버에서 잘못된 개체 핸들을 제공하면 버그 검사가 수행됩니다.
비고
프레임워크 기반 드라이버는 DMA 전송 완료할 때마다 다음 방법 중 하나를 호출해야 합니다.
- WdfDmaTransactionDmaCompleted
프레임워크는 DMA 트랜잭션 여러 DMA 전송 작업으로 나눌 수 있습니다. 따라서 드라이버는 메서드의 반환 값을 검사하여 추가 전송이 필요한지 확인해야 합니다.
메서드가 FALSE 반환하는 경우 상태 위치는 STATUS_MORE_PROCESSING_REQUIRED 수신하고 트랜잭션을 완료하려면 추가 DMA 작업이 필요합니다. 일반적으로 EvtInterruptDpc 이벤트 콜백 함수는 이 시점에서 다른 작업을 수행하지 않습니다. 대신 프레임워크는 드라이버의 EvtProgramDma 이벤트 콜백 함수를 호출하므로 콜백 함수는 다음 전송을 시작할 수 있습니다.
메서드가 TRUE 반환하는 경우 지정된 트랜잭션에 대해 더 이상 전송되지 않습니다. 이 경우 상태 값은 STATUS_SUCCESS 프레임워크에 오류가 발생하지 않고 DMA 트랜잭션이 완료됨을 의미합니다.
WdfDmaTransactionDmaCompleted호출하기 전에 드라이버가 WdfDmaTransactionStopSystemTransfer 호출하면 WdfDmaTransactionDmaCompleted TRUE 상태 값이 STATUS_CANCELLED반환됩니다.
단일 전송대해 설정된 트랜잭션의 경우 WdfDmaTransactionDmaCompletedTRUE 반환하고, 초기화에 성공하더라도 하드웨어가 단일 전송에서 트랜잭션을 완료하지 못하면 상태 값이 STATUS_WDF_TOO_MANY_TRANSFERS 반환됩니다. 이 오류는 각 DMA 작업에 대한 잔여 전송을 보고하는 하드웨어에서 발생할 수 있습니다. 예를 들어 드라이버는 64KB를 작성하도록 디바이스를 프로그래밍하지만 디바이스는 60KB만 씁니다. 이 경우 드라이버는 DMA 작업을 반복하거나 디바이스를 다시 설정할 수 있습니다.
상태 대한 다른 값은 프레임워크에서 오류를 감지했으며 DMA 트랜잭션이 완료되지 않았을 수 있음을 의미합니다.
WdfDmaTransactionDmaCompleted TRUE 반환하는 경우 드라이버는 일반적으로 다음을 수행합니다.
- WdfObjectDelete 또는 WdfDmaTransactionRelease 호출하여 트랜잭션 개체를 각각 삭제하거나 다시 사용합니다.
- DMA 트랜잭션이 I/O 요청과 연결된 경우 I/O 요청을 완료합니다. (드라이버는 WdfRequestComplete 또는 WdfRequestCompleteWithInformation호출하여 요청을 완료합니다.)
예시
다음 코드 예제는 AMCC5933 샘플 드라이버에서입니다. 이 예제에서는 EvtInterruptDpc 콜백 함수를 보여줍니다. 이 예제에서는 DMA 전송이 완료되었음을 프레임워크에 알깁니다. 프레임워크에서 이 전송이 DMA 트랜잭션의 마지막 전송임을 나타내는 경우 코드는 DMA 트랜잭션 개체를 삭제하고 연결된 I/O 요청을 완료합니다.
VOID
AmccPciEvtInterruptDpc(
IN WDFINTERRUPT WdfInterrupt,
IN WDFOBJECT WdfDevice
)
{
PAMCC_DEVICE_EXTENSION devExt;
WDFREQUEST request;
REQUEST_CONTEXT *transfer;
NTSTATUS status;
size_t transferred;
BOOLEAN transactionComplete;
UNREFERENCED_PARAMETER( WdfInterrupt );
//
// Retrieve request and transfer.
//
devExt = AmccPciGetDevExt(WdfDevice);
request = devExt->CurrentRequest;
transfer = GetRequestContext(request);
//
// Check to see if the request has been canceled.
//
if (WdfRequestIsCanceled(request)) {
TraceEvents(
TRACE_LEVEL_ERROR,
AMCC_TRACE_IO,
"Aborted DMA transaction 0x%p",
request
);
WdfObjectDelete( transfer->DmaTransaction );
devExt->CurrentRequest = NULL;
WdfRequestComplete(
request,
STATUS_CANCELLED
);
return;
}
//
// Notify the framework that a DMA transfer has completed.
//
transactionComplete = WdfDmaTransactionDmaCompleted(
transfer->DmaTransaction,
&status
);
if (transactionComplete) {
ASSERT(status != STATUS_MORE_PROCESSING_REQUIRED);
//
// No more data. The request is complete.
//
TraceEvents(
TRACE_LEVEL_INFORMATION,
AMCC_TRACE_IO,
"Request %p completed: status %X",
request,
status
);
//
// Get the byte count.
//
transferred =
WdfDmaTransactionGetBytesTransferred(transfer->DmaTransaction);
TraceEvents(
TRACE_LEVEL_INFORMATION,
AMCC_TRACE_IO,
"Bytes transferred %d",
(int) transferred
);
//
// Delete this DmaTransaction object.
//
WdfObjectDelete(transfer->DmaTransaction);
//
// Clean up the device context for this request.
//
devExt->CurrentRequest = NULL;
//
// Complete this I/O request.
//
WdfRequestCompleteWithInformation(
request,
status,
(NT_SUCCESS(status)) ? transferred : 0
);
}
}
요구 사항
| 요구 사항 | 가치 |
|---|---|
| 대상 플랫폼 | 보편적 |
| 최소 KMDF 버전 | 1.0 |
| 헤더 | wdfdmatransaction.h(Wdf.h 포함) |
| 라이브러리 | Wdf01000.sys(프레임워크 라이브러리 버전 관리 참조) |
| IRQL | <=DISPATCH_LEVEL |
| DDI 규정 준수 규칙 | DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf) |
참고하십시오
WdfDmaTransactionDmaCompletedFinal