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 gpioclx (extensão de estrutura gpio). 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 na memória que podem ser acessados diretamente pelo processador no chip soc. No entanto, um dispositivo controlador GPIO separado pode estar 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 integrada 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 GPIO for mapeado pela memória, o driver do controlador GPIO poderá acessar diretamente os registros de hardware do controlador em 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 ISRs de nível passivo.

O driver de um controlador GPIO que tem registros de hardware mapeados em memória deve definir o bit de sinalizador MemoryMappedController nas informações do dispositivo que o driver fornece a GpioClx. Caso contrário, GpioClx pressupõe que os registros de hardware não sejam mapeados pela memória e que o driver possa acessar esses registros somente em IRQL = 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 às 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_QueryEnabledInterrupts CLIENT_UnmaskInterrupt Essas funções são chamadas em DIRQL ou PASSIVE_LEVEL, dependendo se o ISR em 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 da estrutura GPIO chama as seguintes funções de retorno de chamada relacionadas à interrupção somente em PASSIVE_LEVEL, independentemente de o sinalizador MemoryMappedController ser definido:

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 em 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 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 do 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 em tempo hábil, o driver deve manter o bloqueio de interrupção por não mais do que o necessário.

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