- 若该文为原创文章,未经允许不得转载
- 风释雪
- QQ:627833006
- E-mail:hn.cy@foxmail.com
- CSDN博客地址:https://blog.csdn.net/weixin_46718879
1.版本说明
2.概述
本文主要实现PL端中断PS功能,并且支持多个中断信号。
2.1.工具
- xilinx vivado 2018.3
- xilinx sdk 2018.3
- petalinux 2018.3
- linux-xlnx-xilinx-v2018.3 (源码,辅助分析,Xilinx github可下载)
2.2.平台
- ZCU106
2.3.重要参考资料
linux-xlnx-xilinx-v2018.3\Documentation\devicetree\bindings\interrupt-controller\xilinx,intc.txt
3.软件VIVADO工程
PL端使用vio来产生中断信号,配合linux软件验证。
4.软件PETALINUX工程
使用UIO方法,应用层直接操作中断
设备树:
/include/ "system-conf.dtsi"
/ {
chosen {
bootargs = "earlycon console=ttyPS0,115200 clk_ignore_unused uio_pdrv_genirq.of_id=generic-uio";
stdout-path = "serial0:115200n8";
};
};
&amba_pl {
uio@0{
compatible="generic-uio";
status="okay";
interrupt-controller;
interrupt-parent=<&gic>;
interrupts=<0x0 89 0x1>; /* 0x1 = posedge 0x4 = high */
};
uio@1{
compatible="generic-uio";
status="okay";
interrupt-controller;
interrupt-parent=<&gic>;
interrupts=<0x0 90 0x1>; /* 0x1 = posedge 0x4 = high */
};
};
5.linux命令
- cat /proc/interrupts
6.软件SDK工程
pid_t pid;
pthread_t tid;
int fd;
uint32_t uio_key = 1;
uint32_t uio_value = 0;
int err;
pid = getpid();
tid = pthread_self();
printf("%s pid %lu tid %lu (0x%lx) \r\n", s, (unsigned long)pid, (unsigned long)tid, (unsigned long)tid);
while (true)
{
fd = open("/dev/uio0", O_RDWR);
if (fd < 0)
{
printf("uio0 can't open!");
}
write(fd, &uio_key, sizeof(uio_key));
err = read(fd, &uio_value, sizeof(uio_value));
if (err == 4)
{
// TODO
}
}