Condividi tramite


Transazioni Custom-Transmit SerCx2

Alcuni hardware del controller seriale possono implementare un meccanismo di trasferimento dei dati diverso da PIO o DMA di sistema per la scrittura di dati in un controller seriale. Un driver controller seriale può supportare transazioni di trasmissione personalizzate per rendere disponibile questo meccanismo di trasferimento dati da usare da SerCx2.

Per avviare una transazione di trasmissione personalizzata, SerCx2 chiama la funzione di callback dell'evento EvtSerCx2CustomTransmitTransactionStart e fornisce come parametri la richiesta di scrittura (IRP_MJ_WRITE) e una descrizione del buffer di scrittura per la transazione. In questa chiamata, la funzione avvia la transazione e restituisce . Il driver è quindi responsabile del completamento della transazione e del completamento della richiesta di scrittura.

Creazione dell'oggetto di trasmissione personalizzato

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

Il driver deve implementare la funzione seguente:

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

Il metodo SerCx2CustomTransmitTransactionCreate crea un oggetto di trasmissione personalizzato e fornisce al driver chiamante un handle SERCX2CUSTOMTRANSMITTRANSACTION per questo oggetto. Le funzioni EvtSerCx2CustomTransmitTransactionXxx** del driver accettano tutti questo handle come primo parametro. I metodi SerCx2 seguenti accettano questo handle come primo parametro:

Inizializzazione e pulizia dell'hardware

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

Se un driver implementa una funzione di callback degli eventi EvtSerCx2CustomTransmitTransactionInitialize , SerCx2 chiama questa funzione per inizializzare il controller seriale prima di avviare la transazione. Se implementato, la funzione EvtSerCx2CustomTransmitTransactionInitialize deve chiamare il metodo SerCx2CustomTransmitTransactionInitializeComplete per informare SerCx2 al termine dell'inizializzazione del controller seriale.

Se il driver implementa una funzione di callback dell'evento EvtSerCx2CustomTransmitTransactionCleanup , SerCx2 chiama questa funzione per pulire lo stato hardware al termine della transazione. Se implementato, la funzione EvtSerCx2CustomTransmitTransactionInitialize deve chiamare il metodo SerCx2CustomTransmitTransactionCleanupComplete per informare SerCx2 al termine della pulizia del controller seriale.

Accesso all'oggetto richiesta

Per avviare una transazione di trasmissione personalizzata, SerCx2 chiama la funzione EvtSerCx2CustomTransmitTransactionStart associata e passa la richiesta di scrittura associata (incapsulata in un handle di oggetto WDFREQUEST) a questa funzione come parametro. Il driver è responsabile della chiamata di un metodo, ad esempio WdfRequestComplete , per completare la richiesta al termine della transazione. A meno che la richiesta non possa essere completata immediatamente, prima che la funzione EvtSerCx2CustomTransmitTransactionStart restituisca un risultato, il driver deve chiamare un metodo come WdfRequestMarkCancelableEx per contrassegnare la richiesta come annullabile.

Il driver del controller seriale non deve usare un metodo come WdfRequestRetrieveInputBuffer per accedere al buffer dei dati nella richiesta di scrittura. Al contrario, il driver deve usare i valori dei parametri Mdl, Offset e Length passati alla funzione EvtSerCx2CustomTransmitTransactionStart per accedere a questo buffer.

Durante una transazione di trasmissione personalizzata, il driver potrebbe dover archiviare informazioni sulla transazione in un contesto associato all'oggetto richiesta. In tal caso, la funzione di callback dell'evento EvtDriverDeviceAdd del driver può chiamare il metodo WdfDeviceInitSetRequestAttributes per impostare gli attributi da usare per gli oggetti richiesta. Questi attributi includono il nome e le dimensioni di allocazione da usare per i contesti di richiesta. Gli attributi della richiesta specificati in questa chiamata devono corrispondere agli attributi della richiesta specificati dal driver nella chiamata al metodo SerCx2InitializeDevice . Questi attributi vengono specificati nel membro RequestAttributes della struttura SERCX2_CONFIG che il driver passa a SerCx2InitializeDevice. Per altre informazioni, vedere SERCX2_CONFIG.

Per una richiesta di scrittura ricevuta dal driver del controller seriale all'inizio di una transazione di trasmissione personalizzata, il contesto della richiesta allocato dal framework driver non è inizializzato. Il driver deve, come procedura consigliata, chiamare la routine RtlZeroMemory per inizializzare il contesto della richiesta a tutti gli zeri.