Compartilhar via


Particionando um controlador GPIO em bancos de pinos

Um desenvolvedor de driver pode, como opção, particionar um dispositivo de controlador gpio (E/S de uso geral) em dois ou mais bancos de pinos GPIO. Por exemplo, um dispositivo controlador GPIO que tem 64 pinos GPIO pode ser descrito pelo driver do controlador GPIO como dois bancos, cada um com 32 pinos GPIO. O desenvolvedor pode fornecer um único driver para gerenciar todos os bancos em um dispositivo controlador GPIO, e esse driver normalmente usa um objeto de dispositivo para representar todo o dispositivo. No entanto, alguns ou todos os bancos no dispositivo podem ser gerenciados independentemente dos outros bancos no dispositivo.

Normalmente, um driver de controlador GPIO opta por particionar um controlador GPIO em dois ou mais bancos por um dos seguintes motivos:

  • O estado de energia dos pinos gpio em um banco pode ser gerenciado independentemente dos pinos nos outros bancos.
  • O número total de pinos no controlador GPIO é maior que 64.

O tamanho máximo do banco compatível com a extensão da estrutura GPIO (GpioClx) é de 64 pinos. Um dispositivo controlador gpio que contém mais de 64 pinos deve ser particionado pelo driver em dois ou mais bancos, cada um dos quais não contém mais de 64 pinos.

Para determinar como um controlador GPIO é particionado em bancos, o GpioClx chama a função de retorno de chamada de evento CLIENT_QueryControllerBasicInformation. Essa função, que é implementada pelo driver do controlador GPIO, fornece uma estrutura CLIENT_CONTROLLER_BASIC_INFORMATION que descreve os atributos e os recursos do controlador GPIO. Dois membros dessa estrutura, TotalPins e NumberOfPinsPerBank, especificam como os pinos no controlador GPIO são particionados em bancos. TotalPins especifica o número total de pinos no controlador GPIO e NumberOfPinsPerBank especifica o número de pinos por banco. Se N for o número de bancos no controlador, os bancos serão numerados de 0 a N-1. Todos, exceto o último banco (ou seja, número de banco N–1) devem conter o número de pinos especificados no membro NumberOfPinsPerBank . O último banco pode ter qualquer número de pinos de um para NumberOfPinsPerBank.

GpioClx determina o número total de bancos no controlador GPIO dos valores dos membros TotalPins e NumberOfPinsPerBank . O GpioClx usa a seguinte fórmula de inteiro para calcular o número total de bancos:

(TotalPins + NumberOfPinsPerBank – 1) / NumberOfPinsPerBank Em alguns dispositivos de controlador GPIO, um banco de pinos em um dispositivo pode ser ativado ou alternado para um estado de baixa potência independentemente dos outros bancos no mesmo dispositivo. Assim, quando um banco específico está ocioso, esse banco pode ser alternado para um estado de baixa potência para reduzir o consumo de energia. Para acomodar esses dispositivos, o GpioClx dá suporte ao gerenciamento de energia no nível do componente. GpioClx define dois estados de potência no nível de componente, F0 (totalmente ativado) e F1 (baixa potência ou desativado).

Para determinar se um banco de pinos GPIO dá suporte ao gerenciamento de energia no nível do componente, o GpioClx chama a função de retorno de chamada de evento CLIENT_QuerySetControllerInformation . O parâmetro InputBuffer dessa função é um ponteiro para uma estrutura CLIENT_CONTROLLER_QUERY_SET_INFORMATION_INPUT . Para solicitar informações de gerenciamento de energia, o chamador define o membro RequestType dessa estrutura como QueryBankPowerInformation.

Se um banco GPIO der suporte ao gerenciamento de energia no nível de componente, o GpioClx habilitará uma transição para o estado de energia F1 quando o banco estiver ocioso. Antes de o banco entrar no estado F1, o GpioClx chama a função de retorno de chamada de evento CLIENT_SaveBankHardwareContext para instruir o driver a salvar o contexto de hardware (principalmente, o conteúdo do registro) do banco. Posteriormente, depois que o banco entra no estado F0, o GpioClx chama a função de retorno de chamada de evento CLIENT_RestoreBankHardwareContext para informar ao driver para restaurar o contexto de hardware salvo anteriormente.