Compartilhar via


Transações SerCx2 System-DMA-Transmit

Alguns drivers de controlador serial implementam suporte para transmitir transações que usam o controlador DMA do sistema. Esse suporte é opcional, mas pode melhorar o desempenho, aliviando o processador main da necessidade de usar E/S (E/S) programada para transferências de dados longas. O SerCx2 executa uma transação system-DMA-transmit configurando o controlador DMA do sistema e iniciando as transferências de DMA necessárias em nome do driver do controlador serial.

Quando o driver do controlador serial cria um objeto system-DMA-transmit, o driver fornece os parâmetros que o SerCx2 usará para configurar o adaptador DMA do sistema para transações de transmissão de DMA do sistema.

Antes do início da transação, o driver do controlador serial tem a opção de fazer qualquer configuração especial do hardware do controlador serial ou adaptador de DMA que possa ser necessário para a transação. Após a conclusão da transação, o driver tem a opção de esvaziar o FIFO de transmissão e, se necessário, para limpo o estado de hardware do controlador serial.

Criando o objeto system-DMA-transmit

Antes que o SerCx2 possa chamar qualquer uma das funções EvtSerCx2SystemDmaTransmitXxx** do driver serial, o driver deve chamar o método SerCx2SystemDmaTransmitCreate para registrar essas funções com SerCx2. Esse método aceita, como parâmetro de entrada, um ponteiro para uma estrutura SERCX2_SYSTEM_DMA_TRANSMIT_CONFIG que contém ponteiros para as funções EvtSerCx2SystemDmaTransmitxxx** do driver.

Como opção, o driver pode implementar qualquer uma ou todas as seguintes funções:

Como opção, o driver pode implementar as seguintes funções:

Um driver que implementa qualquer uma das funções na lista anterior deve implementar todas as três.

O método SerCx2SystemDmaTransmitCreate cria um objeto system-DMA-transmit e fornece ao driver de chamada um identificador SERCX2SYSTEMDMATRANSMIT para esse objeto. As funções EvtSerCx2SystemDmaTransmitxxx** do driver assumem esse identificador como seu primeiro parâmetro. Os seguintes métodos SerCx2 assumem esse identificador como seu primeiro parâmetro:

Inicialização de hardware e limpo-up

Alguns drivers de controlador serial podem precisar inicializar o hardware do controlador serial no início de uma transação de transmissão de DMA do sistema ou para limpo o estado de hardware do controlador serial no final da transação.

Se um driver implementar uma função de retorno de chamada de evento EvtSerCx2SystemDmaTransmitInitializeTransaction , o SerCx2 chamará essa função para inicializar o controlador serial antes de iniciar a primeira transferência de DMA na transação. Se implementada, a função EvtSerCx2SystemDmaTransmitInitializeTransaction deverá chamar o método SerCx2SystemDmaTransmitInitializeTransactionComplete para informar o SerCx2 quando o driver terminar de inicializar o controlador serial.

Se o driver implementar uma função de retorno de chamada de evento EvtSerCx2SystemDmaTransmitCleanupTransaction, o SerCx2 chamará essa função para limpo o estado de hardware após o fim da transferência de DMA final na transação. Se implementada, a função EvtSerCx2SystemDmaTransmitInitializeTransaction deverá chamar o método SerCx2SystemDmaTransmitCleanupTransactionComplete para informar o SerCx2 quando o driver terminar de limpar o controlador serial.

Um driver de controlador serial que precisa fazer qualquer configuração especial do controlador DMA do sistema no início de uma transação system-DMA-transmit deve implementar uma função de retorno de chamada de evento EvtSerCx2SystemDmaTransmitConfigureDmaChannel . Essa função pode chamar o método SerCx2SystemDmaTransmitGetDmaEnabler para obter o habilitador de DMA para o adaptador DMA do sistema usado para a transação. O SerCx2 chama essa função antes de iniciar a primeira transferência de DMA na transação. Para obter mais informações sobre habilitadores de DMA, consulte Habilitando transações de DMA.

Esvaziar e limpar o FIFO de transmissão

Um driver de controlador serial que dá suporte a transações de transmissão de DMA do sistema deve implementar uma função de retorno de chamada de evento EvtSerCx2SystemDmaTransmitDrainFifo se o driver puder detectar quando o FIFO de transmissão esvazia. Se implementada, SerCx2 chamará essa função após o último byte de dados em uma transação system-DMA-transmit ter sido gravado no FIFO de transmissão. Durante essa chamada, a função EvtSerCx2SystemDmaTransmitDrainFifo normalmente habilita uma interrupção disparada quando o FIFO de transmissão esvazia e retorna sem esperar pela interrupção. Quando o FIFO esvazia, o driver chama o método SerCx2SystemDmaTransmitDrainFifoComplete para notificar o SerCx2. Somente depois de receber essa notificação o SerCx2 conclui a solicitação de gravação pendente (IRP_MJ_WRITE) associada à transação system-DMA-transmit.

Se o driver do controlador serial não implementar uma função EvtSerCx2SystemDmaTransmitDrainFifo , o SerCx2 deverá concluir a solicitação de gravação pendente sem primeiro verificar se o FIFO de transmissão foi esvaziado. Não pode haver nenhuma garantia de que os dados gravados no FIFO serão transmitidos sem um atraso significativo. Todos os dados que permanecem no FIFO após a conclusão de uma solicitação de gravação podem ser perdidos antes de serem transmitidos. Essa perda de dados inesperada em uma solicitação de gravação concluída com êxito pode criar problemas de confiabilidade para o driver periférico que enviou a solicitação.

Um driver que implementa uma função EvtSerCx2SystemDmaTransmitDrainFifo também deve implementar funções de retorno de chamada de evento EvtSerCx2SystemDmaTransmitCancelDrainFifo e EvtSerCx2SystemDmaTransmitPurgeFifo .

A função EvtSerCx2SystemDmaTransmitCancelDrainFifo permite que o SerCx2 cancele uma operação de esvaziamento fifo em andamento antes de ser concluída. O SerCx2 poderá cancelar essa operação se a solicitação de gravação for cancelada ou se o controlador serial estiver prestes a sair do estado de energia do dispositivo D0 para entrar em um estado de baixa potência. Se a função EvtSerCx2SystemDmaTransmitCancelDrainFifo cancelar com êxito a operação fifo-drain, essa função retornará TRUE. Um valor retornado de TRUE garante que a função EvtSerCx2SystemDmaTransmitDrainFifo retornará sem chamar primeiro SerCx2SystemDmaTransmitDrainFifoComplete. Um valor retornado de FALSE indica que a função EvtSerCx2SystemDmaTransmitDrainFifo chamou ou chamará SerCx2SystemDmaTransmitDrainFifoComplete.

Se a solicitação de gravação associada a uma transação system-DMA-transmit for cancelada ou atingir o tempo limite antes de ser concluída, o SerCx2 chamará a função EvtSerCx2SystemDmaTransmitPurgeFifo , se ela for implementada, para descartar quaisquer dados não ressentidos que possam continuar sendo o FIFO de transmissão. Quando o FIFO é limpo, a função EvtSerCx2SystemDmaTransmitPurgeFifo chama o método SerCx2SystemDmaTransmitPurgeFifoComplete para notificar o SerCx2. Somente depois de receber essa notificação o SerCx2 inicia uma nova transação de E/S.