Compartilhar via


retornos de chamada Interrupt-Related

Como opção, o driver para um controlador de E/S de uso geral (GPIO) pode fornecer suporte para interrupções de GPIO. Para dar suporte a interrupções de GPIO, um driver de controlador GPIO implementa um conjunto de funções de retorno de chamada para gerenciar essas interrupções. O driver inclui ponteiros para essas funções de retorno de chamada no pacote de registro fornecido pelo driver quando ele se registra como um cliente da extensão do framework GPIO (GpioClx). Para obter mais informações sobre esse pacote de registro, consulte GPIO_CLIENT_REGISTRATION_PACKET.

Como regra, um controlador GPIO que é uma parte integrada de um chip SoC (System on a Chip) tem registros de hardware mapeados pela memória que podem ser acessados diretamente pelo processador no chip SoC. No entanto, um dispositivo controlador GPIO separado pode ser conectado externamente ao chip SoC por meio de um barramento serial, conforme mostrado no diagrama a seguir.

um controlador gpio integrado e um controlador gpio externo.

Neste diagrama, o controlador GPIO externo está conectado a um barramento I²C. Esse barramento é controlado por um controlador de barramento I²C, que é uma parte integrante do chip SoC. A linha de solicitação de interrupção do controlador GPIO externo está conectada a um pino no controlador GPIO integrado. O DDI gpioClx pode acomodar o controlador GPIO integrado e o controlador GPIO externo neste exemplo.

Se um dispositivo controlador de GPIO for mapeado em memória, o driver do controlador GPIO poderá acessar diretamente os registros de hardware do controlador no DIRQL. No entanto, se o controlador GPIO estiver conectado serialmente, o driver do controlador GPIO poderá acessar os registros de hardware somente em IRQL = PASSIVE_LEVEL, conforme discutido em ISRsPassive-Level.

O driver de um controlador GPIO que tem registros de hardware mapeados pela memória deve definir o bit de sinalizador MemoryMappedController nas informações do dispositivo que o driver fornece ao GpioClx. Caso contrário, o GpioClx pressupõe que os registros de hardware não estão mapeados na memória e que o driver pode acessar esses registros apenas em nível IRQL igual a PASSIVE_LEVEL. Para obter mais informações sobre esse bit de sinalizador, consulte CONTROLLER_ATTRIBUTE_FLAGS.

O GpioClx implementa uma ISR (rotina de serviço de interrupção) para atender solicitações de interrupção do controlador GPIO. Esse ISR chama as seguintes funções de retorno de chamada relacionadas à interrupção:

CLIENT_ClearActiveInterruptsCLIENT_MaskInterruptsCLIENT_QueryActiveInterruptsCLIENT_QueryEnabledInterruptsCLIENT_UnmaskInterrupt Essas funções são chamadas em DIRQL ou PASSIVE_LEVEL, dependendo se o ISR no GpioClx é executado em DIRQL ou PASSIVE_LEVEL. O ISR chama essas funções em DIRQL se MemoryMappedController = 1 e em PASSIVE_LEVEL se MemoryMappedController = 0. Em ambos os casos, o ISR serializa automaticamente seus retornos de chamada para que uma chamada a uma dessas funções não ocorra no meio de uma chamada para outra dessas funções.

A extensão do framework GPIO chama as seguintes funções de callback relacionadas à interrupção somente no nível PASSIVE_LEVEL, independentemente de o sinalizador MemoryMappedController estar ativado:

CLIENT_DisableInterruptCLIENT_EnableInterrupt Se o sinalizador MemoryMappedController não estiver definido, todas as funções de retorno de chamada relacionadas à interrupção serão chamadas em PASSIVE_LEVEL. O GpioClx serializa automaticamente chamadas para essas funções para que uma chamada a uma dessas funções não ocorra no meio de uma chamada para outra dessas funções.

No entanto, se o sinalizador MemoryMappedController estiver definido, as funções CLIENT_EnableInterrupt e CLIENT_DisableInterrupt deverão sincronizar explicitamente suas operações de habilitação e desabilitação de interrupção com o ISR gpioClx, que chama as outras quatro funções de retorno de chamada relacionadas à interrupção no DIRQL.

Normalmente, as outras funções de retorno de chamada CLIENT_Xxx (cujos nomes não contêm "Interrupção") não executam o processamento relacionado à interrupção e, portanto, não precisam ser sincronizadas com o ISR gpioClx. No entanto, se qualquer uma dessas funções for chamada em PASSIVE_LEVEL e contiver um código que acesse as configurações de interrupção acessadas por funções relacionadas à interrupção no DIRQL, esse código deverá ser sincronizado com o ISR.

Para dar suporte à sincronização de interrupção, o GpioClx implementa um conjunto de bloqueios de interrupção. Uma função de retorno de chamada executada em PASSIVE_LEVEL pode chamar o método GPIO_CLX_AcquireInterruptLock para adquirir um bloqueio de interrupção e chamar o método GPIO_CLX_ReleaseInterruptLock para liberar o bloqueio. Quando a função mantém o bloqueio de interrupção, o ISR GpioClx não pode ser executado e esse ISR não pode chamar nenhuma função de retorno de chamada relacionada à interrupção. Para permitir que as interrupções de GPIO sejam tratadas de forma oportuna, o driver deve manter a trava de interrupção por não mais tempo do que o necessário.

Para obter mais informações, consulte sincronização de interrupção para drivers de controlador gpio.