System-Mode DMA 지원

[KMDF에만 적용]

시스템 모드 DMA는 버스 master DMA와 달리 여러 디바이스가 일반적으로 다중 채널 DMA 컨트롤러를 공유하는 구성을 설명합니다.

KMDF(Kernel-Mode Driver Framework) 버전 1.11부터 프레임워크는 Windows 운영 체제의 Windows 8 이상 버전에서 실행되는 System on a Chip(SoC) 기반 시스템의 시스템 모드 DMA를 지원합니다.

이 항목에서는 시스템 모드 DMA 디바이스에 대한 I/O 요청을 처리하기 위해 KMDF 드라이버가 이벤트 콜백 함수에 제공해야 하는 코드와 등록할 수 있는 선택적 이벤트 콜백 함수에 대해 설명합니다.

KMDF 및 버스 master DMA에 대한 자세한 내용은 Bus-Master DMA 디바이스에 대한 KMDF 드라이버에서 I/O 요청 처리를 참조하세요.

다음 그림에서는 드라이버가 시스템 모드 DMA를 지원하는 데 사용하는 이벤트 콜백 함수를 보여 줍니다.

KMDF 드라이버에서 시스템 모드 DMA 구현에 대한 이벤트 콜백 함수를 보여 주는 순서도입니다.

System-Mode DMA Enabler 만들기

시스템 모드 DMA 프로필을 만드는 것은 2단계 프로세스입니다. 다음 단계는 일반적인 시나리오를 나타냅니다.

  1. 일반적으로 EvtDriverDeviceAdd 콜백 함수에서 드라이버는 WDF_DMA_ENABLER_CONFIG_INIT 호출하여 Profile 매개 변수를 SystemMode 또는 SystemModeDuplex로 설정합니다. 그런 다음 드라이버는 WdfDmaEnablerCreate를 호출하여 방금 받은 WDF_DMA_ENABLER_CONFIG 구조를 전달합니다.

    또는 드라이버가 EvtDevicePrepareHardware 중에 인에이블러를 만들 수 있습니다.

  2. 드라이버의 EvtDevicePrepareHardware 콜백 함수는 WdfDmaEnablerConfigureSystemProfile 메서드를 호출하여 DMA 인에이블러를 해당 DMA 리소스와 연결합니다. 이중 사용 권한자의 경우 드라이버는 WdfDmaEnablerConfigureSystemProfile 을 두 번 호출하여 각 전송 방향을 구성합니다.

    드라이버는 EvtDevicePrepareHardware가 완료된 후 WdfDmaEnablerConfigureSystemProfile을 호출할 수 있지만 드라이버는 DMA 트랜잭션을 초기화하기 전에 이 메서드를 호출해야 합니다.

선택적 콜백 함수 제공

일반적으로 KMDF 드라이버는 DMA 채널을 구성하지 않습니다. 그러나 특정 상황에서 드라이버는 채널별 구성을 수행해야 할 수 있습니다. 예를 들어 드라이버는 다음 단계를 사용하여 DMA 컨트롤러에 의해 구현되는 사용자 지정 함수를 호출할 수 있습니다.

  1. 드라이버의 요청 처리기 중 하나에서 드라이버는 WdfDmaTransactionSetChannelConfigurationCallback 을 호출하여 EvtDmaTransactionConfigureDmaChannel 콜백 함수를 등록합니다.
  2. 드라이버의 EvtDmaTransactionConfigureDmaChannel 콜백 함수는 WdfDmaEnablerWdmGetDmaAdapter 를 호출하여 WDM DMA_ADAPTER 대한 포인터를 검색합니다. 이 구조체는 드라이버의 시스템 모드 DMA 채널을 나타내는 어댑터 개체입니다.
  3. 그런 다음 드라이버는 ConfigureAdapterChannel 을 호출하여 DMA 컨트롤러에서 구현된 사용자 지정 함수를 사용하도록 설정할 수 있습니다. 이 루틴은 DMA_OPERATIONS 구조에서 반환된 주소의 포인터로만 호출할 수 있습니다.
  4. 드라이버의 EvtDmaTransactionConfigureDmaChannel 콜백 함수는 DMA 채널을 성공적으로 구성하면 TRUE를 반환합니다.
  5. 프레임워크는 드라이버의 EvtProgramDma 콜백 함수를 호출합니다.

이전 완료 알림 받기

버스 마스터링 컨트롤러를 사용하는 디바이스와 달리 시스템 모드 DMA 디바이스의 하드웨어는 인터럽트를 실행하여 DMA 전송 완료를 알리지 않을 수 있습니다.

디바이스가 DMA 전송 완료를 알리는 인터럽트를 발생시키지 않으면 드라이버가 시스템 모드 DMA 전송이 완료될 때 프레임워크가 호출하는 EvtDmaTransactionDmaTransferComplete 이벤트 콜백 함수를 제공할 수 있습니다.

이 콜백 함수를 등록하기 위해 드라이버는 요청 처리기 중 하나에서 WdfDmaTransactionSetTransferCompleteCallback을 호출합니다.