GPIO (E/S de uso geral)
Os circuitos integrados do SoC (Sistema em um Chip) fazem uso extensivo de pinos de GPIO (E/S de uso geral). 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 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. As funcionalidades do GPIO são modeladas como um dispositivo controlador GPIO no namespace . A gpioClx ( extensão de estrutura gpio ) 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 pino 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 são significativos para o firmware acpi porque o firmware deve relatar o mapeamento de recursos de interrupção do sistema para 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 (aumento ou bordas ActiveHigh e queda ou bordas 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 um estado declarado e não inserido, sejam declarações momentâneas (por exemplo, botões de push) ou declarações longas indefinidamente (por exemplo, inserções de entrada de fone de ouvido). A detecção de borda para interrupções do ActiveBoth pode ser implementada no hardware do controlador GPIO (ActiveBoth de hardware) ou ser emulada no software de driver GPIO (ActiveBoth emulado). O Windows exige que os controladores GPIO que implementam o ActiveBoth precisem usar o ActiveBoth emulado. Isso é necessário para garantir uma manipulação robusta de interrupções de dois gumes para todos os cenários. Para dar suporte à emulação do ActiveBoth, os seguintes requisitos de hardware se aplicam:
Os controladores GPIO que dão suporte a interrupções ActiveBoth devem dar suporte a interrupções no modo de nível e devem dar suporte à reprogramação da polaridade da interrupção dinamicamente em runtime.
Para minimizar o risco de erros de E/S, o Windows prefere o uso de controladores GPIO mapeados em memória em vez de controladores GPIO conectados a SPB. Na verdade, para o dispositivo PNP0C40 (Windows Button Array), é necessário que o GPIO ActiveBoth interrompa para esse dispositivo conectar-se a um controlador GPIO mapeado em memória e não a um conectado a SPB. Para determinar quais interrupções de botão devem ser ActiveBoth, consulte 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 pressupõe ainda que o estado declarado de todas as linhas de interrupção do ActiveBoth seja o nível lógico baixo (a borda ActiveLow) por padrão. 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 Método de Device-Specific do Controlador GPIO (_DSM).
O terceiro requisito na lista anterior implica que o driver de um dispositivo que usa ActiveBoth pode 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é mesmo 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 ("aceitar") 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ásicas que a função de retorno de chamada CLIENT_QueryControllerBasicInformation do driver fornece para GpioClx. Para obter mais informações, consulte Drivers de E/S de uso geral (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 identificação e configuração do dispositivo
O namespace ACPI de um dispositivo controlador GPIO inclui o seguinte:
- Um objeto de ID de Hardware (_HID) compatível com ACPI atribuído pelo fornecedor.
- Um conjunto de recursos consumidos (_CRS).
- Um objeto ID exclusiva (_UID), se houver mais de uma instância do controlador GPIO no namespace (ou seja, dois ou mais nós de namespace que têm os mesmos objetos de identificação do dispositivo).
A _CRS do controlador GPIO contém todos os recursos (espaço de endereço para registros, interrupções do sistema e assim por diante) consumidos por todos os bancos no controlador GPIO. O mapeamento de recursos de interrupção para banco é representado na ordem em que os recursos de interrupção são listados no _CRS , ou seja, 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 Compartilhado.
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 recurso de conexão GPIO. Esses descritores de recursos 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 gpio e pinos de interrupção conectados. Se uma interrupção conectada for capaz de ativar (capaz de ativar 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 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 aos drivers de dispositivo. Vários drivers de caixa de entrada dependem desse serviço para dar suporte a 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 ACPI Events", da especificação acpi.
Para plataformas SoC, as interrupções de GPIO são usadas para sinalizar eventos de plataforma. Qualquer dispositivo de namespace ("Origem do Evento ACPI" que sinaliza eventos para seu driver usando o operador notificar 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 pino listado no objeto _AEI.
O driver ACPI manipula a interrupção de GPIO listada e avalia o método de controle Edge, Level ou Event para ele. O método de controle impede o evento de hardware, se necessário, e executa o operador Notify necessário no nó do namespace do dispositivo de origem 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 que contém 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 qualquer número de recursos de hardware de plataforma, como controlar energia e relógios ou definir modos em dispositivos. Para dar suporte ao uso de E/S gpio de métodos de controle ASL, o ACPI 5.0 define um novo tipo OpRegion, "GeneralPurposeIO".
GeneralPurposeIO OpRegions (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 um GeneralPurposeIO OpRegion. 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 "Manipulador opRegion"), os métodos devem ter cuidado para não 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 do GPIO, se necessário. Consulte a seção Dependências do dispositivo no tópico Objetos de namespace de gerenciamento de dispositivos para obter uma discussão sobre quando usar _DEP. É importante que os drivers não sejam atribuídos a recursos de E/S gpio que também são atribuídos a GeneralPurposeIO OpRegions. Opregions são para o uso exclusivo de métodos de controle ASL.