linux下DMA驱动测试代码

Linux内核DMA子系统 - DMA测试实例1 【DMA机理】Linux内核DMA子系统 - DMA测试实例1。 阅读详情

DMA传输可以是内存到内存、内存到外设和外设到内存。这里的代码通过dma驱动实现了内存到内存的数据传输。

/*
Function description:When we call dmatest_read(),it will transmit src memory data
to dst memory,then print dst memory data by dma_callback_func(void) function.
*/
#include<linux/module.h>
#include<linux/init.h>
#include<linux/fs.h>
#include<linux/sched.h>

#include<linux/device.h>
#include<linux/string.h>
#include<linux/errno.h>

#include<linux/types.h>
#include<linux/slab.h>
#include<linux/dmaengine.h>
#include<linux/dma-mapping.h>

#include<asm/uaccess.h>

#define DEVICE_NAME "dma_test"
unsigned char dmatest_major;
static struct class *dmatest_class;

struct dma_chan *chan;
 //bus address
dma_addr_t dma_src;
dma_addr_t dma_dst;
//virtual address
char *src = NULL;
char *dst = NULL ;
struct dma_device *dev;
struct dma_async_tx_descriptor *tx = NULL;
enum dma_ctrl_flags flags;
dma_cookie_t cookie;

//When dma transfer finished,this function will be called.
void dma_callback_func(void)
{
	int i;
	for (i = 0; i < 512; i++){
		printk(KERN_INFO "%c",dst[i]);
	}
}

int dmatest_open(struct inode *inode, struct file *filp)
{
	return 0;
}

int dmatest_release(struct inode *inode, struct file *filp)
{
	return 0;
}

static ssize_t dmatest_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)
{
	int ret = 0;
	//alloc a desc,and set dst_addr,src_addr,data_size.
	tx = dev->device_prep_dma_memcpy(chan, dma_dst, dma_src, 512, flags);
	if (!tx){
		printk(KERN_INFO "Failed to prepare DMA memcpy");
	}
	
	tx->callback = dma_callback_func;//set call back function
	tx->callback_param = NULL;
	cookie = tx->tx_submit(tx); //submit the desc
	if (dma_submit_error(cookie)){
		printk(KERN_INFO "Failed to do DMA tx_submit");
	}
	
	dma_async_issue_pending(chan);//begin dma transfer
	
	return ret;
}

static ssize_t dmatest_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)
{
	int ret = 0;
	return ret;
}

static const struct file_operations dmatest_fops = {
	.owner = THIS_MODULE,
	.read = dmatest_read,
	.write = dmatest_write,
	.open = dmatest_open,
	.release = dmatest_release,
};

int dmatest_init(void)
{
	int i;
	dma_cap_mask_t mask;
	
	//the first parameter 0 means allocate major device number automatically
	dmatest_major = register_chrdev(0,DEVICE_NAME,&dmatest_fops);
	if (dmatest_major < 0) 
		return dmatest_major;
	//create a dmatest class
	dmatest_class = class_create(THIS_MODULE,DEVICE_NAME);
	if (IS_ERR(dmatest_class))
		return -1;
	//create a dmatest device from this class
	device_create(dmatest_class,NULL,MKDEV(dmatest_major,0),NULL,DEVICE_NAME);


	//alloc 512B src memory and dst memory
	src = dma_alloc_coherent(NULL, 512, &dma_src, GFP_KERNEL);
	printk(KERN_INFO "src = 0x%x, dma_src = 0x%x\n",src, dma_src);
	
	dst = dma_alloc_coherent(NULL, 512, &dma_dst, GFP_KERNEL);
	printk(KERN_INFO "dst = 0x%x, dma_dst = 0x%x\n",dst, dma_dst);
		
	for (i = 0; i < 512; i++){
		*(src + i) = 'a';
	}

	dma_cap_zero(mask);
	dma_cap_set(DMA_MEMCPY, mask);//direction:memory to memory
	chan = dma_request_channel(mask,NULL,NULL); //request a dma channel
	printk(KERN_INFO "dma channel id = %d\n",chan->chan_id);
	
	flags = DMA_CTRL_ACK | DMA_PREP_INTERRUPT;
	dev = chan->device;
	
	return 0;
}

void dmatest_exit(void)
{
	unregister_chrdev(dmatest_major,DEVICE_NAME);//release major device number
	device_destroy(dmatest_class,MKDEV(dmatest_major,0));//destroy globalmem device
	class_destroy(dmatest_class);//destroy globalmem class
	
	//free memory and dma channel
	dma_free_coherent(NULL, 512, src, &dma_src);
	dma_free_coherent(NULL, 512, dst, &dma_dst);
	
	dma_release_channel(chan);
}

module_init(dmatest_init);
module_exit(dmatest_exit);

MODULE_LICENSE("GPL");


AXI DMA总结、内核axidmatest.c测试程序分析、SG mode AXI DMA 概述: XILINX提供的AXI DMA支持Scatter/Gather mode和Direct Register mode 数据位宽支持32,64,128,256,512,1024bits,stream数据位宽支持8,16,32,64,128,256,512,1024bits,这里数据位宽表示DDR到上图中DataMover的数据位宽,stream数据位宽表示的DataMover到设备的数据位宽,表示一次可以传输多少位的数据。最高支持64bit地址。 AXI DMA在Scatte 阅读详情

相关推荐

xapp1052之dma_test.v

dma_test是针对dma硬件设计的仿真测试文件,文件包括DMA写数据测试,DMA读数据测试以及DMA读写数据测试。这个测试文件其实就是模拟pc的应用程序对fpga设备进行DMA读写。     DMA写测试指的是fpga设备往pc端进行DMA方式的写数据,而不是pc端往fpga设备中进行读写,这点要弄清。dma写测试的选择如下所示: else if (testname == "dma_mwr

Buyi_Shizi的博客 5810

dmaengine,dmatest, DW_DMAC driver

linux下有现成的dw_dmac驱动,但是需要自己创建设备文件,分配IRQ和mem resources, 所以需要对配置进行测试 linux dma engine framework提供了dmatest.c测试文件,用于测试,但是怎么使用这个文件呢? 首先一定要将该文件编译为ko文件,在测试时,insmod+参数 就可以启动这个函数  module 中使用参数主要有几个函数 : modu

yazhouren的专栏 5438

米尔科技ZYNQ -Linux下的DMA驱动

一.目标 在米尔科技的z-turn板上实现linux下的DMA驱动,同时对DMA中断进行测试。 二.分析 ZYNQ的AXIDMA有Direct Register Mode和Scatter/Gather Mode,本文使用的是Direct Register Mode。 Vivado上PL端的构造如下图所示,开启了DMA中断(PL-PS中断)。对于AXI-DMA来说,CPU通过S_AXI_LITE得出...

天使之猜的博客 6962

dmatest 代码分析

dmatest 代码分析 dmatest是内核的一个测试dma模块的代码,代码位置位于内核的./drivers/dma/dmatest.c,关于dmatest模块的使用可以参考内核提供的文档./Documentation/dmaengine/dmatest.txt,这里只简单地介绍一下。 编译加载模块 配置支持位置: Device Drivers -> DMA Engine support -> DMA Test client 或者直接修改配置文件CONFIG_DMATEST=m,编译成模块。

weixin_38878510的博客 5099

zynq 使用AXI_dma 传输==pl到ps,linux驱动开发,应用层处理DMA数据(一)

zynq axi_dma pl到ps数据传输 axi_dma驱动 linux应用层使用dma

ZYH10140的博客 9403

拆解紫光官方PCIe DMA测试代码:从臃肿GUI到精简C语言测试Demo

本文详细解析了紫光官方PCIe DMA测试代码的重构过程,从臃肿的GUI应用精简为高效的C语言测试框架。通过拆解核心功能、设计轻量级API和优化性能,开发者可以快速验证PCIe DMA功能,适用于FPGA数据采集和异构计算等场景。文章还提供了驱动兼容性处理和调试技巧,帮助解决常见问题。

weixin_30819163的博客 693

linux dma驱动,linux下DMA驱动测试代码

DMA传输可以是内存到内存、内存到外设和外设到内存。这里的代码通过dma驱动实现了内存到内存的数据传输。/*Function description:When we call dmatest_read(),it will transmit src memory datato dst memory,then print dst memory data by dma_callback_func(voi...

weixin_29159127的博客 869

linux 字符驱动设备 驱动代码 测试代码 makefile文件

1.驱动代码 ,此部分的ioctl 就是为了模拟控制编写一个printk函数来代表 代码:led.c /* driver.c */ #include #include #include #include #include #include #include #include #include #include #include

蜗牛的爬行之路 581

【JokerのZYNQ7020】LINUX_AXI_DMA。

软件环境:vivado 2017.4 硬件平台:XC7Z035 这篇吧主要哔哔一下在linux下,怎么使用axi_dma,这里说的使用,是指的应用层面的使用,而不是驱动层的axi_dma在linux下的驱动,至于为什么不按照一般流程,把vivado底层模块写成linux下的驱动,一方面水平还不够,另一方面,直接在应用层上用能达到一样的目的,方法还简单粗暴。 这里需要注意一下,...

Joker_是小王的博客 3944

[AbutionGraph] 报表制作-使用Grafana动态可视化知识图谱指标

使用开源报表可视化工具Grafana实时监控时序知识图谱数据仓库AbutionGraph中的数据,实时性报表查询, 满足单次百万千万级的数据查询,毫秒级查询延迟,亚秒级对千亿数据量汇总统计,每日过亿报表查询/多维分析/日志分析等数据指标...

图特摩斯科技-博客 4279

英飞凌ADS开发环境搭建全流程:从安装到第一个程序烧录

本文详细介绍了英飞凌ADS开发环境搭建的全流程,包括环境准备、ADS安装与配置、MemTools烧录技巧等关键步骤。针对嵌入式开发者,特别提供了从安装到第一个程序烧录的实战指南,涵盖常见问题解决方案和优化建议,帮助开发者快速上手英飞凌AURIX系列微控制器的开发工作。

qsc901234的博客 334

DMA实践4:使用dma_alloc_coherent替代dma_map_single

DMA实践4:使用dma_alloc_coherent替代dma_map_single

4229

硕士论文排版救星:用Mathtype一键搞定所有公式格式(附样式预设文件)

本文详细介绍了如何使用Mathtype的样式预设和批量格式化功能,快速统一硕士论文中的公式格式。通过创建标准样式预设文件和一键批量处理,解决公式字体、大小、间距不统一的问题,确保符合学术规范要求,大幅提升论文排版效率。

weixin_30772105的博客 938

3559AV100 sensor hub添加DMA模式

在主soc中使用sensor hub外围资源,使能shub spi0添加DMA驱动支持 1.进入linux目录,打开menu菜单 make ARCH=arm64 CROSS_COMPILE=aarch64-himix100-linux- menuconfig 2.打开驱动支持 Device Drivers —> []DMA Engine support —> <> Hisilicon EDMAC Controller support [*] Renesas SuperH

小小英 2355

若依框架整合Flowable:从零构建企业级流程中心

本文详细介绍了如何将若依框架与Flowable工作流引擎整合,构建企业级流程中心。通过环境配置、依赖添加、数据库设置等核心步骤,实现流程定义管理、任务处理服务等关键功能,并结合实际案例展示请假审批流程的实现与动态表单集成。文章还提供了性能优化和生产建议,帮助开发者高效构建稳定可靠的工作流系统。

weixin_28365523的博客 230

ISA-95(S95)标准详解

ISA-95是制造业系统集成的“通用语言”,通过分层模型和信息流规范,打通企业计划层与设备控制层,成为实现数字化工厂的核心标准之一。其与ISA-88的协同应用,可进一步优化生产执行与资源管理的效率。标准,旨在解决企业商业系统(如ERP)与工业控制系统(如MES、SCADA)之间的集成问题。

「东哥说MES」 专注于MES制造执行系统,为你拆解核心架构、功能模块及与ERP/PLC的集成逻辑。提供从入门到精通的系列干货、精选行业报告与实用工具,构建你的数字化知识体系,关注我,用实战经验照亮你的数字化之路。 3737

Linux USB 驱动开发实例(六)—— USB鼠标驱动注解及测试

参考2.6.14版本中的driver/usb/input/usbmouse.c。鼠标驱动可分为几个部分:驱动加载部分、probe部分、open部分、urb回调函数处理部分。 一、驱动加载部分 static int __init usb_mouse_init(void) { int retval = usb_register(&usb_mouse_driver);//注册鼠标驱动 ...

|~~~热爱生活、努力学习的小伙汁~~~| 1129

双击文件夹弹窗“找不到应用程序”,但是右键点击打开可以

此电脑、回收站、c、d、f盘、控制面板、任意文件夹等都没有办法双击打开。 右键中包含“使用filemanager打开”,是由于FileManager卸载残留导致的。 懒人专用附件 下载解压上面附件,双击导入可以清理FileManager软件残留 参考: 双击此电脑出现找不到应用程序,但是右键点击可以-其他-优快云问答https://ask.youkuaiyun.com/questions/7631439 电脑上的文件夹双击都提示找不到应用程序,但是右击打开就能打开,该怎么解决? - 知乎 (z

webmasterqpwou的博客 1万+

流式DMA映射实践1:先写一个misc驱动框架

流式DMA映射实践1:先写一个misc驱动框架

1498

JavaScript教程-字符集,Unicode转义序列,标识符,数据类型,数字,未定义值,浮点数,字符串,引用数据类型,类型检测,类型转换,运算符,关系运算符,

前端学习

VAN 213

GPU硬件架构与微架构深度解析34-GPU安全架构深度解析

现代GPU不仅是图形处理器,更是高性能计算平台,安全架构设计至关重要。内存加密- 保护数据在传输和存储时的安全安全启动- 确保固件和软件的完整性隔离机制- 防止不同应用间的数据泄露密钥管理- 安全存储和处理加密密钥。

2301_79143213的博客 100

DMA驱动测试代码

转载:http://www.bubuko.com/infodetail-931408.html DMA传输可以是内存到内存、内存到外设和外设到内存。这里的代码通过dma驱动实现了内存到内存的数据传输。 /* Function description:When we call dmatest_read(),it will transmit src memory data to dst memo...

feixiang3839的专栏 573

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

fences策略linux,Linux dma-fence demo--笔记

首页>系统相关> 文章详细Linux dma-fence demo--笔记2021-03-29 23:01:16阅读:122来源:互联网https://www.cnblogs.com/yaongtime/p/14594567.html前面的几篇笔记记录dma-fence的一些用途,这里简单写了个DMA-FENCE的测试代码。dma-fence本身的实现和使用并不复杂,其只有两种状态...

weixin_39575737的博客 1389

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

AXI DMA linux驱动

1.PL端设计: PL端设计包括四个AXI DMA IP,它们分别和zynq处理IP的HP口相连接。 这个设计是基于Avnet-Digilent-ZedBoard-v2016.1-final.bsp,由于其它的ip都是xilinx开发环境开发环境就有,所以这里就不详细每一步设计过程了。 这些IP包括AXI interconnect, system reset,axi dma,concat。 注...

weixin_42278284的博客 2084

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

spi-lcd-st7789-驱动开发-imx6ul spi dma传输(6)

imx6ul spi dma传输分析 imx6ul sdk 里面spi 驱动做的比较完善,会自己判断是否满足dma传输的条件,如果满足dma传输就直接使用dma进行传输了。 那么imx 6ul平台spi使用dma传输的条件是什么呢?其实只要传输的bpw为1,2,4 然后数据长度为32的整数倍就可以使用dma传输了。 imx 进行spi传输相关的代码如下: static int spi_imx_transfer(struct spi_device *spi, struct spi_tran

萌主不萌的专栏 3092
上一篇: linux驱动中的链表操作
下一篇: linux下pl330 DMA控制器驱动分析
EmSoftEn
博客等级 码龄12年 40粉丝 63原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值