Pregunta

Estoy trabajando con el árbol de dispositivos de kernel de Linux y a primera vista parece haber una funcionalidad perdida para los nodos con múltiples padres de interrupción. Tengo un controlador que está controlando una placa integrada por el brazo personalizado, se necesitan GPIOS y las interrupciones PIN de múltiples padres de interrupción de GPIO y administra la batería a bordo, la voltaje baja IRQS, RESET_PENDING IRQ, etc.

He encontrado una fuente donde alguien parece haber hackeado una funcionalidad adicional para lidiar con esto, pero eso no es oficial e implica modificar los archivos de origen de interrupción que no quiero. La modificación agregó soporte para un término llamado "interrupciones, extendido" como este. Aquí el padre de interrupción se especifica en las tuplas.

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

No he encontrado ningún medio o ejemplo de cómo usar la propiedad de mapas de interrupción para lograr un mapeo de interrupciones de GPIO simple, por lo que estoy perdido allí.

Si solo estuve usando un solo padre de interrupción de GPIO, la forma correcta de hacerlo sería así.

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

Pero eso solo permite declarar uno interrupción de padres con múltiples interrupciones especificadas en "interrupciones" y todos deben pertenecer a los padres especificados. Estoy usando 2 padres de interrupción, GPIO7 y GPIO3.

¿Cuál es la forma correcta de implementar múltiples interrupciones con diferentes padres de interrupción en un solo nodo de dispositivo en el árbol del dispositivo?

¿Fue útil?

Solución

No sé si esto funciona para los padres de interrupción de la GPIO, pero para otros tipos de controladores de interrupción, utiliza la propiedad 'Mapa de interrupciones', y especifica la lista de interrupciones usando Phandeles a cada uno de los controladores separados.Aquí hay un ejemplo que vi donde el conductor necesitaba 3 interrupciones, 2 del controlador 'Intc' y 1 del 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>;

En este ejemplo, el nodo INTC tenía un valor de Células-células # de # <3> y el nodo SPMI tuvo un valor de # Celdas de interrupción de 4 (lo que significa que se necesitan muchos argumentos que deben usarse con sus respectivas fichas).

El campo de nombres de interrupción es opcional, pero le permite solicitar el nombre de IRQ por nombre en lugar de por número en el código (es decir, use Platform_Get_irq_byName (), en lugar de Platform_Get_irq ())

Para ser honesto, estoy un poco inseguro para lo que se usa la máscara de interrupción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top