祝各位道友念头通达
GitHub Gitee 语雀 打赏

zynq ps pcie endpoint 调试

ps 端 ep 配置, 非 pl 端

官方示例代码: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/2141323327/Zynq+UltraScale+MPSoC+PS-PCIe+End+Point+Driver

这里说明大概流程, 细节查看文档
需要调试细节和资料可留言

基础配置

基础配置1:
image
基础配置2:
endpoint 也需要配置 id, 中断类型, bar 数量等
image

1. linux 驱动代码说明

首先从官方示例代码 ps_pcie_dma.c 中 提供了如何通过 DMA 和 PIO 的方式对数据进行传输。

2. PIO 模式

PIO 的读写方式是直接通过 CPU 将数据拷贝至 BAR 2 空间中

static ssize_t
pio_write (struct file *file,
  	const char __user * buffer, size_t length, loff_t * f_offset) {

  char *barMemory = NULL;
  struct expresso_dma_device *xdev;
  ssize_t numBytes = 0;

  xdev = file->private_data;
  barMemory = (char *) xdev->BARInfo[PIO_MEMORY_BAR_NUMBER].BAR_VIRT_ADDR; /** PIO_MEMORY_BAR_NUMBER 2 */

  ...

  barMemory += *f_offset;

  numBytes = copy_from_user(barMemory, buffer, length);
  ...
  return numBytes;

3. DMA

这里的 DMA 采用的是 SG DMA 模块, 该模块需要 对应的 EP 模块支持, 在该平台中,DMA 模块映射在 bar0 空间, 通过 host 主机驱动配置
手册中描述了 AXI-PCIE DMA 是支持 SG(scatter-gather, 既不连续内存 DMA) 模式的
sg 模块在 linux 也有对应的数据结构控制

image

4. 说明

手册说明了 zynq 系列 PS PCIE 相关寄存器分五个模块

  • AXIPCIE_DMA, pcie DMA 操作寄存器
  • AXIPCIE_EGRESS, 数据输出地址绑定寄存器
  • AXIPCIE_INGRESS, 数据输入地址绑定寄存器
  • AXIPCIE_MAIN , 配置总寄存器, 桥, ECAM 等
  • PCIE_ATTRIB, 模块, 其中对 bar, id等配置都是在该寄存器中实现

这里应该是不需要 fpga 做额外类似 PL 端 IP 盒的配置

5. 注意事项

在 linux 上跑上述示例之前, 需要先跑对应的 EP 裸机代码

6. 结构图

image

posted @ 2024-06-24 15:36  韩若明瞳  阅读(94)  评论(0编辑  收藏  举报