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