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.
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
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.
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.
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.
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.
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.
La salida del AXI INTC está conectada al puerto pl_ps_irq_0 del bloque Zynq MPSoC:
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
- Controladores GPIO asignados en memoria
- Soporte de dispositivo de entrada
- Teclados
- Botones GPIO
- Botones GPIO sondeados
- Teclados
- Soporte GPIO
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:
Una vez hecho esto, inicie Linux. Puede ver las etiquetas de los pulsadores SW15 a SW18 en cat / proc / interrupts.
Cuando presiona los botones pulsadores al azar, el recuento de disparos aumenta como se muestra a continuación: