Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O SerCx2 manipula uma solicitação de leitura ou gravação de um cliente emitindo uma ou mais transações de E/S para o driver do controlador serial. Esse driver trata cada transação como uma operação de E/S autocontida que transfere dados entre o controlador serial e o buffer de dados na solicitação.
Os circuitos integrados do SoC (System on a Chip) frequentemente incluem controladores seriais (ou UARTs) para habilitar a comunicação serial de alta velocidade com outros circuitos integrados que são soldados à mesma placa de circuito impresso. Os processadores nesses SoCs podem usar PIO (Programmed I/O) para transferir dados diretamente para ou a partir dos registros de dados mapeados na memória nesses controladores seriais. Além disso, esses SoCs normalmente fornecem hardware DMA avançado para mover dados entre os controladores serial e a memória.
O PIO pode ser suficiente para transferências de dados curtas, mas usar o PIO para transferências mais longas em altas taxas de dados coloca uma carga muito grande no processador. O DMA é necessário para descarregar essas transferências do processador.
Tipos de transações de E/S
O SerCx2 define os três tipos gerais de transações de E/S a seguir:
- PIO
- DMA do sistema
- Personalizado
Todos os drivers de controlador serial devem dar suporte a transações de E/S que usam PIO para transferir dados. Um driver de controlador serial também pode dar suporte a transações de E/S que usam o DMA do sistema ou um mecanismo de transferência de dados personalizado, dependendo dos recursos do controlador serial e do hardware associado. O driver pode dar suporte a transações de DMA do sistema ou transações personalizadas, mas não ambas.
Para cada tipo de transação de E/S compatível com o hardware do controlador serial, o driver do controlador serial registra um pacote de suporte com SerCx2. Os recursos de hardware relevantes são descritos neste pacote, que inclui um conjunto de funções de eventos de retorno de chamada implementadas pelo driver e chamados pelo SerCx2 para iniciar e controlar esse tipo de transação de E/S.
Se um controlador serial puder usar um controlador DMA do sistema, que pode ser compartilhado com outros dispositivos, o driver do controlador serial poderá dar suporte a transações de DMA do sistema. Para essas transações, o SerCx2 configura o controlador DMA do sistema e inicia as transferências de DMA. O driver do controlador serial faz relativamente pouco trabalho durante transações de DMA do sistema.
Se um controlador serial tiver algum mecanismo de hardware personalizado para transferir dados, o driver do controlador serial poderá dar suporte a transações personalizadas que usam esse mecanismo. Por exemplo, se o hardware do controlador serial tiver capacidade de DMA mestre de barramento embutida, o driver do controlador serial poderá dar suporte a transações personalizadas para tornar essa funcionalidade disponível para o SerCx2.
As transações personalizadas são flexíveis em termos dos tipos de mecanismos de transferência de dados que podem dar suporte. No entanto, essas transações são mais difíceis de implementar do que transações de PIO ou transações de DMA do sistema. Para dar suporte a transações personalizadas, o driver do controlador serial normalmente deve configurar e inicializar o hardware usado para transferir dados. Além disso, se uma solicitação de leitura ou gravação pendente for cancelada antes que a transação de recebimento personalizado ou de transmissão personalizada associada seja concluída, o driver deverá encerrar a transação e finalizar a solicitação.
Cada transação de E/S é uma operação relativamente simples. Uma transação de E/S lê dados do controlador serial ou grava dados no controlador e nunca mistura leituras e gravações. Uma transação de E/S usa um único modo de transferência — PIO, DMA do sistema ou personalizado — e nunca mistura modos de transferência.
O SerCx2 pode decidir de forma inteligente se deseja usar PIO ou DMA para atender a uma solicitação de leitura ou gravação. Por exemplo, o SerCx2 pode optar por apresentar uma solicitação de leitura ou gravação muito curta para o driver do controlador serial como uma transação PIO. Ou o SerCx2 pode apresentar uma solicitação de leitura ou gravação mais longa para o controlador serial como uma transação DMA.
Dividindo uma solicitação de leitura ou de gravação em várias transações
Alguns controladores de DMA do sistema podem ter limitações que exigem que o SerCx2 interrompa uma solicitação de leitura ou gravação mais longa em duas ou mais transações de E/S. Por exemplo, se um controlador DMA do sistema exigir que as transferências de DMA comecem e terminem em limites de bytes pares na memória, mas o buffer de dados em uma solicitação de leitura comece e termine em limites de bytes ímpares, o SerCx2 poderá usar PIO para transferir o primeiro e o último byte do buffer, e usar o DMA do sistema para transferir todos os dados entre o primeiro e o último byte. Para este exemplo, o SerCx2 emite as três transações de E/S a seguir para o driver do controlador serial na ordem mostrada:
- Uma transação de recebimento por PIO para o primeiro byte.
- Uma transação de recebimento de sistema DMA para os bytes intermediários.
- Uma transação de recebimento por PIO para o último byte.
Da mesma forma, se um mecanismo personalizado de transferência de dados puder iniciar e encerrar uma transação de transmissão personalizada em um limite de bytes arbitrário na memória, mas o tamanho do buffer em uma solicitação de gravação exceder o comprimento máximo de transferência de uma transação de transmissão personalizada, o SerCx2 particionará a solicitação de gravação em duas (ou mais) transações de transmissão personalizada, cada uma das quais não excede o comprimento máximo da transferência.
Se o SerCx2 precisar dividir uma solicitação de leitura ou gravação em duas ou mais transações de E/S, o driver do controlador serial poderá ignorar com segurança a relação dessas transações entre si e com a solicitação. O SerCx2 serializa as transações para garantir que os dados sejam recebidos ou transmitidos na ordem correta.
Quando o driver do controlador serial registra um conjunto de funções de retorno de chamada para dar suporte a transações personalizadas ou transações de DMA do sistema, o driver fornece valores de parâmetro que descrevem os recursos do hardware que executarão essas transações. Por exemplo, para transações de DMA do sistema, os parâmetros incluem os requisitos de alinhamento e os comprimentos mínimos e máximos de transferência aos quais o controlador DMA do sistema dá suporte. O SerCx2 usa esses parâmetros para decidir se deseja processar uma solicitação de leitura ou gravação como uma transação PIO ou uma transação system-DMA e se deve dividir a solicitação em duas ou mais transações de E/S.
No entanto, um controlador serial pode ter recursos de hardware especiais que não podem ser descritos adequadamente pelos parâmetros que o driver do controlador serial fornece ao SerCx2. Assim, o driver pode ter acesso a informações dependentes de hardware que permitem ao driver tomar decisões melhores do que o SerCx2 sobre como particionar uma solicitação de leitura ou gravação em uma ou mais transações de E/S. Como opção, esse driver pode implementar as funções de retorno de chamada de evento EvtSerCx2SelectNextReceiveTransactionType e EvtSerCx2SelectNextTransmitTransactionType. O SerCx2 chama essas funções, se elas forem implementadas, para permitir que o driver decida quais transações de E/S usar para atender a uma solicitação de leitura ou gravação.