I already want to do that for a few month but
did not had the time yet...

Here you are:

int dmacpy(dma_addr_t dst, dma_addr_t src, size_t n)
{
        int tcc;
        int dev_id=0;

        // initialise DMA
        if (davinci_request_dma(dev_id, "TEST", davinci_edma_cb,
             NULL, &ch, &tcc, EVENTQ_0)) {
                return -1;
        }
        init_completion(&done);

        // set DMA parameters
        davinci_set_dma_dest_params(ch, dst, 0, 0);
        davinci_set_dma_src_params(ch, src, 0, 0);

        // parameters for transfers size less than 64K
        if (n < 0x10000 ) {
                davinci_set_dma_src_index(ch, 0, 0);
                davinci_set_dma_dest_index(ch, 0, 0);
                davinci_set_dma_transfer_params(ch, n, 1, 1, 0, Async);
        
        }
        // parameters for transfers 64K and more
        if ( n >= 0x10000  ) {
                // tested for up to 64 MB
                // inspired by 3.2 Subframe Extraction Exampl
                int acnt = 0x4000; // could be 0x8000
                int bcnt = n / 0x4000;
                //int bcnt = n / acnt;
                /// Reference:
                /// 2.3.2 EDMA3 Channel Parameter Set Fields
                /// 2.3.2.1 Channel Options Parameter (OPT)
                /// 2.3.2.8 Source B Index (SRCBIDX)
                davinci_set_dma_src_index(ch, acnt, 0); // args: srcbidx srccidx
                davinci_set_dma_dest_index(ch, acnt, 0); // args: destbidx, 
destcidx
                davinci_set_dma_transfer_params(ch, acnt, bcnt, 1, 0, ABsync);
                // args: acnt, bcnt, ccnt, bcntrld, sync_mode
        }
        // davinci_print_dma_transfer_params(ch);
        // start DMA transfer
        davinci_start_dma(ch);
        // and wait for completion
        wait_for_completion(&done);
        return 0;
}
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to