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.
Os drivers de controlador GPIO podem chamar os métodos GPIO_CLX_AcquireInterruptLock e GPIO_CLX_ReleaseInterruptLock para adquirir e liberar bloqueios de interrupção que são implementados internamente pela extensão de estrutura GPIO (GpioClx). O código do driver que é executado em IRQL = PASSIVE_LEVEL pode chamar esses métodos para sincronizar com a rotina de serviço de interrupção (ISR) no GpioClx. O GpioClx dedica um bloqueio de interrupção separado para cada banco de pinos no controlador GPIO.
Se os registos de hardware do controlador GPIO estão mapeados em memória, o ISR no GpioClx chama determinadas funções de retorno de chamada de evento implementadas pelo driver no nível DIRQL; o GpioClx chama o restante das funções de retorno de chamada no nível PASSIVE_LEVEL. Uma função de retorno de chamada de nível passivo que acessa um banco de registradores pode precisar usar um bloqueio de interrupção para sincronizar com funções de retorno de chamada que são executadas no DIRQL e que acessam os mesmos registros.
Por exemplo, as funções de retorno de chamada de nível passivo CLIENT_EnableInterrupt e CLIENT_DisableInterrupt modificam as configurações de hardware que afetam a operação de outras rotinas de retorno de chamada relacionadas a interrupções executadas no DIRQL. As funções CLIENT_EnableInterrupt e CLIENT_DisableInterrupt normalmente usam os bloqueios de interrupção do banco para sincronizar seus acessos ao registro.
O GpioClx serializa automaticamente os callbacks relacionados a interrupções e E/S que ocorrem no DIRQL. O GpioClx adquire o bloqueio de interrupção para o banco de destino antes de chamar uma função de retorno de chamada no DIRQL e libera o bloqueio após o retorno da função. É um erro que uma função de retorno de chamada invocada no DIRQL tente reobter o bloqueio de interrupção do banco chamando GPIO_CLX_AcquireInterruptLock.
Da mesma forma, o GpioClx serializa automaticamente os callbacks que ocorrem no PASSIVE_LEVEL. O GpioClx implementa internamente um bloqueio de espera por banco. O GpioClx adquire o bloqueio de espera para o banco de destino antes de chamar uma função de retorno em PASSIVE_LEVEL e libera o bloqueio quando a função retorna. Para um controlador GPIO mapeado pela memória, o GpioClx gerencia os bloqueios de espera do banco em nome do driver, mas não permite que o driver adquira e libere explicitamente os bloqueios.
No entanto, para um controlador GPIO não mapeado na memória, GPIO_CLX_AcquireInterruptLock e GPIO_CLX_ReleaseInterruptLock adquirem e liberam um bloqueio de espera em vez de um bloqueio de interrupção. O GpioClx implementa um bloqueio de espera separado para cada banco de pinos no controlador GPIO. Como os registos não são mapeados pela memória, todas as funções de retorno de chamada relacionadas a interrupções e E/S são chamadas em PASSIVE_LEVEL para poderem usar solicitações de E/S para acessar os registos através de um barramento serial, como I²C. O GpioClx adquire o bloqueio de espera para o banco de destino antes de chamar uma dessas funções de callback e libera o bloqueio após o retorno da função.
É um erro para uma função de retorno de chamada para um controlador não mapeado na memória tentar readquirir o bloqueio de espera do banco chamando GPIO_CLX_AcquireInterruptLock. No entanto, o código de driver de nível passivo fora das funções de retorno de chamada pode invocar os métodos GPIO_CLX_XxxInterruptLock para sincronizar com as funções de retorno de chamada. Como o GpioClx chama todas as funções de retorno de chamada relacionadas com interrupções e E/S ao nível PASSIVE_LEVEL, os bloqueios de espera do banco substituem eficazmente os bloqueios de interrupção do banco para controladores que não têm mapeamento de memória.
Outra opção para um controlador sem memória mapeada é que o driver do controlador implemente um conjunto de bloqueios de espera. Esses bloqueios de espera podem permitir que as rotinas de retorno de chamada façam mais bloqueios e desbloqueios refinados de recursos compartilhados do que é possível com os bloqueios de espera implementados pelo GpioClx.
Durante a chamada da rotina de retorno CLIENT_QueryControllerBasicInformation, um driver de controlador GPIO informa ao GpioClx se os registos do controlador estão mapeados em memória. Para obter mais informações, consulte a descrição do sinalizador de MemoryMappedController no CLIENT_CONTROLLER_BASIC_INFORMATION.
Para obter mais informações sobre bloqueios de interrupção e bloqueios de espera, consulte Usando bloqueios do Framework.
As tabelas a seguir fornecem informações mais detalhadas sobre quais funções de retorno de chamada são chamadas em DIRQL em vez de em PASSIVE_LEVEL se os registradores estiverem mapeados na memória. As notas que seguem as tabelas explicam quando as funções callback de nível passivo devem usar bloqueios de interrupção.
- Funções de retorno de chamada relacionadas com interrupções
- funções de retorno de chamada ligadas a E/S
- Inicialização e configuração de GPIO e funções de retorno de chamada relacionadas com a configuração
- Funções de callback relacionadas à gestão de energia do GPIO
- Outras funções de retorno de chamada
Funções de retorno de chamada relacionadas a interrupções
Para suportar pinos GPIO configurados como entradas de interrupção, um driver de controlador GPIO implementa um conjunto de funções de retorno de chamada de evento para gerenciar solicitações de interrupção por meio desses pinos. Na tabela a seguir, a coluna do meio indica o IRQL no qual as funções são chamadas se os registros de hardware do controlador GPIO estiverem mapeados na memória. A coluna mais à direita indica o IRQL no qual as funções são chamadas se os registradores não estiverem mapeados na memória e devem ser acessados por meio de um barramento serial.
| Função de retorno de chamada | IRQL se tiver memória mapeada (MemoryMappedController = 1) | IRQL se acessado em série (MemoryMappedController = 0) |
|---|---|---|
PASSIVE_LEVEL (Ver nota 1.) |
PASSIVE_LEVEL (Ver nota 2.) |
|
DIRQL (Ver nota 3.) |
Nível Passivo (Ver nota 4.) |
|
DIRQL (Ver nota 5.) |
DIRQL (Ver nota 6.) |
Notas
O GpioClx não adquire o bloqueio de interrupção bancária antes de chamar essa função de retorno de chamada. A função de retorno de chamada pode adquirir o bloqueio de interrupção bancária, se necessário, para sincronizar acessos de registradores que são compartilhados com funções de retorno de chamada que são executadas no DIRQL.
O GpioClx serializa a chamada para esta função de retorno de chamada juntamente com outras relacionadas a interrupção e E/S, que são invocadas em PASSIVE_LEVEL. Assim, a função de retorno de chamada não deve tentar adquirir o bloqueio de espera do banco.
O GpioClx adquire o bloqueio de interrupção do banco antes de chamar este callback e libera o bloqueio depois que a função for concluída. Assim, a função de retorno de chamada não deve tentar adquirir o bloqueio de interrupção bancária.
O GpioClx serializa a chamada para este callback com outros callbacks relacionados a interrupções e operações de E/S que são chamados em PASSIVE_LEVEL. Assim, a função de retorno de chamada não deve tentar adquirir o bloqueio de espera do banco.
O GpioClx adquire o bloqueio de interrupção do banco antes de invocar essa função callback e libera o bloqueio depois que a função retorna. Assim, a função de retorno de chamada não deve tentar adquirir o bloqueio de interrupção bancária.
O GpioClx não adquire o bloqueio de interrupção bancária antes de chamar essa função de retorno de chamada. O driver do controlador GPIO é responsável por fornecer qualquer sincronização que possa ser necessária.
Funções de retorno de chamada relacionadas a E/S
Para oferecer suporte a pinos GPIO configurados como pinos de E/S de dados, um driver de controlador GPIO implementa um conjunto de funções de retorno de chamada de eventos para gerenciar operações de E/S por meio desses pinos. Na tabela a seguir, a coluna do meio indica o IRQL no qual as funções são chamadas se os registros de hardware do controlador GPIO estiverem mapeados na memória. A coluna mais à direita indica o IRQL no qual as funções são chamadas se os registradores não estiverem mapeados na memória e devem ser acessados por meio de um barramento serial.
| Função de callback | IRQL se a memória mapeada (MemoryMappedController = 1) | IRQL quando acessado em série (MemoryMappedController = 0) |
|---|---|---|
Nível Passivo (Ver nota 1.) |
Nível Passivo (PASSIVE_LEVEL) (Ver nota 2.) |
|
DIRQL (Ver nota 3.) |
PASSIVE_LEVEL (Ver nota 4.) |
Notas
O GpioClx não adquire o bloqueio de interrupção bancária antes de chamar essa função de retorno de chamada. A função de retorno de chamada pode adquirir o bloqueio de interrupção, se necessário, para sincronizar os acessos aos registos que são partilhados com funções de retorno de chamada que são executadas no DIRQL.
O GpioClx serializa a chamada para esta função de retorno com outras funções de retorno relacionadas a interrupções e E/S que são chamadas ao nível PASSIVE_LEVEL. Assim, a função de retorno de chamada não deve tentar adquirir a trava de espera do banco.
O GpioClx adquire o bloqueio de interrupção bancária antes de chamar essa função de retorno de chamada e libera o bloqueio depois que a função retorna. Assim, a função de retorno de chamada não deve tentar adquirir o bloqueio de interrupção bancária.
O GpioClx serializa a chamada para este callback com outros callbacks relacionados a interrupções e às operações de E/S que são chamados em PASSIVE_LEVEL. Assim, a função de retorno de chamada não deve tentar adquirir o bloqueio de espera do banco.
Funções de retorno de chamada relacionadas com a configuração e inicialização de GPIO
Para configurar um controlador GPIO para executar operações de E/S e interrupção, um driver de controlador GPIO implementa um conjunto de funções de retorno de chamada de evento para inicializar o controlador. Na tabela a seguir, a coluna do meio indica o IRQL no qual as funções são chamadas se os registros de hardware do controlador GPIO estiverem mapeados na memória. A coluna mais à direita indica o IRQL no qual as funções são chamadas se os registos não estiverem mapeados na memória e devem ser acedidos por meio de um barramento de série.
| Função de retorno de chamada | IRQL caso a memória esteja mapeada (MemoryMappedController = 1) | IRQL quando acessado em série (MemoryMappedController = 0) |
|---|---|---|
PASSIVE_LEVEL (Ver nota 1.) |
PASSIVE_LEVEL (Ver nota 2.) |
Notas
Quando o GpioClx chama qualquer uma dessas funções de retorno de chamada, os bloqueios de interrupção bancária não estão disponíveis. Assim, essas funções de retorno de chamada não devem tentar adquirir o bloqueio de interrupção bancária.
Os bloqueios de espera do banco GpioClx não estão disponíveis quando essas funções de retorno de chamada são chamadas. Assim, o driver não deve tentar adquirir um bloqueio de espera bancária para sincronizar com essas funções de retorno de chamada.
Funções de retorno de chamada relacionadas ao gerenciamento de energia GPIO
Para permitir que um controlador GPIO altere os estados de energia do dispositivo, um driver de controlador GPIO implementa um conjunto de funções de retorno de chamada de evento para salvar e restaurar as configurações de hardware durante essas alterações. Na tabela a seguir, a coluna do meio indica o IRQL no qual as funções são chamadas se os registros de hardware do controlador GPIO estiverem mapeados na memória. A coluna mais à direita indica o IRQL no qual as funções são chamadas se os registradores não estiverem mapeados na memória e devem ser acessados por meio de um barramento serial.
| Função de callback | IRQL se estiver mapeado na memória (MemoryMappedController = 1) | IRQL quando acedido em série (MemoryMappedController = 0) |
|---|---|---|
DIRQL ou HIGH_LEVEL (Ver Notas.) |
Não suportado. |
Notas
- Para transições regulares de estado F: As funções de retorno de chamada de guardar/restaurar são chamadas com a bloqueio de interrupção do banco de dados mantido pelo GpioClx no DIRQL. Assim, nenhuma das funções de retorno de chamada deve tentar adquirir o bloqueio de interrupção bancária.
- Para transições críticas de estado F: As funções de retorno de chamada para salvamento/restauração são acionadas quando o plug-in do motor de potência (PEP) é utilizado para salvaguardar e restaurar o estado do GPIO. As funções de callback de gravação/restauração são chamadas em ALTO_NÍVEL no contexto do último processador que se torna ocioso, o que ocorre no final da transição para um estado de ociosidade profunda da plataforma. Assim, nenhuma das funções de retorno de chamada deve tentar adquirir o bloqueio de interrupção bancária.
Para obter mais informações sobre Estados F, consulte Component-Level Gestão de Energia. Para obter mais informações sobre o PEP, consulte PoFxPowerControl.
Outras funções de retorno de chamada
Para ativar um controlador GPIO para suportar operações específicas do controlador, um driver do controlador GPIO implementa uma função de retorno de chamada de evento denominada CLIENT_ControllerSpecificFunction. Na tabela a seguir, a coluna do meio indica o IRQL no qual a função é chamada se os registros de hardware do controlador GPIO estiverem mapeados na memória. A coluna mais à direita indica o IRQL no qual a função é chamada se os registos não estiverem mapeados na memória e devem ser acessados através de um barramento serial.
| Função de callback | IRQL se estiver mapeada na memória (MemoryMappedController = 1) | IRQL se acessado em série (MemoryMappedController = 0) |
|---|---|---|
PASSIVE_LEVEL (Ver nota 1.) |
Nível Passivo (Ver nota 2.) |
Notas
O GpioClx não adquire o bloqueio de interrupção bancária antes de chamar essa função de retorno de chamada. A função de retorno de chamada pode adquirir o bloqueio de interrupção bancária, se necessário, para sincronizar acessos de registradores que são compartilhados com funções de retorno de chamada que são executadas no DIRQL.
O GpioClx serializa a chamada para esta função de callback com outras funções de callback relacionadas a interrupções e entrada/saída que são chamadas em PASSIVE_LEVEL. Assim, a função de retorno de chamada não deve tentar adquirir o bloqueio de espera do banco.