Part Number:TDA4VM
我使用如下代码,希望通过udma通道进行数据搬移,发现在c71平台上无法实现从DDR搬移至L2,而C66 core无此问题。而当我将通道号设定为8,即设置为dru通道时,数据可从DDR搬移至L2内存。测试代码如下:
void test_udma()
{
uint8_t data_check = 0;
uint8_t *src_buf1 = NULL;
uint32_t data_len = 1024 * 8;
volatile uint8_t *p_wr = (volatile uint8_t *)(appMemAlloc(APP_MEM_HEAP_DDR, data_len, APP_UDMA_CACHELINE_ALIGNMENT));//(uint8_t *)(0x70020000);//
volatile uint8_t *p_rd = (volatile uint8_t *)(appMemAlloc(APP_MEM_HEAP_L2, data_len, APP_UDMA_CACHELINE_ALIGNMENT));//(uint8_t *)(0x70022000);//
unsigned int i = 0;
int ret_val = 0;
app_udma_ch_handle_t udmaChIn;
app_udma_copy_nd_prms_t prms_nd_in;
memset(p_rd, 0x0, data_len);
appLogPrintf("UDMA: p_rd addr is %p\r\n", p_rd);
for(i = 0; i < data_len; i++)
{
p_wr[i] = i % 256;
}
appMemCacheWb((void *)p_wr, data_len);
udmaChIn = appUdmaCopyNDGetHandle(8);
// src_buf1 = (uint8_t *)(appMemAlloc(APP_UDMA_HEAP_ID, data_len, APP_UDMA_CACHELINE_ALIGNMENT));
// if(src_buf1 == NULL)
// {
// Platform_Printf("%s, %d\r\n" , __FUNCTION__, __LINE__);
// return -1;
// }
prms_nd_in.copy_mode = 2;
prms_nd_in.src_addr = appMemGetVirt2PhyBufPtr((uint64_t) (p_wr), APP_UDMA_HEAP_ID);
prms_nd_in.dest_addr = appMemGetVirt2PhyBufPtr((uint64_t) (p_rd), APP_MEM_HEAP_L2);
prms_nd_in.icnt0 = data_len;
prms_nd_in.icnt1 = 1;
prms_nd_in.icnt2 = 1;
prms_nd_in.icnt3 = 1;
prms_nd_in.dim1 = data_len;
prms_nd_in.dim2 = 0;
prms_nd_in.dim3 = 0;
prms_nd_in.dicnt0 = prms_nd_in.icnt0;
prms_nd_in.dicnt1 = prms_nd_in.icnt1;
prms_nd_in.dicnt2 = 1; /* Ping-pong */
prms_nd_in.dicnt3 = 1;
prms_nd_in.ddim1 = data_len;
prms_nd_in.ddim2 = 0;
prms_nd_in.ddim3 = 0;
// appUdmaCopyNDPrmsPrint(&prms_nd_in, "IN");
// appUdmaCopyNDPrmsPrint(&prms_nd_out, "OUT");
udmaChIn = appUdmaCopyNDGetHandle(0);
ret_val = appUdmaCopyNDInit(udmaChIn, &prms_nd_in);
if(ret_val != 0){
appLogPrintf("UDMA: ERROR: appUdmaCopyNDInit %d!!\n", udmaChIn);
return 7;
}
appLogPrintf("UDMA: SUCCESS: appUdmaCopyNDInit %d!!\n", udmaChIn);
ret_val = appUdmaCopyNDTrigger(udmaChIn);
if(ret_val != 0){
appLogPrintf("UDMA: ERROR: appUdmaCopyNDTrigger %d!!\n", ret_val);
}
appLogPrintf("UDMA: SUCCESS: appUdmaCopyNDTrigger %d!!\n", ret_val);
ret_val = appUdmaCopyNDWait(udmaChIn);
if(ret_val != 0){
appLogPrintf("UDMA: ERROR: appUdmaCopyNDWait %d!!\n", ret_val);
}
appLogPrintf("UDMA: SUCCESS: appUdmaCopyNDWait %d!!\n", ret_val);
appUdmaCopyNDDeinit(udmaChIn);
//appMemCacheInv((void *)src_buf1, data_len);
for(i = 0; i < data_len; i++)
{
data_check = p_rd[i];
if(data_check != (i % 256))
{
appLogPrintf("%s().data is %d error, i is %d\r\n" , __FUNCTION__, data_check, i);
}
}
}
当udmaChIn = appUdmaCopyNDGetHandle(8);即设置为DRU通道传输时,可完成数据搬移,请问Ti工程师如何使用udma通道从DDR搬移至L2内存
yu duan:
开出L2内存的地址为0x64800000
,
Cherry Zhou:
您好,我们把您的问题升级到英文论坛给美国工程师看下,链接如下,有答复会尽快给到您:
e2e.ti.com/…/tda4vm-c71-udma
,
Cherry Zhou:
您好,
使用DRU channel8的时候有没有问题?如果用UDMA channel,会有什么问题出现?
未经允许不得转载:TI中文支持网 » TDA4VM: c71 udma