System-Wide ID dispositivo univoci

Un driver per una scheda audio tipica deve essere facilmente in grado di supportare diverse istanze della stessa scheda audio in un sistema. Quasi tutte le strutture di dati gestite da un driver vengono archiviate nel buffer di estensione del dispositivo (vedere la descrizione del campo DeviceExtension della struttura DEVICE_OBJECT). Se diverse istanze di un driver condividono dati globali, tuttavia, tali istanze devono sincronizzare l'accesso a questi dati.

Un requisito aggiuntivo è che ogni sottodispositivo in una determinata istanza di una scheda adattatore deve avere una stringa ID dispositivo che identifica in modo univoco il sottodispositivo in tutte le istanze della stessa scheda di scheda nel sistema.

Il modo più semplice per eseguire questa operazione consiste nell'esporre ogni sottodispositivo nella scheda adattatore come dispositivo logicamente distinto al gestore Plug and Play. Questa opzione viene visualizzata come opzione (1) in Dispositivi audio multifunzione.

Un secondo approccio consiste nell'usare il driver del bus multifunzione fornito dal sistema per gestire i sottodispositivi nella scheda adattatore. Il driver del bus MF assegna a ogni sottodispositivo un ID dispositivo che è garantito essere univoco nel sistema, anche se il sistema contiene diverse istanze della stessa scheda adattatore. Il driver del bus MF supporta progettazioni in cui i sottodispositivi condividono un set comune di registri di configurazione, ma ogni sottodispositivo ha un proprio set di registri di indirizzi di base PCI. I sottodispositivi non devono avere dipendenze nascoste l'una dall'altra e devono essere in grado di funzionare contemporaneamente senza interferire tra loro o con altri dispositivi nel sistema. Questa è l'opzione (2) in Dispositivi audio multifunzione.

Un terzo approccio consiste nell'usare un driver proprietario del bus per gestire i sottodispositivi in una scheda adattatore. Questa operazione è spesso necessaria se i sottodispositivi hanno dipendenze reciproche che devono essere gestite centralmente. Tali dipendenze possono verificarsi in due modi:

  • I sottodispositivi potrebbero condividere una risorsa su scheda. Ad esempio, se i sottodispositivi condividono un processore di segnali digitali, il driver del bus potrebbe dover scaricare il sistema operativo proprietario in esecuzione nel DSP prima di avviare il primo sottodispositivo.

  • Un difetto di progettazione potrebbe causare una dipendenza tra i sottodispositivi. Ad esempio, un difetto di progettazione potrebbe richiedere che i sottodispositivi siano accesi o spenti in una determinata sequenza.

Quando esiste un tipo di dipendenza, un driver proprietario del bus è quasi sempre una soluzione migliore rispetto alla presentazione dei sottodispositivi direttamente al gestore Plug and Play e al tentativo di nascondere la dipendenza.

Se si fornisce il proprio driver bus per una scheda adattatore, è necessario assicurarsi che gli ID dispositivo assegnati dal driver del bus siano univoci nel sistema.

Un driver del bus fornisce un ID dispositivo per uno dei relativi elementi figlio in risposta a una query IRP_MN_QUERY_ID dal gestore Plug and Play. L'ID può essere specificato in uno dei due modi in cui il driver del bus indica nella risposta a una query IRP_MN_QUERY_CAPABILITIES impostando il campo UniqueID della struttura DEVICE_CAPABILITIES su TRUE o FALSE:

  • Uniqueid = VERO

    Ciò significa che il nome dell'elemento figlio è garantito che sia univoco in tutto il sistema. La stringa ID dispositivo contiene un ID dispositivo più un ID istanza, ovvero un numero di serie che identifica in modo univoco l'istanza hardware.

  • Uniqueid = FALSE

    Ciò significa che il nome dell'elemento figlio è univoco solo rispetto all'elemento padre. La maggior parte dei dispositivi usa questo mezzo di identificazione. In questo caso, il gestore Plug and Play estende la stringa ID dispositivo ricevuta per renderla univoca tramite il sistema. La stringa estesa è una funzione dell'ID univoco del dispositivo padre.

Tutti i driver del bus audio devono impostare UniqueID = FALSE per i propri figli. In questo modo, il gestore Plug and Play estende la stringa id del dispositivo figlio aggiungendo informazioni sull'elemento padre del dispositivo per rendere univoco l'ID nel computer.