您的位置 首页 汽车

让 Linux 接纳来自 PL 的自定义中止信号

硬件连接MPSoC 可以接收两组来自 PL 的中断信号。在 Vivado 中,可以通过 PS-PL Configuration -> General -> Interrupts ->

硬件衔接

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 代码中填入中止号,现在这种办法不行行了,请运用虚拟中止号的办法。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/155867.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部