E/S gpioClx e interfaces de interrupção
Normalmente, os clientes de um controlador GPIO são drivers para dispositivos periféricos que se conectam a pinos GPIO. Esses drivers usam pinos GPIO como canais de dados de baixa largura de banda, saídas de seleção de dispositivo e entradas de solicitação de interrupção. Os drivers de dispositivo periférico abrem conexões lógicas com pinos GPIO configurados como entradas ou saídas de dados. Eles usam essas conexões para enviar solicitações de E/S para esses pinos. Além disso, os drivers de dispositivo periféricos podem conectar logicamente suas rotinas de serviço de interrupção a pinos GPIO configurados como entradas de solicitação de interrupção.
Os pinos de GPIO são recursos de hardware gerenciados pelo sistema. Antes que um driver de dispositivo periférico inicie seu dispositivo, o gerenciador de Plug and Play (PnP) atribui a esse driver uma lista de recursos de hardware. Essa lista de recursos de hardware pode incluir o seguinte:
- Um recurso de E/S do GPIO. Esse recurso é um conjunto de um ou mais pinos GPIO configurados como entradas de dados ou saídas de dados. Os recursos de E/S do GPIO são um novo tipo de recurso do Windows começando com Windows 8.
- Uma interrupção. Esse recurso de interrupção pode ser implementado como um pin gpio configurado como uma entrada de interrupção, mas pode ser implementado por um controlador de interrupção programável ou como um pino de interrupção dedicado em um pacote de processador. A abstração de interrupção da camada de abstração de hardware (HAL) oculta esses detalhes de implementação, que os drivers de cliente podem ignorar com segurança.
Antes que um driver de dispositivo periférico possa usar um conjunto de pinos GPIO como entradas ou saídas de dados, o driver deve abrir uma conexão lógica com esses pinos. Por exemplo, um driver KMDF ( interface de driver no modo kernel ) obtém um identificador WDFIOTARGET para identificar a conexão. O driver usa esse identificador para enviar solicitações de E/S para os pinos. Especificamente, os drivers de cliente enviam IOCTL_GPIO_WRITE_PINS e IOCTL_GPIO_READ_PINS solicitações de controle de E/S para gravar dados em pinos de saída e ler dados de pinos de entrada. Para obter exemplos de código que mostram como se conectar a um conjunto de pinos de E/S de GPIO, consulte os seguintes tópicos:
Conectando um driver KMDF a pinos de E/S de GPIO
Para usar um recurso de interrupção para receber interrupções, um driver de dispositivo periférico deve conectar logicamente uma ISR (rotina de serviço de interrupção) à interrupção. Por exemplo, um driver de modo kernel pode fazer essa conexão chamando o método WdfInterruptCreate ou a rotina IoConnectInterruptEx . Depois de ser conectado, o ISR do driver é executado quando o dispositivo periférico sinaliza uma solicitação de interrupção para a entrada do controlador de interrupção ou fixação do GPIO. Para obter mais informações sobre interrupções, consulte Criando um objeto de interrupção.
A gpioClx (extensão de estrutura gpio) gerencia conexões de E/S e conexões de interrupção para os drivers de dispositivo periféricos que são seus clientes. O gerenciador PnP pode atribuir diferentes grupos de pinos GPIO em um dispositivo controlador GPIO a drivers de cliente diferentes. Alguns desses pinos são configurados como entradas ou saídas de dados e alguns são configurados como entradas de solicitação de interrupção.
Quando os drivers cliente recebem solicitações de interrupção ou enviam solicitações de E/S para pinos gpio, o GpioClx chama funções de retorno de chamada de evento implementadas pelo driver do controlador GPIO. Esses retornos de chamada acessam os registros de hardware no dispositivo controlador GPIO. Por meio dessas chamadas de função, o GpioClx lê entradas de dados, grava em saídas de dados e gerencia solicitações de interrupção (consultando, habilitando, mascarando, limpando e assim por diante, pinos GPIO configurados como entradas de interrupção).
O GpioClx faz todo o processamento necessário para gerenciar a E/S e interromper as conexões que são abertas pelos clientes. O driver do controlador GPIO, delegando o gerenciamento dessas conexões ao GpioClx, é responsável apenas pela tarefa relativamente simples de acessar os registros de hardware no dispositivo do controlador GPIO. O driver do controlador GPIO não precisa conhecer o driver do cliente para o qual um acesso específico é feito.