#include #include #include "dma.h" #define BUFLEN (PAGE_SIZE) static void *source_log, *dest_log, *cb_log; static dma_addr_t source_io, dest_io, cb_io; static struct bcm2708_dma_cb *cb; static int channel; static dma_addr_t dma_reg; static int __init mod_init( void ) { unsigned int irqs; /************************/ /* Speicher reservieren */ /************************/ source_log=dma_alloc_coherent(NULL,BUFLEN,&source_io, GFP_KERNEL); if (!source_log) { printk(KERN_ERR "dma_alloc_coherent error source\n"); return -EIO; } dest_log=dma_alloc_coherent(NULL,BUFLEN,&dest_io,GFP_KERNEL); if (!dest_log) { printk(KERN_ERR "dma_alloc_coherent error dest\n"); goto free_source; } cb_log=dma_alloc_coherent(NULL,sizeof(struct bcm2708_dma_cb), &cb_io, GFP_KERNEL); if (!cb_log) { printk(KERN_ERR "dma_alloc_coherent error cb\n"); goto free_dest; } printk("SOURCE: log-addr: %p bus-addr: %p phys_addr: %p\n", source_log, (char *)source_io, (char *)virt_to_phys(source_log)); printk("DEST: log-addr: %p bus-addr: %p phys_addr: %p\n", dest_log,(char *)dest_io,(char *)virt_to_phys(dest_log)); printk("CB: log-addr: %p bus-addr: %p phys_addr: %p\n", cb_log, (char *)cb_io, (char *)virt_to_phys(cb_log)); memcpy( source_log, "Hello World", strlen("Hello World")+1); memcpy( dest_log,"not yet copied",strlen("not yet copied")+1); /***********************/ /* DMA-Kanal aufsetzen */ /***********************/ channel = bcm_dma_chan_alloc( BCM_DMA_FEATURE_NORMAL, (void *)&dma_reg, &irqs ); printk("channel: %d dma_reg: %p irqs: %x\n",channel, (void*)dma_reg,irqs); cb = (struct bcm2708_dma_cb *) cb_log; cb->info= BCM2708_DMA_S_INC | BCM2708_DMA_D_INC; cb->src = (unsigned long) source_io; cb->dst = (unsigned long) dest_io; cb->length = BUFLEN; cb->stride = 0; cb->next = 0; /****************/ /* DMA-Transfer */ /****************/ printk("ZIEL VORHER %p: %s\n", dest_log, (char *)dest_log); bcm_dma_start( (void*)dma_reg, cb_io ); bcm_dma_wait_idle( (void*)dma_reg ); printk("ZIEL NACHHER %p: %s\n", dest_log, (char *)dest_log); return 0; free_dest: dma_free_coherent(NULL, BUFLEN, dest_log, dest_io ); free_source: dma_free_coherent(NULL, BUFLEN, source_log, source_io); if (channel) bcm_dma_chan_free(channel); return -EIO; } static void __exit mod_exit( void ) { printk("freeing dma-ressources\n"); dma_free_coherent(NULL, BUFLEN, dest_log, dest_io ); dma_free_coherent(NULL, BUFLEN, source_log, source_io); dma_free_coherent(NULL, sizeof(struct bcm2708_dma_cb), cb_log, cb_io); if (channel) bcm_dma_chan_free(channel); return; } module_init( mod_init ); module_exit( mod_exit ); MODULE_LICENSE("GPL");