OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5822|回复: 13

[XILINX] zynq 编写Linux驱动程序驱动vivado HLS的IP核

[复制链接]

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2017-9-2
在线时间
7 小时
发表于 2020-3-13 09:28:13 来自手机 | 显示全部楼层 |阅读模式
我在使用正点原子ZYNQ7020领航者开发板写Linux驱动的时候遇到了一点问题,想发帖请教一下。
我的小项目目标是在运行着Linux的zynq开发板上实现对于给定的一个数组,每个元素乘以2。我用vivado HLS设计了这个乘法模块。模块只有一个数据端口,数组经由该端口输入,乘法后的结果也经由该端口输出。设计好这个乘法模块IP核以后放到vivado软件中进行连线,并按照教程添加其它必要的IP核,使得该硬件平台可以成功运行Linux。目前,我可以实现用该硬件平台成功在zynq上运行petalinux,我还写了一个简单的裸机应用程序让乘法运算在裸机环境下跑,也能跑成功,得到正确的结果。但是,我在教程提供的字符设备驱动框架的基础上尝试对硬件平台中那个HLS乘法模块进行驱动时,发现并没有出现输出结果。
我的驱动代码设计思路大致为:
1. 在init初始化字符设备的时候,对HLS模块的各物理地址(如控制模块是否开启、是否空闲的状态寄存器、数据端口寄存器)使用ioremap_nocache()映射到内核虚拟内存中。
2. 往一块连续的地址区域调用write函数写入数组元素作为HLS端口输入。
3. 开启HLS模块。时刻观察状态寄存器的值,一旦表示“HLS模块运行完毕”的位为1时,再次读取该端口所映射的同样的那块地址区域。(由于前面提到输入输出都经由该端口,所以输出值会覆盖原来输入的那些数据。我在裸机程序中就是这样设计的。)

结果发现,最终读取到的数据还是输入的那些数据,也就是说并没有输出数据,因为这些输入数据没有被覆盖掉。但状态寄存器的值的确能监视到发生变化,且最终确定模块已经运行完毕。为什么没有输出结果呢?
想请教一下有没有可能哪些地方我的驱动设计思路出现了问题。
谢谢!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

712

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2177
金钱
2177
注册时间
2018-8-27
在线时间
257 小时
发表于 2020-3-13 10:02:05 | 显示全部楼层
你在裸机下能够使用说明你这个HLS的设计以及搭建的vivado硬件平台应该是没有问题的,我看你这个驱动设计的思路也是没有问题的。你说的裸机程序是指SDK程序吗?方便看下你的hls的IP跟其他模块的连接图吗?
森罗万象
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2017-9-2
在线时间
7 小时
 楼主| 发表于 2020-3-13 11:39:02 | 显示全部楼层
你好!谢谢你的回答。
是的,裸机程序是在win10的Xilinx SDK中完成,设计方式和《zynq领航者嵌入式开发指南》里面的众多例程一样。我可以用什么方式把HLS、vivado工程、裸机程序和Ubuntu下的Linux驱动程序和测试程序给你看一下?
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2017-9-2
在线时间
7 小时
 楼主| 发表于 2020-3-13 11:39:37 | 显示全部楼层
xiaotaotao 发表于 2020-3-13 10:02
你在裸机下能够使用说明你这个HLS的设计以及搭建的vivado硬件平台应该是没有问题的,我看你这个驱动设计的 ...

你好!谢谢你的回答。
是的,裸机程序是在win10的Xilinx SDK中完成,设计方式和《zynq领航者嵌入式开发指南》里面的众多例程一样。我可以用什么方式把HLS、vivado工程、裸机程序和Ubuntu下的Linux驱动程序和测试程序给你看一下?
回复 支持 反对

使用道具 举报

2

主题

712

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2177
金钱
2177
注册时间
2018-8-27
在线时间
257 小时
发表于 2020-3-13 11:49:28 | 显示全部楼层
Thührer 发表于 2020-3-13 11:39
你好!谢谢你的回答。
是的,裸机程序是在win10的Xilinx SDK中完成,设计方式和《zynq领航者嵌入式开发 ...

你截个图就行了,把HLS IP这部分的连接图 给我看看
森罗万象
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2017-9-2
在线时间
7 小时
 楼主| 发表于 2020-3-13 12:03:42 | 显示全部楼层
xiaotaotao 发表于 2020-3-13 10:02
你在裸机下能够使用说明你这个HLS的设计以及搭建的vivado硬件平台应该是没有问题的,我看你这个驱动设计的 ...

硬件平台和Linux驱动程序、测试程序见图片文件和附件。谢谢!

linux_driver.rar

3.64 KB, 下载次数: 17

Ubuntu下编写的HLS模块Linux驱动程序和测试程序

回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2017-9-2
在线时间
7 小时
 楼主| 发表于 2020-3-13 12:05:54 | 显示全部楼层
xiaotaotao 发表于 2020-3-13 11:49
你截个图就行了,把HLS IP这部分的连接图 给我看看

图片中是硬件平台。

能运行Linux且能驱动HLS模块的硬件平台

能运行Linux且能驱动HLS模块的硬件平台
回复 支持 反对

使用道具 举报

2

主题

712

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2177
金钱
2177
注册时间
2018-8-27
在线时间
257 小时
发表于 2020-3-13 12:07:04 | 显示全部楼层
Thührer 发表于 2020-3-13 12:03
硬件平台和Linux驱动程序、测试程序见图片文件和附件。谢谢!

没看到你的图片
森罗万象
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2017-9-2
在线时间
7 小时
 楼主| 发表于 2020-3-13 12:07:21 | 显示全部楼层
xiaotaotao 发表于 2020-3-13 11:49
你截个图就行了,把HLS IP这部分的连接图 给我看看

图片中是硬件平台对应的地址信息。

硬件平台中部分模块的地址信息

硬件平台中部分模块的地址信息
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2017-9-2
在线时间
7 小时
 楼主| 发表于 2020-3-13 12:18:00 | 显示全部楼层
xiaotaotao 发表于 2020-3-13 11:49
你截个图就行了,把HLS IP这部分的连接图 给我看看

下面是Linux驱动的测试程序的运行结果。这些是从putty中复制粘贴过来的。
  1. root@zynq_multiply_lite:~# ls
  2. chrdev_mul.ko   chrdev_mul_APP
  3. root@zynq_multiply_lite:~# mv * /lib/modules/4.14.0-xilinx/
  4. root@zynq_multiply_lite:~# ls
  5. root@zynq_multiply_lite:~# cd /lib/modules/4.14.0-xilinx/
  6. root@zynq_multiply_lite:/lib/modules/4.14.0-xilinx# ls
  7. chrdev_mul.ko        modules.builtin      modules.order
  8. chrdev_mul_APP       modules.builtin.bin  modules.softdep
  9. kernel               modules.dep          modules.symbols
  10. modules.alias        modules.dep.bin      modules.symbols.bin
  11. modules.alias.bin    modules.devname
  12. root@zynq_multiply_lite:/lib/modules/4.14.0-xilinx# insmod chrdev_mul.ko
  13. chrdev_mul: loading out-of-tree module taints kernel.
  14. Module started...
  15. mmap...
  16. char device driver already loaded!
  17. root@zynq_multiply_lite:/lib/modules/4.14.0-xilinx# ./chrdev_mul_APP /dev/mmult
  18. Opening the char device...ib/modules/4.14.0-xilinx# ./chrdev_mul_APP /dev/mmult
  19. Writing matrix A to kernel...
  20. #Kernel: (float)0x3f800000 was written to AXI BRAM(__iomem: 0xf0ab9000).
  21. #Kernel: (float)0x40000000 was written to AXI BRAM(__iomem: 0xf0ab9010).
  22. #Kernel: (float)0x40400000 was written to AXI BRAM(__iomem: 0xf0ab9020).
  23. #Kernel: (float)0x40000000 was written to AXI BRAM(__iomem: 0xf0ab9030).
  24. #Kernel: (float)0x40400000 was written to AXI BRAM(__iomem: 0xf0ab9040).
  25. #Kernel: (float)0x40800000 was written to AXI BRAM(__iomem: 0xf0ab9050).
  26. #Kernel: (float)0x40400000 was written to AXI BRAM(__iomem: 0xf0ab9060).
  27. #Kernel: (float)0x40800000 was written to AXI BRAM(__iomem: 0xf0ab9070).
  28. #Kernel: (float)0x40a00000 was written to AXI BRAM(__iomem: 0xf0ab9080).
  29. Writing matrix B to kernel...
  30. #Kernel: (float)0x3f800000 was written to AXI BRAM(__iomem: 0xf0ab9090).
  31. #Kernel: (float)0x0 was written to AXI BRAM(__iomem: 0xf0ab90a0).
  32. #Kernel: (float)0x0 was written to AXI BRAM(__iomem: 0xf0ab90b0).
  33. #Kernel: (float)0x0 was written to AXI BRAM(__iomem: 0xf0ab90c0).
  34. #Kernel: (float)0x3f800000 was written to AXI BRAM(__iomem: 0xf0ab90d0).
  35. #Kernel: (float)0x0 was written to AXI BRAM(__iomem: 0xf0ab90e0).
  36. #Kernel: (float)0x0 was written to AXI BRAM(__iomem: 0xf0ab90f0).
  37. #Kernel: (float)0x0 was written to AXI BRAM(__iomem: 0xf0ab9100).
  38. #Kernel: (float)0x3f800000 was written to AXI BRAM(__iomem: 0xf0ab9110).
  39. #in app: sending a START signal 0x1 to run HLS module.



  40. #Kernel: start signal received!
  41. Before START, register value = 4
  42. #Kernel: After START, register value of __iomem 0xf0abb000 = 0x1
  43. #in app: sending a query signal 0x10101010 to view HLS status.


  44. #Kernel: in query mode
  45. #Kernel: register value of __iomem 0xf0abb000 is 0x6


  46. #in app: AXI_LITE reg = 0x6


  47. #Kernel: in query mode
  48. #Kernel: register value of __iomem 0xf0abb000 is 0x4


  49. #in app: HLS task is done. AXI_LITE reg = 0x4

  50. #in app: Deriv#Kernel: (float)0x3f800000 fetched from __iomem 0xf0ab9000.
  51. ing result...
  52. #Kernel: Read data successfully.
  53. read data: 3f800000(aka. 1.000000)
  54. #Kernel: (float)0x40000000 fetched from __iomem 0xf0ab9010.
  55. #Kernel: Read data successfully.
  56. read data: 40000000(aka. 2.000000)
  57. #Kernel: (float)0x40400000 fetched from __iomem 0xf0ab9020.
  58. #Kernel: Read data successfully.
  59. read data: 40400000(aka. 3.000000)
  60. #Kernel: (float)0x40000000 fetched from __iomem 0xf0ab9030.
  61. #Kernel: Read data successfully.
  62. read data: 40000000(aka. 2.000000)
  63. #Kernel: (float)0x40400000 fetched from __iomem 0xf0ab9040.
  64. #Kernel: Read data successfully.
  65. read data: 40400000(aka. 3.000000)
  66. #Kernel: (float)0x40800000 fetched from __iomem 0xf0ab9050.
  67. #Kernel: Read data successfully.
  68. read data: 40800000(aka. 4.000000)
  69. #Kernel: (float)0x40400000 fetched from __iomem 0xf0ab9060.
  70. #Kernel: Read data successfully.
  71. read data: 40400000(aka. 3.000000)
  72. #Kernel: (float)0x40800000 fetched from __iomem 0xf0ab9070.
  73. #Kernel: Read data successfully.
  74. read data: 40800000(aka. 4.000000)
  75. #Kernel: (float)0x40a00000 fetched from __iomem 0xf0ab9080.
  76. #Kernel: Read data successfully.
  77. read data: 40a00000(aka. 5.000000)
  78. Closing the char device...
复制代码
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2017-9-2
在线时间
7 小时
 楼主| 发表于 2020-3-13 16:43:44 | 显示全部楼层

你好,想问一下我Linux驱动代码是哪里存在什么问题吗,我好像还是没能解决
回复 支持 反对

使用道具 举报

2

主题

712

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2177
金钱
2177
注册时间
2018-8-27
在线时间
257 小时
发表于 2020-3-13 17:40:44 | 显示全部楼层
Thührer 发表于 2020-3-13 16:43
你好,想问一下我Linux驱动代码是哪里存在什么问题吗,我好像还是没能解决

等我有时间再看看
森罗万象
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2017-9-2
在线时间
7 小时
 楼主| 发表于 2020-3-13 18:46:10 | 显示全部楼层
xiaotaotao 发表于 2020-3-13 17:40
等我有时间再看看

好啊,谢谢
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-3-31
在线时间
2 小时
发表于 2020-3-31 16:54:17 | 显示全部楼层
你好,你是从哪里学的驱动的编写啊? 我看正点原子的视频里面只涉及到了很简单的驱动编写啊。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-10-3 09:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表