#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. CactiEZ安装与配置-监控网卡流量

    1.1. 环境 本例CactiEZ-10.1-x86_64.iso下载地址 https://pan.baidu.com/s/1vivDJqpgtoBXRLm2D-bBTQ 密码:u12l 测试环境 服 ...

  2. mybatis自动生成service、dao、mapper

    1.config.properties ## 数据库连接参数 jdbc.driverClass = com.mysql.jdbc.Driver jdbc.url = jdbc:mysql://loca ...

  3. 潭州课堂25班:Ph201805201 django 项目 第四十四课 项目部署 (课堂笔记)

    项目部署 稳定,并发,效益, 一.Django配置 1.settings.py配置 复制全局settings.py配置文件,创建一个副本命名为MyBlog/pro_settings.py,修改DEBU ...

  4. Vue常用模块

    1.npm install Vue-Awesome-Swiper@v2.6.7 --save 实现轮播图 2.npm install axios  发送请求get,post

  5. LOJ #10084. 「一本通 3.3 练习 1」最小圈(二分+SPFA判负环)

    题意描述: 见原LOJ:https://loj.ac/problem/10084 题解: 假设所求的平均最小值为X,环上各个边的权值分别为A1,A2...Ak,可以得到: X=(A1+A2+A3+.. ...

  6. es6冲刺02

    1.Symbol es6新增的数据类型 1)概念 提供一个独一无二的值 let a=Symbol() let b=Symbol() 或 let c=Symbol.for('c') let d=Symb ...

  7. JSAP104

    JSAP104 1.目标: 2.绑定事件的区别 1).addEventListener中的this是当前绑定的对象 .attachEventListener是window 2) 3)解绑事件 方法一: ...

  8. 5、python的变量和常量

    今天看看python的变量和常量,这是python中最基本的两个概念. 首先先说一下解释器执行Python的过程:    python3 C:\test.py 1. 启动python解释器(内存中) ...

  9. ORACLE数据恢复方法(提交事务也可以)

    今天在操作数据库的时候,发现数据操作错误,想要恢复,但是没有用事务,按理说,设置成不默认提交事务,此时所做的各种操作都没有反应到数据库中.这时,你可以rollback事务,撤销所有未提交的修改.不过, ...

  10. C# MemoryCache GCHandle

    MemoryCache在项目中用了很久,感觉比较简单,以前也看过里面的源代码,主要借用MemoryCacheStore来完成数据的存储,里面是线程安全的,MemoryCacheStore借用Hasht ...