Pergunta

Estou trabalhando com a árvore de dispositivos do kernel Linux e, à primeira vista, parece haver uma funcionalidade ausente para nós com vários pais de interrupção.Eu tenho um driver que está controlando uma placa embarcada ARM personalizada, ele usa GPIOs e interrupções de pinos de vários pais de interrupção GPIO e gerencia a bateria integrada, irqs de baixa tensão, irq reset_pending, etc.

Encontrei uma fonte onde alguém parece ter hackeado funcionalidades adicionais para lidar com isso, mas isso não é oficial e envolve a modificação dos arquivos de origem de interrupção que eu não quero.A modificação adicionou suporte para um termo chamado “interrupções estendidas” como este.Aqui o pai da interrupção é especificado nas tuplas.

    #interrupt-cells = <2>;
    interrupts-extended = <&gpio3 21 1>, <&gpio7 13 2>; /* voltage/reset irq */

Não encontrei nenhum meio ou exemplo de como usar a propriedade interrupt-map para obter um mapeamento simples de interrupção gpio, por isso estou perdido.

Se eu estivesse usando apenas um único pai de interrupção GPIO, a maneira correta de fazer isso seria assim.

interrupt-parent = <&gpio1>;
interrupts = <9 2>, <8,1>;

mas isso só permite declarar um interrupção pai com múltiplas interrupções especificadas em "interrupções" e todas elas devem pertencer ao pai especificado.Estou usando 2 pais de interrupção, gpio7 e gpio3.

Qual é a maneira correta de implementar múltiplas interrupções com diferentes pais de interrupção em um único nó de dispositivo na árvore de dispositivos?

Foi útil?

Solução

Não sei se isso funciona para pais de interrupção gpio, mas para outros tipos de controladores de interrupção, você usa a propriedade 'mapa de interrupção' e especifica a lista de interrupções usando phandles para cada um dos controladores separados.Aqui está um exemplo que vi onde o driver precisava de 3 interrupções, 2 do controlador 'intc' e 1 do controlador 'spmi':

interrupts = <0 1 2>;
interrupt-map = <0 &intc 0 134 0
                 1 &intc 0 140 0
                 2 &spmi 0 0x9 0 0>;
interrupt-names = "core_irq", "async_irq", "pmic_id_irq";
interrupt-map-mask = <0 0 0 0>;

Neste exemplo, o nó intc tinha um valor #interrupt-cells de <3> e o nó spmi tinha um valor #interrupt-cells de 4 (o que significa que muitos argumentos precisavam ser usados ​​com seus respectivos phandles).

O campo de nomes de interrupções é opcional, mas permite solicitar o irq por nome em vez de por número no código (ou seja, use platform_get_irq_byname(), em vez de platform_get_irq() )

Para ser honesto, não tenho certeza para que serve a máscara de mapa de interrupção.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top