Compartilhar via


recursos de hardware do GPIO-Based

A partir do Windows 8, os pinos de GPIO (E/S de uso geral) controlados por um driver de controlador GPIO estão disponíveis para outros drivers como recursos de hardware gerenciados pelo sistema. Os pinos de E/S do GPIO, que são pinos configurados como entradas de dados ou saídas de dados, estão disponíveis como um novo tipo de recurso do Windows, recursos de E/S de GPIO. Além disso, os pinos de interrupção gpio, que são pinos configurados como entradas de solicitação de interrupção, estão disponíveis como recursos comuns de interrupção do Windows.

Um recurso de E/S de GPIO representa um conjunto de um ou mais pinos GPIO que o driver de um dispositivo periférico pode ler ou gravar. O Windows oculta detalhes sobre a implementação subjacente dos pinos de E/S de GPIO para que os drivers de dispositivo periféricos possam ser gravados para manipular recursos de E/S de GPIO abstratos. Drivers de dispositivo periférico que usam esses recursos abstratos podem funcionar entre plataformas, independentemente do hardware do controlador GPIO que implementa os recursos. Um recurso de E/S de GPIO é representado por um identificador WDFIOTARGET que associa esse recurso ao driver de controlador GPIO específico que possui os pinos ou pinos GPIO subjacentes.

Normalmente, um pino de E/S em um controlador GPIO pode ser configurado para entrada ou saída, dependendo dos recursos do hardware do controlador e do dispositivo que está fisicamente conectado ao pino. Portanto, um driver pode abrir uma conexão lógica com esse pino para operações de gravação ou leitura, mas não ambas. No entanto, essa restrição é imposta pelo hardware e não pela extensão da estrutura GPIO (GpioClx). Se o hardware permitir que um pino de E/S seja configurado para entrada e saída, o GpioClx permitirá que um driver abra uma conexão lógica com o pino para operações de leitura e gravação.

Para pinos GPIO configurados como entradas de solicitação de interrupção, o fato de que uma solicitação de interrupção é implementada por um pino GPIO em vez de por um controlador de interrupção ou uma linha de solicitação de interrupção dedicada é completamente abstraído pelo sistema operacional. As interrupções de GPIO são apresentadas aos drivers de dispositivo periférico como recursos abstratos de interrupção. A abstração desses recursos é suportada pela pilha de driver GPIO e pela HAL (camada de abstração de hardware). Assim, os drivers de dispositivo periféricos que usam recursos de interrupção podem ignorar em grande parte detalhes sobre a implementação subjacente desses recursos. Para obter mais informações, consulte Interrupções de GPIO.

O diagrama a seguir mostra um exemplo de atribuição de recursos baseados em GPIO para dois drivers de dispositivo periféricos:

atribuição de exemplo de recursos baseados em gpio.

No diagrama anterior, os três recursos baseados em GPIO a seguir recebem o driver de dispositivo periférico A:

  • Dois pinos de entrada de dados
  • Um pin de saída de dados
  • Um pino de entrada de interrupção

Os dois recursos baseados em GPIO a seguir são atribuídos ao driver de dispositivo periférico B:

  • Um pin de entrada de dados
  • Um pino de entrada de interrupção

Os drivers A e B recebem seus recursos atribuídos em suas funções de retorno de chamada EvtDevicePrepareHardware . Se um driver receber, como um recurso, um conjunto de um ou mais pinos de E/S de GPIO, o driver poderá abrir uma conexão com esses pinos para acessá-los. O driver obtém um identificador WDFIOTARGET para identificar a conexão e envia solicitações de E/S para esse identificador para ler ou gravar nesses pinos.

Para obter exemplos de código que mostram como se conectar a um conjunto de pinos de E/S de GPIO e enviar solicitações de E/S para esses pinos, consulte os seguintes tópicos:

Conectando um driver KMDF a pinos de E/S gpio

Em ambos os tópicos, a IoRoutine função no exemplo de código abre um recurso de pino de E/S de GPIO para leituras ou gravações, dependendo do valor do ReadOperation parâmetro. Se o recurso for aberto para leituras (DesiredAccess = GENERIC_READ), os pinos no recurso serão configurados como entradas e uma solicitação de IOCTL_GPIO_READ_PINS enviada ao recurso pin lerá os valores de entrada nesses pinos. GpioClx não permite que uma solicitação de IOCTL_GPIO_WRITE_PINS seja enviada a um conjunto de pinos de entrada e conclui essa solicitação com um erro STATUS_GPIO_OPERATION_DENIED status. Da mesma forma, se o recurso pin for aberto para gravações (DesiredAccess = GENERIC_WRITE), os pinos no recurso serão configurados como saídas e uma solicitação IOCTL_GPIO_WRITE_PINS enviada ao recurso de pino definirá os valores nas travas de saída que conduzem esses pinos. Normalmente, enviar uma solicitação de IOCTL_GPIO_READ_PINS para um conjunto de pinos de saída simplesmente lê os últimos valores gravados nas travas de saída.

Para usar um recurso de interrupção para receber interrupções, um driver cliente deve conectar uma ISR (rotina de serviço de interrupção) à interrupção. Normalmente, o driver faz essa conexão chamando o método WdfInterruptCreate (ou, possivelmente, a rotina IoConnectInterruptEx ). Para obter mais informações sobre interrupções do KMDF, consulte Criando um objeto de interrupção.

Em contraste com Plug and Play dispositivos que podem ser conectados dinamicamente e desconectados de uma plataforma de hardware, um dispositivo controlador GPIO é permanentemente anexado. Além disso, as conexões entre pinos GPIO e um dispositivo periférico são consideradas permanentes. (Ou, se o dispositivo periférico puder ser desconectado de um slot, o slot será dedicado a este dispositivo.) Portanto, os recursos de GPIO disponíveis são fixos e podem ser especificados no firmware da plataforma. Da mesma forma, os drivers de dispositivo periférico que usam recursos gpio são considerados para usar conjuntos dedicados de recursos GPIO. Portanto, os requisitos de recursos para esses drivers de dispositivo podem ser especificados no firmware da plataforma.

Quando o firmware de plataforma designa um conjunto de pinos GPIO como um recurso de E/S de GPIO, o firmware indica se os pinos nesse recurso podem ser abertos para leituras, gravações ou leituras e gravações.

Se um driver de dispositivo periférico usar mais de um recurso de E/S gpio, esse driver deverá estar ciente da ordem em que esses recursos são enumerados pelo gerenciador PnP. Por exemplo, se um driver usa dois pinos de E/S gpio, mas esses pinos devem ser acessados de forma independente e em momentos separados, o firmware da plataforma deve descrever cada pino como um recurso de E/S gpio separado. O gerenciador de PnP enumera esses recursos na ordem em que eles são descritos no firmware da plataforma, que deve corresponder à ordem esperada pelo driver.

Depois que um driver de dispositivo periférico abre uma conexão com um recurso de E/S gpio, um IOCTL_GPIO_READ_PINS ou IOCTL_GPIO_WRITE_PINS solicitação que esse driver envia para essa conexão acessa todos os pinos no recurso. Se o driver às vezes precisar acessar apenas um subconjunto desses pinos, esse subconjunto deverá ser atribuído ao driver como um recurso separado.

Para obter mais informações sobre solicitações de IOCTL_GPIO_READ_PINS , incluindo o mapeamento de pinos de entrada de dados para os bits no buffer de saída da solicitação, consulte IOCTL_GPIO_READ_PINS. Para obter mais informações sobre IOCTL_GPIO_WRITE_PINS solicitações, incluindo o mapeamento dos bits no buffer de entrada de solicitação para pinos de saída de dados, consulte IOCTL_GPIO_WRITE_PINS.