Condividi tramite


Panoramica delle transazioni di I/O SerCx2

SerCx2 gestisce una richiesta di lettura o scrittura da un client inviando una o più transazioni di I/O al driver del controller seriale. Questo driver considera ogni transazione come un'operazione di I/O autonoma che trasferisce i dati tra il controller seriale e il buffer di dati nella richiesta.

I circuiti integrati SoC (System on a Chip) spesso includono controller seriali (o UART) per consentire la comunicazione seriale ad alta velocità con altri circuiti integrati che vengono venduti alla stessa scheda di circuito stampato. I processori in questi soC possono usare i/O programmati per trasferire direttamente i dati da o verso i registri dati mappati alla memoria in questi controller seriali. Inoltre, questi soC forniscono in genere hardware DMA avanzato per spostare i dati tra i controller seriali e la memoria.

PIO potrebbe essere sufficiente per i trasferimenti di dati brevi, ma l'uso di PIO per trasferimenti più lunghi a velocità dei dati elevate comporta un onere eccessivo per il responsabile del trattamento. DMA è necessario per eseguire l'offload di tali trasferimenti dal processore.

Tipi di transazioni di I/O

SerCx2 definisce i tre tipi generali seguenti di transazioni di I/O:

  • PIO
  • DMA di sistema
  • Personalizzato

Tutti i driver del controller seriale devono supportare le transazioni di I/O che usano PIO per trasferire i dati. Un driver controller seriale può supportare anche transazioni di I/O che usano DMA di sistema o un meccanismo di trasferimento dati personalizzato, a seconda delle funzionalità del controller seriale e dell'hardware associato. Il driver può supportare transazioni DMA di sistema o transazioni personalizzate, ma non entrambe.

Per ogni tipo di transazione di I/O supportata dall'hardware del controller seriale, il driver del controller seriale registra un pacchetto di supporto con SerCx2. Questo pacchetto descrive le funzionalità hardware pertinenti e include un set di funzioni di callback di eventi implementate dal driver che SerCx2 chiama per avviare e controllare questo tipo di transazione di I/O.

Se un controller seriale può usare un controller DMA di sistema, che potrebbe essere condiviso con altri dispositivi, il driver del controller seriale potrebbe supportare le transazioni DMA di sistema. Per queste transazioni, SerCx2 configura il controller DMA di sistema e avvia i trasferimenti DMA. Il driver del controller seriale funziona relativamente poco durante le transazioni DMA di sistema.

Se un controller seriale dispone di un meccanismo hardware personalizzato per il trasferimento dei dati, il driver del controller seriale potrebbe supportare transazioni personalizzate che usano questo meccanismo. Ad esempio, se l'hardware del controller seriale ha funzionalità DMA master predefinite, il driver del controller seriale può supportare transazioni personalizzate per rendere questa funzionalità disponibile per SerCx2.

Le transazioni personalizzate sono flessibili in termini di tipi di meccanismi di trasferimento dei dati che possono supportare. Tuttavia, queste transazioni sono più difficili da implementare rispetto alle transazioni PIO o alle transazioni DMA di sistema. Per supportare transazioni personalizzate, il driver del controller seriale deve in genere configurare e inizializzare l'hardware usato per trasferire i dati. Inoltre, se una richiesta di lettura o scrittura in sospeso viene annullata prima del completamento della transazione di ricezione personalizzata o trasmissione personalizzata associata, il driver deve terminare la transazione e completare la richiesta.

Ogni transazione di I/O è un'operazione relativamente semplice. Una transazione di I/O legge i dati dal controller seriale o scrive i dati nel controller e non combina mai letture e scritture. Una transazione di I/O usa una singola modalità di trasferimento, OVVERO PIO, DMA di sistema o personalizzata, e non combina mai le modalità di trasferimento.

SerCx2 può decidere in modo intelligente se usare PIO o DMA per soddisfare una richiesta di lettura o scrittura. Ad esempio, SerCx2 potrebbe scegliere di presentare una richiesta di lettura o scrittura molto breve al driver del controller seriale come transazione PIO. In alternativa, SerCx2 potrebbe presentare una richiesta di lettura o scrittura più lunga al controller seriale come transazione DMA.

Interruzione di una richiesta di lettura o scrittura in più transazioni

Alcuni controller DMA di sistema potrebbero avere limitazioni che richiedono a SerCx2 di interrompere una richiesta di lettura o scrittura più lunga in due o più transazioni di I/O. Ad esempio, se un controller DMA di sistema richiede l'avvio e la fine dei limiti di byte pari in memoria, ma il buffer di dati in una richiesta di lettura inizia e termina su limiti di byte dispari, SerCx2 potrebbe usare PIO per trasferire il primo e l'ultimo byte nel buffer e usare DMA di sistema per trasferire tutti i dati tra il primo e l'ultimo byte. Per questo esempio, SerCx2 rilascia le tre transazioni di I/O seguenti al driver del controller seriale nell'ordine indicato:

  1. Transazione di ricezione PIO per il primo byte.
  2. Transazione di ricezione DMA di sistema per i byte intermedi.
  3. Transazione di ricezione PIO per l'ultimo byte.

Analogamente, se un meccanismo di trasferimento dati personalizzato può avviare e terminare una transazione di trasmissione personalizzata su un limite di byte arbitrario in memoria, ma le dimensioni del buffer in una richiesta di scrittura superano la lunghezza massima di trasferimento di una transazione di trasmissione personalizzata, SerCx2 partiziona la richiesta di scrittura in due o più transazioni di trasmissione personalizzate, ognuna delle quali non supera la lunghezza massima di trasferimento.

Se SerCx2 deve suddividere una richiesta di lettura o scrittura in due o più transazioni di I/O, il driver del controller seriale può ignorare in modo sicuro la relazione tra queste transazioni e la richiesta. SerCx2 serializza le transazioni per garantire che i dati vengano ricevuti o trasmessi nell'ordine corretto.

Quando il driver del controller seriale registra un set di funzioni di callback per supportare transazioni system-DMA o transazioni personalizzate, il driver fornisce i valori dei parametri che descrivono le funzionalità dell'hardware che eseguiranno queste transazioni. Ad esempio, per le transazioni system-DMA, i parametri includono i requisiti di allineamento e le lunghezze di trasferimento minime e massime supportate dal controller DMA di sistema. SerCx2 usa questi parametri per decidere se elaborare una richiesta di lettura o scrittura come transazione PIO o una transazione DMA di sistema e se suddividere la richiesta in due o più transazioni di I/O.

Tuttavia, un controller seriale potrebbe avere funzionalità hardware speciali che non possono essere descritte adeguatamente dai parametri forniti dal driver del controller seriale a SerCx2. Di conseguenza, il driver potrebbe avere accesso a informazioni dipendenti dall'hardware che consentono al driver di prendere decisioni migliori rispetto a SerCx2 su come partizionare una richiesta di lettura o scrittura in una o più transazioni di I/O. Come opzione, un driver di questo tipo può implementare le funzioni di callback degli eventi EvtSerCx2SelectNextReceiveTransactionType e EvtSerCx2SelectNextTransactionType . SerCx2 chiama queste funzioni, se implementate, per consentire al driver di decidere quali transazioni di I/O usare per soddisfare una richiesta di lettura o scrittura.