Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A partir do Windows 8, os pinos de E/S de uso geral (GPIO) 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 GPIO, que são pinos configurados como entradas ou saídas de dados, estão disponíveis como um novo tipo de recurso do Windows, recursos de E/S 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 de interrupção comuns do Windows.
Um recurso de E/S 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 GPIO para que os drivers de dispositivo periféricos possam ser gravados para manipular recursos de E/S GPIO abstratos. Os drivers de dispositivo periféricos que usam esses recursos abstratos podem funcionar entre plataformas, independentemente do hardware do controlador GPIO que implementa os recursos. Um recurso de E/S GPIO é representado por um identificador WDFIOTARGET que associa esse recurso ao driver de controlador GPIO específico que possui o pino 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. Assim, 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 de 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 uma solicitação de interrupção ser 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 GPIO são apresentadas aos drivers de dispositivos periféricos como recursos de interrupção abstratos. A abstração desses recursos é suportada pela pilha de drivers GPIO e pela camada de abstração de hardware (HAL). Assim, os drivers de dispositivo periféricos que usam recursos de interrupção podem ignorar em grande parte os detalhes sobre a implementação subjacente desses recursos. Para obter mais informações, consulte Interrupções GPIO.
O diagrama a seguir mostra um exemplo de atribuição de recursos baseados em GPIO para dois drivers de dispositivo periférico:
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 pino 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 pino de entrada de dados
- Um pino de entrada de interrupção
Os drivers A e B recebem os seus recursos atribuídos nas 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 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 GPIO e enviar solicitações de E/S para esses pinos, consulte os seguintes tópicos:
Ligação de um driver KMDF a pinos de E/S GPIO
Em ambos os tópicos, a função IoRoutine no exemplo de código abre um recurso de pino de E/S GPIO para leituras ou gravações, dependendo do valor do parâmetro ReadOperation. 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 de pino lerá os valores de entrada nesses pinos. O GpioClx não permite que uma solicitação de IOCTL_GPIO_WRITE_PINS seja enviada a um conjunto de pinos de entrada e recusa essa solicitação com um status de erro STATUS_GPIO_OPERATION_DENIED. Da mesma forma, se o recurso de pino for aberto para gravações (DesiredAccess = GENERIC_WRITE), os pinos no recurso serão configurados como saídas e uma solicitação de IOCTL_GPIO_WRITE_PINS enviada ao recurso de pino definirá os valores nos latches de saída que acionam esses pinos. Normalmente, enviar uma solicitação IOCTL_GPIO_READ_PINS para um conjunto de pinos de saída simplesmente lê os últimos valores gravados nos trincos de saída.
Para usar um recurso de interrupção para receber interrupções, um driver de cliente deve conectar uma rotina de serviço de interrupção (ISR) à 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 KMDF, consulte Criando um objeto de interrupção.
Ao contrário dos dispositivos Plug and Play que podem ser conectados dinamicamente e desconectados de uma plataforma de hardware, um dispositivo controlador GPIO é permanentemente conectado. Além disso, as conexões entre os pinos GPIO e um dispositivo periférico são consideradas permanentes. (Ou, se o dispositivo periférico puder ser desligado de uma ranhura, a ranhura é dedicada a este dispositivo.) Portanto, os recursos GPIO disponíveis são fixos e podem ser especificados no firmware da plataforma. Da mesma forma, presume-se que os drivers de dispositivos periféricos que utilizam recursos GPIO usem conjuntos dedicados de recursos GPIO. Assim, os requisitos de recursos para esses drivers de dispositivo podem ser especificados no firmware da plataforma.
Quando o firmware da plataforma designa um conjunto de pinos GPIO como um recurso de E/S GPIO, o firmware indica se os pinos neste recurso podem ser abertos para leituras, gravações ou para leituras e gravações.
Se um driver de dispositivo periférico usa mais de um recurso de E/S GPIO, esse driver deve 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 independentemente e em momentos separados, o firmware da plataforma deve descrever cada pino como um recurso de E/S GPIO separado. O gerenciador PnP enumera esses recursos na ordem em que 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, uma solicitação de IOCTL_GPIO_READ_PINS ou IOCTL_GPIO_WRITE_PINS que esse driver envia para essa conexão acessa todos os pinos no recurso. Se, às vezes, o driver 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 pedidos IOCTL_GPIO_READ_PINS, incluindo o mapeamento dos pinos de entrada de dados para os bits no buffer de saída da solicitação, consulte IOCTL_GPIO_READ_PINS. Para mais informações sobre os pedidos IOCTL_GPIO_WRITE_PINS, incluindo o mapeamento dos bits no buffer de entrada do pedido para os pinos de saída de dados, consulte IOCTL_GPIO_WRITE_PINS.