Xilinx XDMA 数据传输sgdma 驱动代码分析

Xilinx XDMA 数据传输sgdma 驱动代码分析

我的之前两篇文章有介绍到上位机软件的逻辑该如何控制,驱动代码的框架是怎样的,驱动的整体逻辑在linux系统中是如何实现的,感兴趣的小伙伴可以去考古。
Xilinx XDMA 上位机应用程序控制逻辑
Xilinx XDMA驱动代码分析及用法
XDMA 传输的核心部分代码是cdev_sgdma.c ,利用DMA进行数据传输,传输方式为sgdma的传输方式,

1、SG-DMA介绍

Scatter-Gather DMA ,分散/集中映射是流式 DMA 映射的一个特例。它将几个缓冲区集中到一起进行一次映射,并在一个 DMA 操作中传送所有数据。这些分散的缓冲区由分散表结构scatterlist来描述,多个分散的缓冲区的分散表结构组成缓冲区的struct scatterlist数组。
[DMA技术和及其SG模式](https://blog.csdn.net/chinamaoge/article/details/104606865)

2、sgdma IO文件操作接口

cdev_sgdma.c 是xdma 驱动传输的主要接口,驱动正确安装后会生成xdma0_c2h_0 xdma0_h2c_0 的读写设备。
在这里插入图片描述
上位机程序。通过文件io.read\write 调用驱动的read\write,以触发sgdma进行数据传输,传输完成会有中断,之余中断时如何使用的,感兴趣的朋友看一下一起的文章。
在这里插入图片描述

char_sgdma_read 、char_sgdma_write 两个接口调用同一个接口进行数据输出, 接口以一个bool变量驱动,数据是读还是写。
在这里插入图片描述
函数原型:

static ssize_t char_sgdma_read_write(struct file *file, const char __user *buf,
		size_t count, loff_t *pos, bool write)

函数的调用关系如图
在这里插入图片描述

static ssize_t char_sgdma_read_write(struct file *file, const char __user *buf,
		size_t count, loff_t *pos, bool write)
{
   
	int rv;
	ssize_t res = 0;
	struct xdma_cdev *xcdev = (struct xdma_cdev *)file->private_data;
	struct xdma_dev *xdev;
	struct xdma_engine *engine;
	struct xdma_io_cb cb;

	rv = xcdev_check(__func__, xcdev, 1);
	if (rv < 0)
		return rv;
	xdev = xcdev->xdev;
	engine = xcdev->engine;

	dbg_tfr("file 0x%p, priv 0x%p, buf 0x%p,%llu, pos %llu, W %d, %s.\n",
		file, file->private_data, buf, (u64)count, (u64)*pos, write,
		engine->name);

	if ((write && engine->dir != DMA_TO_DEVICE) ||
	    (!write && engine->dir != DMA_FROM_DEVICE)) {
   
		pr_err("r/w mismatch. W %d, dir %d.\n",
			write, engine->dir);
		return -EINVAL;
	}

	rv = check_transfer_align(engine, buf, count, *pos, 1);
	if (rv) {
   
		pr_info("Invalid transfer alignment detected\n");
		return rv;
	}

	memset(&cb, 0, sizeof(struct xdma_io_cb));
	cb.buf = (char __user *)buf;
	cb.len = count;
	cb.ep_addr = (u64)*pos;
	cb.write = write;
	rv = 
  • 9
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论
在Windows上对Xilinx XDMA驱动进行测试,我们可以遵循以下步骤: 1. 下载和安装Xilinx XDMA驱动:首先,我们需要从Xilinx官方网站上下载和安装适用于我们目标设备的XDMA驱动程序。确保选择与您所使用的设备和操作系统版本兼容的驱动程序。 2. 配置硬件设置:安装驱动后,我们需要连接Xilinx XDMA适配器到计算机,并确保设备正常工作。这涉及到检查硬件连接、配置适配器、设置中断线路等等,确保所有配置都正确完成。 3. 编译和运行示例代码Xilinx提供了许多示例代码,可以帮助我们了解如何使用XDMA驱动进行数据传输。我们可以选择一个适合我们测试需求的示例代码,按照指导进行编译和运行。 4. 测试功能:使用示例代码可以测试Xilinx XDMA驱动数据传输方面的功能。检查数据传输的性能和稳定性,确保数据可以准确地从主机计算机传输到外设设备,以及从外设设备传输回主机。 5. 调试和故障排除:在测试过程中,可能会遇到一些问题。如果出现错误或其他异常情况,我们需要根据错误日志或调试工具进行故障排除。这可能涉及检查配置文件、调整驱动设置、查看硬件状态等等。 6. 进行性能测试:对Xilinx XDMA驱动进行性能测试是很重要的。我们可以使用不同大小和类型的数据进行测试,评估数据传输速度和延迟。这有助于确定驱动的性能瓶颈以及是否满足我们的需求。 7. 编写自己的应用程序:一旦我们确认Xilinx XDMA驱动正常工作并满足我们的需求,我们可以开始编写自己的应用程序。这可以是一个数据采集应用程序、实时数据处理应用程序等等,根据我们的具体应用场景进行开发。 总结起来,测试Xilinx XDMA驱动需要下载和安装驱动、配置硬件设置、编译和运行示例代码、测试功能、调试和故障排除、性能测试以及编写自己的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂的蕉尼基

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值