estructura DEVICE_DESCRIPTION (wdm.h)

La estructura de DEVICE_DESCRIPTION describe los atributos del dispositivo físico para el que un controlador solicita un adaptador DMA.

Sintaxis

typedef struct _DEVICE_DESCRIPTION {
  ULONG            Version;
  BOOLEAN          Master;
  BOOLEAN          ScatterGather;
  BOOLEAN          DemandMode;
  BOOLEAN          AutoInitialize;
  BOOLEAN          Dma32BitAddresses;
  BOOLEAN          IgnoreCount;
  BOOLEAN          Reserved1;
  BOOLEAN          Dma64BitAddresses;
  ULONG            BusNumber;
  ULONG            DmaChannel;
  INTERFACE_TYPE   InterfaceType;
  DMA_WIDTH        DmaWidth;
  DMA_SPEED        DmaSpeed;
  ULONG            MaximumLength;
  ULONG            DmaPort;
  ULONG            DmaAddressWidth;
  ULONG            DmaControllerInstance;
  ULONG            DmaRequestLine;
  PHYSICAL_ADDRESS DeviceAddress;
} DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;

Miembros

Version

Versión de esta estructura. El miembro Version de la estructura DEVICE_DESCRIPTION que se pasa a la rutina IoGetDmaAdapter determina qué versión de la estructura de DMA_ADAPTER devuelve esta rutina. A continuación se muestra una lista de los posibles valores del miembro Version y las versiones de DMA_ADAPTER correspondientes:

DEVICE_DESCRIPTION_VERSION

Si Version = DEVICE_DESCRIPTION_VERSION, IoGetDmaAdapter omite el miembro IgnoreCount y devuelve la versión 1 de la estructura de DMA_ADAPTER .

DEVICE_DESCRIPTION_VERSION1

Si Version = DEVICE_DESCRIPTION_VERSION1, IoGetDmaAdapter usa el miembro IgnoreCount y devuelve la versión 1 de la estructura de DMA_ADAPTER .

DEVICE_DESCRIPTION_VERSION2

Si Version = DEVICE_DESCRIPTION_VERSION2, IoGetDmaAdapter usa el miembro IgnoreCount y devuelve la versión 2 de la estructura de DMA_ADAPTER . La versión 2 está disponible a partir de Windows XP.

DEVICE_DESCRIPTION_VERSION3

Si Version = DEVICE_DESCRIPTION_VERSION3, IoGetDmaAdapter usa el miembro IgnoreCount y devuelve la versión 3 de la estructura de DMA_ADAPTER . La versión 3 está disponible a partir de Windows 8.

Master

Si el dispositivo es un dispositivo DMA maestro de bus. Se establece en TRUE si el dispositivo es un dispositivo DMA maestro de bus. Se establece en FALSE si es un dispositivo DMA subordinado.

ScatterGather

En el caso de un dispositivo DMA de bus-master, este miembro indica si el dispositivo admite dispersión o recopilación de DMA. Establézcalo en TRUE si el dispositivo puede realizar la dispersión o recopilación de DMA. De lo contrario, establezca este miembro en FALSE.

En el caso de un dispositivo DMA subordinado, no se usa el valor de ScatterGather . En su lugar, IoGetDmaAdapter asume que la funcionalidad de dispersión y recopilación de un dispositivo DMA subordinado es la misma que la del controlador DMA del sistema subyacente al que está conectado el dispositivo.

DemandMode

Este miembro solo se usa si version es DEVICE_DESCRIPTION_VERSION2.

En el caso de un dispositivo DMA subordinado, este miembro indica si se debe usar el modo de demanda del controlador DMA del sistema. Establézcalo en TRUE para usar el modo de demanda. De lo contrario, establezca este miembro en FALSE.

En el caso de un dispositivo DMA maestro de bus, no se usa el valor DemandMode .

Si Version es DEVICE_DESCRIPTION_VERSION, DEVICE_DESCRIPTION_VERSION1 o DEVICE_DESCRIPTION_VERSION3, no se usa el valor DemandMode .

AutoInitialize

En el caso de un dispositivo DMA subordinado, este miembro indica si se debe usar el modo de inicialización automática del controlador DMA del sistema. Establezca en TRUE para usar el modo autoinicializar. De lo contrario, establezca este miembro en FALSE.

En el caso de un dispositivo DMA maestro de bus, no se usa el valor AutoInitialize .

Dma32BitAddresses

Este miembro solo se usa si Version es DEVICE_DESCRIPTION_VERSION, DEVICE_DESCRIPTION_VERSION1 o DEVICE_DESCRIPTION_VERSION2.

Dma32BitAddresses especifica si el dispositivo puede usar direcciones completas de 32 bits para las operaciones DMA. Se establece en TRUE si el dispositivo admite direcciones de 32 bits. De lo contrario, establezca este miembro en FALSE.

Si Version = DEVICE_DESCRIPTION_VERSION3, no se usa el valor Dma32BitAddresses .

IgnoreCount

Si se omite el contador de transferencia del controlador DMA. Se establece en TRUE si el controlador DMA de esta plataforma no mantiene un contador de transferencia preciso y, por tanto, requiere una solución alternativa. De lo contrario, establezca este miembro en FALSE.

Si Version = DEVICE_DESCRIPTION_VERSION, no se usa el valor IgnoreCount .

Para obtener más información, vea la sección Comentarios.

Reserved1

Reservado para uso del sistema. Debe ser FALSE.

Dma64BitAddresses

Este miembro solo se usa si Version es DEVICE_DESCRIPTION_VERSION, DEVICE_DESCRIPTION_VERSION1 o DEVICE_DESCRIPTION_VERSION2.

Dma64BitAddresses especifica si el dispositivo puede usar direcciones completas de 64 bits para las operaciones DMA. Se establece en TRUE si el dispositivo admite direcciones de 64 bits. De lo contrario, establezca este miembro en FALSE.

Si Version = DEVICE_DESCRIPTION_VERSION3, no se usa el valor Dma64BitAddresses .

BusNumber

Número de bus asignado por el sistema para el bus de E/S. Los controladores WDM no usan este miembro.

DmaChannel

Número del canal DMA al que se asigna un dispositivo subordinado. El controlador de dispositivo obtiene este número de canal de la lista de recursos que recibe en la solicitud de IRP_MN_START_DEVICE que inicia el dispositivo. Para obtener más información sobre este número, vea la descripción del miembro Dma.Channel en CM_PARTIAL_RESOURCE_DESCRIPTOR.

InterfaceType

Tipo de interfaz del bus de E/S que se va a usar para DMA. Establezca este miembro en el valor de enumeración INTERFACE_TYPE que indica el tipo de interfaz. Para obtener más información, vea la sección Comentarios.

DmaWidth

Para un dispositivo DMA subordinado, este miembro especifica el ancho de datos DMA para las transferencias por parte del controlador DMA del sistema. Los valores posibles son Width8Bits, Width16Bits, Width32Bits y Width64Bits.

En el caso de un dispositivo DMA maestro de bus, no se usa el valor DmaWidth .

DmaSpeed

Este miembro solo se usa si Version es DEVICE_DESCRIPTION_VERSION, DEVICE_DESCRIPTION_VERSION1 o DEVICE_DESCRIPTION_VERSION2.

Para un dispositivo DMA subordinado, este miembro especifica una de las siguientes velocidades para el sistema DMA: Compatible, TypeA, TypeB, TypeC o TypeF.

En el caso de un dispositivo DMA maestro de bus, no se usa el valor DmaSpeed .

Si Version = DEVICE_DESCRIPTION_VERSION3, no se usa el valor DmaSpeed .

MaximumLength

El número máximo de bytes que el dispositivo puede transferir en una operación DMA que usa el objeto de adaptador asignado.

DmaPort

Número de puerto de bus de tipo Microchannel. Este parámetro está obsoleto, pero se conserva en la estructura para la compatibilidad con los controladores heredados.

DmaAddressWidth

Este miembro solo se usa si Version = DEVICE_DESCRIPTION_VERSION3.

Para un dispositivo DMA de bus-master, DmaAddressWidth especifica el ancho, en bits, de una dirección DMA. El valor DmaAddressWidth debe ser distinto de cero y no debe superar los 64. Si el ancho de la dirección de memoria es mayor que el ancho de la dirección DMA, se requieren registros de asignación para acceder a una región de memoria que está fuera del alcance de la dirección del controlador DMA.

En el caso de un dispositivo DMA subordinado, no se usa el valor DmaAddressWidth . En su lugar, IoGetDmaAdapter asume que el ancho de dirección de un dispositivo DMA subordinado es el mismo que el del controlador DMA del sistema subyacente al que está conectado el dispositivo.

DmaControllerInstance

No se usa.

DmaRequestLine

Este miembro solo se usa si Version = DEVICE_DESCRIPTION_VERSION3.

Para un dispositivo DMA subordinado, DmaRequestLine especifica la línea de solicitud en el controlador DMA al que está conectado el dispositivo. El controlador de dispositivo obtiene el número de esta línea de solicitud de la lista de recursos que recibe en la solicitud IRP_MN_START_DEVICE que inicia el dispositivo. Para obtener más información sobre el número de línea de solicitud, vea la descripción del miembro u.DmaV3.RequestLine en CM_PARTIAL_RESOURCE_DESCRIPTOR.

En el caso de un dispositivo DMA maestro de bus, no se usa el valor DmaRequestLine .

DeviceAddress

Este miembro solo se usa si Version = DEVICE_DESCRIPTION_VERSION3.

En el caso de un dispositivo DMA subordinado, DeviceAddress es la dirección asignada a la memoria del registro de datos en el dispositivo que se usa como origen o destino para una transferencia DMA. Este registro de datos se encuentra en un desplazamiento conocido específico del dispositivo desde la dirección de inicio del dispositivo. El miembro DmaWidth especifica el ancho de este registro. El controlador de dispositivo obtiene la dirección de inicio del dispositivo de la lista de recursos que recibe en la solicitud IRP_MN_START_DEVICE que inicia el dispositivo. Para obtener más información sobre esta dirección, vea la descripción del miembro u.Memory.Start en CM_PARTIAL_RESOURCE_DESCRIPTOR.

En el caso de un dispositivo DMA maestro de bus, no se usa el miembro DeviceAddress .

Comentarios

El controlador de un dispositivo que usa DMA para transferir datos usa la estructura DEVICE_DESCRIPTION para pasar información sobre el dispositivo a la rutina IoGetDmaAdapter . El controlador llama a esta rutina para solicitar un objeto de adaptador para un objeto de dispositivo físico (PDO). Este PDO representa la conexión física del dispositivo al bus de E/S que se va a usar para DMA. Para obtener más información, vea Obtener un objeto de adaptador.

Para asignar recursos para un controlador DMA, el administrador de E/S necesita información sobre el controlador, pero solo puede obtener parte de esta información de un controlador. Por ejemplo, el controlador de un dispositivo bus-master sabe si el dispositivo admite DMA de dispersión o recopilación o usa direcciones completas de 32 bits. O bien, el controlador de un dispositivo subordinado puede determinar el número de canal DMA de la lista de recursos que recibe el controlador en la solicitud de IRP_MN_START_DEVICE que inicia el dispositivo. El controlador usa la estructura DEVICE_DESCRIPTION para pasar esta información al administrador de E/S.

Antes de llamar a IoGetDmaAdapter, el controlador debe inicializar primero la estructura de DEVICE_DESCRIPTION completa y, a continuación, rellenar los miembros seleccionados para describir el dispositivo.

El miembro InterfaceType especifica el tipo de interfaz de bus que se usará para DMA. Si establece InterfaceType en InterfaceTypeUndefined, IoGetDmaAdapter consulta el PDO para determinar el tipo de interfaz correcto para el dispositivo. O bien, puede especificar un tipo de interfaz explícito, como Internal, Isa, Eisa o PCIBus. Para obtener más información, consulte la lista de tipos de interfaz admitidos en INTERFACE_TYPE.

Si el miembro ScatterGather se establece en TRUE y el miembro InterfaceType se establece en PCIBus, el miembro Dma32BitAddresses se omite y IoGetDmaAdapter asume que el dispositivo admite direcciones DMA de 32 bits.

Si el miembro Dma64BitAddresses se establece en TRUE, el miembro Dma32BitAddresses se omite y IoGetDmaAdapter asume que el dispositivo admite direcciones DMA de 64 bits.

Para indicar que el hardware del controlador DMA no puede mantener de forma confiable un recuento de transferencia preciso, establezca IgnoreCount en TRUE y establezca Version en un valor distinto de DEVICE_DESCRIPTION_VERSION. En una plataforma que tiene un controlador DMA de este tipo, el sistema operativo omite el contador de transferencia de DMA, pero debe tomar precauciones especiales para mantener la integridad de los datos durante las operaciones de DMA. Normalmente, el uso de una solución alternativa para compensar un controlador DMA deficiente degrada la velocidad de las transferencias DMA.

Un controlador debe especificar TypeF como el valor DmaSpeed solo si el firmware ACPI del equipo lo admite.

Requisitos

Requisito Value
Cliente mínimo compatible Se admite a partir de Windows 2000.
Encabezado wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h)

Consulte también

CM_PARTIAL_RESOURCE_DESCRIPTOR

CM_RESOURCE_LIST

DMA_ADAPTER

INTERFACE_TYPE

IRP_MN_START_DEVICE

IoGetDmaAdapter