Xilinx XDMA 上位机应用程序控制逻辑

这篇具有很好参考价值的文章主要介绍了Xilinx XDMA 上位机应用程序控制逻辑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Xilinx XDMA pcie 上位机应用程序控制逻辑

1. 驱动安装的参数

关于驱动的编译和安装这里就不多讲了,无非就是make 和 insmod 。这里讲一下驱动安装时,控制驱动属性的几个参数:
1.中断模式

static unsigned int interrupt_mode;
module_param(interrupt_mode, uint, 0644);
MODULE_PARM_DESC(interrupt_mode, "0 - Auto , 1 - MSI, 2 - Legacy, 3 - MSI-x");

中断模式分为三种,MSIX是最新的中断模式,老版本的内核可能不支持。就比如说我的内核。如果不指定驱动安装额中断参数,那么就会产生内核安装的错误。所以这里我们选择MSI的中断模式。

2.驱动运行模式

static unsigned int poll_mode;
module_param(poll_mode, uint, 0644);
MODULE_PARM_DESC(poll_mode, "Set 1 for hw polling, default is 0 (interrupts)");

驱动的运行模式分为两种, 中断模式和poll_mode 模式,默认是中断模式,设置为1是硬件polling模式。根据实际应用场景可以选择相应的设置。
3.sgdma传输延时

unsigned int h2c_timeout = 10;
module_param(h2c_timeout, uint, 0644);
MODULE_PARM_DESC(h2c_timeout, "H2C sgdma timeout in seconds, default is 10 sec.");

unsigned int c2h_timeout = 10;
module_param(c2h_timeout, uint, 0644);
MODULE_PARM_DESC(c2h_timeout, "C2H sgdma timeout in seconds, default is 10 sec.");

默认是10s钟, 可以自定义设置。

4.其他参数

static unsigned int enable_st_c2h_credit = 0;
module_param(enable_st_c2h_credit, uint, 0644);
MODULE_PARM_DESC(enable_st_c2h_credit,
	"Set 1 to enable ST C2H engine credit feature, default is 0 ( credit control disabled)");

unsigned int desc_blen_max = XDMA_DESC_BLEN_MAX;
module_param(desc_blen_max, uint, 0644);
MODULE_PARM_DESC(desc_blen_max,
		 "per descriptor max. buffer length, default is (1 << 28) - 1");

这两个参数,没有使用过,基本上也没怎么了解。 大概也就是数据传输的认证和描述符的buf长度吧 。

2.驱动安装后生成的几个设备

驱动安装成功后,会生成几个设备文件。对应的应用编程, 就是操作这些设备文件来实现对应的业务逻辑。简单的介绍一下几个设备的功能:
xdma 应用编程,linux,Xilinx XDMA,后端,fpga开发,驱动开发
1. xdma0_h2c_0 xdma0_c2h_0
这两个设备就是用来读写的设备文件,h2c 是写设备,c2h是读设备。对应的是FPGA端设置的通道。
2. xdma0_events_x
用于处理中断事件的设备,IP核内设置对应的中断号,对应的中断设备。
3. xdma0_user
xdma_user设备节点用于实现PCIe的地址映射,为上层应用提供编程控制接口、AXI接口等
4. xdma0_control
xdma0_control设备节点主要是为上层提供DMA寄存器接口

比较常用的就这几个设备。

3.应用程序逻辑

两个线程:一个线程用于处理中断事件,另外一个线程用于处理数据读取。线程之间的同步用信号量。
读取的数据保存在文件。

	/*信号量初始化*/
	sem_init(&c2h_sem, 0, 0);
	/*线程创建*/
	pthread_create(&c2h_event_thread, NULL, c2h_event_process, NULL);
	pthread_create(&c2h_data_thread, NULL, c2h_data_process, NULL);

void *c2h_event_process(void *param)
{
	static int flag = 0;
	int fd = open_event("/dev/xdma0_events_0");
	printf("c2h event thread running, c2h_event_fd = %d\n", fd);
	while(1)
	{
		int val = read_event(fd);
		if(val ) 
		{
			sem_post(&c2h_sem);
			if (flag < total_frame) {
				printf("c2h get %d frame event\n",flag);
				flag++;
			}else{
				pthread_exit(0);
			}
		}else{	
			continue;
		}
	}
}
void *c2h_data_process(void *param)
{
	int fd = open("/dev/xdma0_c2h_0",O_RDWR | O_NONBLOCK);
	printf("c2h data thread running, c2h_data_fd = %d\n", fd);

	/*读取的数据写文件*/
	FILE *record_fp = fopen("/mnt/nfs/c2h_record.bin", "wb");
	unsigned char *buf = new unsigned char[frame_bytes];
	while(1)
	{
		sem_wait(&c2h_sem);
	 	int read_bytes = read(xdma_c2h_fd, c2h_align_mem, trans_bytes);
	 	memcpy(buf, c2h_align_mem, read_bytes);
		recv_frame_cnt++;
		fwrite(buf, frame_bytes, 1, record_fp);
		printf("Have been read %d frame,with %d irq\n",recv_frame_cnt,irq_num);
		if(recv_frame_cnt >= total_frame)
		{
			clock_gettime(CLOCK_MONOTONIC, &ts_end);
			printf("video recv over!\n");
			delete buf;
			fclose(record_fp);
			pthread_exit(0);
		}
	}
}

读取的数据保存在以4096字节的堆区。函数调用时:

/*4096字节对齐分配内存*/
posix_memalign((void **)&c2h_align_mem,4096, frame_bytes);

设备xdma_usr的使用,之前有说过,xdma_user设备节点用于实现PCIe的地址映射,为上层应用提供编程控制接口、AXI接口等。
那么FPGA端可以设置一些属性放在寄存器中供我们读取。比如我这边就从寄存器a4获取的帧的大小,
mmap 函数是将硬件的地址硬件映射至linux 用户层可访问的虚拟地址空间。

	int control_fd = open_control("/dev/xdma0_user");
	control_base = mmap_control(control_fd,MAP_SIZE);
	/*获取帧大小*/
	frame_bytes = read_control(control_base,0x0a4);
	printf("frame_bytes:%d\n", frame_bytes);

测试代码很简单,逻辑基本上就是这样。

最近我会去研究XDMA的驱动,看他的实际逻辑时如何的。之后会更新一篇文章,来梳理我之后的学习内容。

相关的的驱动及测试代码,以及FPGA工程,已经上传至网盘,有需要的朋友可以自行下载。

链接:https://pan.baidu.com/s/1wdPqUf8_2K6r8ZbVupizrw
提取码:i2sw文章来源地址https://www.toymoban.com/news/detail-708835.html

到了这里,关于Xilinx XDMA 上位机应用程序控制逻辑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA基于XDMA实现PCIE X4的HDMI视频采集 提供工程源码和QT上位机程序和技术支持

    PCIE(PCI Express)采用了目前业内流行的点对点串行连接,比起 PCI 以及更早期的计算机总线的共享并行架构,每个设备都有自己的专用连接,不需要向整个总线请求带宽,而且可以把数据传输率提高到一个很高的频率,达到 PCI 所不能提供的高带宽,是目前各行业高速接口的优

    2023年04月18日
    浏览(48)
  • FPGA基于XDMA实现PCIE X8采集AD7606数据 提供工程源码和QT上位机程序和技术支持

    PCIE(PCI Express)采用了目前业内流行的点对点串行连接,比起 PCI 以及更早期的计算机总线的共享并行架构,每个设备都有自己的专用连接,不需要向整个总线请求带宽,而且可以把数据传输率提高到一个很高的频率,达到 PCI 所不能提供的高带宽,是目前各行业高速接口的优

    2024年02月06日
    浏览(77)
  • FPGA基于XDMA实现PCIE X8采集AD9226数据 提供工程源码和QT上位机程序和技术支持

    PCIE(PCI Express)采用了目前业内流行的点对点串行连接,比起 PCI 以及更早期的计算机总线的共享并行架构,每个设备都有自己的专用连接,不需要向整个总线请求带宽,而且可以把数据传输率提高到一个很高的频率,达到 PCI 所不能提供的高带宽,是目前各行业高速接口的优

    2024年02月04日
    浏览(44)
  • FPGA基于XDMA实现PCIE X8视频采集HDMI输出 提供工程源码和QT上位机程序和技术支持

    PCIE(PCI Express)采用了目前业内流行的点对点串行连接,比起 PCI 以及更早期的计算机总线的共享并行架构,每个设备都有自己的专用连接,不需要向整个总线请求带宽,而且可以把数据传输率提高到一个很高的频率,达到 PCI 所不能提供的高带宽,是目前各行业高速接口的优

    2024年02月01日
    浏览(49)
  • FPGA基于XDMA实现PCIE X4视频采集HDMI输出 提供工程源码和QT上位机程序和技术支持

    PCIE(PCI Express)采用了目前业内流行的点对点串行连接,比起 PCI 以及更早期的计算机总线的共享并行架构,每个设备都有自己的专用连接,不需要向整个总线请求带宽,而且可以把数据传输率提高到一个很高的频率,达到 PCI 所不能提供的高带宽,是目前各行业高速接口的优

    2024年02月02日
    浏览(48)
  • 【.NET】控制台应用程序的各种交互玩法

    关于控制台交互,大伙伴们也许见得最多的是进度条,就是输出一行但末尾不加 n,而是用 r 回到行首,然后输出新的内容,这样就做出进度条了。不过这种方法永远只能修改最后一行文本。 于是,有人想出了第二种方案——把要输出的文本存起来(用二维数组,啥的都行

    2024年02月04日
    浏览(63)
  • C#控制台应用程序如何添加窗口关闭事件?

    公司有一个控制台应用程序,在关闭控制台应用程序窗口前,想处理一下业务逻辑。还有比如误操作关闭了,或者像消息队列启动了发送消息提醒,那关闭了窗口代表控制台应用销毁了,也需要发送消息通知。那这个时候添加关闭窗口事件就派上用场了。 很多小伙伴问,有没

    2024年02月13日
    浏览(48)
  • .net core控制台应用程序在linux运行

    1)创建.net 6.0控制台应用程序 2)在应用根目录执行cmd命令发布应用:dotnet publish -o .deploy 3)将发布文件上传到服务器    4)运行控制台应用程序(dotnet /home/app/ConsoleApp/ConsoleApp5.dll) 5)如果需要定时执行,可以添加sh文件 参考:linux定时备份(删除)mysql_linux数据库定时备

    2024年02月16日
    浏览(61)
  • xilinx XDMA

    xdma 是 xilinx 提供的 Pcie 总线桥的IP核,类似于硬件的透传模块;该 ip 核主要作用是将pcie总线转换成axi总线,可以通过该模块直接操作 axi 总线上设备寄存器。模块最新好像可以支持 pcie x16 接口。当前介绍的只支持 x4。 分成两个部分,具体大致如下: 左侧 Pcie 总线 相关 右侧

    2024年02月08日
    浏览(39)
  • .NET Core 实现日志打印输出在控制台应用程序中

    在本文中,我们将探讨如何在 .NET Core 应用程序中将日志消息输出到控制台,从而更好地了解应用程序的运行状况。 在 .NET Core 中,日志输出打印是使用 Microsoft.Extensions.Logging 命名空间中的类和方法实现的。首先,我们需要确保在项目中添加了以下必要的依赖包: Microsoft.Ex

    2024年02月11日
    浏览(171)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包