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
相关产品推荐
相关产品推荐

