Condividi tramite


Transazioni SerCx2 System-DMA-Transmit

Alcuni driver del controller seriale implementano il supporto per le transazioni di trasmissione che usano il controller DMA di sistema. Tale supporto è facoltativo, ma può migliorare le prestazioni sfruttando il processore principale della necessità di usare I/O programmati (PIO) per i trasferimenti di dati lunghi. SerCx2 esegue una transazione di trasmissione DMA di sistema configurando il controller DMA di sistema e avviando i trasferimenti DMA necessari per conto del driver del controller seriale.

Quando il driver del controller seriale crea un oggetto system-DMA-transmit, il driver fornisce i parametri usati da SerCx2 per configurare l'adattatore DMA di sistema per le transazioni di trasmissione system-DMA.

Prima dell'inizio della transazione, il driver del controller seriale ha la possibilità di eseguire qualsiasi configurazione speciale dell'hardware del controller seriale o della scheda DMA che potrebbe essere necessaria per la transazione. Al termine della transazione, il driver ha la possibilità di svuotare il FIFO di trasmissione e, se necessario, per pulire lo stato hardware del controller seriale.

Creazione dell'oggetto system-DMA-transmit

Prima che SerCx2 possa chiamare una delle funzioni evtSerCx2SystemDmaTransmitXxx**, il driver deve chiamare il metodo SerCx2SystemDmaTransmitCreate per registrare queste funzioni con SerCx2. Questo metodo accetta, come parametro di input, un puntatore a una struttura SERCX2_SYSTEM_DMA_TRANSMIT_CONFIG che contiene puntatori alle funzioni EvtSerCx2SystemDmaTransmitXxx** del driver.

Come opzione, il driver può implementare qualsiasi o tutte le funzioni seguenti:

Come opzione, il driver può implementare le funzioni seguenti:

Un driver che implementa una qualsiasi delle funzioni nell'elenco precedente deve implementare tutte e tre.

Il metodo SerCx2SystemDmaTransmitCreate crea un oggetto system-DMA-transmit e fornisce il driver chiamante con un handle SERCX2SYSTEMDMATRANSMIT a questo oggetto. Le funzioni EvtSerCx2SystemDmaTransmitXxx** del driver accettano questo handle come primo parametro. I metodi SerCx2 seguenti accettano questo handle come primo parametro:

Inizializzazione hardware e pulizia

Alcuni driver del controller seriale potrebbero dover inizializzare l'hardware del controller seriale all'inizio di una transazione di trasmissione DMA di sistema o per pulire lo stato hardware del controller seriale alla fine della transazione.

Se un driver implementa una funzione di callback dell'evento EvtSerCx2SystemDmaTransmitInitializeTransaction, SerCx2 chiama questa funzione per inizializzare il controller seriale prima di avviare il primo trasferimento DMA nella transazione. Se implementato, la funzione EvtSerCx2SystemDmaTransmitInitializeTransaction deve chiamare il metodo SerCx2SystemDmaTransmitInitializeTransactionComplete per informare SerCx2 al termine dell'inizializzazione del controller seriale.

Se il driver implementa una funzione di callback dell'evento EvtSerCx2SystemDmaTransmitCleanupTransaction, SerCx2 chiama questa funzione per pulire lo stato hardware dopo la fine del trasferimento DMA finale nella transazione. Se implementato, la funzione EvtSerCx2SystemDmaTransmitInitializeTransaction deve chiamare il metodo SerCx2SystemDmaTransmitCleanupTransactionComplete per informare SerCx2 al termine della pulizia del controller seriale.

Un driver del controller seriale che deve eseguire qualsiasi configurazione speciale del controller DMA di sistema all'inizio di una transazione di trasmissione system-DMA deve implementare una funzione di callback dell'evento EvtSerCx2SystemDmaTransmitConfigureDmaChannel . Questa funzione può chiamare il metodo SerCx2SystemDmaTransmitGetDmaEnabler per ottenere l'abilitazione DMA per la scheda DMA di sistema usata per la transazione. SerCx2 chiama questa funzione prima di avviare il primo trasferimento DMA nella transazione. Per altre informazioni sui abilitanti DMA, vedere Abilitazione delle transazioni DMA.

Svuotamento e eliminazione della trasmissione FIFO

Un driver del controller seriale che supporta le transazioni di trasmissione system-DMA deve implementare una funzione di callback degli eventi EvtSerCx2SystemDmaTransmitDrainFifo se il driver può rilevare quando la trasmissione FIFO svuota. Se implementato, SerCx2 chiama questa funzione dopo l'ultimo byte di dati in una transazione di trasmissione DMA di sistema. Durante questa chiamata, la funzione EvtSerCx2SystemDmaTransmitDrainFifo consente in genere un interruzione attivata quando la trasmissione FIFO svuota e quindi restituisce senza attendere l'interruzione. Quando il fiFO svuota, il driver chiama il metodo SerCx2SystemDmaTransmitDrainFifoComplete per notificare SerCx2. Solo dopo aver ricevuto questa notifica, SerCx2 completa la richiesta di scrittura in sospeso (IRP_MJ_WRITE) associata alla transazione system-DMA-transmit.

Se il driver del controller seriale non implementa una funzione EvtSerCx2SystemDmaTransmitDrainFifo , SerCx2 deve completare la richiesta di scrittura in sospeso senza prima verificare che la trasmissione FIFO sia svuotata. Non è possibile garantire che i dati scritti nel FIFO vengano trasmessi senza un ritardo significativo. Tutti i dati che rimangono nel FIFO dopo il completamento di una richiesta di scrittura potrebbero essere persi prima che possa essere trasmesso. Questa perdita di dati imprevista in una richiesta di scrittura completata correttamente può creare problemi di affidabilità per il driver periferico che ha inviato la richiesta.

Un driver che implementa una funzione EvtSerCx2SystemDmaTransmitDrainFifo deve anche implementare le funzioni di callback eventi EvtSerCx2SystemDmaTransmitCancelDrainFifo e EvtSerCx2SystemDmaTransmitPurgeFifo.

La funzione EvtSerCx2SystemDmaTransmitCancelDrainFifo consente a SerCx2 di annullare un'operazione di svuotamento FIFO in corso prima che venga completata. SerCx2 potrebbe annullare questa operazione se la richiesta di scrittura viene annullata o se il controller seriale sta per uscire dallo stato di alimentazione del dispositivo D0 per immettere uno stato di bassa potenza. Se la funzione EvtSerCx2SystemDmaTransmitCancelDrainFifo annulla correttamente l'operazione di svuotamento FIFO, questa funzione restituisce TRUE. Un valore restituito di TRUE garantisce che la funzione EvtSerCx2SystemDmaTransmitDrainFifo restituirà senza prima chiamare SerCx2SystemDmaTransmitDrainFifoComplete. Un valore restituito di FALSE indica che la funzione EvtSerCx2SystemDmaTransmitDrainFifo ha chiamato o chiamerà SerCx2SystemDmaTransmitDrainFifoComplete.

Se la richiesta di scrittura associata a una transazione di trasmissione DMA di sistema viene annullata o timeout prima del completamento della richiesta di scrittura, SerCx2 chiama la funzione EvtSerCx2SystemDmaTransmitPurgeFifo , se implementata, per eliminare eventuali dati non inviati che potrebbero rimanere il FIFO di trasmissione. Quando la funzione FIFO viene eliminata, il metodo EvtSerCx2SystemDmaTransmitPurgeFifo chiama la funzione SerCx2SystemDmaTransmitPurgeFifoComplete per notificare SerCx2. Solo dopo aver ricevuto questa notifica, SerCx2 avvia una nuova transazione di I/O.