目錄1. MPSoC的中斷處理介紹
2. 擴(kuò)展PL中斷
3. 擴(kuò)展AXI Intc中斷
3.1. AXI Intc PL連接
3.2. AXI Intc Device Tree
3.3. AXI Intc外設(shè)的Device Tree
4. 擴(kuò)展MIO中斷
4.1. GPIO中斷控制器
4.2. 外設(shè)使用GPIO中斷控制器5. 檢查Linux中斷信息
01
MPSoC的中斷處理介紹
MPSoC是帶ARM處理器和FPGA(PL)的SoC,包含4核A53及其常用外部模塊(PS)。A53(PS)使用Arm GIC-400,屬于GICv2架構(gòu)。如果想了解GIC-400的具體細(xì)節(jié),請(qǐng)參考文檔APU GIC: CoreLink GIC-400 Generic Interrupt Controller, DDI 0471B, r0p1。
MPSoC的A53(PS)的中斷細(xì)節(jié),在Xilinx的UG1085的Table 13‐1: System Interrupts部分做了詳細(xì)介紹。
需要注意的是,UG1085的Table 13‐1描述的是芯片的內(nèi)部連線,是硬件中斷號(hào),和Linux Kernel使用的軟件中斷號(hào)(邏輯中斷號(hào))有區(qū)別。有的SOC只有一個(gè)中斷控制器,有的SOC有多個(gè)串聯(lián)/并聯(lián)的中斷控制器。Linux Kernel為了各種處理復(fù)雜的中斷控制器設(shè)計(jì),并給中斷提供統(tǒng)一的API,在內(nèi)部使用統(tǒng)一編址的的軟件中斷號(hào)。同時(shí),GIC的Linux Kernel驅(qū)動(dòng)內(nèi)部有一個(gè)表,用于轉(zhuǎn)換硬件中斷號(hào)和軟件中斷號(hào)。這樣的好處是,即使不同SoC系統(tǒng)里有不同的中斷控制器結(jié)構(gòu),驅(qū)動(dòng)程序也可以忽略這些細(xì)節(jié),使用統(tǒng)一的API,比如platform_get_irq,從Device Tree里獲取中斷號(hào),并向Linux Kernel注冊(cè)驅(qū)動(dòng)程序的中斷處理程序。另外,設(shè)備的Device Tree里的中斷號(hào)是局部的,在它所屬的中斷控制器里保持唯一即可。Linux Kernel使用的軟件中斷號(hào),是整個(gè)Linux Kernel系統(tǒng)的,需要在Linux Kernel范圍內(nèi)保持唯一。
更多信息可以參考Linux Kernel代碼,以及Linux kernel的中斷子系統(tǒng)之(二):IRQ Domain介紹。
MPSoC的Device Tree的軟件中斷號(hào),比UG1085的Table 13‐1提供的硬件中斷號(hào)小32。這是因?yàn)锳53內(nèi)部的中斷號(hào)0-31是私有中斷。
以GEM0為例,UG1085的Table 13‐1提供的硬件中斷號(hào)是89,Device Tree里的設(shè)備號(hào)是0x39(57),驅(qū)動(dòng)程序里使用platform_get_irq(pdev, 0)獲取軟件中斷號(hào)。
VCU TRD 2020.2基于zcu106_llp2_xv20的PetaLinux工程里的GEM0的中斷信息:
ethernet@ff0b0000 {
compatible = “cdns,zynqmp-gemcdns,gem”;
interrupt-parent = 《0x04》;
interrupts = 《0x00 0x39 0x04 0x00 0x39 0x04》;
};
UG1085的Table 13‐1里GEM0的硬件中斷號(hào)
UG1085的Table 35‐6: PS-PL Interrupts Summary,使用的是Device Tree里的軟件中斷號(hào)。
需要更多信息,可以參考MPSoC Device tree interrupt number for PL-PS interrupt, Zynq-7000 mapping irq number into device tree value。
02
擴(kuò)展PL中斷
在FPGA(PL)部分,可以的擴(kuò)展很多外部設(shè)備,比如串口、I2C、Can等。A53(PS)為PL的外部設(shè)備預(yù)留了16個(gè)中斷,相關(guān)描述如下。
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)的外部設(shè)備預(yù)留了16個(gè)中斷,在Table 13‐1有如下表述。
VCU TRD 2020.2設(shè)計(jì)里,使用了很多PL中斷。以Video Phy為例,在工程zcu106_llp2_xv20里,它連接到了PL中斷的第3位(從0開(kāi)始計(jì)數(shù)),對(duì)應(yīng)的硬件中斷號(hào)是124,減去32后是92(0x5c)。
在以zcu106_llp2_xv20為硬件工程編譯的PetaLinux工程里,Video Phy的中斷信息如下,確實(shí)是0x5c。
vid_phy_controller@a0130000 {
compatible = “xlnx,vid-phy-controller-2.2xlnx,vid-phy-controller-2.1”;
interrupt-names = “irq”;
interrupt-parent = 《0x04》;
interrupts = 《0x00 0x5c 0x04》;
};
03
擴(kuò)展AXI Intc中斷
有時(shí)候,PL-PS的中斷還不夠用。這時(shí)可以使用Xilinx的axi_intc(AXI Interrupt controller)做擴(kuò)展。Xilinx Wiki網(wǎng)站上的文章Cascade Interrupt Controller support in DTG有詳細(xì)描述。
總結(jié)起來(lái),有下面三步。
3.1. AXI Intc PL連接
在PL設(shè)計(jì)里添加axi_intc(AXI Interrupt controller),把a(bǔ)xi_intc的中斷輸出連接到GIC的PL中斷輸入,把其它外設(shè)的中斷輸出連接到axi_intc的中斷輸入。
3.2. AXI Intc Device Tree
然后在Device Tree里,聲明axi_intc的輸出在GIC的中斷號(hào)。
axi_interrupt-controller {
interrupt-parent = “gic”
interrupts = 《 0 89 1》;
}
3.3. AXI Intc外設(shè)的Device Tree
外設(shè)的Device Tree里,需要聲明interrupt-parent是axi_intc,并聲明它在axi_intc內(nèi)部的中斷號(hào)。interrupt-parent后面的字符串,是Device Tree里axi_intc里的標(biāo)號(hào)。如果有多個(gè)axi_intc,每個(gè)axi_intc的標(biāo)號(hào)(Label)不一樣。每個(gè)外設(shè)的Device Tree里,需要指定自己對(duì)應(yīng)的axi_intc的標(biāo)號(hào)(Label)。
axi_gpio {
interrupt-parent = “axi_intc”;
interrupts = 《0 1》;
}
axi_intc的文檔,也可以參考 Xilinx Interrupt Controller 。
04
擴(kuò)展MIO中斷
下面整合之前的文章,通過(guò)MIO接入外設(shè)中斷。
Zynq-7000和MPSoC有很多MIO管腳。如果外設(shè)有中斷,也可以通過(guò)MIO連接中斷。這時(shí)候,MIO作為GPIO控制器,加載GPIO驅(qū)動(dòng)。下面的描述中,GPIO就是MIO對(duì)應(yīng)的GPIO設(shè)備。
4.1. GPIO中斷控制器
按下列模式,在GPIO的設(shè)備樹(shù)里聲明為中斷控制器
&gpio0 {
#interrupt-cells = 《2》;
interrupt-controller;
};
GPIO的中斷說(shuō)明,在Linux的文件
Documentation/devicetree/bindings/gpio/gpio-zynq.txt里。主要內(nèi)容如下:
- 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. 外設(shè)使用GPIO中斷控制器
外設(shè)的設(shè)備樹(shù)里,添加下列行,聲明gpio0為自己的中斷控制器,并聲明對(duì)應(yīng)的MIO引腳和中斷內(nèi)心。
touchscreen@0 {
interrupt-parent = 《&gpio0》;
interrupts = 《52 2》; /* MIO 52, falling edge */
};
05
檢查L(zhǎng)inux中斷信息
Linux在/proc/interrupts文件里,提供了系統(tǒng)的中斷信息。使用命令“cat /proc/interrupts”,可以顯示軟件中斷號(hào)、中斷在各CPU發(fā)生的次數(shù)、中斷所屬中斷控制器名稱、硬件中斷號(hào),驅(qū)動(dòng)程序名稱。
讀“/proc/interrupts”的內(nèi)容時(shí),會(huì)調(diào)用kernelirqProc.c中的函數(shù)int show_interrupts(struct seq_file *p, void *v)。
下面是一個(gè)例子。
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
從上面打印信息,也可以看到硬件中斷號(hào)、軟件中斷號(hào)(邏輯中斷號(hào))不一樣。
目錄/proc/irq下面會(huì)為每個(gè)rq創(chuàng)建一個(gè)以irq編號(hào)為名字的子目錄。每個(gè)子目錄最重要的文件是smp_affinity。通過(guò)更改smp_affinity的值,可以更改處理中斷的CPU。比如下面缺省情況下,讀出來(lái)中斷59的smp_affinity是f,對(duì)應(yīng)2進(jìn)制1111,表示四個(gè)處理器都能處理中斷59。后來(lái)執(zhí)行命令“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的中斷信息,可以參考問(wèn) Linux 中斷和smp_affinity, Linux 中斷和 IRQ 調(diào)節(jié)。
原文標(biāo)題:【工程師分享】擴(kuò)展MPSoC中斷
文章出處:【微信公眾號(hào):FPGA開(kāi)發(fā)圈】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
責(zé)任編輯:haq
-
控制器
+關(guān)注
關(guān)注
112文章
16103瀏覽量
177077 -
soc
+關(guān)注
關(guān)注
38文章
4099瀏覽量
217774
原文標(biāo)題:【工程師分享】擴(kuò)展MPSoC中斷
文章出處:【微信號(hào):FPGA-EETrend,微信公眾號(hào):FPGA開(kāi)發(fā)圈】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論