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를 지원하는 데 사용하는 이벤트 콜백 함수를 보여 줍니다.
System-Mode DMA Enabler 만들기
시스템 모드 DMA 프로필을 만드는 것은 2단계 프로세스입니다. 다음 단계는 일반적인 시나리오를 나타냅니다.
일반적으로 EvtDriverDeviceAdd 콜백 함수에서 드라이버는 WDF_DMA_ENABLER_CONFIG_INIT 호출하여 Profile 매개 변수를 SystemMode 또는 SystemModeDuplex로 설정합니다. 그런 다음 드라이버는 WdfDmaEnablerCreate를 호출하여 방금 받은 WDF_DMA_ENABLER_CONFIG 구조를 전달합니다.
또는 드라이버가 EvtDevicePrepareHardware 중에 인에이블러를 만들 수 있습니다.
드라이버의 EvtDevicePrepareHardware 콜백 함수는 WdfDmaEnablerConfigureSystemProfile 메서드를 호출하여 DMA 인에이블러를 해당 DMA 리소스와 연결합니다. 이중 사용 권한자의 경우 드라이버는 WdfDmaEnablerConfigureSystemProfile 을 두 번 호출하여 각 전송 방향을 구성합니다.
드라이버는 EvtDevicePrepareHardware가 완료된 후 WdfDmaEnablerConfigureSystemProfile을 호출할 수 있지만 드라이버는 DMA 트랜잭션을 초기화하기 전에 이 메서드를 호출해야 합니다.
선택적 콜백 함수 제공
일반적으로 KMDF 드라이버는 DMA 채널을 구성하지 않습니다. 그러나 특정 상황에서 드라이버는 채널별 구성을 수행해야 할 수 있습니다. 예를 들어 드라이버는 다음 단계를 사용하여 DMA 컨트롤러에 의해 구현되는 사용자 지정 함수를 호출할 수 있습니다.
- 드라이버의 요청 처리기 중 하나에서 드라이버는 WdfDmaTransactionSetChannelConfigurationCallback 을 호출하여 EvtDmaTransactionConfigureDmaChannel 콜백 함수를 등록합니다.
- 드라이버의 EvtDmaTransactionConfigureDmaChannel 콜백 함수는 WdfDmaEnablerWdmGetDmaAdapter 를 호출하여 WDM DMA_ADAPTER 대한 포인터를 검색합니다. 이 구조체는 드라이버의 시스템 모드 DMA 채널을 나타내는 어댑터 개체입니다.
- 그런 다음 드라이버는 ConfigureAdapterChannel 을 호출하여 DMA 컨트롤러에서 구현된 사용자 지정 함수를 사용하도록 설정할 수 있습니다. 이 루틴은 DMA_OPERATIONS 구조에서 반환된 주소의 포인터로만 호출할 수 있습니다.
- 드라이버의 EvtDmaTransactionConfigureDmaChannel 콜백 함수는 DMA 채널을 성공적으로 구성하면 TRUE를 반환합니다.
- 프레임워크는 드라이버의 EvtProgramDma 콜백 함수를 호출합니다.
이전 완료 알림 받기
버스 마스터링 컨트롤러를 사용하는 디바이스와 달리 시스템 모드 DMA 디바이스의 하드웨어는 인터럽트를 실행하여 DMA 전송 완료를 알리지 않을 수 있습니다.
디바이스가 DMA 전송 완료를 알리는 인터럽트를 발생시키지 않으면 드라이버가 시스템 모드 DMA 전송이 완료될 때 프레임워크가 호출하는 EvtDmaTransactionDmaTransferComplete 이벤트 콜백 함수를 제공할 수 있습니다.
이 콜백 함수를 등록하기 위해 드라이버는 요청 처리기 중 하나에서 WdfDmaTransactionSetTransferCompleteCallback을 호출합니다.