Partilhar via


Transações de PIO-Transmit SerCx2

O SerCx2 exige que todos os drivers do controlador serial implementem o suporte para transações de transmissão que usam PIO (E/S) programada. Para iniciar uma transação de transmissão de PIO, o SerCx2 chama a função de retorno de chamada de evento EvtSerCx2PioTransmitWriteBuffer do driver e fornece um buffer de gravação como parâmetro.

Durante essa chamada, a função EvtSerCx2PioTransmitWriteBuffer transfere dados do buffer de gravação para o FIFO de transmissão no hardware do controlador serial. Essa transferência de dados continua até que o buffer de gravação esteja vazio ou o FIFO de transmissão não possa aceitar imediatamente mais dados. Quando a transferência termina, a função retorna o número de bytes que foram transferidos com êxito do buffer de gravação para o FIFO.

Criando o objeto pio-transmit

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

O driver é necessário para implementar todas as três funções a seguir:

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

Como opção, o driver pode implementar as três funções a seguir:

Se o driver implementar qualquer função na lista anterior, ele deverá implementar todos os três.

O método SerCx2PioTransmitCreate cria um objeto de transmissão PIO e fornece ao driver de chamada um identificador SERCX2PIOTRANSMIT para esse objeto. As funções EvtSerCx2PioTransmitXxx** 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 e limpo de hardware

Alguns drivers de controlador serial podem precisar inicializar o hardware do controlador serial no início de uma transação de transmissão de PIO 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 EvtSerCx2PioTransmitInitializeTransaction , SerCx2 chamará essa função para inicializar o controlador serial antes da chamada EvtSerCx2PioTransmitWriteBuffer que inicia a transação. Se implementada, a função EvtSerCx2PioTransmitInitializeTransaction deverá chamar o método SerCx2PioTransmitInitializeTransactionComplete 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 EvtSerCx2PioTransmitCleanupTransaction, SerCx2 chamará essa função para limpo o estado do hardware após a chamada final de EvtSerCx2PioTransmitWriteBuffer na transação. Se implementada, a função EvtSerCx2PioTransmitInitializeTransaction deve chamar o método SerCx2PioTransmitCleanupTransactionComplete para informar o SerCx2 quando o driver terminar de limpar o controlador serial.

Drenando e limpando o FIFO de transmissão

Um driver de controlador serial deve implementar uma função de retorno de chamada de evento EvtSerCx2PioTransmitDrainFifo se o driver puder detectar quando o FIFO é esvaziado. Se implementado, SerCx2 chama essa função após o último byte de dados em uma transação de transmissão de PIO ter sido gravado no FIFO de transmissão. Durante essa chamada, a função EvtSerCx2PioTransmitDrainFifo normalmente permite que uma interrupção seja disparada quando o FIFO de transmissão esvazia e retorna sem esperar. Quando o FIFO esvazia, o driver chama o método SerCx2PioTransmitDrainFifoComplete 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 de transmissão de PIO.

Se o driver do controlador serial não implementar uma função EvtSerCx2PioTransmitDrainFifo , 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 permanecerem no FIFO após a conclusão de uma solicitação de gravação poderão ser perdidos antes que possam ser transmitidos. Essa perda inesperada de dados 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 EvtSerCx2PioTransmitDrainFifo também deve implementar funções de retorno de chamada de evento EvtSerCx2PioTransmitCancelDrainFifo e EvtSerCx2PioTransmitPurgeFifo .

A função EvtSerCx2PioTransmitCancelDrainFifo permite que o SerCx2 cancele uma operação de drenagem FIFO em andamento antes de ser concluída. O SerCx2 poderá cancelar essa operação se a solicitação de gravação atingir o tempo limite ou for cancelada. Se a função EvtSerCx2PioTransmitCancelDrainFifo cancelar com êxito a operação FIFO-drain, essa função retornará TRUE. Um valor retornado de TRUE garante que o driver do controlador serial não tenha chamado e não chamará SerCx2PioTransmitDrainFifoComplete. Um valor retornado de FALSE indica que a função EvtSerCx2PioTransmitDrainFifo chamou ou chamará em breve SerCx2PioTransmitDrainFifoComplete.

Se a solicitação de gravação associada a uma transação de transmissão de PIO for cancelada ou atingir o tempo limite antes de ser concluída, o SerCx2 chamará a função EvtSerCx2PioTransmitPurgeFifo , se ela for implementada, para descartar quaisquer dados nãoentes que possam permanecer como o FIFO de transmissão. O SerCx2 usa as informações que obtém dessa função para informar ao driver periférico exatamente quantos bytes de dados foram transmitidos com êxito para o dispositivo periférico pela solicitação de gravação.

Notificações prontas

Quando uma chamada EvtSerCx2PioTransmitWriteBuffer termina porque o FIFO de transmissão não pode aceitar imediatamente mais dados, o SerCx2 precisa aguardar para concluir a transação de recebimento de PIO até que, posteriormente, o FIFO esteja pronto para aceitar mais dados. Nesse caso, SerCx2 chama a função de retorno de chamada de evento EvtSerCx2PioTransmitEnableReadyNotification para permitir que o driver do controlador serial envie uma notificação pronta. Se essa notificação estiver habilitada, o driver do controlador serial chamará o método SerCx2PioTransmitReady para notificar o SerCx2 quando o driver detectar que o FIFO de transmissão está pronto para aceitar mais dados. Em resposta a essa notificação, SerCx2 chama a função EvtSerCx2PioTransmitWriteBuffer para gravar mais dados no FIFO.

Se a notificação pronta estiver habilitada quando a solicitação de gravação atingir o tempo limite ou for cancelada, o SerCx2 chamará a função de retorno de chamada de evento EvtSerCx2PioTransmitCancelReadyNotification para cancelar a notificação pendente. Se essa função cancelar com êxito a notificação pendente, ela retornará TRUE. Um valor retornado de TRUE garante que o driver do controlador serial não chamará SerCx2PioTransmitReady. Um valor retornado de FALSE indica que a função EvtSerCx2PioTransmitDrainFifo chamou ou chamará SerCx2PioTransmitReady.