Objetos de canal DMA
Nota:
Microsoft admite un entorno diverso e inclusivo. Este artículo contiene referencias a la terminología que la guía de estilo de Microsoft para la comunicación sin sesgo reconoce como excluyente. La palabra o frase se usa en este artículo para la coherencia porque aparece actualmente en el software. Cuando el software se actualiza para quitar el idioma, este artículo se actualizará para que esté en alineación.
El controlador del sistema PortCls implementa las interfaces IDmaChannel e IDmaChannelSlave para beneficiarse de los controladores de miniporte WaveCíclico y WavePci. IDmaChannel representa un canal DMA más sus parámetros de uso de búfer de DMA y búfer asociados. Además, los controladores de miniporte WaveCíclico usan IDmaChannelSlave para administrar un canal DMA para un dispositivo subordinado. IDmaChannelSlave hereda de IDmaChannel. Para obtener información sobre cómo controlar las operaciones de DMA, vea Objetos de adaptador y DMA.
Un objeto IDmaChannel encapsula lo siguiente:
Un canal DMA para un dispositivo maestro o subordinado
Búfer de datos asociado al canal
Información que describe cómo se va a usar el canal
Los controladores de puerto y minipuerto usan objetos de canal DMA para comunicar información sobre el uso del canal DMA. Normalmente, un controlador de miniporta asigna un conjunto de canales DMA durante la inicialización o durante la creación de una secuencia. Durante la creación de una nueva secuencia, el controlador de miniporta indica al controlador de puerto qué objeto de canal DMA se usará para la secuencia.
Se puede crear un objeto de canal DMA para un dispositivo maestro o subordinado:
Un dispositivo subordinado no tiene funcionalidades integradas de hardware DMA y debe confiar en el controlador DMA del sistema para realizar las transferencias de datos que requiera el dispositivo.
Un dispositivo maestro usa su propio hardware DMA de maestro de bus para realizar transferencias de datos en el bus del sistema.
Para obtener un ejemplo de un dispositivo WaveCíclico que usa un objeto de canal DMA subordinado, vea el controlador de audio de ejemplo Sb16 en versiones anteriores del Kit de controladores de Microsoft Windows (WDK). Un objeto de canal DMA maestro es poco más que un backboard para compartir información sobre el canal DMA entre los controladores de puerto y miniport. Para obtener más información sobre los dispositivos maestros y subordinados, vea Introducción a los objetos de adaptador.
El objeto de canal DMA para un dispositivo maestro o subordinado expone lo siguiente:
Un objeto de adaptador
Un único búfer común que el controlador y el hardware DMA pueden compartir
Valor de tamaño de búfer que se puede consultar y cambiar
El objeto de adaptador es una estructura de adaptador DMA para un objeto de dispositivo físico (PDO). El objeto de adaptador se crea automáticamente cuando el controlador de miniport crea el objeto de canal DMA llamando a uno de los métodos siguientes:
IPortWavePci::NewMasterDmaChannel
IPortWaveCíclico::NewMasterDmaChannel
IPortWaveCíclico::NewSlaveDmaChannel
El método IDmaChannel::GetAdapterObject se puede usar para obtener un puntero al objeto de adaptador.
Un controlador de adaptador también puede llamar a la función PcNewDmaChannel para crear un objeto de canal DMA, pero esta función es más difícil de usar que las llamadas IPortWaveXxx::NewXxx DmaChannel porque el autor de la llamada debe especificar explícitamente un objeto de dispositivo y otra información contextual.
En el caso de un canal DMA para un dispositivo subordinado, el método IDmaChannel::TransferCount devuelve el tamaño máximo de transferencia (el parámetro MapSize) especificado en la llamada a IDmaChannelSlave::Start. Además, el objeto de adaptador proporciona algunos métodos para manipular y consultar el dispositivo DMA. Ninguno de estos métodos es significativo para los canales DMA maestros.
IDmaChannel::AllocateBuffer e IDmaChannel::FreeBuffer se usan para administrar el único búfer común asociado al objeto de canal DMA. Se garantiza que el búfer asignado por el objeto sea accesible tanto para el controlador (con direcciones de memoria virtual de kernel) como para el dispositivo DMA (con direcciones de memoria física). Además, el búfer será físicamente contiguo. Normalmente, la mejor estrategia es asignar el búfer DMA durante la inicialización del controlador de miniporte cuando la memoria físicamente contigua es más abundante. IDmaChannel::AllocatedBufferSize devuelve el tamaño del búfer tal como se especificó en la llamada a IDmaChannel::AllocateBuffer.
IDmaChannel::MaximumBufferSize indica el tamaño de búfer máximo real que se puede usar. Esto puede superar el tamaño asignado si el tamaño asignado no es ni un múltiplo del tamaño de página. Puede ser menor que el tamaño asignado si el dispositivo DMA no admite transferencias del tamaño asignado. IDmaChannel::BufferSize e IDmaChannel::SetBufferSize se usan para consultar y establecer el tamaño del búfer que se usará para las transferencias DMA. Cuando se asigna el búfer, el tamaño del búfer se establece en el tamaño máximo del búfer. Después de la inicialización, tanto el controlador de puerto como el controlador de miniportar tienen la oportunidad de cambiar el tamaño del búfer o detectar su valor actual. El controlador de miniport usa el resultado de IDmaChannel::BufferSize para determinar el tamaño de transferencia para las operaciones DMA cuando se inicia el canal DMA. IDmaChannel::SystemAddress e IDmaChannel::P hysicalAddress se usan para obtener las direcciones virtuales y físicas del búfer, respectivamente.
IDmaChannel::CopyTo e IDmaChannel::CopyFrom copian datos de ejemplo hacia y desde el búfer DMA. El controlador de puerto WaveCíclico llama a estos métodos para copiar datos de audio entre el búfer de la aplicación y el búfer cíclico del controlador de miniporte.
El búfer DMA no se usa necesariamente para transferir los datos transmitidos. En el caso del controlador de puerto WavePci, los datos transmitidos se entregan a (o se recuperan) el controlador de miniport como una lista de asignaciones de dispersión y recopilación. Sin embargo, es posible que el controlador de miniporte siga usando el búfer DMA como espacio de memoria compartido para comunicarse con el controlador del adaptador.
Los controladores de puerto proporcionan controladores de miniporte con funciones que pueden usar para crear canales DMA. A menos que se indique lo contrario en la descripción del controlador de puerto, no es absolutamente necesario usar objetos DMA asignados desde el controlador de puerto. El controlador de puerto simplemente requiere un puntero a una interfaz IDmaChannel que admita los métodos que necesita. Compruebe la documentación de cada controlador de puerto para obtener una lista de los métodos del canal DMA que requiere el controlador de puerto.
Normalmente, el enfoque más sencillo es usar las funciones de asignación de canales DMA que implementa el controlador de puerto. En raras ocasiones, es posible que los desarrolladores de controladores de miniporte necesiten implementar sus propios objetos de canal DMA para cumplir los requisitos especiales de sus adaptadores concretos. Esto a veces requiere la implementación de un nuevo objeto. En otros momentos, es suficiente hacer que el objeto de secuencia del controlador de miniporte exponga una interfaz IDmaChannel e implemente los propios métodos del canal DMA.
La interfaz IDmaChannel admite los métodos siguientes:
IDmaChannel::AllocatedBufferSize
IDmaChannel::MaximumBufferSize
La interfaz IDmaChannelSlave amplía IDmaChannel agregando los métodos siguientes: