Visão geral do suporte ao driver GPIO
A partir do Windows 8, a extensão de estrutura GPIO (GpioClx) simplifica a tarefa de escrever um driver para um dispositivo controlador GPIO. Além disso, GpioClx fornece suporte de driver para dispositivos periféricos que se conectam a pinos GPIO. O GpioClx, que é uma extensão fornecida pelo sistema para a estrutura de driver de modo kernel (KMDF), executa tarefas de processamento que são comuns aos membros da classe de dispositivo GPIO.
Esta visão geral discute os seguintes artigos:
Drivers do controlador GPIO
Os fornecedores de hardware fornecem drivers para controlar seus controladores GPIO. Um driver de controlador GPIO é um driver KMDF que gerencia todas as operações específicas de hardware para um controlador GPIO. O driver do controlador GPIO coopera com o GpioClx para lidar com solicitações de E/S para grupos de pinos GPIO configurados como entradas e saídas de dados. Além disso, este driver coopera com o GpioClx para lidar com solicitações de interrupção de pinos GPIO que são configurados como entradas de interrupção.
Um dispositivo controlador GPIO tem algum número de pinos GPIO. Esses pinos podem ser fisicamente conectados a dispositivos periféricos. Os pinos GPIO podem ser configurados como entradas de dados, saídas de dados ou entradas de solicitação de interrupção. Normalmente, um pino GPIO é dedicado a um dispositivo periférico e não é compartilhado por dois ou mais dispositivos. As conexões entre pinos GPIO e dispositivos periféricos são fixas e não podem ser alteradas pelo usuário (por exemplo, removendo um dispositivo periférico e substituindo-o por outro dispositivo). Assim, a atribuição de pinos GPIO para dispositivos periféricos pode ser descrita no firmware da plataforma.
O diagrama a seguir mostra o driver do controlador GPIO e o GpioClx.
O driver do controlador GPIO e o GpioClx se comunicam entre si através da interface de driver de dispositivo (DDI) do GpioClx. O driver do controlador GPIO utiliza métodos de suporte de driver que são implementados pelo GpioClx. O GpioClx chama funções de retorno de chamada de evento que são implementadas pelo driver do controlador GPIO.
O driver do controlador GPIO acessa diretamente os registros de hardware do dispositivo do controlador GPIO.
O GpioClx lida com solicitações de E/S dos drivers para dispositivos periféricos que se conectam fisicamente aos pinos GPIO. O GpioClx traduz essas solicitações de E/S em operações de hardware simples, que ele executa chamando as funções de retorno de chamada de evento que são implementadas pelo driver do controlador GPIO. Por exemplo, para ler ou gravar dados em um conjunto de pinos GPIO, o GpioClx chama funções de retorno de chamada de eventos, como CLIENT_ReadGpioPins e CLIENT_WriteGpioPins. O GpioClx gerencia as filas de E/S para o controlador GPIO e, assim, libera o driver do controlador GPIO dessa tarefa.
Além disso, o GpioClx lida com interrupções primárias do dispositivo controlador GPIO e mapeia essas interrupções para interrupções secundárias, que são manipuladas por drivers de dispositivo periféricos. As interrupções primárias são interrupções geradas por dispositivos de hardware. As interrupções secundárias são geradas pelo sistema operacional em resposta a determinadas interrupções primárias. As interrupções primárias e secundárias são identificadas por interrupções globais do sistema (GSIs). O firmware ACPI para a plataforma de hardware atribui GSIs a interrupções primárias e, em tempo de execução, o sistema operacional atribui GSIs a interrupções secundárias.
Por exemplo, o firmware atribui um GSI à interrupção de hardware do controlador GPIO e o sistema operacional atribui um GSI a um pino GPIO configurado como uma entrada de interrupção.
O GpioClx implementa um ISR que lida com as interrupções primárias geradas por hardware do dispositivo controlador GPIO. Quando um dispositivo periférico afirma uma interrupção em um pino GPIO e as interrupções nesse pino são ativadas e desmascaradas, o controlador GPIO interrompe o processador. Em resposta, o tratador de exceções do kernel agenda o ISR GpioClx para execução. Para identificar o pino GPIO que causou a interrupção, o GpioClx ISR chama a função de retorno de chamada de evento CLIENT_QueryActiveInterrupts, que é implementada pelo driver do controlador GPIO. O ISR do GpioClx então procura o GSI atribuído a esse pino e passa esse GSI para a camada de abstração de hardware (HAL). O HAL gera uma interrupção secundária chamando o ISR que está registrado para este GSI. Este ISR pertence ao driver do dispositivo periférico que originalmente gerou a interrupção.
Para obter mais informações sobre interrupções primárias e secundárias, consulte interrupções GPIO.
Drivers para dispositivos periféricos que utilizam pinos GPIO
Na inicialização, o gerenciador Plug and Play (PnP) enumera dispositivos PnP e dispositivos não-PnP. Para dispositivos não-PnP com conexões fixas com pinos GPIO, o gerenciador PnP consulta o firmware da plataforma para determinar quais pinos GPIO são atribuídos como recursos de hardware gerenciados pelo sistema para esses dispositivos.
O driver KMDF para um dispositivo periférico recebe os seus recursos de hardware atribuídos durante o callback EvtDevicePrepareHardware. Esses recursos podem incluir pinos GPIO configurados como saídas de dados, entradas de dados ou entradas de solicitação de interrupção.
Um recurso de E/S GPIO é um novo tipo de recurso do Windows no Windows 8. Este recurso consiste em um conjunto de um ou mais pinos GPIO que podem ser usados como entradas ou saídas de dados. Se um driver de dispositivo periférico abrir um recurso de E/S GPIO para leituras, o driver usará todos os pinos no recurso como entradas de dados. Se um driver abrir um recurso de E/S GPIO para gravações, o driver usará todos os pinos no recurso como saídas de dados. Para obter exemplos de código que mostram como um driver de dispositivo periférico abre uma conexão lógica com um conjunto de pinos de E/S GPIO, consulte os seguintes tópicos:
Ligação de um driver KMDF a pinos de E/S GPIO
Um pino GPIO configurado como uma entrada de interrupção é atribuído a um driver como um recurso de interrupção comum do Windows. A abstração do recurso de interrupção oculta o fato de que uma interrupção pode ser implementada por um pino GPIO em vez de, por exemplo, um controlador de interrupção programável. Assim, o driver pode tratar um recurso de interrupção baseado em GPIO da mesma forma que qualquer outro recurso de interrupção.
Para acessar os pinos GPIO em um recurso de E/S GPIO, um driver de dispositivo periférico deve abrir uma conexão lógica com os pinos. Um driver KMDF chama o método WdfIoTargetOpen para abrir a conexão. Através dessa conexão, o driver pode enviar solicitações de E/S para os pinos GPIO. O driver envia solicitações de IOCTL_GPIO_READ_PINS para ler dados desses pinos (se forem pinos de entrada) ou solicitações de IOCTL_GPIO_WRITE_PINS para gravar dados neles (se forem pinos de saída).
Para receber interrupções do pino GPIO em um recurso de interrupção, um driver de dispositivo periférico deve registrar sua rotina de serviço de interrupção (ISR) para receber interrupções do recurso de interrupção implementado por esse pino. Um driver KMDF chama o método WdfInterruptCreate para conectar um ISR à interrupção.