Compartilhar via


SerCx2 System-DMA-Receive Transactions

Alguns drivers de controlador serial implementam suporte para receber 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-receive 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-receive, o driver fornece os parâmetros que o SerCx2 usará para configurar o adaptador DMA do sistema para transações de recebimento de DMA do sistema.

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

Criando o objeto system-DMA-receive

Antes que o SerCx2 possa chamar qualquer uma das funções EvtSerCx2SystemDmaReceiveXxx** do driver serial, o driver deve chamar o método SerCx2SystemDmaReceiveCreate para registrar essas funções com SerCx2. Esse método aceita, como parâmetro de entrada, um ponteiro para uma estrutura SERCX2_SYSTEM_DMA_RECEIVE_CONFIG que contém ponteiros para as funções EvtSerCx2SystemDmaReceiveXxx** 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 duas funções a seguir:

Um driver que implementa uma das duas funções na lista anterior deve implementar ambas.

O método SerCx2SystemDmaReceiveCreate cria um objeto system-DMA-receive e fornece ao driver de chamada um identificador SERCX2SYSTEMDMARECEIVE para esse objeto. As funções EvtSerCx2SystemDmaReceiveXxx** 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 recebimento 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 EvtSerCx2SystemDmaReceiveInitializeTransaction , 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 EvtSerCx2SystemDmaReceiveInitializeTransaction deverá chamar o método SerCx2SystemDmaReceiveInitializeTransactionComplete 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 EvtSerCx2SystemDmaReceiveCleanupTransaction, 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 EvtSerCx2SystemDmaReceiveInitializeTransaction deverá chamar o método SerCx2SystemDmaReceiveCleanupTransactionComplete 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-receive deve implementar uma função de retorno de chamada de evento EvtSerCx2SystemDmaReceiveConfigureDmaChannel . Essa função pode chamar o método SerCx2SystemDmaReceiveGetDmaEnabler 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.

Notificações de novos dados

Como opção, o driver do controlador serial pode implementar uma função de retorno de chamada de evento EvtSerCx2SystemDmaReceiveEnableNewDataNotification . Se implementado, o SerCx2 usa essa função para gerenciar com eficiência os tempos limite de intervalo durante o tratamento de solicitações de leitura processadas como transações de recebimento de DMA do sistema.

Um intervalo de tempo limite ocorrerá se o intervalo entre dois bytes sucessivos recebidos pelo controlador serial exceder um tempo máximo especificado pelo cliente. Depois que um driver periférico envia uma solicitação de leitura para SerCx2, um tempo limite de intervalo não pode ocorrer até que pelo menos um byte de dados seja recebido do dispositivo periférico conectado serialmente. O tempo entre a chegada de uma solicitação de leitura e o recebimento do primeiro byte de dados do dispositivo periférico pode ser significativamente maior do que o tempo necessário para receber o restante dos dados para a solicitação de leitura após o recebimento do primeiro byte. Para obter mais informações, consulte SERIAL_TIMEOUTS.

SerCx2 chama a função EvtSerCx2SystemDmaReceiveEnableNewDataNotification , se for implementada, para habilitar uma notificação de novos dados. Se essa notificação estiver habilitada e o controlador serial receber um ou mais bytes de novos dados do dispositivo periférico ou já tiver dados em seu FIFO de recebimento, o driver do controlador serial deverá chamar o método SerCx2SystemDmaReceiveNewDataNotification para notificar o SerCx2.

Para detectar um possível tempo limite de intervalo, o SerCx2 chama periodicamente a rotina ReadDmaCounter do adaptador DMA do sistema para marcar se algum dado foi recebido durante o intervalo anterior. A forma como o SerCx2 detecta o recebimento do primeiro byte de dados depende se o driver do controlador serial implementa uma função EvtSerCx2SystemDmaReceiveEnableNewDataNotification . Se essa função for implementada, o SerCx2 chamará a função para habilitar uma notificação de novos dados e será notificado pelo driver quando o primeiro byte de dados for recebido. Caso contrário, o SerCx2 chama periodicamente ReadDmaCounter para detectar o recebimento do primeiro byte e pode precisar ativar periodicamente o processador para fazer essas chamadas. Assim, um driver que implementa uma função EvtSerCx2SystemDmaReceiveEnableNewDataNotification pode reduzir o consumo de energia não exigindo que o processador ative com frequência.

Nota O SerCx2 depende da rotina ReadDmaCounter do adaptador DMA do sistema para monitorar tempos limite durante transações de recebimento de DMA do sistema e transações de transmissão de DMA do sistema. A HAL (camada de abstração de hardware) deve implementar uma rotina ReadDmaCounter totalmente funcional para o controlador de DMA do sistema usado para transferir dados de e para o controlador serial.

Um driver de controlador serial que dá suporte a notificações de novos dados para transações system-DMA-receive deve implementar uma função de retorno de chamada de evento EvtSerCx2SystemDmaReceiveCancelNewDataNotification para que o SerCx2 possa cancelar uma notificação de novos dados habilitada antes que ela ocorra. Se uma notificação de novos dados estiver habilitada quando a solicitação de leitura pendente for cancelada ou quando ocorrer um tempo limite total, o SerCx2 chamará a função EvtSerCx2SystemDmaReceiveCancelNewDataNotification para cancelar a notificação. 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á SerCx2SystemDmaReceiveNewDataNotification. Um valor retornado de FALSE indica que o driver chamou ou chamará em breve SerCx2SystemDmaReceiveNewDataNotification. Para obter mais informações sobre o tempo limite total, consulte SERIAL_TIMEOUTS.