Transações de PIO-Receive serCx2
O SerCx2 exige que todos os drivers de controlador serial implementem o suporte para receber transações que usam E/S programada (PIO). Para iniciar uma transação de recebimento de PIO, o SerCx2 chama a função de retorno de chamada de evento EvtSerCx2PioReceiveReadBuffer do driver e fornece um buffer de leitura como um parâmetro.
Durante essa chamada, a função EvtSerCx2PioReceiveReadBuffer transfere dados para o buffer de leitura do FIFO de recebimento no hardware do controlador serial. Essa transferência de dados continua até que o buffer de leitura esteja cheio ou nenhum dado esteja disponível imediatamente do FIFO de recebimento. Quando a transferência termina, a função retorna o número de bytes que foram transferidos com êxito para o buffer de leitura do FIFO. Essa função nunca aguarda o recebimento de mais dados.
Criando o objeto PIO-receive
Antes que o SerCx2 possa chamar qualquer uma das funções EvtSerCx2PioReceiveXxx** do driver serial, o driver deve chamar o método SerCx2PioReceiveCreate para registrar essas funções com SerCx2. Esse método aceita, como parâmetro de entrada, um ponteiro para uma estrutura SERCX2_PIO_RECEIVE_CONFIG que contém ponteiros para as funções EvtSerCx2PioReceiveXxx** do driver.
O driver é necessário para implementar todas as três funções a seguir:
- EvtSerCx2PioReceiveReadBuffer
- EvtSerCx2PioReceiveEnableReadyNotification
- EvtSerCx2PioReceiveCancelReadyNotification
Como opção, o driver pode implementar uma ou ambas as seguintes funções:
O método SerCx2PioReceiveCreate cria um objeto pio-receive e fornece ao driver de chamada um identificador SERCX2PIORECEIVE para esse objeto. As funções EvtSerCx2PioReceiveXxx** do driver assumem esse identificador como seu primeiro parâmetro. Os seguintes métodos SerCx2 assumem esse identificador como seu primeiro parâmetro:
- SerCx2PioReceiveReady
- SerCx2PioReceiveInitializeTransactionComplete
- SerCx2PioReceiveCleanupTransactionComplete
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 recebimento 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 EvtSerCx2PioReceiveInitializeTransaction , o SerCx2 chamará essa função para inicializar o controlador serial antes da chamada EvtSerCx2PioReceiveReadBuffer que inicia a transação. Se implementada, a função EvtSerCx2PioReceiveInitializeTransaction deverá chamar o método SerCx2PioReceiveInitializeTransactionComplete 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 EvtSerCx2PioReceiveCleanupTransaction, o SerCx2 chamará essa função para limpo o estado do hardware após a chamada final EvtSerCx2PioReceiveReadBuffer na transação. Se implementada, a função EvtSerCx2PioReceiveInitializeTransaction deverá chamar o método SerCx2PioReceiveCleanupTransactionComplete para informar o SerCx2 quando o driver terminar de limpar o controlador serial.
Notificações prontas
Quando uma chamada EvtSerCx2PioReceiveReadBuffer termina porque não há mais dados disponíveis imediatamente para leitura do FIFO de recebimento, o SerCx2 não pode concluir a transação de recebimento de PIO até que, em algum momento posterior, o controlador serial receba mais dados. Nesse caso, o SerCx2 chama a função de retorno de chamada de evento EvtSerCx2PioReceiveEnableReadyNotification para habilitar uma notificação pronta. Normalmente, essa função permite que uma interrupção seja disparada quando um ou mais bytes de dados estão disponíveis para serem lidos do FIFO de recebimento. Se e somente se essa notificação estiver habilitada, o driver do controlador serial chamará o método SerCx2PioReceiveReady para notificar o SerCx2 quando o driver detectar que o FIFO de recebimento não está mais vazio. Em resposta a essa notificação, o SerCx2 chama a função EvtSerCx2PioReceiveReadBuffer para ler os dados recém-recebidos.
Além disso, o SerCx2 usa notificações prontas para gerenciar com eficiência os tempos limite durante o tratamento de solicitações de leitura processadas como transações de recebimento de PIO. Para obter mais informações sobre esses tempos limite, consulte SERIAL_TIMEOUTS.
Se a notificação pronta estiver habilitada quando a solicitação de leitura atingir o tempo limite ou for cancelada, o SerCx2 chamará a função de retorno de chamada de evento EvtSerCx2PioReceiveCancelReadyNotification 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á SerCx2PioReceiveReady. Um valor retornado de FALSE indica que o driver do controlador já chamou ou chamará SerCx2PioReceiveReady em breve.