DMA的demo
来源:互联网 发布:联通云数据待遇怎么样 编辑:程序博客网 时间:2024/05/22 23:58
DMA的demo
static void fsl_dma_test_callback(void *dma_async_param){ struct completion *cmp = dma_async_param; printk( KERN_ERR "dma transfer done, end=%lu\n", jiffies ); complete(cmp);}static int fsl_dma_self_test(struct dma_chan *chan){ int i; u8 *src; u8 *dest; struct dma_device *dma = chan->device; struct device *dev = dma->dev; struct dma_chan* dma_chan = chan; struct dma_async_tx_descriptor *tx; dma_addr_t dma_dest, dma_src; dma_cookie_t cookie; int err = 0; struct completion cmp; unsigned long tmo; unsigned long flags; u32 test_size = 1024*1024*4u; src = kzalloc(sizeof(u8) * test_size, GFP_KERNEL); if (!src) return -ENOMEM; dest = kzalloc(sizeof(u8) * test_size, GFP_KERNEL); if (!dest) { kfree(src); return -ENOMEM; } /* Fill in src buffer */ for (i = 0; i < test_size; i++) src[i] = (u8)i; /* Start copy, using first DMA channel */ dma_src = dma_map_single(dev, src, test_size, DMA_TO_DEVICE); dma_dest = dma_map_single(dev, dest, test_size, DMA_FROM_DEVICE); flags = DMA_COMPL_SRC_UNMAP_SINGLE | DMA_COMPL_DEST_UNMAP_SINGLE | DMA_PREP_INTERRUPT; printk( KERN_ERR "try to dma copy %d bytes: 0x%08x-->0x%08x\n", test_size, dma_src, dma_dest ); tx = dma->device_prep_dma_memcpy(dma_chan, dma_dest, dma_src, test_size, flags); if (!tx) { dev_err(dev, "Self-test prep failed, disabling\n"); err = -ENODEV; goto free_resources; } async_tx_ack(tx); init_completion(&cmp); tx->callback = fsl_dma_test_callback; tx->callback_param = &cmp; cookie = tx->tx_submit(tx); if (cookie < 0) { dev_err(dev, "Self-test setup failed, disabling\n"); err = -ENODEV; goto free_resources; } printk( KERN_ERR "begin dma transfer: %d bytes, start=%lu\n", test_size, jiffies ); dma->device_issue_pending(dma_chan); tmo = wait_for_completion_timeout(&cmp, msecs_to_jiffies(3000)); if (tmo == 0 || dma->device_tx_status(dma_chan, cookie, NULL) != DMA_SUCCESS) { dev_err(dev, "Self-test copy timed out, disabling\n"); err = -ENODEV; goto free_resources; } if (memcmp(src, dest, test_size)) { dev_err(dev, "Self-test copy failed compare, disabling\n"); err = -ENODEV; goto free_resources; }free_resources: dma->device_free_chan_resources(dma_chan); kfree(src); kfree(dest); return err;}static int __init test_init(void){ struct dma_chan *dc = dma_find_channel(DMA_MEMCPY); if (dc) { printk(" ------- get channel ----\n"); fsl_dma_self_test(dc); } printk(" ------- init time ----\n"); return 0;}static void __exit test_exit(void){ printk("-------- test exit over ----------\n"); return;}MODULE_LICENSE("GPL");module_init(test_init);module_exit(test_exit);
0 0
- DMA的demo
- SG DMA与普通DMA(block DMA)的区别
- 开始DMA的实验
- S3C2440的DMA控制
- s3c2440的DMA应用
- 44b0的DMA
- DMA通道的使用
- pcie dma的玩法
- sata DMA 的建立
- SPI的驱动 dma
- DMA的控制方式
- DMA控制器的学习
- s3c2440的DMA应用
- 基本的DMA控制器
- DMA的控制方式
- S3C2440的DMA
- STM32的DMA中断
- s3c2440的DMA应用
- 总结三种MySQL 外键约束方式
- lightoj-1047-Neighbor House【矩阵DP】
- File-list&listFiles
- HashMap 、HashTable区别
- Struts2自学入门(三)
- DMA的demo
- java基础知识点(一)
- Understanding FaceNet
- 运算符
- 有向图的存储
- tjut 4722
- 计算机的组成及其功能
- 笔试面试网络知识总结
- 【CDP-云设计模式】第8章,1.队列链表模式(Queuing Chain Pattern)