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

AG16K MCU ARM Cortex M3

其中,Input文件为Keil生成的mcu程序文件,输出为合成后的存储格式Bin文件,Program address 为上方表格中“程序运行 RAM 地址(4bytes)”,即 Keil 中设置的程序运行地址。其中 MCU 程序的地址,根据 mcu.ip 中设置的 FLASH_BIAS 进行设置。AG16K MCU 的 FPGA 工程中,需调用 alta_mcu_m3 的硬核 IP,包含在 alta_sim.v 的库文。Quartus II。//MCU 程序在 FLASH 中存放的首地址。

Embeded_FPGA的博客 1806

C++ 核电站

问题描述 一个核电站有n个放核物质的坑,排列在一条直线上。如果连续m个坑中放入核物质就会发生爆炸,所以某些坑中不能放核物质。 本题的任务:对于给定的n和m,求不发生爆炸的放置核物质的方案总数。 输入格式 第一行两个正整数n和m,之间用一个空格隔开。2≤n≤50,2≤m≤5。 输出格式 一行一个正整数,表示方案总数。 输入样例 4 3 输出样例 13 数据规模与约定 2≤n≤50,2≤m≤5 CODE #include<bits/stdc++.h> using namespace

HybridCOW_HORSE的博客 1804

DMA实践4:使用dma_alloc_coherent替代dma_map_single

DMA实践4:使用dma_alloc_coherent替代dma_map_single

4229

5G NR LDPC码(2)—— 从基图到速率匹配:解码5G高速数据信道的标准化设计

本文深入解析了5G NR LDPC码的标准化设计流程。从作为核心骨架的基图(BG1/BG2)出发,详细阐述了其如何通过扩展因子Z灵活生成实际校验矩阵,并协同传输块大小计算与分段策略。文章重点剖析了基于循环缓存和冗余版本的速率匹配机制,以及其如何高效支撑增量冗余混合自动重传请求,从而确保5G高速数据信道在复杂环境下的可靠与高效传输。

weixin_29206669的博客 272

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

ROG幻16Air新机避坑:Ubuntu 22.04下NVIDIA驱动、CUDA与Isaac Gym的兼容性实战

本文详细记录了在ROG幻16Air新机上安装Ubuntu 22.04,并成功配置NVIDIA驱动、CUDA与Isaac Gym强化学习开发环境的完整实战过程。针对官方文档未明确支持Ubuntu 22.04的挑战,文章提供了从驱动安装、CUDA版本选择、Python虚拟环境搭建到Isaac Gym兼容性调试的一站式解决方案,帮助开发者在新硬件上高效部署机器人仿真与训练平台。

weixin_28419039的博客 221

Oracle11g下载与安装(windows)

一、Oracle11g下载 二、安装准备 三、执行安装步骤 四、测试连接 附:Oracle11g服务说明

欢迎订阅我的“JAVA全栈开发笔记(全)”专栏,价格优惠,仅需19.9元。 2万+

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

从VLM到VLA概论

智驾视觉大模型

xiaomu_347的博客 1713

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

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

1498

170、电机控制中的温升测试

本文以一次IGBT炸管事故为切入点,深入剖析电机控制中温升测试的实质:不仅是温度测量,更是对铜损、铁损、散热效率等热管理问题的系统验证。作者强调测试前热电偶布置、环境记录、预运行的重要性,提出实时监控电流谐波、绕组电阻、散热梯度等关键参数,并通过损耗分离与冷却系统实测,揭示真实热源。结合温升曲线异常分析与经验建议,强调留余量、仿真结合实测、关注瞬态工况等实践要点,警示温升测试是保障可靠性与安全性的核心环节。

2401_88858637的博客 49

《UDS协议从入门到精通》系列——图解0x27:安全访问

什么是安全访问服务?应用场景和基本原理是什么?全网最直观详细的图解UDS-0x27:安全访问服务!!

车载系统攻城狮 7233

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

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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、付费专栏及课程。

余额充值