Compartilhar via


Visão geral do suporte ao driver GPIO

A partir do Windows 8, a extensão da estrutura GPIO (GpioClx) 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. O 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 artigos:

Drivers de 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 de dados e saídas de dados. Além disso, esse driver coopera com o GpioClx para lidar com solicitações de interrupção de pinos GPIO configurados como entradas de interrupção.

Um dispositivo controlador GPIO tem alguns números 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 pin 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 corrigidas 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 GpioClx.

diagrama de bloco de componentes gpio.

O driver do controlador GPIO e o GpioClx se comunicam entre si por meio da interface de driver de dispositivo (DDI) do 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 que são implementadas pelo driver do controlador GPIO.

O driver do controlador GPIO acessa diretamente os registros de hardware do dispositivo controlador GPIO.

O GpioClx manipula solicitações de E/S dos drivers para dispositivos periféricos que estão conectados fisicamente aos pinos GPIO. O 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 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 evento, como CLIENT_ReadGpioPins e CLIENT_WriteGpioPins. O GpioClx gerencia as filas de E/S para o controlador GPIO e, portanto, alivia o driver do controlador GPIO dessa tarefa.

Além disso, o GpioClx manipula as 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 principais interrupções 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.

O GpioClx implementa um ISR que manipula as interrupções primárias geradas por hardware do dispositivo do controlador GPIO. Quando um dispositivo periférico afirma 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 exceção do kernel agenda o ISR GpioClx a ser executado. 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 GPioClx ISR 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 a ISR registrada para este GSI. Esse ISR pertence ao driver do dispositivo periférico que originalmente declarou 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 do Plug and Play (PnP) enumera os dispositivos PnP e os 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 de 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 a chamada de retorno 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 do GPIO é um novo tipo de recurso do Windows no 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:

Conectar 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 de recursos de interrupção oculta o fato de que uma interrupção pode ser implementada por um pin 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 de 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 de 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 que um driver de dispositivo periférico receba interrupções de um recurso de interrupção associado ao pino GPIO, é necessário registrar sua rotina de serviço de interrupção (ISR) para receber as interrupções desse recurso de interrupção, que é implementado por este pino. Um driver KMDF chama o método WdfInterruptCreate para conectar um ISR à interrupção.