器件型号: J784S4XEVM
尊敬的团队:
我正在使用 UDMA 在 R5F 内核上执行存储器到存储器复制。
目标缓冲区位于共享 DDR 区域中、该区域通过 RAT 地址转换从 R5F 访问。 当我使用 CPU memcpy () 将数据复制到此区域时,数据被正确写入,并且可以从预期的 DDR 地址读取。
但是、当我使用 UDMA 将数据复制到同一缓冲区区域时、传输似乎已成功完成、但数据不会写入预期的存储器位置。 目标缓冲区内容保持不变。
根据此行为、我怀疑 UDMA 可能没有使用 R5F RAT 转换后的地址视图。 换句话说、CPU 可以通过 RAT 映射地址访问缓冲区、但 UDMA 可能需要实际的 SoC/DDR 物理地址、而不是 R5F RAT 别名地址。
您能否确认以下几点?
UDMA 是通过 R5F RAT 映射访问存储器、还是 RAT 仅适用于 R5F CPU 访问?
2.是否需要任何其他设置(例如防火墙/板配置或地址转换设置)以允许 UDMA 访问通过 R5F 的 RAT 映射的共享 DDR 区域?
如果 R5F 通过 RAT 映射的 64 位地址访问目标区域、建议使用什么方法将正确的地址传递给 UDMA?
作为参考、仅 UDMA 出现问题。 CPU memcpy() 可以正常运行到同一区域。
RAT 配置:DDR 地址 0x900000000 映射到 0xE0000000
#if defined(BUILD_MCU1_0)
//CSL_MCU_R5FSS0_RAT_CFG_BASE
#define RAT_BASE (0x40f90000UL)
#endif
#if defined(BUILD_MCU2_0)
//CSL_R5FSS0_RAT_CFG_BASE
#define RAT_BASE (0xff90000UL)
#endif
#if defined(BUILD_MCU3_0)
#define RAT_BASE (0xff90000UL)
#endif
#if defined(BUILD_MCU4_0)
#define RAT_BASE (0xff90000UL)
#endif
/* Set Ragion Address Translation */
void SetRAT()
{
#if defined(BUILD_MCU1_0) || defined(BUILD_MCU2_0) || defined(BUILD_MCU3_0) || defined(BUILD_MCU4_0)
uint32_t region_id = 0;
*(unsigned int *)(RAT_BASE + 0x44 + (region_id*0x10)) = BASE_ADDR; //IN ADDRESS
*(unsigned int *)(RAT_BASE + 0x48 + (region_id*0x10)) = PHY_ADDR_LO; //lower 32bits of the real physical address
*(unsigned int *)(RAT_BASE + 0x4C + (region_id*0x10)) = PHY_ADDR_HI; //Upper 16 bits of the real physical address.
*(unsigned int *)(RAT_BASE + 0x40 + (region_id*0x10)) = 0x8000001C; // bit[31:31] : enable bit[5:0] size (2^SIZE)
#endif
}
DestBuf、链接器、MPU 配置
我只将 destBuf 示例代码 (UDMA_memcpy_test) 中的更改为下面所示的映射变量。
uint8_t shared_buffer[SHARED_BUF_SIZE] __attribute__ ((section (".shared_data_buffer"), aligned (UDMA_CACHELINE_ALIGNMENT)));
>> linker memory setting
#define DDR_SHARED_BUFFER_START 0xE0000000 /* shard memory */
#define SHARD_BUFFER_CORE_SIZE 0x01000000 /* 16 MB */
#define SHARD_BUFFER_TOTAL_SIZE 0x04000000
/*--------------------------- Shared Memory --------------------------*/
#define SHARED_MEM_CORE1_BASE DDR_SHARED_BUFFER_START
#define SHARED_MEM_CORE2_BASE SHARED_MEM_CORE1_BASE + SHARD_BUFFER_CORE_SIZE
#define SHARED_MEM_CORE3_BASE SHARED_MEM_CORE2_BASE + SHARD_BUFFER_CORE_SIZE
#define SHARED_MEM_CORE4_BASE SHARED_MEM_CORE3_BASE + SHARD_BUFFER_CORE_SIZE
SHARED_MEM_CORE1 (RWIX) : ORIGIN = SHARED_MEM_CORE1_BASE LENGTH = SHARD_BUFFER_CORE_SIZE
SHARED_MEM_CORE2 (RWIX) : ORIGIN = SHARED_MEM_CORE2_BASE LENGTH = SHARD_BUFFER_CORE_SIZE
SHARED_MEM_CORE3 (RWIX) : ORIGIN = SHARED_MEM_CORE3_BASE LENGTH = SHARD_BUFFER_CORE_SIZE
SHARED_MEM_CORE4 (RWIX) : ORIGIN = SHARED_MEM_CORE4_BASE LENGTH = SHARD_BUFFER_CORE_SIZE
.shared_data_buffer (NOINIT) : {} palign(128) > __CORE_SHARED_MEM
>> MPU Region Setting
{
/* Region 10 configuration: shared buffer */
.regionId = 10U,
.enable = 1U,
.baseAddr = 0xE0000000,
.size = CSL_ARM_R5_MPU_REGION_SIZE_256MB,
.subRegionEnable = CSL_ARM_R5_MPU_SUB_REGION_ENABLE_ALL,
.exeNeverControl = 0U,
.accessPermission = CSL_ARM_R5_ACC_PERM_PRIV_USR_RD_WR,
.shareable = 1U,
.cacheable = (uint32_t)FALSE,
.cachePolicy = CSL_ARM_R5_CACHE_POLICY_NON_CACHEABLE,
.memAttr = 0U,
},
使用 memcpy 函数结果:
root@j784s4-evm:~# devmem2 0x901000000
/dev/mem opened.
Memory mapped at address 0xffffa1d47000.
Read at address 0x901000000 (0xffffa1d47000): 0x03020100
root@j784s4-evm:~# devmem2 0x901000004
/dev/mem opened.
Memory mapped at address 0xffff810c6000.
Read at address 0x901000004 (0xffff810c6004): 0x07060504
root@j784s4-evm:~#
>>> R5F Core Print Result
[MCU2_0] UDMA:START
UDMA memcpy application started...
destBuf: 0xe1000000 //RAT map address = 0x901000000
[Error] Data mismatch!!
[Error] UDMA App memcpy test failed!!
[Error] UDMA App delete failed!!
[Error] UDMA App deinit failed!!
UDMA memcpy using TR15 block copy Failed!!
Some tests have failed!!
>>> Linux devmem2 read result
root@j784s4-evm:~# devmem2 0x901000000
/dev/mem opened.
Memory mapped at address 0xffff9b6d5000.
Read at address 0x901000000 (0xffff9b6d5000): 0x00000000
root@j784s4-evm:~# devmem2 0x901000004
/dev/mem opened.
Memory mapped at address 0xffff84fe4000.
Read at address 0x901000004 (0xffff84fe4004): 0x00000000
root@j784s4-evm:~#
测试结果中的唯一错误消息与传输后的源/目标比较相关。 没有与 UDMA 配置、创建或传输本身相关的错误。