Risparmio energia ACX
In questo argomento viene illustrato il risparmio energia ACX. Per informazioni sull'enumerazione dei dispositivi ACX, l'avvio e l'arresto e il ribilanciamento del dispositivo, vedere enumerazione dei dispositivi ACX. Per una panoramica generale di ACX, vedere Panoramica delle estensioni della classe audio ACX.
ACX sfrutta il comportamento di alimentazione PnP di WDF KMDF. Per altre informazioni sulle sequenze di risparmio energia kmdf, vedere Sequenze di callback PnP e Risparmio energia.
È consigliabile che i driver ACX implementino completamente il risparmio energia WDF, ad esempio implementando la struttura WDF_PNPPOWER_EVENT_CALLBACKS. Per altre informazioni, vedere Supporto di PnP e risparmio energia nel driver.
Rimozione delle sorprese del dispositivo ACX
Il framework WDF può chiamare EvtDeviceSurpriseRemoval in qualsiasi momento, ovvero questo callback non viene serializzato con la sequenza di risparmio energia. Il driver WDF non deve eseguire alcuna azione sulla ricezione di questo callback, ad eccezione di prendere nota che il dispositivo è stato rimosso a sorpresa.
La sequenza di callback di rimozione delle sorprese di risparmio di energia è identica a quella di dx e rimuove i case, WDF non richiama i callback seguenti nel percorso di rimozione delle sorprese:
- EvtDeviceArmWakeFrom*, ad esempio EvtDeviceArmWakeFromS0
- EvtIoStop (ripulire le code gestite dall'alimentazione) EvtWdfIoQueueIoStop
- EvtDeviceSelfManagedIoFlush (buffer di I/O scaricamento)
Per altre informazioni, vedere Sequenze di callback PnP e Risparmio energia e Uso di code di I/O gestite dall'alimentazione.
Alimentazione e avvio del circuito ACX
È possibile aggiungere un AcxCircuit "dinamico" in qualsiasi momento. Il driver crea un nuovo dispositivo PDO figlio e associa il nuovo AcxCircuit quando si gestisce il callback WDF PrepareHardware per questo dispositivo PDO. La durata di un circuito "dinamico" non è associata alla durata dell'fdO.
Un acxCircuit "statico" può essere aggiunto solo quando il driver gestisce il callback WDF PrepareHardware per il dispositivo FDO. La durata di un circuito "statico" è associata alla durata dell'IDE.
Un driver ACX può anche creare oggetti AcxFactoryCircuit (provider di circuiti) durante la sequenza di alimentazione usando la funzione AcxFactoryCircuitCreate. Un oggetto AcxFactoryCircuit usa la creazione dinamica del circuito per l'aggiunta di ACXCIRCUITS quando richiesto da ACX. Questa funzionalità è molto utile quando si creano endpoint compositi, ad esempio endpoint audio costituiti da due o più ACXCIRCUIT collegati tra loro.
Il circuito ACX definisce i callback seguenti che vengono richiamati durante l'inizializzazione dell'endpoint AcxCircuit/Audio:
EvtAcxCircuitPrepareHardware: ACX richiama questo callback subito dopo che WDF distribuisce il callback hardware. Consente al driver di eseguire qualsiasi "preparazione hardware" specifico del circuito. Questa chiamata viene serializzata da ACX. Il dispositivo non è in D0 quando questa chiamata viene richiamata.
EvtAcxCircuitPowerUp: ACX richiama questo callback subito dopo il ritorno da Dx. Questa chiamata viene serializzata da ACX. Il dispositivo è in D0.
Per gli endpoint compositi AcxCircuits può eseguire la registrazione facoltativamente per questi callback:
EvtAcxCircuitCompositeCircuitInitialize, richiamato la prima volta che ACX rileva che questo ACXCIRCUIT è visibile, ovvero il dispositivo associato è andato in D0 e ha reso questo circuito visibile alle entità esterne al proprio stack. Le interfacce audio del circuito sono ancora nello stato OFF.
EvtAcxCircuitCompositeInitialize, richiamato ogni volta che ACX termina l'init di un endpoint composito. Dopo questo callback ACX attiva le interfacce audio di questo circuito.
EvtAcxCircuitCompositeDeinitialize, richiamato ogni volta che ACX elimina un endpoint composito. I driver potrebbero non ricevere questo callback se il proprio stack è stato rimosso a sorpresa o non è in grado di elaborare I/O.
Se presente, le istanze di flusso vengono ripristinate negli stati di pre-alimentazione.
Alimentazione e rimozione del circuito ACX
Un AcxCircuit "dinamico" può essere rimosso in qualsiasi momento invalidando e rimuovendo l'oggetto dispositivo associato al circuito. Il circuito associato può essere rimosso/scollegato dal dispositivo rimosso quando il driver gestisce i callback WDF PrepareHardware/ReleaseHardware per questo dispositivo PDO. Come accennato in precedenza, la durata di un circuito "dinamico" non è associata alla durata dell'fdO.
Un acxCircuit "statico" può essere rimosso solo quando il driver gestisce i callback WDF PrepareHardware/ReleaseHardware per il dispositivo FDO. La durata di un circuito "statico" è associata alla durata dell'IDE.
Il driver può rimuovere un acxFactoryCircuit (provider di circuiti) nei callback WDF PrepareHardware/ReleaseHardware. La rimozione di un acxFactoryCircuit ha l'effetto di rimuovere tutti i relativi acxcircuiti "dinamici" associati. AcxCircuit(s) può essere rimosso anche quando il gestore ACX indica a una factory di circuito di rimuovere un circuito specifico o quando il gestore ACX chiude i relativi handle AcxFactoryCircuit, in questo scenario ACX chiude tutti i circuiti associati a tale handle.
La struttura ACX_CIRCUIT_PNPPOWER_CALLBACKS descrive i callback seguenti che possono essere usati da un driver ACX.
EvtAcxCircuitPowerDown: ACX richiama questo callback poco prima di andare in Sx/Dx/Stop/Removal/SurpriseRemoval e quando il driver rimuove il circuito. Questa chiamata viene serializzata da ACX. Il dispositivo è in D0, anche se tieni presente che il dispositivo potrebbe essere rimosso a sorpresa in qualsiasi momento (il che significa che l'hardware associato è andato via).
EvtAcxCircuitReleaseHardware: ACX richiama questo callback subito prima che WDF fornisca il callback hardware di rilascio WDF. Consente al driver di eseguire qualsiasi pulizia mentre il circuito è ancora attivo. Questa chiamata viene serializzata da ACX. Il dispositivo non è in D0 quando questa chiamata viene richiamata.
EvtWdfObjectContextCleanup: WDF richiama questo callback quando l'oggetto WDF/ACX viene eliminato. Questa chiamata è sincrona con l'eliminazione della chiamata all'oggetto WDF. Il dispositivo potrebbe non essere in D0 quando viene richiamata questa chiamata. Il callback è in esecuzione a livello passivo.
EvtWdfObjectContextDestory: WDF richiama questo callback dopo che l'ultimo riferimento su questo oggetto viene eliminato. Questa chiamata è asincrona con l'eliminazione della chiamata all'oggetto WDF. Il dispositivo potrebbe non essere in D0 quando viene richiamata questa chiamata. Questo callback viene richiamato solo dopo che l'ultimo riferimento sull'oggetto viene eliminato. Il callback è in esecuzione a <livello di = DPC. L'irQL esatto dipende dal runtime di integrazione del thread che rilascia l'ultimo riferimento.
Gestione inattiva del dispositivo ACX
ACX sfrutta l'infrastruttura di gestione inattiva di WDF. I driver ACX usano le DDI WDF seguenti per abilitare la gestione inattiva:
WdfDeviceAssignS0Idle Impostazioni: questa chiamata specifica il tipo di timeout di inattività e gestione inattiva. Il driver ACX è gratuito per usare l'impostazione appropriata per il dispositivo.
WdfDeviceStopIdle: questa chiamata impedisce al dispositivo di inattività. Si noti che la chiamata non blocca le richieste Sx. Ovvero, il dispositivo passa in Dx indipendentemente dal numero di riferimenti di alimentazione attivi quando il sistema passa a uno stato di alimentazione inferiore.
WdfDeviceResumeIdle: questa chiamata consente al dispositivo di riavviare il timeout di inattività.
In uno scenario di multistack/circuito, diversi stack possono avere timeout di inattività diversi. Ciò è dovuto alle diverse impostazioni/requisiti di risparmio energia di ogni stack, quindi sono appropriati timeout di inattività diversi. Per informazioni generali sulle multistack, vedere Comunicazioni tra driver multi stack ACX.
Driver ACX e code gestite dall'alimentazione
WDF supporta code di I/O gestite dall'alimentazione. Questo tipo di coda è completamente integrato con il risparmio energia di WDF. WDF richiama i callback della coda in vari passaggi della sequenza di power up/power down WDF. Per altre informazioni, vedere Uso di code di I/O gestite da power.
I driver ACX possono usare questo tipo di coda solo se il driver non usa il componente singolo/multi-componente con funzionalità multi-stato (Fx).
Stati del driver ACX e D3Hot/D3Cold (D3)
I driver audio sanno quando andare in D3Hot o D3Cold in base alle informazioni disponibili nell'enumerazione ACX_DX_EXIT_LATENCY.
typedef enum _ACX_DX_EXIT_LATENCY {
AcxDxExitLatencyInstant = 0,
AcxDxExitLatencyFast,
AcxDxExitLatencyResponsive
} ACX_DX_EXIT_LATENCY;
AcxDxExitLatencyFast corrisponde a D3Hot (DSP on) e AcxDxExitLatencyResponsive corrisponde a D3Cold (DSP off).
I driver audio possono ottenere il valore ACX_DX_EXIT_LATENCY chiamando la funzione AcxDeviceGetCurrentDxExitLatency.
WDF conosce le funzionalità D3Cold del driver tramite il campo ExcludeD3Cold di WDF_DEVICE_POWER_POLICY_IDLE_edizione Standard TTINGS. Il driver passa questo struct come input a WdfDeviceAssignS0Idle Impostazioni.
I driver WDF possono richiamare WdfDeviceAssignS0Idle Impostazioni più volte per attivare o disattivare D3Cold a seconda dell'ambiente di sistema, ad esempio in risposta ad ACX. Per altre informazioni, vedere struttura WDF_DEVICE_POWER_POLICY_IDLE_edizione Standard TTINGS.
Framework di risparmio energia (PoFx) e timeout di inattività gestito dal driver
Risparmio energia a livello di componente
Si noti che WDF non supporta direttamente gli stati del dispositivo/componente Fx. Per usare questi stati, il driver deve usare il timeout di inattività gestito dal driver. Per altre informazioni sull'uso degli stati dei componenti del dispositivo Fx e del timeout di inattività gestito dal driver, vedere gli argomenti seguenti.
- Risparmio energia a livello di componente
- Supporto di dispositivi a più componenti con uno o più stati di alimentazione funzionale
Framework di risparmio energia (PoFx)
Windows offre un framework di risparmio energia in fase di esecuzione (PoFx) che aggiunge il supporto per il risparmio energia a livello di componente. Un componente o un sottodispositivo è un'unità hardware funzionale in un dispositivo che può essere attivata o attivata a uno stato a basso consumo indipendentemente dagli altri componenti nello stesso dispositivo. Per altre informazioni, vedere Panoramica di Power Management Framework.
Vedi anche
Enumerazione del dispositivo ACX
Documentazione di riferimento su ACX
Panoramica delle estensioni della classe audio ACX
Uso delle code di I/O gestite dall'alimentazione.