#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. java 使用CRF遇到的问题汇总

    1.libCRFPP.so放在idea项目 resources下,打jar包时打在jar中. jar包工具类 /* * Class NativeUtils is published under the ...

  2. 使用C#的is、as操作符来转型

    is检查对象是否兼容于指定类型,返回Boolean值true或false.使用is永远不会抛出异常. 例:Object o=new Object(); bool b1=(o is Object);// ...

  3. [JOISC2014]バス通学

    [JOISC2014]バス通学 题目大意: 有\(n(n\le10^5)\)个点和\(m(m\le3\times10^5)\)条交通线路.第\(i\)条交通线路可以让你在时间\(x_i\)从\(a_i ...

  4. [模板][P4719]动态dp

    Description: 给定一棵n个点的树,点带点权. 有m次操作,每次操作给定x,y,表示修改点x的权值为y. 你需要在每次操作之后求出这棵树的最大权独立集的权值大小. Hint: \(n,m&l ...

  5. Flask jinja2

    {{ }} #引用 执行 非逻辑代码 {% %} #逻辑代码 引用变量 @app.template_global() # 全局函数 Markup # 安全标签字符串儿 {% macro func() ...

  6. Yii2 组件

    组件的命名空间: 响应组件: yii\web\Response Yii预定义的HTTP异常组件: yii\web\BadRequestHttpException: //状态码 400. yii\web ...

  7. 1. cs231n k近邻和线性分类器 Image Classification

    第一节课大部分都是废话.第二节课的前面也都是废话. First classifier: Nearest Neighbor Classifier 在一定时间,我记住了输入的所有的图片.在再次输入一个图片 ...

  8. 【织梦dedecms安全设置】dedecms如何防止被黑?dedecms被黑了怎么办?

    [织梦dedecms安全设置]dedecms如何防止被黑?dedecms被黑了怎么办?010-63495805很多所谓的“黑客”都是用工具来扫描入侵,厉害点的人是不屑来黑我们的小网站的,所以我们一般做 ...

  9. 获取url参数的精简代码

    题目描述 获取 url 中的参数 指定参数名称,返回该参数的值 或者 空字符串 不指定参数名称,返回全部的参数对象 或者 {} 如果存在多个同名参数,则返回数组 输入例子: getUrlParam(' ...

  10. 微信小程序中遮罩层的滚动穿透问题

    如果弹出层没有滚动事件: <view wx:if="{{alert}}" catchtouchmove="myCatchTouch"> <te ...