Visão geral das transações de E/S do SerCx2
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 (Sistema em um Chip) frequentemente incluem controladores seriais (ou UARTs) para habilitar a comunicação serial de alta velocidade com outros circuitos integrados que são vendidos para a mesma placa de circuito impressa. Os processadores nesses SoCs podem usar o PIO (E/S) programado para transferir dados diretamente para ou 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 seriais 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 sobre o processador. O AMD é 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 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 a 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. Este pacote descreve os recursos de hardware relevantes e inclui um conjunto de funções de retorno de chamada de evento implementadas pelo driver que o SerCx2 chama 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 de 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 a funcionalidade interna de DMA master barramento, o driver do controlador serial poderá dar suporte a transações personalizadas para disponibilizar essa funcionalidade para SerCx2.
As transações personalizadas são flexíveis em termos dos tipos de mecanismos de transferência de dados aos quais 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 personalizada de recebimento ou transmissão personalizada associada seja concluída, o driver deverá encerrar a transação e concluir 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, 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 de DMA.
Dividir uma solicitação de leitura ou gravação em várias transações
Alguns controladores de DMA do sistema podem ter limitações que exigem que o SerCx2 divida uma solicitação de leitura ou gravação mais longa em duas ou mais transações de E/S. Por exemplo, se um controlador de DMA do sistema exigir transferências de DMA para iniciar e terminar em limites de bytes pares na memória, mas o buffer de dados em uma solicitação de leitura for iniciado e terminar em limites de bytes ímpares, o SerCx2 poderá usar o PIO para transferir o primeiro e o último bytes para o buffer e usar o DMA do sistema para transferir todos os dados entre o primeiro e o último bytes. 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 de PIO para o primeiro byte.
- Uma transação system-DMA-receive para os bytes intermediários.
- Uma transação de recebimento de PIO para o último byte.
Da mesma forma, se um mecanismo de transferência de dados personalizado 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 excederá 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á essas transações. Por exemplo, para transações de DMA do sistema, os parâmetros incluem os requisitos de alinhamento e os comprimentos mínimo e máximo de transferência aos quais o controlador de 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 de DMA do sistema e se a solicitação deve ser dividida em duas ou mais transações de E/S.
No entanto, um controlador serial pode ter funcionalidades de hardware especiais que não podem ser adequadamente descritas pelos parâmetros que o driver do controlador serial fornece ao SerCx2. Portanto, o driver pode ter acesso a informações dependentes de hardware que permitem que o driver tome 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 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.