Compartilhar via


Drivers periféricos para dispositivos em portas serial SerCx2-Managed

Normalmente, uma porta serial gerenciada pelo SerCx2 é conectada permanentemente a um dispositivo periférico. Esse dispositivo é controlado por um driver periférico que envia solicitações de E/S para a porta serial. Essas solicitações transferem dados de e para o dispositivo e configuram o estado da porta serial. As solicitações de E/S enviadas pelo driver periférico são tratadas em conjunto pelo SerCx2 e por um driver de controlador serial associado.

Frequentemente, os controladores seriais estão contidos em circuitos integrados do SoC (Sistema em um Chip). Exemplos de dispositivos periféricos que podem estar conectados à porta serial de um controlador serial em um chip SoC incluem GPS, LAN sem fio, câmera e dispositivos Bluetooth.

O driver periférico para o dispositivo periférico serialmente conectado normalmente é um driver KMDF ( Estrutura de Driver do Modo Kernel ) ou UMDF ( User-Mode Driver Framework ). Para se comunicar com esse dispositivo, o driver periférico deve primeiro abrir uma conexão lógica com o controlador serial e receber um identificador de arquivo para o qual o driver pode enviar solicitações de E/S. Para obter mais informações, consulte Abrindo uma porta serial SerCx2-Managed.

Nesta página

Arquitetura do driver serial

O diagrama de bloco a seguir mostra as camadas de software e hardware que formam os caminhos de comunicação entre um dispositivo periférico (na parte inferior do diagrama) e o driver periférico deste dispositivo (na parte superior do diagrama). Neste exemplo, o dispositivo periférico está conectado à porta no controlador serial e a um pino de interrupção no controlador GPIO.

Diagrama que mostra camadas de software e hardware para um dispositivo periférico em uma porta serial gerenciada pelo SerCx2.

O driver periférico neste exemplo é um driver UMDF que envia solicitações de E/S para o dispositivo periférico. Essas solicitações passam pelo caminho de comunicação mostrado no lado esquerdo do diagrama. As solicitações são tratadas pelo SerCx2 e pelo driver do controlador serial. O driver periférico pode solicitar operações de E/S que definem a configuração de hardware da porta serial (por exemplo, alterar a taxa de baud) e que transferem dados de e para o dispositivo periférico por meio da porta serial. Para obter mais informações, consulte Caminho da solicitação de E/S.

As interrupções do dispositivo periférico percorrem o caminho de comunicação no lado direito do diagrama anterior. Conforme mostrado no canto inferior direito deste diagrama, o pino de interrupção do dispositivo periférico está conectado a um pino em um controlador gpio (E/S de uso geral). Esse pino GPIO está configurado para receber sinais de interrupção do dispositivo periférico. Em uma plataforma de hardware baseada em SoC, um controlador GPIO frequentemente desempenha a função de controlador de interrupção programável. Para obter mais informações, consulte Caminho de interrupção.

Os dois blocos mostrados em cinza no diagrama são módulos fornecidos pelo sistema. A extensão da estrutura GPIO (GpioClx) está disponível a partir do Windows 8. Assim como o SerCx2, GpioClx é uma extensão para KMDF. GpioClx executa funções que são comuns a uma variedade de controladores GPIO. GpioClx funciona com um driver de controlador GPIO que gerencia todas as operações específicas de hardware no controlador GPIO. Para obter mais informações, consulte Visão geral do suporte ao driver GPIO.

Caminho da solicitação de E/S

Para transmitir dados para o dispositivo periférico, o driver periférico envia uma solicitação de gravação (IRP_MJ_WRITE) para o controlador serial. Para receber dados do dispositivo periférico, o driver periférico envia uma solicitação de leitura (IRP_MJ_READ) para o controlador serial.

Além disso, o Windows define um conjunto de IOCTLs (solicitações de controle de E/S do dispositivo) que o driver periférico pode usar para executar várias operações de controle de E/S específicas para controladores seriais. Veja a seguir exemplos de operações de controle de E/S que o driver periférico pode solicitar:

  • Defina a taxa de baud na qual a porta serial transmite e recebe dados.
  • Defina os intervalos de tempo limite para solicitações de leitura e gravação.
  • Especifique um conjunto de eventos de hardware na porta serial para a qual o driver periférico recebe notificações.

O SerCx2 dá suporte a muitas das mesmas IOCTLs seriais que o driver serial da caixa de entrada, Serial.sys e a versão 1 da extensão de estrutura serial (SerCx). Para mais informações:

Caminho de interrupção

Conforme mostrado no diagrama arquitetura do driver serial , o dispositivo periférico usa o pino GPIO para enviar interrupções de dispositivo para o driver periférico. Em resposta a um sinal de interrupção do dispositivo periférico, o controlador GPIO sinaliza uma interrupção de hardware (chamada de interrupção primária ) para o processador. O sistema operacional direciona essa interrupção para o ISR do GpioClx. Em seguida, GpioClx identifica qual pino GPIO causou a interrupção e procura o identificador de GSI (interrupção do sistema global) para a interrupção virtual (chamada de interrupção secundária ) do dispositivo periférico. GpioClx fornece o GSI para o HAL e o HAL chama o ISR do driver periférico. Para lidar com a interrupção, o driver periférico normalmente envia uma ou mais solicitações de E/S para o dispositivo periférico por meio do SerCx2 e do driver do controlador serial. Para obter mais informações sobre interrupções primárias e secundárias, consulte Interrupções de GPIO.

Interrupções gpio são apenas uma maneira para o driver periférico receber notificações de eventos de hardware no dispositivo periférico. Outra maneira é que o driver periférico solicite notificações do SerCx2 e do driver do controlador serial quando determinados tipos de eventos de hardware ocorrem na porta serial. Por exemplo, o driver periférico pode pedir para ser notificado quando o controlador serial recebe dados seriais do dispositivo periférico. Para solicitar essas notificações, o driver periférico envia uma solicitação IOCTL_SERIAL_SET_WAIT_MASK ao dispositivo periférico para especificar um conjunto de eventos a serem monitorados e, em seguida, envia uma solicitação IOCTL_SERIAL_WAIT_ON_MASK para começar a escutar esses eventos. Essas solicitações são tratadas pelo SerCx2, com a ajuda do driver do controlador serial. Para obter mais informações sobre os tipos de eventos que o driver periférico pode monitorar, consulte SERIAL_EV_XXX , que são descritos em IOCTL_SERIAL_SET_WAIT_MASK.

No entanto, o controlador serial só pode detectar eventos de hardware quando está no estado de energia do dispositivo D0. Se o controlador serial estiver em um estado de baixa potência, o driver periférico não poderá contar com notificações do controlador serial para saber quando, por exemplo, o dispositivo periférico tem novos dados para o driver ler. Nesse caso, o dispositivo periférico deve enviar um sinal de interrupção (ou, talvez, um sinal de ativação) por meio de um pino GPIO. Um controlador GPIO consome muito pouca energia e normalmente permanece ativo depois que a maioria dos outros dispositivos entrou em estados de baixa energia.