Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Подпрограмма 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.
[in] Handle
Дескриптор, определяющий подсистему DMA. Это значение дескриптора было получено из предыдущего вызова AllocateCaptureDmaEngine или AllocateRenderDmaEngine.
[in] BufferLength
Длина буфера.
[in] Lvi
Указывает последний допустимый индекс (LVI). Этот параметр содержит индекс последнего допустимого дескриптора буфера в BDL. После обработки дескриптора DMA он возвращается к первому дескриптору в списке и продолжает обработку. Если BDL содержит дескрипторы n , они нумеруются от 0 до n-1. Значение lvi должно быть не менее 1; другими словами, BDL должен содержать не менее двух допустимых записей, прежде чем модуль DMA сможет начать операцию.
[in] Isr
Указатель функции на ISR вызывающего абонента. Если вызывающий задает бит прерывания по завершении (IOC) в одном или нескольких дескрипторах буфера в BDL, драйвер hd Audio bus вызывает ISR каждый раз, когда прерывание IOC происходит в потоке. Этот параметр является указателем функции типа HDAUDIO_BDL_ISR, который определен в следующем разделе примечаний.
[in] Context
Контекст.
[out] StreamId
Извлекает идентификатор потока. Этот параметр указывает на выделенную абонентом переменную UCHAR, в которую подпрограмма записывает идентификатор потока, назначенный потоку.
[out] FifoSize
Извлекает размер FIFO ядра DMA в байтах. Этот параметр указывает на выделенную абонентом переменную UINT, в которую подпрограмма записывает размер FIFO.
Возвращаемое значение
SetupDmaEngineWithBdl возвращает STATUS_SUCCESS, если вызов выполнен успешно. В противном случае подпрограмма возвращает соответствующий код ошибки. В следующей таблице показаны некоторые возможные коды состояния возврата.
| Код возврата | Описание |
|---|---|
|
Указывает, что вызывающий объект выполняется в IRQL, который слишком высок. |
|
Указывает, что значение параметра дескриптором недопустимо. |
|
Указывает, что одно из значений параметров неверно (недопустимый указатель или недопустимый формат потока). |
|
Указывает, что время ожидания аппаратного программирования истекло. В этом случае оборудование может находиться в скомпрометированном состоянии. |
|
Указывает, что устройство DMA или буфер DMA не выделены или поток не находится в состоянии сброса. |
Замечания
Подпрограмма SetupDmaEngineWithBdl используется вместе с подпрограммами AllocateContiguousDmaBuffer и FreeContiguousDmaBuffer . Эти три подпрограммы доступны только в HDAUDIO_BUS_INTERFACE_BDL версии HD Audio DDI. Этот DDI не включает подпрограммы AllocateDmaBuffer и FreeDmaBuffer , которые никогда не используются в сочетании с AllocateContiguousDmaBuffer, SetupDmaEngineWithBdl и FreeContiguousDmaBuffer. В отличие от SetupDmaEngineWithBdl, который настраивает подсистему DMA для использования ранее выделенного буфера DMA, AllocatedDmaBuffer выделяет буфер DMA и настраивает подсистему DMA для использования буфера.
Вызывающий объект должен вызвать AllocateContiguousDmaBuffer , чтобы выделить хранилище в системной памяти для буфера DMA и BDL, описывающего страницы физической памяти в буфере. Записи BDL должны находиться в памяти, которая физически связана. Память BDL и буфера должны соответствовать требованиям к выравниванию, описанным в спецификации Intel High Definition Audio (см. веб-сайт Intel HD Audio ).
BDL и буферная память, которые он описывает, должны оставаться допустимыми во время операций DMA. После вызова SetupDmaEngineWithBdl BDL и буферной памяти должны оставаться действительными, пока подсистема DMA продолжает использовать буфер. Модуль DMA использует буфер, пока драйвер функции не заменит буфер, вызвав SetupDmaEngineWithBdl еще раз или освобождает подсистему DMA, вызвав FreeDmaEngine. Драйвер функции отвечает за вызов FreeContiguousDmaBuffer для освобождения буфера и BDL, когда они больше не требуются.
При выделении памяти для буфера вызывающий объект должен удовлетворять всем аппаратным ограничениям для адреса, длины и выравнивания физически смежных блоков памяти, заданных BDL. Таким образом, только клиенты с значительным знанием контроллера шины и системного оборудования должны использовать подпрограмму SetupDmaEngineWithBdl .
Перед вызовом SetupDmaEngineWithBdl для настройки подсистемы DMA клиент должен вызвать AllocateCaptureDmaEngine или AllocateRenderDmaEngine , чтобы выделить подсистему DMA. Параметр дескриптора — это значение, полученное из предыдущего вызова для выделения XXXDmaEngine.
Вызывающий объект отвечает за программирование кодека для управления передачей данных и распознаванием идентификатора потока.
Звуковой драйвер WDM вызывает эту подпрограмму во время создания пин-кода во время выполнения метода NewStream (например, см. раздел IMiniportWavePci::NewStream).
После вызова SetupDmaEngineWithBdl подсистема DMA находится в состоянии сброса. Чтобы запустить обработчик DMA, вызовите SetDmaEngineState.
Параметр isr указывает ISR, что драйвер шины HD Audio должен вызывать каждый раз, когда прерывание IOC происходит в потоке. Этот параметр является указателем функции типа HDAUDIO_BDL_ISR, который определяется следующим образом:
typedef void
(*PHDAUDIO_BDL_ISR)
(IN VOID *Context, IN ULONG InterruptBitMask);
Драйвер шины HD Audio вызывает ISR с тем же значением контекста, что и клиент, указанный в параметре контекста предыдущего вызова SetupDmaEngineWithBdl . Параметр прерыванияBitMask содержит биты из регистра состояния потока контроллера HD Audio, указывающего причину прерывания. В следующей таблице показано значение отдельных битов в прерыванииBitMask.
| Битовые числа | Значение |
|---|---|
| 31:5 |
Неиспользованный. |
| 4 |
Ошибка дескриптора (DESE). Если во время получения дескриптора буфера возникает ошибка, контроллер HD Audio задает бит DESE 1. |
| 3 |
Ошибка FIFO (FIFOE). Если возникает ошибка FIFO (переполнение выходного потока или недостаточного запуска в входном потоке), контроллер HD Audio задает бит FIFOE 1. |
| 2 |
Состояние прерывания завершения буфера (BCIS). Если бит IOC имеет значение 1 в байте буфера дескриптора буфера, контроллер HD Audio задает бит BCIS равным 1 после обработки последнего примера буфера. |
| 1:0 |
Неиспользованный. |
Драйвер шины HD Audio задает неиспользуемые биты равным нулю. Вместо того чтобы предположить, что произошло прерывание IOC, ISR всегда должен проверить параметр прерыванияBitMask , чтобы определить, произошла ли ошибка потока. Дополнительные сведения о битах состояния прерывания, показанных в предыдущей таблице, см. в описании регистров состояния потока в спецификации Intel High Definition Audio.
Размер FIFO — это максимальное число байтов, которое модуль DMA может хранить в своем внутреннем буфере в любое время. В зависимости от аппаратной реализации размер FIFO подсистемы DMA может быть статическим или динамически изменяться с изменениями в формате потока. Дополнительные сведения о размере FIFO см. в спецификации intel High Definition Audio.
Вызывающий объект должен выделить буферную память и BDL из непагированного пула.
Требования
| Требование | Ценность |
|---|---|
| целевая платформа | Рабочий стол |
| Заголовок | hdaudio.h (include Hdaudio.h) |
| IRQL | пассивный уровень |