DMA 트랜잭션 만들기 및 초기화

[KMDF에만 적용]

드라이버가 DMA 디바이스에 I/O 요청을 보내려면 먼저 드라이버가 다음을 수행해야 합니다.

  1. WdfDmaTransactionCreate를 호출하여 요청에 대한 DMA 트랜잭션 개체를 만듭니다.

  2. WdfDmaTransactionInitializeUsingRequest, WdfDmaTransactionInitialize 또는 WdfDmaTransactionInitializeUsingOffset을 호출하여 트랜잭션 개체를 초기화합니다.

일반적으로 드라이버는 요청 처리기가프레임워크 요청 개체를 수신하고 요청을 하드웨어에 전달해야 하므로 DMA 트랜잭션을 만듭니다. 이 경우 드라이버는 요청 개체 핸들을 입력으로 수락하고 요청 개체에서 요청의 주소 매개 변수 를 추출하는 WdfDmaTransactionInitializeUsingRequest를 호출해야 합니다.

드라이버가 받은 프레임워크 요청 개체를 기반으로 하지 않는 DMA 트랜잭션을 만들어야 하는 경우 드라이버는 WdfDmaTransactionInitialize 또는 WdfDmaTransactionInitializeUsingOffset을 호출할 수 있습니다. 두 메서드 모두 드라이버가 제공하는 주소 매개 변수를 허용합니다.

세 가지 초기화 메서드를 모두 입력 매개 변수로 EvtProgramDma 이벤트 콜백 함수의 주소가 필요합니다. 이 콜백 함수는 디바이스를 프로그래밍하고 프레임워크는 DMA 전송 을 사용할 수 있을 때마다 콜백 함수를 호출합니다.

드라이버가 WdfDmaEnablerCreate 를 호출하여 DMA 지원자 개체를 만들면 드라이버는 디바이스의 최대 전송 길이가 포함된 WDF_DMA_ENABLER_CONFIG 구조를 제공합니다. 프레임워크는 이 값을 모든 DMA 전송의 기본 최대 길이로 사용합니다.

일부 유형의 DMA 트랜잭션의 경우 디바이스의 기본 최대 길이와 다른 최대 전송 길이를 지정해야 할 수 있습니다. WdfDmaTransactionSetMaximumLength를 사용하여 개별 트랜잭션에 대한 최대 전송 길이를 설정할 수 있습니다. 프레임워크는 지정된 트랜잭션을 처리하는 동안에만 지정된 최대 전송 길이를 사용합니다.

최대 전송 길이는 운영 체제가 DMA 인에이블러 개체에 사용할 수 있도록 하는 맵 레지스터 수에 의해 제한됩니다. 사용 가능한 최대 전송 길이를 결정하기 위해 드라이버는 WdfDmaEnablerGetFragmentLength를 호출할 수 있습니다. WdfDmaEnablerGetFragmentLength가 반환하는 값이 드라이버가 WdfDmaEnablerCreate에 제공한 최대 전송 길이보다 작으면 프레임워크는 더 작은 값을 사용합니다.

드라이버가 DMA 트랜잭션을 만들고 초기화한 후 드라이버는 트랜잭션을 시작해야 합니다.