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.

[FAQ] [参考译文] [常见问题解答] AM62x、AM64x:更新基于区域的地址转换(RAT)设置

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1192281/faq-am62x-am64x-updating-the-region-based-address-translation-rat-settings

器件型号:AM6442
Thread 中讨论的其他器件:SysConfig

R5F、PRU_ICSSG/PRU-ICSS/PRU-SS 和 M4F 远程内核都具有基于区域的地址转换(RAT)模块。 RAT 模块允许内核将系统地址(例如、0x8000_0000处的 DDR)转换为不同的本地地址(例如、远程内核可以写入0x90000000的本地地址、RAT 可以配置为将该写入转换为0x8000_0000处的 DDR 系统地址)。 M4内核最有可能需要配置 RAT。 但是、请注意、R5F 和 PRU 内核也具有 RAT 功能。

何时需要更改 RAT 设置? 何时不应更改 RAT 设置? 如何更改 RAT 设置?

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

    何时需要更改 RAT 设置?

    TI 示例项目中的 RAT 设置可用作起点。
    但是、示例工程的地址映射可能与不同
    您的用例需求。

    这些用例中需要地址转换:

    *内核必须访问超过32位地址空间的存储器(例如、
    片上调试硬件配置寄存器的地址更大
    0xFFF_FFFF)。

    *内核必须访问无法从内核访问的内存区域
    本地地址。

    存储器区域可能无法访问、因为:

    *内存区域已为本地资源定义(例如、
    M4F 在小于0x6000_0000的地址处有本地资源、和
    大于0xDFFF_FFFF)。

    *项目已重新映射了一个不同的内存空间
    本地地址(例如、如果系统地址0x0000_0000重新映射
    本地地址0x8000_0000、内核需要访问系统
    地址0x8000_0000、则必须重新映射系统地址0x8000_0000
    另一个本地地址)

    对于 M4F、尤其是 AM24x/62X/64x 上的 M4F、请在 M4F 时检查 RAT 设置
    项目访问:

    *系统内存和外部内存(例如、在共享内存用例中)

    *器件配置寄存器(pinmux、计时、电源、复位等
    参考 TRM 章节“器件配置”)

    *主要域资源

    AM64x 注意: 默认情况下、M4F 驱动程序仅支持使用 MCU 域外设。  有关支持的外设列表、请参阅 MCU+ SDK 发行说明。

    AM62x 注意:  
    M4F 驱动程序默认支持使用 MCU 域外设。 基准
    MCU+ SDK 发行说明、以获取支持的外设列表。 一些
    主域外设和唤醒域外设也可以
    M4F 访问的。 请参阅 MCU+ SDK 页面"访问主程序和
    MCU 域的唤醒域外设"

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

    何时不应重新映射存储器区域?

    如果 Linux 正在初始化远程内核、则是 Linux 所在的任何内存区域
    不能重新映射远程内核的初始化数据。

    Linux 无法查看远程内核的 RAT 设置。 因此、是 Linux
    无法判断远程核心工程中的地址是否已重新映射。

    例如、假设我们希望远程内核的资源表是
    放置在 DDR 中、地址为0x9CC0_0000。 但是、在远程内核中、还有另一个存储器区域
    已重新映射到0x9000_0000-0x9FFF_FFFF 的本地地址范围。 所以
    在远程内核中、我们将系统地址0x9000_0000重新映射到本地地址
    0xA000_0000。 然后、远程核心文件将显示资源表位于
    本地地址0xACC0_0000、RAT 会将其转换为系统地址
    0x9CC0_0000的说明。

    在此示例中、Linux 将读取远程内核的本地地址信息、
    并将资源表放置在系统地址0xACC0_0000处。 代码
    不起作用。

    要使该示例正常工作、有哪些选项?

    1.继续使用 Linux 加载远程内核。 但是、请勿重新映射
    0x9000_0000地址空间到不同的本地地址。 相反、请移动
    映射到本地地址0x9000_0000的存储器区域
    另一个本地地址。

    2.使用 SBL 而不是 Linux 加载远程内核。

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

    如何更新远程核心项目中的 RAT 设置

    MCU+项目的 RAT 映射存储在 SysConfig 文件 example.syscfg 中。
    example.syscfg 可使用 SysConfig 工具或直接使用文件进行编辑
    编辑器。

    如何在 linker.cmd 文件内使用 RAT 转换

    linker.cmd 文件使用 CPU 内核虚拟地址。
    这意味着、如果一个存储器区域被 RAT 和转换
    在 linker.cmd 文件中引用存储器区域、然后在 linker.cmd 中引用
    文件应使用本地 RAT 转换地址、而不是系统地址。

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

    如何在远程核心固件中使用 RAT 转换

    MCU+函数通过传递来区分它们与哪个外设通信
    函数调用中外设的基址。

    使用 MCU+ SDK 编写的所有软件都应使用 AddrTranslateP_getLocalAddr
    获取外设的本地地址。 即使地址不是、也是如此
    当前重新映射的 AddrTransleP_getLocalAddr 使代码更容易
    已移植。 AddrTranslateP_getLocalAddr 还可阻止较新版本的代码
    如果添加了地址转换、则中断。

    AddrTranslateP_getLocalAddr 如何生成底座的局部视图
    地址?

    1.将实际系统地址传递给 AddrTransclateP_getLocalAddr。
    AddrTransleP_getLocalAddr 检查系统地址是否在中
    重新映射的地址范围:

    2.如果地址范围未重新映射、则 AddrTranslateP_getLocalAddr
    设置 localAddr = systemAddr

    3.如果地址重新映射,则 AddrTranslateP_getLocalAddr 转换
    localAddr

    与该外设交互的每个函数调用都将使用
    localAddr 值。