请选择 进入手机版 | 继续访问电脑版
[X]关闭

[米联客-XILINX-H3_CZ08_7100] LINUX驱动篇连载-11 PL中断实验

文档创建者:LINUX课程
浏览次数:219
最后更新:2024-09-10
文档课程分类-AMD-ZYNQ
AMD-ZYNQ: ZYNQ-SOC » 2_LINUX应用开发
本帖最后由 LINUX课程 于 2024-9-11 10:35 编辑

软件版本:vitis2021.1(vivado2021.1)
操作系统:WIN10 64bit
硬件平台:适用XILINX Z7/ZU系列FPGA
登录“米联客”FPGA社区-www.uisrc.com视频课程、答疑解惑!

1 概述
PL到PS的中断是ARM和FPGA交互中非常重要的一项功能。PS的中断控制器及时响应PL的中断,以通知CPU及时处理。本文通过按键输入,模拟中断信号的参数,通过简单的实验掌握PL到PS中断使用。然后在后续很多demo中,我们都会遇到PL到PS中断使用。虽然本文只用到了PL中断,但是在本文的第二下节,我们会对ZYNQ MPSOC的中断资源做一个简要介绍。
本文实验目的:
  • 熟悉ZYNQ MPSOC的中断资源,并且重点掌握PL-PS的中断资源
  • 搭建由FPGA按键输入模拟PL中断产生的的SOC工程
  • 编写PL中断测试验证程序
2 系统框图
image.jpg
3 PL中断资源简介
共有16个PL到PS中断通过Shared Peripheral Interrupts接入到CPU.
image.jpg
PL-PS的中断资源分2组,第1组的中断号为68~61;第2组的中断号为15~8
image.jpg
4 搭建SOC系统工程
详细的搭建过程这里不再重复,对于初学读者如果还不清楚如何创建SOC工程的,请学习“01Vitis Soc开发入门”这篇文章。
4.1 SOC系统工程
image.jpg
image.jpg
4.2 编译并导出平台文件
以下步骤简写,有不清楚的看“[米联客-XILINX-H3_CZ08_7100] LINUX基础篇连载-04 从vitis移植Ubuntu实现二次开发”
1:打开soc_prj内工程。
2:生成Bit文件。
3:导出到硬件: FileExport HardwareInclude bitstream
4:导出完成后,对应工程路径的soc_hw路径下有硬件平台文件:system_wrapper.xsa的文件。根据硬件平台文件system_wrapper.xsa来创建需要Platform平台。
image.jpg
5:打开vitis,并添加设备树模板。
6:创建工程文件,选择device tree创建,创建完成后编译工程。
7:获得设备树以及启动文件,打开虚拟机将文件拷贝到开发包的指定位置。
4.3 设备树修改及驱动编译
1:设备树修改
本章vitis不会生成任何有用的设备树,所以需要手动添加,另外soc_dts内有写好的设备树,若不熟可以参考。设备树的修改如下:
1725935026198.jpg
添加的设备如下:
  1. plint {
  2. compatible = "milianke,plint";
  3. interrupt-parent = <&intc>;
  4. interrupts = <0 29 4>; // 61 - 32
  5. };
复制代码
compatible字段用来匹配驱动,而interrupts为中断号。
image.jpg
第一位的中断号为 61,在Linux使用中断号时。实际要减去32,即fdma的中断号为 29。
2:编译系统
拷贝上一步写好的设备树到指定路径,拷贝其他文件后,编译uboot,编译kernel,制作镜像并烧录系统。具体步骤参考“[米联客-XILINX-H3_CZ08_7100] LINUX基础篇连载-04 从vitis移植Ubuntu实现二次开发”
3:编译驱动
将对应的demo拷贝至/home/uisrc下,同时确保/home/uisrc下有软件开发包uisrc-lab-xlnx。
1725935148688.jpg
进入demo的路径,使用make编译驱动。
image.jpg
其中.ko结尾的文件为我们编译出来的驱动。
4:拷贝程序
将对应的文件拷贝至sd卡上:
image.jpg
5 程序分析
  1. #include <linux/module.h>
  2. #include <linux/interrupt.h>
  3. #include <linux/of_platform.h>

  4. struct PLInt
  5. {
  6. int irq;
  7. };
  8. struct PLInt *PLInt_data;

  9. static irqreturn_t pl_irq_handler(int irq, void *data)
  10. {
  11. printk(KERN_CRIT "plbutton\n");
  12. return IRQ_HANDLED;
  13. }

  14. int of_PLInt_data(struct PLInt *pdata, struct platform_device *pdev)
  15. {
  16. pdata->irq = platform_get_irq(pdev, 0);
  17. if (pdata->irq < 0)
  18. {
  19.   printk("[err]unable get irq.\n");
  20.   return -1;
  21. }
  22. printk("irq: %d\n", pdata->irq);

  23. return 0;
  24. }

  25. static int PLInt_probe(struct platform_device *pdev)
  26. {
  27. int ret = 0;
  28. struct device *dev = &pdev->dev;
  29. struct PLInt *pdata = dev_get_platdata(dev);
  30. if (!pdata)
  31. {
  32.   pdata = devm_kzalloc(dev, sizeof(struct PLInt), GFP_KERNEL);
  33.   if (!pdata)
  34.    return -ENOMEM;

  35.   platform_set_drvdata(pdev, pdata);
  36. }
  37. ret = of_PLInt_data(pdata, pdev);
  38. PLInt_data = pdata;
  39. ret = request_irq(PLInt_data->irq, pl_irq_handler, IRQF_TRIGGER_RISING, "PLInt", PLInt_data);
  40. return ret;
  41. }

  42. static int PLInt_remove(struct platform_device *pdev)
  43. {
  44. free_irq(PLInt_data->irq, PLInt_data);
  45. return 0;
  46. }

  47. static struct of_device_id PLInt_of_match[] = {
  48. {.compatible = "milianke,plint"},
  49. {},
  50. };

  51. static struct platform_driver PLInt_device_driver = {
  52. .driver = {
  53.   .name = "PLInt",
  54.   .owner = THIS_MODULE,
  55.   .of_match_table = of_match_ptr(PLInt_of_match),
  56. },
  57. .probe = PLInt_probe,
  58. .remove = PLInt_remove,
  59. };

  60. static int __init PLInt_init(void)
  61. {
  62. return platform_driver_register(&PLInt_device_driver);
  63. }

  64. static void __exit PLInt_exit(void)
  65. {
  66. platform_driver_unregister(&PLInt_device_driver);
  67. }

  68. late_initcall(PLInt_init);
  69. module_exit(PLInt_exit);

  70. MODULE_LICENSE("GPL");
  71. MODULE_AUTHOR("uisrc");
复制代码
行64,调用行55~58代码,与设备树的compatible字段匹配。
行20~47,驱动初始化函数,需要读取设备树的中断号,并使用中断号申请中断。
行49~53,驱动注销函数,主要用来释放中断。
行17~27,获取设备树中的中断号。
行11~15,中断回调函数。
6 演示结果
6.1 硬件准备
将SD卡插入板卡。
SD2.0 启动 01 而模式开关为 ON OFF(7100 需要先将系统烧录进qspi,然后才能从qspi启动sd卡,“[米联客-XILINX-H3_CZ08_7100] LINUX基础篇连载-04 从vitis移植Ubuntu实现二次开发”)
2f5038eb9880afd532753935815b079.jpg
将 PS 端串口线连接电脑,如果要使用 ssh 登录,将网口线同样连接至电脑,最后给开发板通电。每次重新上电,需要重新插拔 PS 串口,否则会登录失败。
image.jpg
接入12V直流电源开机。
6.2 实验结果
登录板卡后,ls找到刚才拷贝进来的驱动文件,运行sudo insmod plint.ko装载驱动:
image.jpg
按下配套开发板上的PL 输入按键:
1725935327362.jpg
输出结果如下:
image.jpg
按几次就会输出几次plbutton。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则