5 votos

Altera Cyclone V - Manejo de interrupciones de Linux y FPGA

Necesito propagar una interrupción de mi núcleo IP FPGA personalizado al sistema HPS de un DE0_nano_SoC (arquitectura HPS-FPGA del Ciclón V) 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 des-afirmar la señal de interrupción) y copia unos pocos bytes de los registros de la FPGA a un programa que se ejecuta en Linux.

La elección de Linux es arbitraria, preferiblemente Angstrom/Yocto, que tengo en marcha ahora mismo, pero si el FreeRTOS ofreciera una implementación más simple yo iría a por él.


Mis suposiciones (por favor corrígeme si me equivoco)

1) El Controlador de Interrupciones en el HPS reconoce las interrupciones generadas por la FPGA, comenzando en el número 73 (hay algún desplazamiento, pero en principio están mapeadas 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 de la FPGA, mapeadas por el Controlador de Interrupciones de HPS?

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

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

3voto

Tom Carpenter Puntos 7192

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

El núcleo de Linux ya ha sido 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 manejador de interrupciones (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 un manejador configurado, probablemente tendrá un manejador por defecto que se deshaga de la interrupción de forma silenciosa (probablemente simplemente ignorándola).

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

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

TL;DR; Necesitas 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 ya se ocupa el puente HPS en el hardware.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X