You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ZYNQ7000平台AXI GPIO中断注册失败问题求助

ZYNQ7000 AXI GPIO中断注册失败问题

环境与配置说明

  • 硬件:基于ZYNQ7000的自定义板卡
  • 开发环境:Petalinux 2021.2(部署于Ubuntu 20.04.03)、Vivado 2021.2
  • 硬件配置:AXI GPIO 1连接按键并配置为可产生中断,仅连接1路中断至处理器中断输入
  • 已启用AXI GPIO的中断使能寄存器与全局中断寄存器

PL-DTS配置内容

/ {
amba_pl: amba_pl {
  #address-cells = <1>;
  #size-cells = <1>;
  compatible = "simple-bus";
  ranges ;
  axi_gpio_0: gpio@41200000 {
    #gpio-cells = <3>;
    clock-names = "s_axi_aclk";
    clocks = <&clkc 15>;
    compatible = "xlnx,axi-gpio-2.0", "xlnx,xps-gpio-1.00.a";
    gpio-controller ;
    reg = <0x41200000 0x10000>;
    xlnx,all-inputs = <0x0>;
    xlnx,all-inputs-2 = <0x0>;
    xlnx,all-outputs = <0x1>;
    xlnx,all-outputs-2 = <0x0>;
    xlnx,dout-default = <0x00000000>;
    xlnx,dout-default-2 = <0x00000000>;
    xlnx,gpio-width = <0x4>;
    xlnx,gpio2-width = <0x20>;
    xlnx,interrupt-present = <0x0>;
    xlnx,is-dual = <0x0>;
    xlnx,tri-default = <0xFFFFFFFF>;
    xlnx,tri-default-2 = <0xFFFFFFFF>;
  };
  axi_gpio_1: gpio@41210000 {
    #gpio-cells = <3>;
    #interrupt-cells = <2>;
    clock-names = "s_axi_aclk";
    clocks = <&clkc 15>;
    compatible = "xlnx,axi-gpio-2.0", "xlnx,xps-gpio-1.00.a";
    gpio-controller;
    interrupt-controller;
    interrupt-names = "ip2intc_irpt";
    interrupt-parent = <&intc>;
    interrupts = <0 29 4>;
    reg = <0x41210000 0x10000>;
    xlnx,all-inputs = <0x1>;
    xlnx,all-inputs-2 = <0x0>;
    xlnx,all-outputs = <0x0>;
    xlnx,all-outputs-2 = <0x0>;
    xlnx,dout-default = <0x00000000>;
    xlnx,dout-default-2 = <0x00000000>;
    xlnx,gpio-width = <0x1>;
    xlnx,gpio2-width = <0x20>;
    xlnx,interrupt-present = <0x1>;
    xlnx,is-dual = <0x0>;
    xlnx,tri-default = <0xFFFFFFFF>;
    xlnx,tri-default-2 = <0xFFFFFFFF>;
  };
  };
};

注:中断号计算为61(29+32),对应DTS中interrupts = <0 29 4>;配置

内核模块核心代码

if (request_irq(IRQ_NUM, isr, 0, DEVICE_NAME, NULL)) {
  printk(KERN_ERR "my_init: Cannot register IRQ %d\n", IRQ_NUM);
  return -EIO;
 } else {
  printk(KERN_INFO "my_init: Registered IRQ %d\n", IRQ_NUM);
 }

 printk(KERN_INFO "my_init: Initialize Module \"%s\"\n", DEVICE_NAME);  
 pdev = platform_device_register_simple(DEVICE_NAME, 0, NULL, 0);        
 if (pdev == NULL) {                            
  printk(KERN_WARNING "my_init: Adding platform device \"%s\" failed\n", DEVICE_NAME);
  kfree(pdev);                                
  return -ENODEV;                              
 }

问题汇总

  • 无法注册中断号61
  • 尝试所有空闲中断号均无法正常工作
  • 需求:通过内核模块调用request_irq()直接注册AXI GPIO中断并绑定ISR,不使用GPIO-keys或UIO(需阻塞读取)
  • 已查阅Xilinx及其他厂商相关问题并尝试所有方案,均未解决

补充:按键与处理器连接正常,GPIO-keys可正常捕获按键动作


内容的提问来源于stack exchange,提问作者user20007168

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:30:43