Altera Cyclone V - Manejo de interrupciones de Linux y FPGA

Necesito propagar una interrupción desde mi núcleo IP FPGA personalizado al sistema HPS de un DE0_nano_SoC (arquitectura Cyclone V HPS-FPGA) y manejarlo en Linux. He buscado mucho en Google para decir con confianza que este tema no está bien cubierto.


Funcionalidad requerida

El núcleo IP FPGA personalizado establece una señal de interrupción. El HPS registra esta señal ( posiblemente escribe en el núcleo IP de la FPGA personalizada para desactivar la señal de interrupción) y copia algunos bytes de los registros en la FPGA a un programa que se ejecuta en Linux.

La elección de Linux es arbitraria, preferiblemente Angstrom/Yocto, que estoy ejecutando en este momento, pero si FreeRTOS ofreciera una implementación más simple, lo haría.


Mis suposiciones (por favor, corríjame si es incorrecto)

1) El controlador de interrupción en el HPS reconoce las interrupciones generadas por FPGA, comenzando en el número 73 (hay algunos cambios, pero en principio se asignan con valores constantes).

2) Linux para ARM Cortex A9, puede reconocer interrupciones específicas del proveedor (para diferentes periféricos como I2C0/1/2, UART0/1, etc.).


Pregunta

1) ¿Reconoce Linux las interrupciones del FPGA, asignadas por el controlador de interrupciones HPS?

2) ¿Necesito desarrollar un controlador para que Linux pueda reconocer las interrupciones de FPGA?

3) Esta parece ser una característica bastante importante de toda la arquitectura de Cyclone V. ¿No ha desarrollado Altera tales controladores ya, para manejar interrupciones simples de FPGA a HPS en Linux?

Esto es específico del dispositivo. Mejor publicar esto en forma altera.
@MITURAJ En realidad no es específico del dispositivo. Es específico del sistema operativo.

Respuestas (1)

El puente HPS está diseñado para tomar interrupciones FPGA y alimentarlas al controlador general de interrupciones (GIC) dentro del procesador ARM. En lo que respecta al procesador, las interrupciones del FPGA no son diferentes de las interrupciones de cualquier otra fuente. Al igual que los periféricos I2C o UART, las interrupciones de FPGA invocan la misma respuesta en el GIC.

El kernel de Linux ya se ha personalizado para el procesador específico y el controlador de interrupciones. El kernel ya sabe cómo reaccionar ante una interrupción: simplemente ejecuta cualquier controlador de interrupción (ISR) que haya configurado el kernel para manejar una interrupción específica. En el caso de una fuente de interrupción que no tenga configurado un controlador, es probable que tenga un controlador predeterminado que elimine silenciosamente la interrupción (probablemente simplemente ignorándola).

Entonces, ¿cómo lo manejas? De la misma manera que se maneja cualquier otra interrupción: un controlador. Debe proporcionar algún código, software de controlador, que registre un controlador de interrupción para la fuente de interrupción específica. Por ejemplo, ya se proporcionan controladores para los periféricos I2C y UART, estos tendrán controladores de interrupción.

Hay muchos documentos útiles en Internet para el manejo de controladores, una búsqueda rápida en Google encontró esto que parece bastante bueno. A partir de ahí, podemos ver que todas las interrupciones tienen un número, cuyos controladores se pueden ver ejecutando el comando cat /proc/interrupts. En su caso, no verá nada para la interrupción número 73 (la primera interrupción de FPGA) ya que no hay un controlador configurado para manejarla.

TL;RD; Necesita escribir un controlador de Linux. No hay nada especial que deba hacerse para tener en cuenta el hecho de que la interrupción proviene de la FPGA, de la que el puente HPS ya se ocupa en el hardware.

Sospecho que está pasando por alto la parte más difícil de todo esto: las actualizaciones del árbol de dispositivos que deberán realizarse para que el kernel sepa qué está conectado a qué interrupción, qué rangos de memoria se utilizan o la configuración general del bus para que pueda puede acceder al hardware del lado FPGA.
@akohlsmith muy posiblemente, pero mi respuesta no pretende ser un manual de instrucciones completo, ya que el "cómo" de escribir un controlador dependerá de mucha información que no se proporciona en la pregunta. El punto clave es que pasar de FPGA a HPS ya está solucionado en el hardware, por lo que escribir un controlador para un periférico en el FPGA no es diferente de cualquier periférico mapeado en memoria (por ejemplo, un dispositivo PCIe).
Exactamente, mi punto era que el controlador del dispositivo es la parte fácil. Devicetree ha vuelto locos a muchos piratas informáticos del kernel.