This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] J784S4XEVM:将 UDMA 内存复制到 RAT 映射的 DDR 地址(64 位地址)不会更新目标缓冲区

Guru**** 2892950 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1643733/j784s4xevm-udma-memory-copy-to-rat-mapped-ddr-address-64bit-address-does-not-update-destination-buffer

器件型号: 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:~#

 

UDMA_memcpyTest () 结果:
>>> 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 配置、创建或传输本身相关的错误。

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    2. 是否需要任何其他设置(例如防火墙/电路板配置或地址转换设置)以允许 UDMA 访问通过 R5F 的 RAT 映射的共享 DDR 区域?

    RAT 仅用于 R5F、UDMA 可以直接访问存储器、而无需任何 RAT 映射。

    [quote userid=“682372“ url=“~/support/processors-group/processors/f/processors-forum/1643733/j784s4xevm-udma-memory-copy-to-rat-mapped-ddr-address-64bit-address-does-not-update-destination-buffer 如果 R5F 通过 RAT 映射的 64 位地址访问目标区域、建议使用什么方法将正确的地址传递给 UDMA?

    您需要将原始物理地址传递给 UDMA。

    此致、

    Brijesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我确认、 App_udmaTrpdInit() pTr->addr pTr->daddr 当输入地址在 RAT 映射的地址范围内时、它在修改后可正确转换为物理地址。

    谢谢你。