嵌入式开发者社区

标题: 谁有PC与6657之间DMA通信的示例代码? [打印本页]

作者: wangyf    时间: 2016-6-22 17:17
标题: 谁有PC与6657之间DMA通信的示例代码?
买了一块创龙的6657开发板,6657作为EP端,我想在PC端的驱动添加DMA操作的代码,我直接复制DMA操作在LED程序加载之后,
发现驱动模块加载一只停留在HAL_writeDMA 接口

请问一下各位高手
1.  我这样操作DMA是不是有什么问题
2.  有没有Tronlong板子DMA操作的示例代码可以给我看看,因为这部分代码原来的demo里面只是给667X实现的




程序修改如下:

#if GPIO_LED
        /* Load "GPIO_LED or UART0_POLL" demo into DSP */
        pushData(bootCode, 0, &bootEntryAddr);

        /* Write boot entry address into MAGIC_ADDR */
        writeDSPMemory(0, MAGIC_ADDR, &bootEntryAddr, 4);
#endif

        /*********************************/
        /******* DMA Testing ****************/
        printk("Allocating consistent memory ...\n");
        wDataVirt = (uint8_t*)dma_alloc_coherent(&PCIE_DEV->dev, DMA_TRANSFER_SIZE, &wData, GFP_KERNEL);
        rDataVirt = (uint8_t*)dma_alloc_coherent(&PCIE_DEV->dev, DMA_TRANSFER_SIZE, &rData, GFP_KERNEL);

        for (i = 0; i < DMA_TRANSFER_SIZE; i++) {
            wDataVirt[i] = i;
            rDataVirt[i] = 0;
        }

        /* Wait 2 second for DDR init */
        mdelay(2000);

        printk ("Write DMA to DSP ...\n");
        do_gettimeofday(&test_time1);
        HAL_writeDMA (wData, DDR_START, DMA_TRANSFER_SIZE, 1);   /* Move from GPP to DSP */
        do_gettimeofday(&test_time2);

        mdelay(1000);

        printk("Read DMA from DSP ...\n");
        do_gettimeofday(&test_time3);
        HAL_readDMA(DDR_START, rData, DMA_TRANSFER_SIZE, 1);     /* Move from DSP to GPP */
        do_gettimeofday(&test_time4);
        
        mdelay(1000);

        /* For demo how to move inside DSP purpose only, you can directly move between GPP and DSP using flag = 1 */
        //    HAL_writeDMA (0x80000000, 0x11800000, 0x10000, 0);        
        //    HAL_writeDMA (0x11800000, 0x0C000000, 0x10000, 0);

        diff = (test_time2.tv_sec - test_time1.tv_sec)*1000000 + (test_time2.tv_usec - test_time1.tv_usec);
        printk("DMA write throughput is: %d.%02d MB/s\n", DMA_TRANSFER_SIZE/(1024*1024)*1000*1000/diff,
                ((DMA_TRANSFER_SIZE/(1024*1024)*1000*1000)%diff)*100/diff);

        diff = (test_time4.tv_sec - test_time3.tv_sec)*1000000 + (test_time4.tv_usec - test_time3.tv_usec);
        printk("DMA read throughput is: %d.%02d MB/s\n", DMA_TRANSFER_SIZE/(1024*1024)*1000*1000/diff,
                ((DMA_TRANSFER_SIZE/(1024*1024)*1000*1000)%diff)*100/diff);

        printk("Freeing consistent memory ...\n");
        dma_free_coherent(&PCIE_DEV->dev, DMA_TRANSFER_SIZE, wDataVirt, wData);
        dma_free_coherent(&PCIE_DEV->dev, DMA_TRANSFER_SIZE, rDataVirt, rData);


作者: 希望缄默    时间: 2016-6-24 22:14
这是pc端linux dma 使用跟dsp关系不大 c6678 简单修改就能在c6657使用
作者: wangyf    时间: 2016-6-26 10:00
希望缄默 发表于 2016-6-24 22:14
这是pc端linux dma 使用跟dsp关系不大 c6678 简单修改就能在c6657使用

能告诉一下该如何修改吗,目前我直接把6678的HAL_readDMA 和 HAL_writeDMA 拿过来用, 会一直停留在接口的while循环部分,那部分代码是用来判断DMA操作是否完成。
刚接触6657的DSP,还不知道如何修改,希望高手能指点一下。
作者: 希望缄默    时间: 2016-6-27 09:27
wangyf 发表于 2016-6-26 10:00
能告诉一下该如何修改吗,目前我直接把6678的HAL_readDMA 和 HAL_writeDMA 拿过来用, 会一直停留在接口 ...

[attach]880[/attach]


0x02740000

作者: wangyf    时间: 2016-6-27 16:35
希望缄默 发表于 2016-6-27 09:27

0x02740000

你好,
请问是该 0x02704000   PARAM_0_OPT 吗?
我把它改成了  myIowrite32(0x00100008, pReg + PARAM_0_OPT/4);
按照文档《Enhanced Direct Memory Access (EDMA3) Controller User Guide》,这是block move example里面的值。
目前测试也是不成功的。请问我这样设置正确吗?
作者: wangyf    时间: 2016-6-27 16:37
希望缄默 发表于 2016-6-27 09:27

0x02740000

你好,
是不是 4XXX 这些寄存器的值都要改一下?
作者: 希望缄默    时间: 2016-6-28 09:10
wangyf 发表于 2016-6-27 16:37
你好,
是不是 4XXX 这些寄存器的值都要改一下?

嗯 因为这个实际上是通过 PCIe 链路配置 DSP EDMA3 寄存器
而 C6678 与 C6657 EDM3 差异大一些 有些宏要对照数据手册改
作者: wangyf    时间: 2016-6-30 10:16
希望缄默 发表于 2016-6-28 09:10
嗯 因为这个实际上是通过 PCIe 链路配置 DSP EDMA3 寄存器
而 C6678 与 C6657 EDM3 差异大一些 有些宏要 ...

谢谢 能够工作了
作者: ch3ch2sh    时间: 2018-1-6 21:44
请问你是怎么解决C6657在PC上被识别的呢?根据官方的文档并不能使C6657的板卡被PC识别




欢迎光临 嵌入式开发者社区 (https://51ele.net/) Powered by Discuz! X3.4