Altera Cyclone V - Manejo de interrupciones de Linux y FPGA

5

Necesito propagar una interrupción de mi núcleo de IP FPGA personalizado al sistema HPS de un DE0_nano_SoC (arquitectura del ciclón V HPS-FPGA) y manejar en Linux. He buscado bastante 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 de IP de FPGA personalizado para anular la confirmación de la señal de interrupción) y copia unos pocos bytes de los registros en el 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 el FreeRTOS ofreciera una implementación más simple, lo haría.

Mis suposiciones (corríjame si está mal)

1) El controlador de interrupciones 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, es capaz de 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) ¿Debo desarrollar un controlador para que Linux pueda reconocer las interrupciones de FPGA?

3) Esto parece ser una característica bastante importante de toda la arquitectura del Cyclone V. ¿Ya Altera ha desarrollado dichos controladores para manejar las interrupciones simples de FPGA a HPS en Linux?

    
pregunta new_stacker

1 respuesta

2

El puente HPS está diseñado para tomar interrupciones FPGA y enviarlas al controlador de interrupción general (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 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 interrupción. El kernel ya sabe cómo reaccionar ante una interrupción, simplemente ejecuta cualquier controlador de interrupción (ISR) que haya sido configurado por el kernel para manejar una interrupción específica. En el caso de una fuente de interrupción que no tenga configurado un manejador, es probable que tenga un manejador predeterminado que elimine la interrupción en silencio (probablemente simplemente ignorándola).

Entonces, ¿cómo lo manejas? De la misma manera 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 hay controladores provistos 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 rápida búsqueda en Google encontró esto que parece bastante bueno . Desde allí 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 ningún controlador configurado para manejarlo.

TL; DR; Debe escribir un controlador de Linux. No hay nada especial que deba hacerse para tener en cuenta el hecho de que la interrupción proviene del FPGA, que ya está a cargo del hardware mediante el puente HPS.

    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas