xdma的linux驱动编译给arm使用(中断检测-测试程序)

news2025/4/7 7:16:00

1、驱动链接

XDMA驱动源码官网下载地址为:https://github.com/Xilinx/dma_ip_drivers
下载最新版本的XDMA驱动源码,即master版本,否则其驱动用不了(xdma ip核版本为4.1)。
在这里插入图片描述

2、驱动

此部分来源于博客:xdma驱动编译(给arm使用)

2.1、修改驱动的Makefile

修改dma_ip_drivers-master/XDMA/linux-kernel/xdma/Makefile

# ifneq ($(KERNELRELEASE),)
# 	$(TARGET_MODULE)-objs := libxdma.o xdma_cdev.o cdev_ctrl.o cdev_events.o cdev_sgdma.o cdev_xvc.o cdev_bypass.o xdma_mod.o xdma_thread.o
# 	obj-m := $(TARGET_MODULE).o
# else
# 	BUILDSYSTEM_DIR:=/lib/modules/$(shell uname -r)/build
# 	PWD:=$(shell pwd)
 
找到上面的并注释掉(最后一行还有一个 endif 也注释掉),紧挨着就添加下面的:
 
$(TARGET_MODULE)-objs := libxdma.o xdma_cdev.o cdev_ctrl.o cdev_events.o cdev_sgdma.o cdev_xvc.o cdev_bypass.o xdma_mod.o xdma_thread.o
obj-m := $(TARGET_MODULE).o
BUILDSYSTEM_DIR:=/home/debian/Desktop/xiaguangbo/project/rk3588/project/kernel # linux 源码目录
PWD:=$(shell pwd)

2.2、编译

export ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
make

3、测试工具

3.1、修改测试工具Makefile

修改 dma_ip_drivers-master/XDMA/linux-kernel/tools/Makefile

# CC ?= gcc
CC = aarch64-linux-gnu-gcc

3.2、编译

make

编译之后用file xxx查看文件是否是属于aarch64架构的,如果不是查看Makefile对不对

4、xdma中断检测上位机

4.1、代码

#include <assert.h>
#include <fcntl.h>
#include <getopt.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <pthread.h>  
#include <semaphore.h>
#include <stdarg.h>
#include <syslog.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/sysinfo.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
/* ltoh: little to host */
/* htol: big to host */
#if __BYTE_ORDER == __LITTLE_ENDIAN
#  define ltohl(x)       (x)
#  define ltohs(x)       (x)
#  define htoll(x)       (x)
#  define htols(x)       (x)
#elif __BYTE_ORDER == __BIG_ENDIAN
#  define ltohl(x)     __bswap_32(x)
#  define ltohs(x)     __bswap_16(x)
#  define htoll(x)     __bswap_32(x)
#  define htols(x)     __bswap_16(x)
#endif
#define MAP_SIZE (1024*1024UL)
#define MAP_MASK (MAP_SIZE - 1)

static void * user_base;
static int start_en;
unsigned int  user_irq_ack;

static void *mmap_control(int fd,long mapsize)
{
	void *vir_addr;
	vir_addr = mmap(0, mapsize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
	return vir_addr;
}

static void user_write(unsigned int address,unsigned int val)
{
    unsigned int writeval = htoll(val);
    *((unsigned int *)(user_base+address)) = writeval;
}

static unsigned int user_read(unsigned int address)
{
    unsigned int read_result = *((unsigned int *)(user_base+address));
    read_result = ltohl(read_result);
    return read_result;
}

void *event0_process()
{
	int val;
	int h_event0;
    	h_event0 = open("/dev/xdma0_events_0", O_RDWR | O_SYNC);
    	if(h_event0 < 0) 
	{ 
		printf("open event0 error\n");
	}
	else
	{
	printf("open event0\n");
	while (1)
		{
			if (start_en) {
			read(h_event0,&val,4);
			if (val == 1)
				printf("event_0 done!\n");
			else
				printf("event_0 timeout!\n");
			}
			usleep(1);
		}
	close(h_event0);
	}
}

void *event1_process()
{
	int val;
	int h_event1;
    	h_event1 = open("/dev/xdma0_events_1", O_RDWR | O_SYNC);
    	if(h_event1 < 0) 
	{ 
		printf("open event1 error\n");
	}
	else
	{
	printf("open event1\n");
	while (1)
		{
			if (start_en) {
			read(h_event1,&val,4);
			if (val == 1)
				printf("event_1 done!\n");
			else
				printf("event_1 timeout!\n");
			}
			usleep(1);
		}
	close(h_event1);
	}
}

void *event2_process()
{
	int val;
	int h_event2;
    	h_event2 = open("/dev/xdma0_events_2", O_RDWR | O_SYNC);
    	if(h_event2 < 0) 
	{ 
		printf("open event2 error\n");
	}
	else
	{
	printf("open event2\n");
	while (1)
		{
			if (start_en) {
			read(h_event2,&val,4);
			if (val == 1)
				printf("event_2 done!\n");
			else
				printf("event_2 timeout!\n");
			}
			usleep(1);
	}
	close(h_event2);
	}
}

void *event3_process()
{
	int val;
	int h_event3;
    	h_event3 = open("/dev/xdma0_events_3", O_RDWR | O_SYNC);
    	if(h_event3 < 0) 
	{ 
		printf("open event3 error\n");
	}
	else
	{
	printf("open event3\n");
	while (1)
		{
			if (start_en) {
			read(h_event3,&val,4);
			if (val == 1)
				printf("event_3 done!\n");
			else
				printf("event_3 timeout!\n");
			}
			usleep(1);
		}
	close(h_event3);
	}
}

int main(int argc, char* argv[])
{

    	static int h_c2h0;
    	static int h_h2c0;
    	static int h_user;
    	pthread_t t_event0; 
    	pthread_t t_event1;
    	pthread_t t_event2;
    	pthread_t t_event3;

    	char* user_name = "/dev/xdma0_user";
    	char* c2h0_name = "/dev/xdma0_c2h_0";
    	char* h2c0_name = "/dev/xdma0_h2c_0";

	start_en = 0;

    	h_c2h0 = open(c2h0_name,O_RDWR | O_NONBLOCK);
    	if(h_c2h0 < 0) { printf("open c2h0 error\n");  };

    	h_h2c0 = open(h2c0_name,O_RDWR);
    	if(h_h2c0 < 0) { printf("open h2c0 error\n");  };

    	h_user = open(user_name, O_RDWR | O_SYNC);
    	if(h_user < 0) { printf("open user error\n");  };

    	user_base = mmap_control(h_user,MAP_SIZE);
	user_write(0x00000, 0xf);
  	pthread_create(&t_event0, NULL, event0_process, NULL);
	pthread_create(&t_event1, NULL, event1_process, NULL);
	pthread_create(&t_event2, NULL, event2_process, NULL);
	pthread_create(&t_event3, NULL, event3_process, NULL);

	usleep(100);
	user_irq_ack = 0xffff0000;
	user_write(0x00004, user_irq_ack);//start irq
	start_en = 1;
	printf("start\n");

	pthread_join(t_event0,NULL);
	pthread_join(t_event1,NULL);
	pthread_join(t_event2,NULL);
	pthread_join(t_event3,NULL);

	user_irq_ack = 0x00000000;
	user_write(0x00004, user_irq_ack);//stop irq

	close(h_c2h0);
	close(h_h2c0);
	close(h_user);
	close(t_event0);
	close(t_event1);
	close(t_event2);
	close(t_event3);

}

4.2编译中断测试程序

aarch64-linux-gnu-gcc pcie_irq.c -o pcie_irq -static -lpthread

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1978022.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多模态MLLM都是怎么实现的(12)-Florence-2

最近一直在打艾尔登法环DLC&#xff0c;疏于更新了&#xff0c;罪过罪过&#xff0c;今天把拉塔恩给过了&#xff0c;也该更新了&#xff0c;停更期间&#xff0c;催更的信息主要是啥时候更新GPU系列的第五篇&#xff0c;不是不更&#xff0c;是刚打完&#xff0c;正好有客户要…

C# Unity 面向对象补全计划 七大原则 之 里氏替换

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 本系列作为七大原则和设计模式的进阶知识&#xff0c;看不懂没关系 请看专栏&#xff1a;http://t.csdnimg.cn/mIitr&#xff0c;尤其是关于继承的两篇文章&#xff…

算法022:寻找峰值

寻找峰值. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/find-peak-element/ 这个题跟上一个题很像&#xff0c;也是寻找一个峰值。此题还特意强调了如果有多个峰…

【数学思维培养】罗博深小学数学青少年数学思维分级课程(3-4年级)

【数学思维培养】罗博深小学数学青少年数学思维分级课程&#xff08;3-4年级&#xff09; 背景前摇&#xff1a; 虽然我是学理工科计算机的&#xff0c;但我感觉我在数学方面一直都存在劣势&#xff0c;无论是写程序到了涉及数学计算的地方&#xff08;比如向量、余弦等&#…

【数据分析--带你认识数据分析,了解数据分析的】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;本阶段和大家一起分享和探索数据分析—基础介绍&#xff0c;本篇文章主要讲述了&#xff1a;数据分析的介绍&#xff0c;Python开源库&#xff0c;配置Jupyter等等。欢迎大家一起探索讨论…

C++程序的编译链接过程

一、预处理 &#xff08;1&#xff09; 将所有的#define删除&#xff0c;并且展开所有的宏定义 &#xff08;2&#xff09; 处理所有的条件预编译指令&#xff0c;如#if、#ifdef &#xff08;3&#xff09; 处理#include预编译指令&#xff0c;将被包含的文件插入到该预编译…

html+css 实现hover边框彩色流动

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽效果&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 文…

人工智能深度学习系列—深入探索IoU Loss及其变种:目标检测与分割的精度优化利器

文章目录 1. 背景介绍2. Loss计算公式3. 使用场景4. 代码样例5. 总结 1. 背景介绍 在深度学习的目标检测和分割领域&#xff0c;评估预测结果与真实标注之间的一致性是提升模型性能的关键。IoU Loss&#xff08;Intersection over Union Loss&#xff09;及其变种损失函数&…

【人工智能五】人工智能基础习题

文章目录 壹. 内容补充一. VR&#xff0f;AR&#xff0f;MR的区别1. 三者概念2. 区别 二. 深度学习重要算法及人物介绍1. 反向传播算法2. 卷积神经网络 贰. 习题精选1一. 选择二. 判断题三. 填空题四. 简单题1. 综合2. 深度学习与神经网络 壹. 内容补充 一. VR&#xff0f;AR&…

人工智能与机器学习的相关介绍

文章目录 人工智能的发展历程人工智能与机器学习关系图谱数据处理机器学习ML和深度学习DL的区别人工智能按照学习方式划分监督学习算法无监督学习算法总结 人工智能的发展历程 重要的时间点了解一下&#xff1a; 早在1950年人工智能就已经开始兴起 1997年deep blue战胜了人类国…

一款功能强大的屏幕演示工具,免费版足够使用!

鼠标换肤 | 屏幕画笔 | 放大镜 | 聚光灯 | 屏幕放大 | 倒计时&#xff0c;功能强大的屏幕演示工具 屏幕演示工具适用于Windows平台&#xff0c;特别是Windows 10及以上版本。该软件提供了多种实用功能&#xff0c;包括鼠标换肤、屏幕画笔、放大镜、聚光灯、屏幕放大和倒计时等…

k8s集群的资源发布方式(滚动/蓝绿/灰度发布)及声明式管理方法

目录 1.常见的发布方式 2.滚动发布 3.蓝绿发布 4.实现金丝雀发布&#xff08;Canary Release&#xff09; 5.声明式管理方法 1.常见的发布方式 蓝绿发布:两套环境交替升级&#xff0c;旧版本保留一定时间便于回滚优点&#xff1a;用户无感知&#xff0c;部署和回滚速度较…

基于强化学习算法玩CartPole游戏

什么事CartPole游戏 CartPole&#xff08;也称为倒立摆问题&#xff09;是一个经典的控制理论和强化学习的基础问题&#xff0c;通常用于测试和验证控制算法的性能。具体来说&#xff0c;它是一个简单的物理模拟问题&#xff0c;其目标是通过在一个平衡杆&#xff08;倒立摆&a…

Cesium初探-坐标转换

Cesium的坐标系分三种&#xff1a;屏幕坐标、笛卡尔空间直角坐标、地理坐标。 屏幕坐标 屏幕坐标系是一个是平面直角坐标系&#xff0c;即二维笛卡尔坐标系&#xff0c;屏幕左上角为原点&#xff08;0,0&#xff09;&#xff0c;单位为像素值&#xff0c;屏幕水平方向为X轴&a…

Python | SyntaxError: invalid syntax 深度解析

Python | SyntaxError: invalid syntax 深度解析 在Python编程中&#xff0c;SyntaxError: invalid syntax是一个常见的错误&#xff0c;它表明Python解释器在尝试解析代码时遇到了语法问题。这个错误通常是由于代码中存在拼写错误、缺少符号&#xff08;如括号、冒号或逗号&a…

Java中的Map(如果想知道Java中有关Map的知识点,那么只看这一篇就足够了!)

前言&#xff1a;在Java编程语言中&#xff0c;集合框架&#xff08;Collection Framework&#xff09;提供了一系列用于存储和操作数据的接口和类。其中&#xff0c;Map和Set是两个非常重要的接口&#xff0c;分别用于存储键值对和无重复元素的集合。 ✨✨✨这里是秋刀鱼不做梦…

Nerd Fonts

文章目录 关于 Nerd Fonts重要告示TL;DR字体的各种下载选项 特点 Glyph Setsshell中的图标名称 修补字体Variations 字体安装Option 1: Release Archive DownloadOption 2: Homebrew FontsOption 3: Unofficial Chocolatey or Scoop RepositoriesOption 4: Arch Extra Reposito…

AI在医学领域:医学成像中针对深度神经网络(DNN)的对抗性攻击及其防御策略

关键词&#xff1a;对抗性攻击、医学图像、深度神经网络、模型安全、鲁棒性 机器学习&#xff08;ML&#xff09;是医学领域快速发展的一个分支&#xff0c;它利用计算机科学和统计学的方法来解决医学问题。众所周知&#xff0c;攻击者可能通过故意为机器学习分类器创建输入来…

C++11 包装器

1.function包装器 1.1 概念介绍 ret func(x); 上面 func 是什么呢&#xff1f;那么 func 可能是函数名&#xff0c;函数指针&#xff0c;函数对象 ( 仿函数对象 )&#xff0c; 也可能是lamber 表达式对象&#xff0c;这些都是可调用的类型。 函数包装器&#xff0c;也称为函…

comfyui老照片修复工作流,直接复制到comfyui中即可使用

ComfyUI是一个基于web的图形用户界面,用于直观地构建和运行AI模型流程。它特别适合于使用Stable Diffusion等模型进行图像生成任务。然而,ComfyUI本身并不直接提供老照片修复的功能,但你可以通过组合不同的节点来实现这一目标。 老照片修复通常涉及到几个关键步骤: 图像去…