DMA 트랜잭션 사용

[KMDF에만 적용]

프레임워크 기반 드라이버가 DMA 디바이스에 대한 I/O 작업을 처리하는 경우 드라이버는 각 DMA 디바이스에 대해 프레임워크의 DMA 기능을 사용하도록 설정해야 합니다. 이러한 기능을 사용하도록 설정하려면 드라이버의 EvtDriverDeviceAdd 또는 EvtDevicePrepareHardware 콜백 함수는 다음을 수행해야 합니다.

  1. WdfDeviceSetAlignmentRequirement를 호출하여 버퍼 맞춤에 대한 디바이스의 요구 사항을 지정합니다.

  2. WdfDmaEnablerCreate를 호출하여 DMA 작업 유형(단일 패킷 또는 분산/수집)과 디바이스가 지원하는 최대 전송 크기를 지정합니다. KMDF 버전 1.11부터 프레임워크는 운영 체제의 Windows 8 이상 버전에서 실행되는 System on a Chip(SoC) 기반 시스템의 시스템 모드 DMA를 지원합니다.

  3. WdfDmaEnablerSetMaximumScatterGatherElements를 호출하여 디바이스가 분산/수집 작업을 지원하는 경우 디바이스가 분산/수집 목록에서 지원할 수 있는 최대 요소 수를 지정합니다.

PLX9x5x 샘플의 다음 코드 예제에서는 프레임워크의 DMA 기능을 사용하도록 설정하는 방법을 보여 줍니다. 이 코드는 Init.c 파일에 표시됩니다.

WDF_DMA_ENABLER_CONFIG   dmaConfig;

WdfDeviceSetAlignmentRequirement( DevExt->Device, PCI9656_DTE_ALIGNMENT_16 );
WDF_DMA_ENABLER_CONFIG_INIT( &dmaConfig,
                             WdfDmaProfileScatterGather64Duplex,
                             DevExt->MaximumTransferLength );
status = WdfDmaEnablerCreate( DevExt->Device,
                              &dmaConfig, 
                              WDF_NO_OBJECT_ATTRIBUTES,
                              &DevExt->DmaEnabler );

드라이버에 공통 버퍼가 필요한 경우 드라이버의 EvtDriverDeviceAdd 콜백 함수는 일반적으로 이를 설정합니다. 이러한 버퍼에 대한 자세한 내용은 공용 버퍼 사용을 참조하세요.

드라이버가 WdfDmaEnablerCreate를 호출한 후 WdfDmaEnablerWdmGetDmaAdapter 를 호출하여 프레임워크가 디바이스의 입력 및 출력 방향에 대해 만드는 WDM DMA_ADAPTER 구조체에 대한 포인터를 가져올 수 있습니다. 그러나 대부분의 프레임워크 기반 드라이버는 이러한 구조에 액세스할 필요가 없습니다.