Logotipo de Zephyrnet

Cómo manejar más de 16 interrupciones usando el controlador de interrupciones AXI

Fecha:

Introducción:

Este blog cubre cómo usar el controlador de interrupciones AXI (INTC) en los casos en los que necesita enrutar más de 16 interrupciones al PS desde núcleos IP en el PL. Estamos utilizando periféricos Xilinx, incluidos GPIO, IIC, UART y temporizadores en el diseño de Vivado. 

El diseño de ejemplo se creó en la versión 2020.1 de Vivado, dirigido a una placa de evaluación ZCU106. Las interrupciones se prueban en PetaLinux 2020.1 y se adjuntan el diseño Tcl y el archivo system-user.dtsi.

AXIGPIO:

El núcleo de entrada / salida de uso general (GPIO) es una interfaz que proporciona un fácil acceso a las propiedades internas del dispositivo. Este núcleo también se puede utilizar para controlar el comportamiento de los dispositivos externos.

Interrupciones:

El control de interrupciones obtiene el estado de interrupción de los canales GPIO y genera una interrupción en el host. Está habilitado cuando el Habilitar interrupción La opción está configurada en Vivado.

Gpio_Vivado.PNG

Para el modo de entrada, los pines gpio_input se conectan a los BOTONES PULSADORES del ZCU106 de la siguiente manera:

° entrada_gpio (0) = GPIO_SW15

° entrada_gpio (1) = GPIO_SW14

° entrada_gpio (2) = GPIO_SW16

° entrada_gpio (3) = GPIO_SW17

° entrada_gpio (3) = GPIO_SW18

botones_pulsadores.PNG

INTC AXI:

El núcleo del controlador de interrupción AXI (INTC) concentra múltiples entradas de interrupción de dispositivos periféricos en una única salida de interrupción al procesador del sistema. Los registros se utilizan para verificar, habilitar y reconocer interrupciones.

AXI_INTC.PNG

El propósito principal de este ejemplo es conectar más de 16 interrupciones a la EP. El núcleo AXI INTC nos permite cumplir con este requisito. Podemos ir hasta 32 interrupciones si usamos un bloque AXI INTC, y puede hacer uso de cascada. (Podríamos cubrir un ejemplo de esto en otra entrada de blog).

En los siguientes diagramas donde discutimos la IP de Concat, puede ver cómo se conectan las interrupciones.

Diseño de bloque:

No he agregado un diagrama del diseño completo de una sola vez porque es demasiado grande, por lo que las conexiones requeridas se muestran por separado a continuación.

IP de Concat:

El núcleo IP de Concat proporciona un mecanismo para combinar señales de bus de diferentes anchos en un solo bus.

Bloque_Concat.PNG

Agregue el bloque Concat del catálogo de IP y haga doble clic en la IP como se muestra a continuación para abrir el cuadro de diálogo Volver a personalizar IP. 

Configuración_concat.PNG

 Establezca el parámetro "Número de publicaciones" en el número de puertos de entrada que desee. En este ejemplo, se seleccionan 18.

Así es como se ve después de personalizar la IP; el puerto 18 está conectado a la línea de interrupción GPIO_PUSH_BUTTONS como se discutió anteriormente.

concat_vivado.PNG

 dout es el puerto de salida cuyo ancho de bit es igual al ancho de bit combinado de todos los puertos de entrada que se enruta al puerto de entrada intr del núcleo AXI INTC.

Bloque_Concat_2.PNG

d_fuera.PNG

La salida del AXI INTC está conectada al puerto pl_ps_irq_0 del bloque Zynq MPSoC:

pl_ps_irq.PNG

Valide el diseño y siga los pasos restantes para generar el flujo de bits. Exporte el hardware para construir las imágenes de PetaLinux.

PetaLinux:

Configuración del kernel:

Las siguientes opciones están habilitadas en menuconfig. Normalmente están habilitados de forma predeterminada, pero debe marcar por si acaso.

  • Controladores de dispositivo
    • Soporte GPIO
      • Controladores GPIO asignados en memoria
        • Soporte Xilinx GPIO
        • Soporte Xilinx Zynq GPIO
    • Soporte de dispositivo de entrada
      • Teclados
        • Botones GPIO
        • Botones GPIO sondeados

Agregar pulsadores al árbol de dispositivos:

Los botones pulsadores están disponibles solo para la aplicación Input GPIO.

Cada subnodo creado controla un solo bit de GPIO. En el nodo de claves "gpio-keys" en el archivo dts, cree subnodos para botones pulsadores según el diseño con los nombres que se muestran a continuación:

archivo_dtsi_1.png

Una vez hecho esto, inicie Linux. Puede ver las etiquetas de los pulsadores SW15 a SW18 en cat / proc / interrupts. 

ints.png

Cuando presiona los botones pulsadores al azar, el recuento de disparos aumenta como se muestra a continuación:

ints_1.png

boot_log y system_user_dtsi.zip

Fuente: https://forums.xilinx.com/t5/Design-and-Debug-Techniques-Blog/How-to-handle-more-that-16-interrupts-using-the-AXI-Interrupt/ba-p/ 1165154

punto_img

Información más reciente

punto_img