dma 测试例子
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/sched.h>
#include <linux/mman.h>
#include <linux/init.h>
#include <linux/dma-mapping.h>
#include <linux/fs.h>
#include <linux/version.h>
#include <linux/delay.h>
#include <mach/dma.h>
#include <linux/dmaengine.h>
#include <linux/device.h>
#include <linux/io.h>
#include <linux/delay.h>
static int gMajor; /* major number of device */
static struct class *dma_tm_class;
u32 *wbuf, *wbuf2, *wbuf3;
u32 *rbuf, *rbuf2, *rbuf3;
u32 *rxbuf,*txbuf;
struct dma_chan *dma_m2m_chan_rx,*dma_m2m_chan_tx;
struct completion dma_m2m_ok;
struct scatterlist sg_rx[1],sg_tx[1],sg[3], sg2[3];
#define SDMA_BUF_SIZE 1024
static bool dma_m2m_filter(struct dma_chan *chan, void *param)
{
if (!imx_dma_is_general_purpose(chan))
{
printk("I #################\n");
return false;
}
chan->private = param;
return true;
}
static void dma_m2m_callback(void *data)
{
printk("in %s\n",__func__);
complete(&dma_m2m_ok);
return ;
}
static int imx_fpga_dma_init()
{
dma_cap_mask_t dma_m2m_mask;
struct imx_dma_data m2m_dma_data = {0};
struct dma_slave_config dma_m2m_config;
init_completion(&dma_m2m_ok);
dma_cap_zero(dma_m2m_mask);
dma_cap_set(DMA_SLAVE, dma_m2m_mask);
m2m_dma_data.peripheral_type = IMX_DMATYPE_EXT;
m2m_dma_data.priority = DMA_PRIO_HIGH;
dma_m2m_chan_rx = dma_request_channel(dma_m2m_mask, dma_m2m_filter, &m2m_dma_data);
dma_m2m_config.direction = DMA_FROM_DEVICE;
dma_m2m_config.src_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
dma_m2m_config.src_addr =0x74000000;
dmaengine_slave_config(dma_m2m_chan_rx, &dma_m2m_config);
rxbuf=kzalloc(SDMA_BUF_SIZE, GFP_DMA);
/* tx*/
dma_m2m_chan_tx = dma_request_channel(dma_m2m_mask, dma_m2m_filter, &m2m_dma_data);
dma_m2m_config.direction = DMA_TO_DEVICE;
dma_m2m_config.dst_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
dma_m2m_config.dst_addr =0x74000000;
dmaengine_slave_config(dma_m2m_chan_tx, &dma_m2m_config);
txbuf=kzalloc(SDMA_BUF_SIZE, GFP_DMA);
}
static int start_rx_dma()
{
int ret;
struct dma_async_tx_descriptor *desc;
sg_init_table(sg_rx, 1);
sg_set_buf(&sg_rx[0],rxbuf,SDMA_BUF_SIZE);
ret = dma_map_sg(NULL, sg_rx, 1, DMA_FROM_DEVICE);
if (ret == 0) {
pr_err("DMA mapping error for RX.\n");
return -EINVAL;
}
desc = dma_m2m_chan_rx->device->device_prep_slave_sg(dma_m2m_chan_rx,
sg_rx, 1, DMA_FROM_DEVICE, 0);
if (!desc) {
pr_err("We cannot prepare for the RX slave dma!\n");
return -EINVAL;
}
desc->callback = dma_m2m_callback;
dmaengine_submit(desc);
dmaengine_submit(desc);
dma_unmap_sg(NULL, sg_rx, 1, DMA_FROM_DEVICE);
return 0;
}
static int start_tx_dma()
{
int ret;
struct dma_async_tx_descriptor *desc;
memset(txbuf,0x33,SDMA_BUF_SIZE);
sg_init_table(sg_tx, 1);
sg_set_buf(&sg_tx[0],txbuf,SDMA_BUF_SIZE);
ret = dma_map_sg(NULL, sg_tx, 1, DMA_TO_DEVICE);
desc = dma_m2m_chan_tx->device->device_prep_slave_sg(dma_m2m_chan_tx,
sg_tx, 1, DMA_FROM_DEVICE, DMA_PREP_INTERRUPT| DMA_COMPL_SKIP_DEST_UNMAP);
if (!desc) {
pr_err("We cannot prepare for the tX slave dma!\n");
return -EINVAL;
}
desc->callback = dma_m2m_callback;
dmaengine_submit(desc);
dmaengine_submit(desc);
dma_unmap_sg(NULL, sg_tx, 1, DMA_TO_DEVICE);
return 0;
}
int sdma_open(struct inode * inode, struct file * filp)
{
imx_fpga_dma_init();
return 0;
}
int sdma_release(struct inode * inode, struct file * filp)
{
dma_release_channel(dma_m2m_chan_rx);
dma_m2m_chan_rx = NULL;
dma_release_channel(dma_m2m_chan_tx);
dma_m2m_chan_tx = NULL;
/* kfree(wbuf);
kfree(wbuf2);
kfree(wbuf3);
kfree(rbuf);
kfree(rbuf2);
kfree(rbuf3);*/
return 0;
}
ssize_t sdma_read (struct file *filp, char __user * buf, size_t count,
loff_t * offset)
{
//start_rx_dma();
return 0;
}
ssize_t sdma_write(struct file * filp, const char __user * buf, size_t count,
loff_t * offset)
{
start_tx_dma();
return 0;
}
struct file_operations dma_fops = {
open: sdma_open,
release: sdma_release,
read: sdma_read,
write: sdma_write,
};
int __init sdma_init_module(void)
{
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26))
struct device *temp_class;
#else
struct class_device *temp_class;
#endif
int error;
/* register a character device */
error = register_chrdev(0, "sdma_test", &dma_fops);
if (error < 0) {
printk("SDMA test driver can't get major number\n");
return error;
}
gMajor = error;
printk("SDMA test major number = %d\n",gMajor);
dma_tm_class = class_create(THIS_MODULE, "sdma_test");
if (IS_ERR(dma_tm_class)) {
printk(KERN_ERR "Error creating sdma test module class.\n");
unregister_chrdev(gMajor, "sdma_test");
return PTR_ERR(dma_tm_class);
}
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28))
temp_class = device_create(dma_tm_class, NULL,
MKDEV(gMajor, 0), NULL, "sdma_test");
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26))
temp_class = device_create(dma_tm_class, NULL,
MKDEV(gMajor, 0), "sdma_test");
#else
temp_class = class_device_create(dma_tm_class, NULL,
MKDEV(gMajor, 0), NULL,
"sdma_test");
#endif
if (IS_ERR(temp_class)) {
printk(KERN_ERR "Error creating sdma test class device.\n");
class_destroy(dma_tm_class);
unregister_chrdev(gMajor, "sdma_test");
return -1;
}
printk("SDMA test Driver Module loaded\n");
return 0;
}
static void sdma_cleanup_module(void)
{
unregister_chrdev(gMajor, "sdma_test");
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26))
device_destroy(dma_tm_class, MKDEV(gMajor, 0));
#else
class_device_destroy(dma_tm_class, MKDEV(gMajor, 0));
#endif
class_destroy(dma_tm_class);
printk("SDMA test Driver Module Unloaded\n");
}
module_init(sdma_init_module);
module_exit(sdma_cleanup_module);
MODULE_AUTHOR("Freescale Semiconductor");
MODULE_DESCRIPTION("SDMA test driver");
MODULE_LICENSE("GPL");
dma 测试例子的更多相关文章
- ORM开发之解析lambda实现完整查询(附测试例子)
上次讲解了怎么解析匿名对象(ORM开发之解析lambda实现group查询),这次来实现解析二元运算,完成基本条件语法 先看一个表达式 query.Where(b => b.Number == ...
- php判断数据库是否连接成功的测试例子
php判断数据库是否连接成功的测试例子 如果出现数据库配置不正确的错误,请看php与mysql的配置教程: win7系统下如何配置php-Apache-mysql环境 http://www.cnblo ...
- php多线程抓取信息测试例子
php多线程抓取信息测试例子 PHP 5.3 以上版本,使用pthreads PHP扩展,可以使PHP真正地支持多线程.多线程在处理重复性的循环任务,能够大大缩短程序执行时间. PHP扩展下载:htt ...
- Go语言学习之斐波那契数列的测试例子和定义常量方法
### Go语言学习之斐波那契数列的测试例子和定义常量方法 1.go语言中测试文件必须以test.go结尾,比如:fib_test.go 2.测试文件内的方法必须是Test开头,比如:func Tes ...
- Jmeter负载测试例子
通过浏览器操作网站在jmeter录屏控制器显示录屏例子,并且通过这例子模拟多用户(线程)来负载测试. 工具/原料 Jmeter 浏览器 1.先在测试计划创建线程组和录制Case 1 1.1 选 ...
- cglib测试例子和源码详解
目录 简介 为什么会有动态代理? 常见的动态代理有哪些? 什么是cglib 使用例子 需求 工程环境 主要步骤 创建项目 引入依赖 编写被代理类 编写MethodInterceptor接口实现类 编写 ...
- dom4j的测试例子和源码详解(重点对比和DOM、SAX的区别)
目录 简介 DOM.SAX.JAXP和DOM4J xerces解释器 SAX DOM JAXP DOM解析器 获取SAX解析器 DOM4j 项目环境 工程环境 创建项目 引入依赖 使用例子--生成xm ...
- 基于V6的中移动物联测试例子,当前测试还挺稳定
下载: 链接:https://pan.baidu.com/s/1Gz8mEffDGXNSK8lIsAIUEg 提取码:2sur 测试步骤看此贴,跟V7开发板是一样的: 基于H7的中移动物联例子以及 ...
- 【ELK】Centos7 安装 ELK 7.6.2 和 UI 管理界面以及测试例子
1. 初始化环境 1.0 初始化环境官网参考 https://www.elastic.co/guide/en/elasticsearch/reference/current/system-config ...
随机推荐
- 打造利器Qt Creator:代码todo工具的使用
http://blog.csdn.net/maobush/article/details/67636734
- set_include_path和get_include_path用法详解
首先set_include_path这个函数呢,是在脚本里动态地对PHP.ini中include_path进行修改的.而这个include_path呢,它可以针对下面的include和require的 ...
- jmeter接口测试实例1-添加学生信息
jmeter实例1:添加学生信息 进入jmeter,添加线程组改名称为添加学生信息(为了好区分接口),添加http请求,输入IP,方法,路径,在body data中输入json串,同上面postman ...
- python之函数第二篇
一.名称空间与作用域 名称空间分类: 内置名称空间 import this dir(buil-in) 查看全部内置 全局名称空间 局部名称空间 在函数体内等 查询全局和局部 globals()方法可以 ...
- MongodbHelper
这个是在查找到的一些资料的基础上自己写的,不足之处请交流指正: using MongoDB.Bson; using MongoDB.Driver; using System; using System ...
- css解决滚动弹出层里边的滚动条时带动了整个页面滚动的问题
之前一个朋友问我说他的一个弹出层在弹出后,上下滑动弹出层或遮罩层,结果遮罩层下边的整个页面(页面超出了一屏)也跟着滚动了,他说他不想要这样的效果,我说你把弹出层和遮罩层的position:fixed设 ...
- MySQL优化之like关键字
1.%号不放最左边 无法使用索引了,开头是不确定的,MySQL也无法进行优化了,只能扫描表了. 2.使用覆盖索引 如果业务需要%就放开头我们也没办法,一般情况需求都是这样的,毕竟优化还是为业务服务的. ...
- .Net转Java.02.数据类型
.NET中常见的数据类型分类分别是值类型和引用类型 值类型包括(基元类型.struct.枚举) 引用类型包括(类.类.数组.接口.指针) Java分为,基本类型和类 C# Java 值类型 ...
- 2.1 mac下多版本jdk的安装和管理
之前已经安装过jdk8了,安装路径:/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk 现在安装jdk10,下载后,双击dmg文件一直到安装完成,安装 ...
- 分布式环境中,模块数据交互协议分析 (百度brpc)
1. 背景 之前听到同事说,要为自己的模块考虑写个数据协议.今天有空想了一下.写出来,方便后续使用. 开源代码brpc中可以支持多种协议,nshead.redis.mongo等20多种协议. 2. 什 ...