【工程师分享】扩展MPSoC中断

FPGA开发圈 2021-04-30 00:00

作者:付汉杰,hankf@xilinx.com

文章转载自:赛灵思中文社区论坛


目录

1. MPSoC的中断处理介绍
2. 扩展PL中断
3. 扩展AXI Intc中断
3.1. AXI Intc PL连接
3.2. AXI Intc Device Tree
3.3. AXI Intc外设的Device Tree
4. 扩展MIO中断
4.1. GPIO中断控制器
4.2. 外设使用GPIO中断控制器5. 检查Linux中断信息



01

MPSoC的中断处理介绍

MPSoC是带ARM处理器和FPGA(PL)的SoC,包含4核A53及其常用外部模块(PS)。A53(PS)使用Arm GIC-400,属于GICv2架构。如果想了解GIC-400的具体细节,请参考文档APU GIC: CoreLink GIC-400 Generic Interrupt Controller, DDI 0471B, r0p1。


MPSoC的A53(PS)的中断细节,在Xilinx的UG1085的Table 13‐1: System Interrupts部分做了详细介绍。


需要注意的是,UG1085的Table 13‐1描述的是芯片的内部连线,是硬件中断号,和Linux Kernel使用的软件中断号(逻辑中断号)有区别。有的SOC只有一个中断控制器,有的SOC有多个串联/并联的中断控制器。Linux Kernel为了各种处理复杂的中断控制器设计,并给中断提供统一的API,在内部使用统一编址的的软件中断号。同时,GIC的Linux Kernel驱动内部有一个表,用于转换硬件中断号和软件中断号。这样的好处是,即使不同SoC系统里有不同的中断控制器结构,驱动程序也可以忽略这些细节,使用统一的API,比如platform_get_irq,从Device Tree里获取中断号,并向Linux Kernel注册驱动程序的中断处理程序。另外,设备的Device Tree里的中断号是局部的,在它所属的中断控制器里保持唯一即可。Linux Kernel使用的软件中断号,是整个Linux Kernel系统的,需要在Linux Kernel范围内保持唯一。


更多信息可以参考Linux Kernel代码,以及Linux kernel的中断子系统之(二):IRQ Domain介绍。


MPSoC的Device Tree的软件中断号,比UG1085的Table 13‐1提供的硬件中断号小32。这是因为A53内部的中断号0-31是私有中断。


以GEM0为例,UG1085的Table 13‐1提供的硬件中断号是89,Device Tree里的设备号是0x39(57),驱动程序里使用platform_get_irq(pdev, 0)获取软件中断号。


VCU TRD 2020.2基于zcu106_llp2_xv20的PetaLinux工程里的GEM0的中断信息:

ethernet@ff0b0000 {
compatible = "cdns,zynqmp-gem\0cdns,gem";
interrupt-parent = <0x04>;
interrupts = <0x00 0x39 0x04 0x00 0x39 0x04>;
};

UG1085的Table 13‐1里GEM0的硬件中断号


UG1085的Table 35‐6: PS-PL Interrupts Summary,使用的是Device Tree里的软件中断号。


需要更多信息,可以参考MPSoC Device tree interrupt number for PL-PS interrupt, Zynq-7000 mapping irq number into device tree value。



02

扩展PL中断

在FPGA(PL)部分,可以的扩展很多外部设备,比如串口、I2C、Can等。A53(PS)为PL的外部设备预留了16个中断,相关描述如下。

PS-PL Interrupts
The interrupts from the processing system I/O peripherals (IOP) are routed to the PL. In the
other direction, the PL can asynchronously assert 16 interrupts to the PS. These interrupts
are assigned a priority level routed to interrupt controllers which aggregate and route them
to appropriate processor. Additionally, FIQ/IRQ interrupts are available which are routed
directly to the private peripheral interrupt unit of the interrupt controller. Table 35-6
summarizes the interrupts.

PL到A53(PS)的外部设备预留了16个中断,在Table 13‐1有如下表述。


VCU TRD 2020.2设计里,使用了很多PL中断。以Video Phy为例,在工程zcu106_llp2_xv20里,它连接到了PL中断的第3位(从0开始计数),对应的硬件中断号是124,减去32后是92(0x5c)。


在以zcu106_llp2_xv20为硬件工程编译的PetaLinux工程里,Video Phy的中断信息如下,确实是0x5c。

vid_phy_controller@a0130000 {
compatible = "xlnx,vid-phy-controller-2.2\0xlnx,vid-phy-controller-2.1";
interrupt-names = "irq";
interrupt-parent = <0x04>;
interrupts = <0x00 0x5c 0x04>;

};



03

扩展AXI Intc中断

有时候,PL-PS的中断还不够用。这时可以使用Xilinx的axi_intc(AXI Interrupt controller)做扩展。Xilinx Wiki网站上的文章Cascade Interrupt Controller support in DTG有详细描述。


总结起来,有下面三步。


3.1. AXI Intc PL连接

在PL设计里添加axi_intc(AXI Interrupt controller),把axi_intc的中断输出连接到GIC的PL中断输入,把其它外设的中断输出连接到axi_intc的中断输入。


3.2. AXI Intc Device Tree

然后在Device Tree里,声明axi_intc的输出在GIC的中断号。

axi_interrupt-controller {
interrupt-parent = "gic"
interrupts = < 0 89 1>;
}


3.3. AXI Intc外设的Device Tree

外设的Device Tree里,需要声明interrupt-parent是axi_intc,并声明它在axi_intc内部的中断号。interrupt-parent后面的字符串,是Device Tree里axi_intc里的标号。如果有多个axi_intc,每个axi_intc的标号(Label)不一样。每个外设的Device Tree里,需要指定自己对应的axi_intc的标号(Label)。

axi_gpio {
interrupt-parent = "axi_intc";
interrupts = <0 1>;
}


axi_intc的文档,也可以参考 Xilinx Interrupt Controller 。



04

扩展MIO中断

下面整合之前的文章,通过MIO接入外设中断。


Zynq-7000和MPSoC有很多MIO管脚。如果外设有中断,也可以通过MIO连接中断。这时候,MIO作为GPIO控制器,加载GPIO驱动。下面的描述中,GPIO就是MIO对应的GPIO设备。


4.1. GPIO中断控制器

按下列模式,在GPIO的设备树里声明为中断控制器

&gpio0 {
#interrupt-cells = <2>;
interrupt-controller;
};


GPIO的中断说明,在Linux的文件

Documentation/devicetree/bindings/gpio/gpio-zynq.txt里。主要内容如下:

- interrupt-controller   : Marks the device node as an interrupt controller.
- #interrupt-cells : Should be 2. The first cell is the GPIO number.
The second cell bits[3:0] is used to specify trigger type and level flags:
1 = low-to-high edge triggered.
2 = high-to-low edge triggered.
4 = active high level-sensitive.
8 = active low level-sensitive.


4.2. 外设使用GPIO中断控制器

外设的设备树里,添加下列行,声明gpio0为自己的中断控制器,并声明对应的MIO引脚和中断内心。

touchscreen@0 {
interrupt-parent = <&gpio0>;
interrupts = <52 2>; /* MIO 52, falling edge */
};



05

检查Linux中断信息

Linux在/proc/interrupts文件里,提供了系统的中断信息。使用命令“cat /proc/interrupts”,可以显示软件中断号、中断在各CPU发生的次数、中断所属中断控制器名称、硬件中断号,驱动程序名称。


读“/proc/interrupts”的内容时,会调用kernel\irq\Proc.c中的函数int show_interrupts(struct seq_file *p, void *v)。

下面是一个例子。

root@zcu106_vcu_llp2_nv16:~# cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3
3: 18945 9421 13324 23628 GICv2 30 Level arch_timer
6: 0 0 0 0 GICv2 67 Level zynqmp_ipi
12: 0 0 0 0 GICv2 155 Level axi-pmon, axi-pmon
13: 0 0 0 0 GICv2 156 Level zynqmp-dma
14: 0 0 0 0 GICv2 157 Level zynqmp-dma
15: 0 0 0 0 GICv2 158 Level zynqmp-dma
16: 0 0 0 0 GICv2 159 Level zynqmp-dma
17: 0 0 0 0 GICv2 160 Level zynqmp-dma
18: 0 0 0 0 GICv2 161 Level zynqmp-dma
19: 0 0 0 0 GICv2 162 Level zynqmp-dma
20: 0 0 0 0 GICv2 163 Level zynqmp-dma
21: 0 0 0 0 GICv2 164 Level Mali_GP_MMU, Mali_GP, Mali_PP0_MMU, Mali_PP0, Mali_PP1_MMU, Mali_PP1
22: 0 0 0 0 GICv2 109 Level zynqmp-dma
23: 0 0 0 0 GICv2 110 Level zynqmp-dma
24: 0 0 0 0 GICv2 111 Level zynqmp-dma
25: 0 0 0 0 GICv2 112 Level zynqmp-dma
26: 0 0 0 0 GICv2 113 Level zynqmp-dma
27: 0 0 0 0 GICv2 114 Level zynqmp-dma
28: 0 0 0 0 GICv2 115 Level zynqmp-dma
29: 0 0 0 0 GICv2 116 Level zynqmp-dma
31: 144 0 0 0 GICv2 95 Level eth0, eth0
33: 121 0 0 0 GICv2 49 Level cdns-i2c
34: 140 0 0 0 GICv2 50 Level cdns-i2c
35: 0 0 0 0 GICv2 42 Level ff960000.memory-controller
36: 0 0 0 0 GICv2 57 Level axi-pmon, axi-pmon
37: 43 0 0 0 GICv2 47 Level ff0f0000.spi
38: 0 0 0 0 GICv2 58 Level ffa60000.rtc
39: 0 0 0 0 GICv2 59 Level ffa60000.rtc
40: 0 0 0 0 GICv2 165 Level ahci-ceva[fd0c0000.ahci]
41: 232 0 0 0 GICv2 81 Level mmc0
42: 133 0 0 0 GICv2 53 Level xuartps
44: 0 0 0 0 GICv2 84 Edge ff150000.watchdog
45: 0 0 0 0 GICv2 88 Level ams-irq
46: 12 0 0 0 GICv2 154 Level fd4c0000.dma
47: 0 0 0 0 GICv2 151 Level fd4a0000.zynqmp-display
48: 0 0 0 0 GICv2 122 Level xilinx_framebuffer
49: 0 0 0 0 GICv2 141 Level xilinx_framebuffer
50: 0 0 0 0 GICv2 142 Level xilinx_framebuffer
51: 0 0 0 0 GICv2 143 Level xilinx_framebuffer
52: 0 0 0 0 GICv2 123 Level xilinx-hdmi-rx
53: 0 0 0 0 GICv2 121 Level xilinx_framebuffer
54: 1 0 0 42423 GICv2 125 Level xilinx-hdmitxss
55: 0 0 0 42426 GICv2 127 Level xlnx-mixer
56: 81 0 0 0 GICv2 126 Level a00d0000.i2c
57: 0 0 0 0 GICv2 139 Edge a00d1000.sync_ip
58: 4 0 0 0 GICv2 128 Level a0200000.al5e, a0220000.al5d
59: 16 0 0 0 GICv2 124 Level xilinx-vphy
60: 0 0 0 0 GICv2 97 Level xhci-hcd:usb1
IPI0: 2763 1869 2597 1312 Rescheduling interrupts
IPI1: 21 26 19 36 Function call interrupts
IPI2: 0 0 0 0 CPU stop interrupts
IPI3: 0 0 0 0 CPU stop (for crash dump) interrupts
IPI4: 0 0 0 0 Timer broadcast interrupts
IPI5: 0 0 0 0 IRQ work interrupts
IPI6: 0 0 0 0 CPU wake-up interrupts


从上面打印信息,也可以看到硬件中断号、软件中断号(逻辑中断号)不一样。


目录/proc/irq下面会为每个rq创建一个以irq编号为名字的子目录。每个子目录最重要的文件是smp_affinity。通过更改smp_affinity的值,可以更改处理中断的CPU。比如下面缺省情况下,读出来中断59的smp_affinity是f,对应2进制1111,表示四个处理器都能处理中断59。后来执行命令“echo 2 > /proc/irq/59/smp_affinity”,把其改为2,就只有CPU-1能处理中断59。

root@zcu106_vcu_llp2_nv16:~# ls /proc/irq/48 -l
total 0
-r--r--r-- 1 root root 0 Apr 28 06:54 affinity_hint
-r--r--r-- 1 root root 0 Apr 28 06:54 effective_affinity
-r--r--r-- 1 root root 0 Apr 28 06:54 effective_affinity_list
-r--r--r-- 1 root root 0 Apr 28 06:54 node
-rw-r--r-- 1 root root 0 Apr 28 06:25 smp_affinity
-rw-r--r-- 1 root root 0 Apr 28 06:54 smp_affinity_list
-r--r--r-- 1 root root 0 Apr 28 06:54 spurious
dr-xr-xr-x 2 root root 0 Apr 28 06:54 xilinx_framebuffer

root@zcu106_vcu_llp2_nv16:~# ls /proc/irq/59 -l
total 0
-r--r--r-- 1 root root 0 Apr 28 06:54 affinity_hint
-r--r--r-- 1 root root 0 Apr 28 06:54 effective_affinity
-r--r--r-- 1 root root 0 Apr 28 06:54 effective_affinity_list
-r--r--r-- 1 root root 0 Apr 28 06:54 node
-rw-r--r-- 1 root root 0 Apr 28 06:54 smp_affinity
-rw-r--r-- 1 root root 0 Apr 28 06:54 smp_affinity_list
-r--r--r-- 1 root root 0 Apr 28 06:54 spurious
dr-xr-xr-x 2 root root 0 Apr 28 06:54 xilinx-vphy
root@zcu106_vcu_llp2_nv16:~# cat /proc/irq/59/smp_affinity
f
root@zcu106_vcu_llp2_nv16:~# echo 2 > /proc/irq/59/smp_affinity
root@zcu106_vcu_llp2_nv16:~# cat /proc/irq/59/smp_affinity
2
root@zcu106_vcu_llp2_nv16:~# echo 4 > /proc/irq/59/smp_affinity
root@zcu106_vcu_llp2_nv16:~# cat /proc/irq/59/smp_affinity
4


Linux的中断信息,可以参考问 Linux 中断和smp_affinity, Linux 中断和 IRQ 调节。

更多信息请点击“阅读原文查看”


关注我们

FPGA开发圈 这里介绍、交流、有关FPGA开发资料(文档下载,技术解答等),提升FPGA应用能力。
评论
  • 现在为止,我们已经完成了Purple Pi OH主板的串口调试和部分配件的连接,接下来,让我们趁热打铁,完成剩余配件的连接!注:配件连接前请断开主板所有供电,避免敏感电路损坏!1.1 耳机接口主板有一路OTMP 标准四节耳机座J6,具备进行音频输出及录音功能,接入耳机后声音将优先从耳机输出,如下图所示:1.21.2 相机接口MIPI CSI 接口如上图所示,支持OV5648 和OV8858 摄像头模组。接入摄像头模组后,使用系统相机软件打开相机拍照和录像,如下图所示:1.3 以太网接口主板有一路
    Industio_触觉智能 2025-01-20 11:04 150浏览
  • 嘿,咱来聊聊RISC-V MCU技术哈。 这RISC-V MCU技术呢,简单来说就是基于一个叫RISC-V的指令集架构做出的微控制器技术。RISC-V这个啊,2010年的时候,是加州大学伯克利分校的研究团队弄出来的,目的就是想搞个新的、开放的指令集架构,能跟上现代计算的需要。到了2015年,专门成立了个RISC-V基金会,让这个架构更标准,也更好地推广开了。这几年啊,这个RISC-V的生态系统发展得可快了,好多公司和机构都加入了RISC-V International,还推出了不少RISC-V
    丙丁先生 2025-01-21 12:10 112浏览
  • 数字隔离芯片是一种实现电气隔离功能的集成电路,在工业自动化、汽车电子、光伏储能与电力通信等领域的电气系统中发挥着至关重要的作用。其不仅可令高、低压系统之间相互独立,提高低压系统的抗干扰能力,同时还可确保高、低压系统之间的安全交互,使系统稳定工作,并避免操作者遭受来自高压系统的电击伤害。典型数字隔离芯片的简化原理图值得一提的是,数字隔离芯片历经多年发展,其应用范围已十分广泛,凡涉及到在高、低压系统之间进行信号传输的场景中基本都需要应用到此种芯片。那么,电气工程师在进行电路设计时到底该如何评估选择一
    华普微HOPERF 2025-01-20 16:50 73浏览
  •     IPC-2581是基于ODB++标准、结合PCB行业特点而指定的PCB加工文件规范。    IPC-2581旨在替代CAM350格式,成为PCB加工行业的新的工业规范。    有一些免费软件,可以查看(不可修改)IPC-2581数据文件。这些软件典型用途是工艺校核。    1. Vu2581        出品:Downstream     
    电子知识打边炉 2025-01-22 11:12 52浏览
  •  万万没想到!科幻电影中的人形机器人,正在一步步走进我们人类的日常生活中来了。1月17日,乐聚将第100台全尺寸人形机器人交付北汽越野车,再次吹响了人形机器人疯狂进厂打工的号角。无独有尔,银河通用机器人作为一家成立不到两年时间的创业公司,在短短一年多时间内推出革命性的第一代产品Galbot G1,这是一款轮式、双臂、身体可折叠的人形机器人,得到了美团战投、经纬创投、IDG资本等众多投资方的认可。作为一家成立仅仅只有两年多时间的企业,智元机器人也把机器人从梦想带进了现实。2024年8月1
    刘旷 2025-01-21 11:15 390浏览
  • 高速先生成员--黄刚这不马上就要过年了嘛,高速先生就不打算给大家上难度了,整一篇简单但很实用的文章给大伙瞧瞧好了。相信这个标题一出来,尤其对于PCB设计工程师来说,心就立马凉了半截。他们辛辛苦苦进行PCB的过孔设计,高速先生居然说设计多大的过孔他们不关心!另外估计这时候就跳出很多“挑刺”的粉丝了哈,因为翻看很多以往的文章,高速先生都表达了过孔孔径对高速性能的影响是很大的哦!咋滴,今天居然说孔径不关心了?别,别急哈,听高速先生在这篇文章中娓娓道来。首先还是要对各位设计工程师的设计表示肯定,毕竟像我
    一博科技 2025-01-21 16:17 100浏览
  • 本文介绍瑞芯微开发板/主板Android配置APK默认开启性能模式方法,开启性能模式后,APK的CPU使用优先级会有所提高。触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。源码修改修改源码根目录下文件device/rockchip/rk3562/package_performance.xml并添加以下内容,注意"+"号为添加内容,"com.tencent.mm"为AP
    Industio_触觉智能 2025-01-17 14:09 164浏览
  • 2024年是很平淡的一年,能保住饭碗就是万幸了,公司业绩不好,跳槽又不敢跳,还有一个原因就是老板对我们这些员工还是很好的,碍于人情也不能在公司困难时去雪上加霜。在工作其间遇到的大问题没有,小问题还是有不少,这里就举一两个来说一下。第一个就是,先看下下面的这个封装,你能猜出它的引脚间距是多少吗?这种排线座比较常规的是0.6mm间距(即排线是0.3mm间距)的,而这个规格也是我们用得最多的,所以我们按惯性思维来看的话,就会认为这个座子就是0.6mm间距的,这样往往就不会去细看规格书了,所以这次的运气
    wuliangu 2025-01-21 00:15 186浏览
  • 临近春节,各方社交及应酬也变得多起来了,甚至一月份就排满了各式约见。有的是关系好的专业朋友的周末“恳谈会”,基本是关于2025年经济预判的话题,以及如何稳定工作等话题;但更多的预约是来自几个客户老板及副总裁们的见面,他们为今年的经济预判与企业发展焦虑而来。在聊天过程中,我发现今年的聊天有个很有意思的“点”,挺多人尤其关心我到底是怎么成长成现在的多领域风格的,还能掌握一些经济趋势的分析能力,到底学过哪些专业、在企业管过哪些具体事情?单单就这个一个月内,我就重复了数次“为什么”,再辅以我上次写的:《
    牛言喵语 2025-01-22 17:10 41浏览
  • Ubuntu20.04默认情况下为root账号自动登录,本文介绍如何取消root账号自动登录,改为通过输入账号密码登录,使用触觉智能EVB3568鸿蒙开发板演示,搭载瑞芯微RK3568,四核A55处理器,主频2.0Ghz,1T算力NPU;支持OpenHarmony5.0及Linux、Android等操作系统,接口丰富,开发评估快人一步!添加新账号1、使用adduser命令来添加新用户,用户名以industio为例,系统会提示设置密码以及其他信息,您可以根据需要填写或跳过,命令如下:root@id
    Industio_触觉智能 2025-01-17 14:14 122浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦