Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Os circuitos integrados do SoC (System on a Chip) fazem uso extensivo de pinos de E/S de uso geral (GPIO). Para plataformas baseadas em SoC, o Windows define uma abstração geral para hardware GPIO e essa abstração requer suporte do namespace ACPI (Advanced Configuration and Power Interface).
A abstração do GPIO é compatível com as definições de especificação do ACPI 5.0 listadas neste artigo.
Para verificar se o controlador GPIO atende a todos os requisitos da plataforma Windows, consulte a lista de verificação de requisitos do controlador GPIO.
Dispositivos do controlador GPIO
O Windows dá suporte a controladores GPIO. Os controladores GPIO fornecem uma variedade de funções para dispositivos periféricos, incluindo interrupções, sinalização de entrada e sinalização de saída. Os recursos de GPIO são modelados como um dispositivo controlador GPIO no namespace. A extensão da estrutura gpio (GpioClx) modela o dispositivo controlador GPIO como sendo particionado em alguns bancos de pinos. Cada banco de pinos tem 64 ou menos pinos configuráveis. Os bancos em um controlador GPIO são ordenados em relação à posição de seus pinos dentro do espaço de pinos GPIO, relativo ao controlador. Por exemplo, o banco 0 contém pinos 0-31 no controlador, o banco 1 contém pinos 32-63 e assim por diante. Todos os bancos têm o mesmo número de pinos, exceto o último banco, que pode ter menos. Os bancos têm importância para o firmware ACPI porque o firmware deve informar o mapeamento de recursos de interrupção do sistema para os bancos, conforme descrito na seção objetos de namespace GPIO abaixo.
Cada pino em um banco tem um conjunto de parâmetros (por exemplo, saída, interrupção sensível ao nível, entrada desativada e assim por diante) que descrevem como o pino deve ser configurado.
Controladores GPIO e interrupções do ActiveBoth
Um recurso de alguns controladores GPIO é a capacidade de gerar interrupções em ambas as bordas de um sinal (bordas de subida ou ActiveHigh e bordas de descida ou ActiveLow). Isso é útil em uma variedade de aplicativos, incluindo a interface do botão, em que eventos de pressionamento de botão (uma borda) e eventos de liberação de botão (a borda oposta) são significativos. Esse recurso é conhecido como "ActiveBoth".
Logicamente, os sinais ActiveBoth têm tanto um estado afirmado quanto não afirmado, sejam eles afirmações momentâneas (por exemplo, botões de pressão) ou afirmações indefinidamente longas (por exemplo, inserções de plugues de fone de ouvido). A detecção de borda para interrupções ActiveBoth pode ser implementada no hardware do controlador GPIO (ActiveBoth de hardware) ou ser emulada no software do driver GPIO (ActiveBoth emulado). O Windows exige que os controladores GPIO que implementam o ActiveBoth usem o ActiveBoth emulado. Isso é necessário para garantir uma manipulação robusta de interrupções de borda dupla para todos os cenários. No suporte à emulação do ActiveBoth, os seguintes requisitos de hardware se aplicam:
Os controladores GPIO que suportam interrupções ActiveBoth devem também suportar interrupções no modo de nível e devem suportar a reprogramação da polaridade da interrupção dinamicamente em tempo de execução.
Para minimizar o risco de erros de E/S, o Windows prefere o uso de controladores GPIO mapeados pela memória em vez de controladores GPIO conectados a SPB. Na verdade, para o dispositivo Windows Button Array (PNP0C40), é necessário que as interrupções GPIO ActiveBoth para esse dispositivo se conectem a um controlador GPIO mapeado em memória, e não a um conectado via SPB. Para determinar quais interrupções de botão devem ser configuradas como ActiveBoth, veja a seção Dispositivos de botão no tópico Outros objetos de namespace ACPI.
Para estabelecer um estado inicial determinístico para sinais de interrupção ActiveBoth, a pilha de dispositivos GPIO do Windows garante que a primeira interrupção gerada após a conexão da interrupção pelo driver sempre será para o estado declarado do sinal. A pilha também assume que, por padrão, o estado declarado de todas as linhas de interrupção do ActiveBoth é de nível lógico baixo (a borda ActiveLow). Se esse não for o caso em sua plataforma, você poderá substituir o padrão incluindo o método Device-Specific do controlador GPIO (_DSM) no namespace do controlador. Para obter mais informações sobre esse método, consulte o Método Device-Specific do Controlador gpio (_DSM).
O terceiro requisito na lista anterior implica que o driver de um dispositivo que usa ActiveBoth poderá receber uma interrupção imediatamente após inicializar (conectar-se a) a interrupção, se o sinal no pino GPIO estiver no estado declarado no momento. Isso é possível e até provável para alguns dispositivos (por exemplo, fones de ouvido) e deve ter suporte no driver.
Para dar suporte ao ActiveBoth emulado, o driver do controlador GPIO deve habilitar ("optar por") a emulação ActiveBoth implementando uma função de retorno de chamada CLIENT_ReconfigureInterrupt e definindo o sinalizador EmulateActiveBoth na estrutura de informações básica que a função de retorno de chamada CLIENT_QueryControllerBasicInformation do driver fornece ao GpioClx. Para obter mais informações, consulte General-Purpose drivers de E/S (GPIO).
Objetos de namespace gpio
Os controladores GPIO e os periféricos que se conectam a eles são enumerados pelo ACPI. A conexão entre eles é descrita usando descritores de recurso de conexão GPIO. Para obter mais informações, consulte a seção 6.4.3.8, "Descritores de conexão", da especificação ACPI 5.0.
Objetos de configuração e identificação do dispositivo
O namespace ACPI de um dispositivo controlador GPIO inclui o seguinte:
- Um objeto de ID de Hardware compatível com ACPI (_HID) atribuído pelo fornecedor.
- Um objeto de conjunto de recursos consumidos (_CRS).
- Um objeto ID Exclusivo (_UID), se houver mais de uma instância do controlador GPIO no namespace (isto é, dois ou mais nós de namespace que têm os mesmos objetos de identificação do dispositivo).
O registro _CRS do controlador GPIO inclui todos os recursos (espaço de endereço para registros, interrupções do sistema e assim por diante) utilizados por todos os bancos do controlador GPIO. O mapeamento dos recursos de interrupção para bancos é representado pela ordem em que os recursos de interrupção são listados no _CRS, isto é, a primeira interrupção listada é atribuída ao banco 0, a próxima listada é atribuída ao banco 1 e assim por diante. Os bancos podem compartilhar recursos de interrupção, caso em que a interrupção é listada uma vez para cada banco conectado a ele, em ordem bancária, e é configurada como Compartilhada.
Descritores de recursos de conexão GPIO
A relação entre periféricos e os pinos gpio aos quais eles estão conectados é descrita ao sistema operacional por descritores de recursos de conexão GPIO. Esses descritores de recurso podem definir dois tipos de Conexões GPIO: conexões de interrupção gpio e conexões de E/S gpio. Os periféricos incluem descritores de conexão GPIO em seus _CRS para todas as E/S de GPIO e pinos de interrupção conectados. Se uma interrupção conectada for capaz de acordar o sistema de um estado ocioso de baixa potência, ela deverá ser configurada como ExclusiveAndWake ou SharedAndWake. Para obter mais informações, consulte Gerenciamento de Energia do Dispositivo.
Os descritores são definidos na seção 6.4.3.8.1, "Descritor de Conexão GPIO", da especificação ACPI 5.0. As macros de modelo de recurso ASL para esses descritores são descritas na seção 19.5.53, "GpioInt (GPIO Interrupt Connection Resource Descriptor Macro)", da especificação ACPI 5.0.
Eventos ACPI sinalizados por GPIO
A ACPI define um modelo de evento de plataforma que permite que os eventos de hardware na plataforma sejam sinalizados e comunicados ao driver ACPI. O Windows fornece um serviço de notificação para comunicar eventos de plataforma a drivers de dispositivo. Vários drivers de caixa de entrada dependem desse serviço para fornecer suporte para dispositivos definidos por ACPI, como Botão de Energia do Método de Controle, dispositivo LID, Bateria do Método de Controle, Zona Térmica e assim por diante. Para obter mais informações sobre notificações, consulte a seção 5.6.5, "GPIO-Signaled Eventos ACPI", da especificação ACPI.
Para plataformas SoC, as interrupções de GPIO são usadas para sinalizar eventos de plataforma. Qualquer dispositivo de namespace (dispositivo "Fonte de Evento ACPI") que sinaliza eventos para seu driver usando o operador Notify do ASL requer o seguinte:
O nó de namespace do controlador GPIO ao qual o sinal de evento ACPI está conectado deve incluir um recurso GpioInt para esse pino em seu objeto ACPI Event Information (_AEI) (consulte a seção 2.4.2.3.1, "ACPI Event Information (_AEI) Object", abaixo). O recurso GpioInt deve ser configurado como não compartilhado (Exclusivo).
O nó do controlador também deve conter um método de controle Edge (_Exx), Level (_Lxx) ou Event (_EVT) para cada pin listado no objeto _AEI.
O driver ACPI gerencia a interrupção GPIO listada e avalia a metodologia de controle de Borda, Nível ou Evento para a interrupção. O método de controle acalma o evento de hardware, se necessário, e executa o operador Notify necessário no nó de namespace do dispositivo fonte do evento. Em seguida, o Windows envia a notificação para o driver do dispositivo. Vários eventos poderão ser sinalizados pelo mesmo recurso GpioInt se o método de controle de evento puder consultar o hardware para determinar qual evento ocorreu. Em seguida, o método deve notificar o dispositivo correto com o código de notificação correto.
Objeto ACPI Event Information (_AEI) Conforme mencionado anteriormente, o namespace do controlador GPIO deve conter o objeto _AEI para dar suporte a eventos ACPI. O objeto _AEI (consulte a seção 5.6.5.2 na especificação ACPI 5.0) retorna um buffer de Modelo de Recurso contendo apenas descritores GpioInt que sinalizam eventos ACPI por meio desse controlador GPIO. Cada descritor corresponde a um dispositivo de origem de evento ACPI e é dedicado a esse dispositivo (não compartilhado entre dispositivos).
Regiões de operação GeneralPurposeIO (OpRegions)
Os controladores GPIO geralmente são usados pelo firmware de plataforma para dar suporte a vários recursos de hardware de plataforma, como controlar a energia e relógios ou definir modos em dispositivos. Para dar suporte ao uso de GPIO em métodos de controle ASL, o ACPI 5.0 define um novo tipo de OpRegion, "GeneralPurposeIO".
As OpRegions GeneralPurposeIO (consulte a seção 5.5.2.4.4 da especificação ACPI 5.0) são declaradas dentro do escopo do namespace do dispositivo controlador GPIO cujo driver manipulará a E/S. As declarações de campo GeneralPurposeIO (consulte a seção 5.5.2.4.4.1 da especificação ACPI 5.0) atribuem nomes a pinos GPIO que devem ser acessados em uma OpRegion GeneralPurposeIO. Os Recursos de Conexão gpioIO (consulte a seção 19.5.53 da especificação ACPI 5.0) são usados na declaração Field para especificar os números de pino e a configuração para uma referência de campo específica. O número total de bits de campo nomeados após um descritor de conexão deve ser igual ao número de pinos listados no descritor.
Os campos em uma OpRegion podem ser declarados em qualquer lugar no namespace e acessados de qualquer método no namespace. A direção dos acessos a um GeneralPurposeIO OpRegion é determinada pelo primeiro acesso (leitura ou gravação) e não pode ser alterada.
Como o acesso à OpRegion é fornecido pelo driver de dispositivo do controlador GPIO (o "Gerenciador OpRegion"), é importante que os métodos evitem acessar uma OpRegion até que o driver esteja disponível. O código ASL pode acompanhar o estado do manipulador OpRegion incluindo um método Region (_REG) no dispositivo controlador GPIO (consulte a seção 6.5.4 da especificação ACPI 5.0). Além disso, o objeto OpRegion Dependencies (_DEP) (consulte a seção 6.5.8 da especificação ACPI 5.0) pode ser usado em qualquer dispositivo que tenha um método acessando campos OpRegion GPIO, se necessário. Consulte a seção Dependências do dispositivo no tópico objetos de namespace de gerenciamento de dispositivos para uma discussão sobre quando usar _DEP. É importante que aos drivers não sejam atribuídos recursos de E/S GPIO que também são atribuídos a OpRegions GeneralPurposeIO. As opregions são para o uso exclusivo de métodos de controle ASL.