struttura DEVICE_DESCRIPTION (wdm.h)

La struttura DEVICE_DESCRIPTION descrive gli attributi del dispositivo fisico per cui un driver richiede una scheda DMA.

Sintassi

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;

Members

Version

Versione di questa struttura. Il membro Version della struttura DEVICE_DESCRIPTION passata alla routine IoGetDmaAdapter determina la versione della struttura DMA_ADAPTER restituita da questa routine. Di seguito è riportato un elenco dei valori possibili del membro Version e delle versioni DMA_ADAPTER corrispondenti:

DEVICE_DESCRIPTION_VERSION

Se Version = DEVICE_DESCRIPTION_VERSION, IoGetDmaAdapter ignora il membro IgnoreCount e restituisce la versione 1 della struttura DMA_ADAPTER .

DEVICE_DESCRIPTION_VERSION1

Se Version = DEVICE_DESCRIPTION_VERSION1, IoGetDmaAdapter usa il membro IgnoreCount e restituisce la versione 1 della struttura DMA_ADAPTER .

DEVICE_DESCRIPTION_VERSION2

Se Version = DEVICE_DESCRIPTION_VERSION2, IoGetDmaAdapter usa il membro IgnoreCount e restituisce la versione 2 della struttura DMA_ADAPTER . La versione 2 è disponibile a partire da Windows XP.

DEVICE_DESCRIPTION_VERSION3

Se Version = DEVICE_DESCRIPTION_VERSION3, IoGetDmaAdapter usa il membro IgnoreCount e restituisce la versione 3 della struttura DMA_ADAPTER . La versione 3 è disponibile a partire da Windows 8.

Master

Indica se il dispositivo è un dispositivo DMA master del bus. Impostare su TRUE se il dispositivo è un dispositivo DMA master del bus. Impostare su FALSE se si tratta di un dispositivo DMA subordinato.

ScatterGather

Per un dispositivo DMA master del bus, questo membro indica se il dispositivo supporta DMA a dispersione/raccolta. Impostare su TRUE se il dispositivo può eseguire operazioni DMA a dispersione/raccolta. In caso contrario, impostare questo membro su FALSE.

Per un dispositivo DMA subordinato, il valore ScatterGather non viene usato. IoGetDmaAdapter presuppone invece che la funzionalità di dispersione/raccolta di un dispositivo DMA subordinato sia uguale a quella del controller DMA di sistema sottostante a cui è connesso il dispositivo.

DemandMode

Questo membro viene utilizzato solo se Version è DEVICE_DESCRIPTION_VERSION2.

Per un dispositivo DMA subordinato, questo membro indica se usare la modalità richiesta del controller DMA di sistema. Impostare su TRUE per usare la modalità richiesta. In caso contrario, impostare questo membro su FALSE.

Per un dispositivo DMA master del bus, il valore DemandMode non viene usato.

Se Version è DEVICE_DESCRIPTION_VERSION, DEVICE_DESCRIPTION_VERSION1 o DEVICE_DESCRIPTION_VERSION3, il valore DemandMode non viene usato.

AutoInitialize

Per un dispositivo DMA subordinato, questo membro indica se usare la modalità di inizializzazione automatica del controller DMA di sistema. Impostare su TRUE per usare la modalità di inizializzazione automatica. In caso contrario, impostare questo membro su FALSE.

Per un dispositivo DMA master del bus, il valore AutoInitialize non viene usato.

Dma32BitAddresses

Questo membro viene utilizzato solo se Version è DEVICE_DESCRIPTION_VERSION, DEVICE_DESCRIPTION_VERSION1 o DEVICE_DESCRIPTION_VERSION2.

Dma32BitAddresses specifica se il dispositivo può usare indirizzi a 32 bit completi per le operazioni DMA. Impostare su TRUE se il dispositivo supporta indirizzi a 32 bit. In caso contrario, impostare questo membro su FALSE.

Se Version = DEVICE_DESCRIPTION_VERSION3, il valore Dma32BitAddresses non viene usato.

IgnoreCount

Indica se ignorare il contatore di trasferimento del controller DMA. Impostare su TRUE se il controller DMA in questa piattaforma non gestisce un contatore di trasferimento accurato e pertanto richiede una soluzione alternativa. In caso contrario, impostare questo membro su FALSE.

Se Version = DEVICE_DESCRIPTION_VERSION, il valore IgnoreCount non viene usato.

Per altre informazioni, vedere la sezione Osservazioni.

Reserved1

Riservato per l'utilizzo nel sistema. Deve essere FALSE.

Dma64BitAddresses

Questo membro viene utilizzato solo se Version è DEVICE_DESCRIPTION_VERSION, DEVICE_DESCRIPTION_VERSION1 o DEVICE_DESCRIPTION_VERSION2.

Dma64BitAddresses specifica se il dispositivo può usare indirizzi a 64 bit completi per le operazioni DMA. Impostare su TRUE se il dispositivo supporta indirizzi a 64 bit. In caso contrario, impostare questo membro su FALSE.

Se Version = DEVICE_DESCRIPTION_VERSION3, il valore Dma64BitAddresses non viene usato.

BusNumber

Numero del bus assegnato dal sistema per il bus di I/O. Questo membro non viene usato dai driver WDM.

DmaChannel

Numero del canale DMA a cui viene assegnato un dispositivo subordinato. Il driver di dispositivo ottiene questo numero di canale dall'elenco di risorse ricevuto nella richiesta di IRP_MN_START_DEVICE che avvia il dispositivo. Per altre informazioni su questo numero, vedere la descrizione del membro Dma.Channel in CM_PARTIAL_RESOURCE_DESCRIPTOR.

InterfaceType

Tipo di interfaccia del bus di I/O da usare per DMA. Impostare questo membro sul valore di enumerazione INTERFACE_TYPE che indica il tipo di interfaccia. Per altre informazioni, vedere la sezione Osservazioni.

DmaWidth

Per un dispositivo DMA subordinato, questo membro specifica la larghezza dei dati DMA per i trasferimenti dal controller DMA di sistema. I valori possibili sono Width8Bits, Width16Bits, Width32Bits e Width64Bits.

Per un dispositivo DMA master del bus, il valore DmaWidth non viene usato.

DmaSpeed

Questo membro viene utilizzato solo se Version è DEVICE_DESCRIPTION_VERSION, DEVICE_DESCRIPTION_VERSION1 o DEVICE_DESCRIPTION_VERSION2.

Per un dispositivo DMA subordinato, questo membro specifica una delle velocità seguenti per DMA di sistema: Compatible, TypeA, TypeB, TypeC o TypeF.

Per un dispositivo DMA master bus, il valore DmaSpeed non viene usato.

Se Version = DEVICE_DESCRIPTION_VERSION3, il valore DmaSpeed non viene usato.

MaximumLength

Numero massimo di byte che il dispositivo può trasferire in un'operazione DMA che usa l'oggetto adattatore allocato.

DmaPort

Numero di porta del bus di tipo Microchannel. Questo parametro è obsoleto, ma viene mantenuto nella struttura per la compatibilità con i driver legacy.

DmaAddressWidth

Questo membro viene usato solo se Version = DEVICE_DESCRIPTION_VERSION3.

Per un dispositivo DMA master del bus, DmaAddressWidth specifica la larghezza, in bit, di un indirizzo DMA. Il valore DmaAddressWidth deve essere diverso da zero e non deve superare 64. Se la larghezza dell'indirizzo di memoria è maggiore della larghezza dell'indirizzo DMA, i registri mappa devono accedere a un'area di memoria che supera la portata dell'indirizzo del controller DMA.

Per un dispositivo DMA subordinato, il valore DmaAddressWidth non viene usato. IoGetDmaAdapter presuppone invece che la larghezza dell'indirizzo di un dispositivo DMA subordinato corrisponda a quella del controller DMA di sistema sottostante a cui è connesso il dispositivo.

DmaControllerInstance

Non usato.

DmaRequestLine

Questo membro viene usato solo se Version = DEVICE_DESCRIPTION_VERSION3.

Per un dispositivo DMA subordinato, DmaRequestLine specifica la riga di richiesta nel controller DMA a cui è connesso il dispositivo. Il driver di dispositivo ottiene il numero di questa riga di richiesta dall'elenco di risorse ricevuto nella richiesta di IRP_MN_START_DEVICE che avvia il dispositivo. Per altre informazioni sul numero di riga della richiesta, vedere la descrizione del membro u.DmaV3.RequestLine in CM_PARTIAL_RESOURCE_DESCRIPTOR.

Per un dispositivo DMA master del bus, il valore DmaRequestLine non viene usato.

DeviceAddress

Questo membro viene usato solo se Version = DEVICE_DESCRIPTION_VERSION3.

Per un dispositivo DMA subordinato, DeviceAddress è l'indirizzo mappato alla memoria del registro dati nel dispositivo usato come origine o destinazione per un trasferimento DMA. Questo registro dati si trova in un offset noto specifico del dispositivo dall'indirizzo iniziale del dispositivo. La larghezza del registro viene specificata dal membro DmaWidth . Il driver di dispositivo ottiene l'indirizzo iniziale del dispositivo dall'elenco di risorse ricevuto nella richiesta di IRP_MN_START_DEVICE che avvia il dispositivo. Per altre informazioni su questo indirizzo, vedere la descrizione del membro u.Memory.Start in CM_PARTIAL_RESOURCE_DESCRIPTOR.

Per un dispositivo DMA master del bus, il membro DeviceAddress non viene usato.

Commenti

Il driver di un dispositivo che usa DMA per trasferire i dati usa la struttura DEVICE_DESCRIPTION per passare informazioni sul dispositivo alla routine IoGetDmaAdapter . Il driver chiama questa routine per richiedere un oggetto adapter per un oggetto dispositivo fisico (PDO). Questo PDO rappresenta la connessione fisica del dispositivo al bus di I/O da usare per DMA. Per altre informazioni, vedere Recupero di un oggetto adapter.

Per allocare risorse per un controller DMA, il gestore di I/O necessita di informazioni sul controller, ma può ottenere alcune di queste informazioni solo da un driver. Ad esempio, il driver per un dispositivo bus-master sa se il dispositivo supporta DMA a dispersione/raccolta o usa indirizzi a 32 bit completi. In alternativa, il driver per un dispositivo subordinato può determinare il numero di canale DMA dall'elenco di risorse ricevuto dal driver nella richiesta di IRP_MN_START_DEVICE che avvia il dispositivo. Il driver usa la struttura DEVICE_DESCRIPTION per passare queste informazioni al gestore di I/O.

Prima di chiamare IoGetDmaAdapter, il driver deve prima inizializzare l'intera struttura DEVICE_DESCRIPTION , quindi compilare i membri selezionati per descrivere il dispositivo.

Il membro InterfaceType specifica il tipo di interfaccia del bus che verrà utilizzata per DMA. Se si imposta InterfaceType su InterfaceTypeUndefined, IoGetDmaAdapter esegue una query sul PDO per determinare il tipo di interfaccia corretto per il dispositivo. In alternativa, è possibile specificare un tipo di interfaccia esplicito, ad esempio Internal, Isa, Eisa o PCIBus. Per altre informazioni, vedere l'elenco dei tipi di interfaccia supportati in INTERFACE_TYPE.

Se il membro ScatterGather è impostato su TRUE e il membro InterfaceType è impostato su PCIBus, il membro Dma32BitAddresses viene ignorato e IoGetDmaAdapter presuppone che il dispositivo supporti indirizzi DMA a 32 bit.

Se il membro Dma64BitAddresses è impostato su TRUE, il membro Dma32BitAddresses viene ignorato e IoGetDmaAdapter presuppone che il dispositivo supporti indirizzi DMA a 64 bit.

Per indicare che l'hardware del controller DMA non può mantenere in modo affidabile un conteggio di trasferimento accurato, impostare IgnoreCount su TRUE e impostare Version su un valore diverso da DEVICE_DESCRIPTION_VERSION. In una piattaforma con un controller DMA di questo tipo, il sistema operativo ignora il contatore di trasferimento DMA, ma deve adottare precauzioni speciali per mantenere l'integrità dei dati durante le operazioni DMA. In genere, l'uso di una soluzione alternativa per compensare un controller DMA carente degrada la velocità dei trasferimenti DMA.

Un driver deve specificare TypeF come valore DmaSpeed solo se il firmware ACPI del computer lo supporta.

Requisiti

Requisito Valore
Client minimo supportato Supportato a partire da Windows 2000.
Intestazione wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)

Vedi anche

CM_PARTIAL_RESOURCE_DESCRIPTOR

CM_RESOURCE_LIST

DMA_ADAPTER

INTERFACE_TYPE

IRP_MN_START_DEVICE

IoGetDmaAdapter