다음을 통해 공유


AVStream의 패킷 기반 DMA

패킷 기반 DMA(직접 메모리 액세스)는 미니드라이버가 사용자 모드에서 받은 버퍼를 캡처하기 위해 직접 데이터를 읽고 데이터를 직접 쓸 때 발생합니다. WDK(Windows 드라이버 키트) 샘플의 AVSHwS(AVStream 시뮬레이션 하드웨어 샘플 드라이버) 샘플은 이러한 유형의 DMA를 수행하는 AVStream 미니드라이버를 빌드하는 방법을 보여 줍니다.

패킷 기반 DMA 체계를 구현하려면 다음을 수행합니다.

  1. 관련 KSPIN_DESCRIPTOR_EX 구조의 Flags 멤버에 KSPIN_FLAG_GENERATE_MAPPINGS 지정합니다. 이 플래그는 분산/수집 지원이 있는 버스 master 사용해야 합니다.

  2. 하드웨어용 AVStream 미니드라이버 작성에 설명된 대로 ISR(인터럽트 서비스 루틴)을 등록합니다.

그런 다음 AVStrMiniDeviceStart 에서 디스패치를 시작합니다.

  1. IoGetDmaAdapter를 사용하여 DMA 어댑터 개체를 설정합니다.

  2. KsDeviceRegisterAdapterObject를 호출하여 AVStream에 DMA 어댑터 개체를 등록합니다.

미니 드라이버는 KsDeviceRegisterAdapterObject 호출에 MaxMappingByteCount 매개 변수를 제공하여 단일 분산/수집 매핑의 최대 크기를 지정합니다.

분산/수집 매핑이 이 최대 크기를 초과하면 AVStream은 매핑을 여러 분산/수집 매핑으로 자동으로 중단합니다. 각 매핑은 MaxMappingByteCount에 지정된 크기보다 크지 않습니다.

AVStrMiniPinProcess 콜백 루틴도 제공해야 합니다. 드라이버 작성기는 이 콜백에 적합한 기능을 선택해야 합니다. 한 가지 예로 다음을 수행할 수 있습니다.

  1. KsPinGetLeadingEdgeStreamPointer를 호출합니다.

  2. KsStreamPointerClone을 호출하여 선행 가장자리를 복제합니다.

  3. 클론을 기반으로 DMA 하드웨어를 프로그래밍합니다.

  4. KsStreamPointerAdvanceOffsets 또는 KsStreamPointerAdvance를 호출하여 선행 가장자리를 진행합니다.

  5. 추가 프레임에 대해 필요에 따라 2단계에서 반복합니다.

하드웨어가 DMA 완료를 위해 중단되면 커널은 공급업체가 이전에 등록한 ISR을 호출합니다. ISR에서 미니드라이버가 DPC(지연 프로시저 호출)를 큐에 넣습니다.

DPC는 DataUsedKSSTREAM_HEADER 구조체의 다른 멤버를 업데이트해야 합니다. 그런 다음 DPC는 KsStreamPointerDelete 를 호출하여 복제본을 삭제하고 연결된 프레임을 해제할 수 있습니다.

또는 프레임의 일부만 완료된 경우 DPC가 복제 포인터를 진행할 수 있습니다. 이렇게 하려면 KsStreamPointerAdvanceOffsets를 호출합니다.

처리를 다시 시작하는 데 필요한 경우 KsPinAttemptProcessing을 호출합니다.

참고

매핑 길이가 실제 페이지가 1개 미만인 경우 단일 실제 페이지에 상주할 수 없습니다.