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
原创粉丝点击