Visão geral do suporte ao driver GPIO
Começando com Windows 8, a gpioClx (extensão de estrutura gpio) simplifica a tarefa de escrever um driver para um dispositivo controlador GPIO. Além disso, o GpioClx fornece suporte de driver para dispositivos periféricos que se conectam a pinos GPIO. GpioClx, que é uma extensão fornecida pelo sistema para a KMDF (estrutura de driver no modo kernel), executa tarefas de processamento comuns aos membros da classe de dispositivo GPIO.
Esta visão geral discute os seguintes tópicos:
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 GpioClx para lidar com solicitações de E/S para grupos de pinos GPIO configurados como entradas de dados e saídas de dados. Além disso, esse driver coopera com GpioClx para lidar com solicitações de interrupção de pinos GPIO configurados como entradas de interrupção.
Um dispositivo controlador GPIO tem um número de pinos GPIO. Esses pinos podem estar 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). Portanto, 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 GpioClx.
O driver do controlador GPIO e o GpioClx se comunicam entre si por meio da DDI (interface de driver de dispositivo) GpioClx. O driver do controlador GPIO chama métodos de suporte ao driver implementados pelo GpioClx. GpioClx chama funções de retorno de chamada de evento implementadas pelo driver do controlador GPIO.
O driver do controlador GPIO acessa diretamente os registros de hardware do dispositivo controlador GPIO.
O GpioClx lida com solicitações de E/S dos drivers para dispositivos periféricos que se conectam fisicamente a pinos GPIO. GpioClx converte 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 implementadas pelo driver do controlador GPIO. Por exemplo, para ler dados ou gravar dados em um conjunto de pinos GPIO, GpioClx chama funções de retorno de chamada de evento, como CLIENT_ReadGpioPins e CLIENT_WriteGpioPins. GpioClx gerencia as filas de E/S para o controlador GPIO e, assim, alivia 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 tratadas por drivers de dispositivo periféricos. As interrupções primárias são interrupções geradas por dispositivos de hardware. 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 GSIs (interrupções globais do sistema). 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.
GpioClx implementa um ISR que manipula as interrupções primárias geradas por hardware do dispositivo controlador GPIO. Quando um dispositivo periférico declara uma interrupção em um pino GPIO e as interrupções nesse pino são habilitadas e desmascaradas, o controlador GPIO interrompe o processador. Em resposta, o manipulador de interceptação de kernel agenda a execução do ISR gpioClx. Para identificar o pino gpio que causou a interrupção, o ISR gpioClx chama a função de retorno de chamada de evento CLIENT_QueryActiveInterrupts , que é implementada pelo driver do controlador GPIO. O ISR gpioClx então pesquisa 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 registrado para esse GSI. Esse ISR pertence ao driver do dispositivo periférico que originalmente afirmou a interrupção.
Para obter mais informações sobre interrupções primárias e secundárias, consulte Interrupções de GPIO.
Drivers para dispositivos periféricos que usam pinos GPIO
Na inicialização, o gerenciador de Plug and Play (PnP) enumera dispositivos PnP e dispositivos não PnP. Para dispositivos não PnP que têm 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 a esses dispositivos.
O driver KMDF para um dispositivo periférico recebe seus recursos de hardware atribuídos durante um retorno de chamada 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 de GPIO é um novo tipo de recurso do Windows em Windows 8. Esse recurso consiste em um conjunto de um ou mais pinos GPIO que podem ser usados como entradas de dados ou saídas de dados. Se um driver de dispositivo periférico abrir um recurso de E/S de GPIO para leituras, o driver usará todos os pinos no recurso como entradas de dados. Se um driver abrir um recurso de E/S de 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:
Conectando 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. Portanto, 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. Por meio dessa conexão, o driver pode enviar solicitações de E/S para os pinos gpio. O driver envia IOCTL_GPIO_READ_PINS solicitações para ler dados desses pinos (se forem pinos de entrada) ou IOCTL_GPIO_WRITE_PINS solicitações 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 ISR (rotina de serviço de interrupção) 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.