#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 测试例子的更多相关文章

  1. ORM开发之解析lambda实现完整查询(附测试例子)

    上次讲解了怎么解析匿名对象(ORM开发之解析lambda实现group查询),这次来实现解析二元运算,完成基本条件语法 先看一个表达式 query.Where(b => b.Number == ...

  2. php判断数据库是否连接成功的测试例子

    php判断数据库是否连接成功的测试例子 如果出现数据库配置不正确的错误,请看php与mysql的配置教程: win7系统下如何配置php-Apache-mysql环境 http://www.cnblo ...

  3. php多线程抓取信息测试例子

    php多线程抓取信息测试例子 PHP 5.3 以上版本,使用pthreads PHP扩展,可以使PHP真正地支持多线程.多线程在处理重复性的循环任务,能够大大缩短程序执行时间. PHP扩展下载:htt ...

  4. Go语言学习之斐波那契数列的测试例子和定义常量方法

    ### Go语言学习之斐波那契数列的测试例子和定义常量方法 1.go语言中测试文件必须以test.go结尾,比如:fib_test.go 2.测试文件内的方法必须是Test开头,比如:func Tes ...

  5. Jmeter负载测试例子

    通过浏览器操作网站在jmeter录屏控制器显示录屏例子,并且通过这例子模拟多用户(线程)来负载测试. 工具/原料   Jmeter 浏览器 1.先在测试计划创建线程组和录制Case   1 1.1 选 ...

  6. cglib测试例子和源码详解

    目录 简介 为什么会有动态代理? 常见的动态代理有哪些? 什么是cglib 使用例子 需求 工程环境 主要步骤 创建项目 引入依赖 编写被代理类 编写MethodInterceptor接口实现类 编写 ...

  7. dom4j的测试例子和源码详解(重点对比和DOM、SAX的区别)

    目录 简介 DOM.SAX.JAXP和DOM4J xerces解释器 SAX DOM JAXP DOM解析器 获取SAX解析器 DOM4j 项目环境 工程环境 创建项目 引入依赖 使用例子--生成xm ...

  8. 基于V6的中移动物联测试例子,当前测试还挺稳定

    下载: 链接:https://pan.baidu.com/s/1Gz8mEffDGXNSK8lIsAIUEg   提取码:2sur 测试步骤看此贴,跟V7开发板是一样的: 基于H7的中移动物联例子以及 ...

  9. 【ELK】Centos7 安装 ELK 7.6.2 和 UI 管理界面以及测试例子

    1. 初始化环境 1.0 初始化环境官网参考 https://www.elastic.co/guide/en/elasticsearch/reference/current/system-config ...

随机推荐

  1. c#取数据库数据 ---两种方法

    通常有以下两种方式 SqlDataReader 和SqlDataAdapter|DataSet方式 SqlDataReader 方式使用方式如下: using System; using System ...

  2. 前缀和的应用 CodeForces - 932B Recursive Queries

    题目链接: https://vjudge.net/problem/1377985/origin 题目大意就是要你把一个数字拆开,然后相乘. 要求得数要小于9,否则递归下去. 这里用到一个递归函数: i ...

  3. 在Node.js使用Promise的方式操作Mysql

    最近在学习Node.js,虽然早就听说了回调地狱结果过了一周就遇到了.所以花时间学习了了一下Promise.虽然还有Async/await.co.生成器等选择,但是因为本人基础较差,以及时间问题所以决 ...

  4. Codeforces.1051G.Distinctification(线段树合并 并查集)

    题目链接 \(Description\) 给定\(n\)个数对\(A_i,B_i\).你可以进行任意次以下两种操作: 选择一个位置\(i\),令\(A_i=A_i+1\),花费\(B_i\).必须存在 ...

  5. fastjson 使用教程

    fastjson 是阿里的开源项目,具网上的说法 fastjson 的解析速度是 Gson 的6倍,体积小,而且开源. 项目地址: https://github.com/alibaba/fastjso ...

  6. JS垃圾收集机制

    JS 具有自动垃圾回收机制,不需要像C++/C等语言去手动跟踪内存使用情况. 垃圾收集方式: 1.标记清除: 垃圾收集器在运行时给存储在内存中的所有变量都加上标记,然后,它会去掉环境中的变量,以及被环 ...

  7. 也谈谈我对Docker的简单理解

    Docker能解决什么问题呢?一个工具的出现必然需要解决一些问题,Docker也不例外,简单说说我们常见的2种情况Docker是如何解决的吧.1.程序在我这跑得好好的,在你那怎么就不行呢?!这是一个典 ...

  8. iOS链接库的冲突

    最近在打包的时候,遇到一个坑.特此记录一下 起因是发现 Unity 5.4 版本,使用c#写的下载,下载速度无法突破 2M/s,同样的网络,后来横向对比使用原来 Cocos2d 开始的游戏,可以达到 ...

  9. Spark(四十四):使用Java调用spark-submit.sh(支持 --deploy-mode client和cluster两种方式)并获取applicationId

    之前也介绍过使用yarn api来submit spark任务,通过提交接口返回applicationId的用法,具体参考<Spark2.3(四十):如何使用java通过yarn api调度sp ...

  10. linux 压缩当前文件夹下所有文件

    linux zip压缩.压缩当前文件夹下所有文件,压缩为a.zip.命令行的方法是怎样. zip  -r fileName.zip  文件夹名 tar tar命令可以用来压缩打包单文件.多个文件.单个 ...