硬件衔接
MPSoC 能够接纳两组来自 PL 的中止信号。在 Vivado 中,能够经过 PS-PL Configuration -> General -> Interrupts -> PL to PS -> IRQ0/IRQ1 翻开。
对应的硬件中止号分别是
PL PS Group 0: 121-128
PL PS Group 1: 136-143
这两组中止信号既能够与 IPI 中的 IP 的中止信号相衔接,也能够和 Verilog 中的逻辑相衔接。假如有多个中止源要衔接到一组信号中,能够运用concat将多个信号组合成一组信号,然后衔接到 IRQ。
假如要从 Verilog 引进中止信号,需求在 IPI 中按右键挑选 Create Port。Port Type 挑选为 Interrupt。
软硬件的桥梁: device tree
硬件信息怎样传送给软件体系?
Linux 的答案是 Device Tree。
以下是 Device Tree Generator 为上图中的 AXI UARTLite 主动创立的 device tree。
axi_uartlite_0: serial@a0000000 {
clocks = misc_clk_0>;
compatible = xlnx,xps-uartlite-1.00.a;
current-speed = 115200>;
device_type = serial;
interrupt-parent = gic>;
interrupts = 0 89 1>;
port-number = 1>;
reg = 0x0 0xa0000000 0x0 0x10000>;
xlnx,baudrate = 0x2580>;
xlnx,data-bits = 0x8>;
xlnx,odd-parity = 0x0>;
xlnx,s-axi-aclk-freq-hz-d = 99.999;
xlnx,use-parity = 0x0>;
};
创立 Device Tree
Device tree 是纯文本文件,后缀是 .dts 或 .dtsi。当然能够手艺从头开始写(好像没人这么做),Xilinx 也供给了东西来协助主动生成。
一种办法是运用 PetaLinux,其实这也是 petalinux-build 中的一个过程。当在一个 PetaLinux 工程中导入 HDF 后,运转 petalinux-build它会主动调用 Device Tree Generator (DTG),为你的工程发生 device tree。用户能够在主动生成的文件的基础上进一步修正,修正的时分留意文件都上会写哪些文件从头生成时会被掩盖,哪些不会。
另一种生成 device tree 的办法是运用 SDK。SDK 能够把 DTG 加载为 BSP Generator,用来生成 device tree. DTG 的下载地址是 [ https://github.com/Xilinx/device-tree-xlnx ]。下载到本地后,在 SDK 的 Xilinx Tools -> Repositories 中增加解压后的目录。在 SDK 中新建一个 BSP, BSP 类型挑选 device_tree
Note: 假如是SDx东西,加载DTG的办法是 Window -> Preference -> Xilinx SDK -> Repositories
Interrupt 特点的界说
Device tree 中和中止相关的特点有两条,interrupts和interrupt-parents。
interrupt-parents指向了中止控制器。在 MPSoC 中有多个外设都有中止控制器特点,分别是 GIC, GPIO, PCIe。
interrupts 后的参数指定了中止号和中止特点。
Device tree bindings interrupts.txt 中界说了 interrupts 后参数的含义。需求留意的是,在中止控制器的特点中有#interrupt-cells的界说,表明interrupts参数需求几个32位的字符。常见的状况是1到3。1个Cell的状况只填写中止号。2个Cell的状况填写中止号和触发条件,GPIO Controller便是这种状况。
ARM GIC 运用的是 3 个 Cell:
第一个 cell 是 0 的话表明中止类型:0 for SPI interrupts, 1 for PPI interrupts。PL 到 PS 的中止归于 SPI,所以填写 0。
第二个 Cell 表明中止号
第三个 Cell 表明中止触发办法。
ARM G%&&&&&% v3 中止 Cell 阐明,来自 arm,gic-v3.txt
The 1st cell is the interrupt type; 0 for SPI interrupts, 1 for PPI
interrupts. Other values are reserved for future use.
The 2nd cell contains the interrupt number for the interrupt type.
SPI interrupts are in the range [0-987]. PPI interrupts are in the
range [0-15].
The 3rd cell is the flags, encoded as follows:
bits[3:0] trigger type and level flags.
1 = edge triggered
4 = level triggered
中止号的确认
Device tree 中 interrupts 的中止号请填写硬件硬件中止号 – 32
中止的驱动程序
PetaLinux 中自带了中止服务程序的比如。
用指令 petalinux-create -t modules -n mymodule就能够创立出比如程序。
其间与注册 IRQ 中止号相关的句子为:
/* Get IRQ for the device */
r_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
if (!r_irq) {
dev_info(dev, no IRQ foundn);
dev_info(dev, mymodule at 0x%08x mapped to 0x%08xn,
(unsigned int __force)lp->mem_start,
(unsigned int __force)lp->base_addr);
return 0;
}
lp->irq = r_irq->start;
rc = request_irq(lp->irq, mymodule_irq, 0, DRIVER_NAME, lp);
if (rc) {
dev_err(dev, testmodule: Could not allocate interrupt %d.n,
lp->irq);
goto error3;
}
留意上面的程序是经过读取 dts 获取中止的信息,然后让操作体系分配一个虚拟中止号。曾经注册中止号是经过手艺在 C 代码中填入中止号,现在这种办法不行行了,请运用虚拟中止号的办法。