PSETUP_DMA_ENGINE_WITH_BDL 콜백 함수(hdaudio.h)

SetupDmaEngineWithBdl 루틴은 호출자가 할당한 DMA 버퍼를 사용하도록 DMA 엔진을 설정합니다.

SetupDmaEngineWithBdl 루틴에 대한 함수 포인터 형식은 다음과 같이 정의됩니다.

구문

PSETUP_DMA_ENGINE_WITH_BDL PsetupDmaEngineWithBdl;

NTSTATUS PsetupDmaEngineWithBdl(
  [in]  PVOID _context,
  [in]  HANDLE Handle,
  [in]  ULONG BufferLength,
  [in]  ULONG Lvi,
  [in]  PHDAUDIO_BDL_ISR Isr,
  [in]  PVOID Context,
  [out] PUCHAR StreamId,
  [out] PULONG FifoSize
)
{...}

매개 변수

[in] _context

HDAUDIO_BUS_INTERFACE_BDL 구조체의 Context 멤버에서 컨텍스트 값을 지정합니다.

[in] Handle

DMA 엔진을 식별하는 핸들입니다. 이 핸들 값은 AllocateCaptureDmaEngine 또는 AllocateRenderDmaEngine에 대한 이전 호출에서 가져옵니다.

[in] BufferLength

버퍼의 길이입니다.

[in] Lvi

LVI(마지막 유효한 인덱스)를 지정합니다. 이 매개 변수는 BDL의 마지막 유효한 버퍼 설명자에 대한 인덱스를 포함합니다. DMA 엔진은 이 설명자를 처리한 후 목록의 첫 번째 설명자로 다시 래핑하고 처리를 계속합니다. BDL에 n 설명자가 포함된 경우 0에서 n-1로 번호가 매겨집니다. lvi 값은 1 이상이어야 합니다. 즉, DMA 엔진이 작업을 시작하기 전에 BDL에 두 개 이상의 유효한 항목이 포함되어야 합니다.

[in] Isr

호출자의 ISR에 대한 함수 포인터입니다. 호출자가 BDL의 하나 이상의 버퍼 설명자에서 IOC(인터럽트 완료) 비트를 설정하는 경우 HD 오디오 버스 드라이버는 스트림에서 IOC 인터럽트가 발생할 때마다 ISR을 호출합니다. 이 매개 변수는 다음 주의 섹션에 정의된 HDAUDIO_BDL_ISR 형식의 함수 포인터입니다.

[in] Context

컨텍스트입니다.

[out] StreamId

스트림 식별자를 검색합니다. 이 매개 변수는 루틴이 스트림에 할당하는 스트림 식별자를 쓰는 호출자 할당 UCHAR 변수를 가리킵니다.

[out] FifoSize

DMA 엔진의 FIFO 크기(바이트)를 검색합니다. 이 매개 변수는 루틴이 FIFO 크기를 쓰는 호출자 할당 UINT 변수를 가리킵니다.

반환 값

SetupDmaEngineWithBdl은 호출이 성공하면 STATUS_SUCCESS 반환합니다. 그렇지 않으면 루틴이 적절한 오류 코드를 반환합니다. 다음 표에서는 가능한 반환 상태 코드 중 일부를 보여 줍니다.

반환 코드 설명
STATUS_UNSUCCESSFUL
호출자가 너무 높은 IRQL에서 실행 중임을 나타냅니다.
STATUS_INVALID_HANDLE
핸들 매개 변수 값이 잘못되었음을 나타냅니다.
STATUS_INVALID_PARAMETER
매개 변수 값 중 하나가 잘못되었음을 나타냅니다(잘못된 포인터 또는 잘못된 스트림 형식).
STATUS_DEVICE_NOT_READY
하드웨어 프로그래밍 시간이 초과되었음을 나타냅니다. 이 경우 하드웨어가 손상된 상태일 수 있습니다.
STATUS_INVALID_DEVICE_REQUEST
DMA 디바이스 또는 DMA 버퍼가 할당되지 않았거나 스트림이 다시 설정 상태가 아님을 나타냅니다.

설명

SetupDmaEngineWithBdl 루틴은 AllocateContiguousDmaBufferFreeContiguousDmaBuffer 루틴과 함께 사용됩니다. 이러한 세 가지 루틴은 hd Audio DDI의 HDAUDIO_BUS_INTERFACE_BDL 버전에서만 사용할 수 있습니다. 이 DDI에는 AllocateContiguousDmaBuffer, SetupDmaEngineWithBdlFreeContiguousDmaBuffer와 함께 사용되지 않는 AllocateDmaBuffer 및 FreeDmaBuffer 루틴이 포함되지 않습니다. 이전에 할당된 DMA 버퍼를 사용하도록 DMA 엔진을 구성하는 SetupDmaEngineWithBdl과 달리 AllocateDmaBuffer 는 둘 다 DMA 버퍼를 할당하고 버퍼를 사용하도록 DMA 엔진을 구성합니다.

호출자는 AllocateContiguousDmaBuffer 를 호출하여 DMA 버퍼와 버퍼의 실제 메모리 페이지를 설명하는 BDL 모두에 대해 시스템 메모리에 스토리지를 할당해야 합니다. BDL 항목은 물리적으로 연속된 메모리에 있어야 합니다. BDL 및 버퍼 메모리는 Intel 고화질 오디오 사양 에 설명된 맞춤 요구 사항을 충족해야 합니다( Intel HD 오디오 웹 사이트 참조).

BDL과 BDL이 설명하는 버퍼 메모리는 모두 DMA 작업 중에 유효한 상태로 유지되어야 합니다. SetupDmaEngineWithBdl 호출 후 DMA 엔진이 버퍼를 계속 사용하는 한 BDL 및 버퍼 메모리는 유효한 상태로 유지되어야 합니다. DMA 엔진은 함수 드라이버가 SetupDmaEngineWithBdl 을 다시 호출하여 버퍼를 대체하거나 FreeDmaEngine을 호출하여 DMA 엔진을 해제할 때까지 버퍼를 사용합니다. 함수 드라이버는 더 이상 필요하지 않은 경우 FreeContiguousDmaBuffer 를 호출하여 버퍼와 BDL을 해제합니다.

버퍼에 대한 메모리를 할당할 때 호출자는 BDL이 지정하는 물리적으로 연속된 메모리 블록의 주소, 길이 및 맞춤에 대한 모든 하드웨어 제약 조건을 충족해야 합니다. 따라서 버스 컨트롤러 및 시스템 하드웨어에 대한 지식이 있는 클라이언트만 SetupDmaEngineWithBdl 루틴을 사용해야 합니다.

SetupDmaEngineWithBdl을 호출하여 DMA 엔진을 구성하기 전에 클라이언트는 AllocateCaptureDmaEngine 또는 AllocateRenderDmaEngine을 호출하여 DMA 엔진을 할당해야 합니다. handle 매개 변수는 XxxDmaEngine 할당에 대한 이전 호출에서 얻은 값입니다.

호출자는 코덱을 프로그래밍하여 데이터 전송을 관리하고 스트림 식별자를 인식합니다.

WDM 오디오 드라이버는 NewStream 메서드를 실행하는 동안 핀 생성 시 이 루틴을 호출합니다(예: IMiniportWavePci::NewStream 참조).

SetupDmaEngineWithBdl을 호출한 후 DMA 엔진은 다시 설정 상태입니다. DMA 엔진을 시작하려면 SetDmaEngineState를 호출합니다.

매개 변수 isr은 스트림에서 IOC 인터럽트 발생 시 HD 오디오 버스 드라이버가 호출할 ISR을 지정합니다. 이 매개 변수는 다음과 같이 정의된 HDAUDIO_BDL_ISR 형식의 함수 포인터입니다.

typedef void
  (*PHDAUDIO_BDL_ISR)
    (IN VOID *Context, IN ULONG InterruptBitMask);

HD 오디오 버스 드라이버는 이전 SetupDmaEngineWithBdl 호출의 컨텍스트 매개 변수에 클라이언트가 지정한 것과 동일한 컨텍스트 값으로 ISR을 호출합니다. interruptBitMask 매개 변수에는 인터럽트의 이유를 나타내는 HD 오디오 컨트롤러 디바이스의 스트림 상태 레지스터의 비트가 포함되어 있습니다. 다음 표에서는 interruptBitMask에서 개별 비트의 의미를 보여 줍니다.

비트 번호 의미
31:5

사용되지 않습니다.

4

DESE(설명자 오류). 버퍼 설명자를 가져오는 동안 오류가 발생하면 HD 오디오 컨트롤러는 DESE 비트를 1로 설정합니다.

3

FIFO 오류(FIFOE). FIFO 오류가 발생하는 경우(출력 스트림에서 오버런 또는 입력 스트림의 언더런) HD 오디오 컨트롤러는 FIFOE 비트를 1로 설정합니다.

2

BCIS(버퍼 완료 인터럽트 상태). 버퍼 설명자의 명령 바이트에서 IOC 비트가 1로 설정된 경우 HD 오디오 컨트롤러는 버퍼의 마지막 샘플이 처리된 후 BCIS 비트를 1로 설정합니다.

1:0

사용되지 않습니다.

 

HD 오디오 버스 드라이버는 사용되지 않는 비트를 0으로 설정합니다. IOC 인터럽트가 발생했다고 가정하는 대신 ISR은 항상 interruptBitMask 매개 변수를 검사 스트림 오류가 발생했는지 여부를 확인해야 합니다. 앞의 표에 표시된 인터럽트 상태 비트에 대한 자세한 내용은 Intel 고화질 오디오 사양의 스트림 상태 레지스터에 대한 설명을 참조하세요.

FIFO 크기는 DMA 엔진이 내부 버퍼에 한 번에 보유할 수 있는 최대 바이트 수입니다. 하드웨어 구현에 따라 DMA 엔진의 FIFO 크기는 정적이거나 스트림 형식의 변경에 따라 동적으로 달라질 수 있습니다. FIFO 크기에 대한 자세한 내용은 Intel 고화질 오디오 사양을 참조하세요.

호출자는 비페이지 풀에서 버퍼 메모리 및 BDL을 할당해야 합니다.

요구 사항

요구 사항
대상 플랫폼 데스크톱
머리글 hdaudio.h(Hdaudio.h 포함)
IRQL PASSIVE_LEVEL

추가 정보

AllocateCaptureDmaEngine

AllocateDmaBuffer

AllocateRenderDmaEngine

FreeDmaBuffer

HDAUDIO_BUFFER_DESCRIPTOR

HDAUDIO_BUS_INTERFACE_BDL

SetDmaEngineState