|
买了一块创龙的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);
|
|