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.

[参考译文] AM6422:如何配置 PRU GPIO 引脚

Guru**** 2873080 points

Other Parts Discussed in Thread: AM6422, AM6442, TMDS64EVM

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1624733/am6422-how-to-configure-pru-gpio-pins

器件型号: AM6422
Thread 中讨论的其他器件: TMDS64EVM

我尝试配置 AM6422 PRI_ICSSG GPIO 引脚、以在裸机设置中使用 MII_G_RT1、MII_G_RT2 和 UART0。

在没有 PRU 类型子系统的微控制器上、这通常是在目标引脚的焊盘配置寄存器中设置相应的多路复用器设置、IN/OUT 设置等的简单过程。

添加 PRU 后、我无法了解需要做什么。 阅读 AM64x TRM 后、似乎这是一个两级流程、但请更正我的错误:

1) 首先、设置适当的 PADCONFIG 寄存器以选择 PRU 的多路复用模式(例如,PADCONFIG11.MUXMODE = 2(对于 PRG0_RGMII1_TD0)

2) 接下来、为了配置 MII 模式信号的使用、我需要将 CSSG_GPCFG0_REG.PR1_PRU0_GP_MUX_SEL 设置为“2",“,如、如 TRM 表 6-51 的第 4 列所述。

这是正确的吗? 或者、通常情况下、步骤 2 只需要使用步骤 1 中的 PADCONFIG 寄存器来配置相应的 PRU0_GPO/GPI 信号(多路复用模式= 0 或 1)?

如果是这样、请查看图 6-17、我能够在表 6-51 的“MII 模式“列下看到 MII_G_RT1 信号 PRG1_RGMII1_RD[3:0](具体在第 529 页上)、但在我向下进入“MII_G_RT1"页面“页面上的替代模式之前、我无法找到其他接收信号 PRG1_RGMII1_RX_CTL、除非我在该页面的“MII_G_RT1"部分“部分列表上处于不同的状态、但在该页上处于不同于该模式列表中。

关于 PRU 内部多路复用的最后一个问题、上述概念如何与 PRUn R30/R31 输入和输出的概念相映射? 这是否会影响通过该接口接收或传输数据的方式?  

谢谢!

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

    您好、Seth。

    PRU 内部多路复用?  

    我的理解是、每个片都应用 PRU 内部多路复用。 因此、如果 slice0 配置为对 PRU GPO/GPI 使用 R30/R31、则您将无法从该切片访问 MII 信号。 如需更多信息、请首先阅读该另一个主题:
    AM6442:PRU ICSSG 内部多路复用器 e GPIO 模式 

    接下来让我们谈谈与 UART 的交互  

    如果您正在与 PRU 子系统中的硬件 UART 进行交互、则来自硬件 UART 的信号不会通过内部多路复用器。 它们有自己的信号路径。

    但是、如果在软件中实现 UART、则需要确保内部引脚多路复用设置为 0 以使引脚与 GPI/GPO 信号位在一起、或设置为 1 以使用 3 通道外设接口来实现 UART。  

    但如果我要进行以太网、我是否会与 MII 交互、然后该外设有一个单独的信号路径、如硬件 UART? 或者 PRU 是否直接与引脚交互、这需要设置内部多路复用?  

    我们正在开始接近我的应用团队可以在论坛上支持的边缘(我特别没有以太网网络固件方面的任何专业知识)。 我仍然将此引脚多路复用问题归类为“一般 PRU 问题“、但我需要从 PRU 固件接收内容进行注释。

    您可以期待未来的发展?

    我已通知贵公司的 TI 代表、您有兴趣访问 PRU 以太网固件的源代码。 但我需要您允许我们直接与您联系,或者我需要您与他们联系 — 我被告知他们一直在与贵公司的员工进行互动,姓名缩写为 JV 和 DG。

    我们将能够为您提供以太网源代码、但我们无法回答有关源代码的问题。

    我们可以继续在论坛上回答一般的 PRU 问题、但不会回答以太网特定的问题。 如果您需要固件开发支持、我们可以建议一些第三方之前完成 PRU 以太网的人员。 我们的一个团队还开始为定制 PRU 以太网开发构建付费支持模型 — 我对此不了解很多,但如果这对您来说可能很感兴趣,我可以检查这是否适合您的环境,并向您公司的 TI 代表提供更多信息。

    此致、

    Nick

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

    再次大家好。 你当然有权限直接联系我。 我渴望得到我的手在一些具体的东西,我可以用作为一个开始的例子。 我期待您的代表的发言。 如果更容易、请将联系信息发送给我、我将发起联系。

    我理解在本论坛可能不适合解答我的以太网固件问题、并感谢应用团队不提供支持。 但是、是否有 TI 客户可以访问的其他技术支持团队/论坛等? 归根结底、我有一本 TI 开发的硬件和手册、还有关于如何正确设置寄存器以特定方式使用它的问题、希望有人能解答这些问题!

    对我的原始问题很感兴趣、当我阅读您发送的链接(AM6442:PRU ICSSG 内部多路复用器 e GPIO 模式 — 处理器论坛-处理器 — TI E2E 支持论坛)时、我需要这样做来设置 PRU 的引脚多路复用器以访问 MII 作为以太网控制器、因此如果有错误、请纠正我:

    1) 在 A53 内核上、将 PADCONFIG46、 PADCONFIG47、PADCONFIG48 等的 PADCONFIG 设置配置为 MuxMode =(PRG1_RGMII1_RD0-3 等)

    2) 在 PRU1 内核上、 对于 MII 模式、我设置 ICSSG_GPCFG1_REG.PR1_PRU1_GP_MUX_SEL = 2

    因此、为了正确设置引脚多路复用设置、我需要 A53 PADCONFIG 设置与我在 PRU GPCFG 多路复用器选择中选择的模式保持一致。 这是正确的方法还是我仍然误解所需的步骤?

    我尝试按照 TI TMDS64EVM 电路板原理图中的说明、连接了这些信号的端到端布线的图像、 但遇到了导致上传无法成功的错误。 基本上、我正在尝试启用来自原理图第 27 页的 PRU1 PRG1_RGMII1_[R*/T*]信号、因为这些信号通过第 18 页的 ICSSG RGMII 1 以太网 PHY“组件并通过相关的 RJ45 连接器进行路由(我的原帖子讨论了 PRU0、PRG0 RGMII 信号、但我的 EVM 不支持这些信号用于外部 RJ45 连接)。

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

    这是我之前尝试更新的图、在右上角显示了电路板上的引脚 尝试通过多路复用进行选择、沿逆时针方向围绕右下角 EVM 上的连接器图像继续。

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

    好的、感谢您的参与。 我相信我现在已经有足够的进展了。

    我希望最后一组问题能很快解决。 查看 MCU+ SDK(版本 am64x_11_02_00_24)、在示例工程中  .\MCU_PLUS_SDK_am64x_11_02_00_24\examples\PRU_IO\empty  中、有两个头文件定义了由 R5F 内核加载到 PRU IRAM 的十六进制固件阵列(分别在 pru0_load_bin.h 和 pru1_load_bin.h 中定义的 PRU0Firmware_0 和 PRU1Firmware_0) 。 这些阵列的生成是工程正常编译过程的一部分、还是有更新它们的额外步骤? 在将固件二进制文件转换为由 R5F 内核加载到 PRU 的十六进制数组之前、如何调试 PRU 代码? SDK 中是否有自述文件或 HOWTO 指南或 Academy 页面中是否讨论过此问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这些数组的生成是项目正常构建过程的一部分、还是有更新它们的额外步骤?

    是的、作为 PRU 固件工程编译后处理步骤的一部分、十六进制阵列的生成是完全自动的。 在 CCS 中构建 PRU 工程时、编译后脚本会运行 hexpru 实用程序、以将编译后的.out 文件转换为包含十六进制数组的 C 头文件、然后将其移至相应的固件目录。 R5F 工程包含这些头文件、并在运行时将数组加载到 PRU IRAM。

    检查以下路径:  

    examples\pru_io\empty\firmware\am64x-evm\icss_g0_tx_pru1_fw\ti-pru-cgt\example.projectspec
    
    Variable: postBuildStep
    $(CG_TOOL_ROOT)/bin/hexpru --diag_wrap=off --array --array:name_prefix=TXPRU1Firmware -o txpru1_load_bin.h empty_am64x-evm_icss_g0_tx_pru1_fw_ti-pru-cgt.out
    ]在将固件二进制文件转换为由 R5F 内核加载到 PRU
    的十六进制数组之前如何调试 PRU 代码

    在十六进制转换之前、直接通过 CCS 加载.out 文件来调试 PRU 代码。 构建 PRU 工程、在 CCS 中连接到 PRU 内核、然后使用 Run→Load Program 加载.out 文件(在构建 PRU 固件工程时、该.out 包含可执行代码和调试符号)。 然后、您可以设置断点、单步执行以及检查寄存器和存储器。 调试完成后、重新编译以为 R5F 工程生成更新的十六进制数组。

    https://software-dl.ti.com/processor-sdk-linux/esd/AM64X/latest/exports/docs/common/PRU-ICSS/PRU-Getting-Started-Labs_Lab 3.html#编译到 a-hex-array-file

    您可以在 SDK 文档中的实验 3:如何编译 PRU 固件以生成十六进制阵列和实验 5:用于调试技术的 PRU 固件基本调试中找到更多详细信息。

    BR
    Jc.

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

    我看到这有一个问题。 我从 SDK 导入了一个空工程作为起点。 导入后、我右键点击 CCS 的 Project Explorer 中的工程、并将其重命名为一个更简单的名称。 但是、在编译时、我在编译后处理步骤中收到错误。 编译过程生成的.out 文件按预期与重命名的工程名称相匹配、但 Makefile 在向 hexpru 工具提供输入时引用了旧工程名称。 如何解决此问题? 执行构建时处理的 CCS 会覆盖手动编辑 Makefile。 在 Build->PRU Linker->Basic Options 下的工程属性中、“specify output file name“设置为${ProjName}.out、但我找不到该变量的定义位置。 对项目进行文本搜索并不能揭示为什么这个旧名称在自动构建过程中仍然存在。 建议?

    附加生成的 makefile。

    新工程名称: ICSSG0_PRU1_AFDX

    旧工程名称(仍在 151 行中使用): empty_am64x-evm_iss_g0_pru1_fw_ti-pru-CGT

    新名称:e2e.ti.com/.../makefile.txt

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

    您可以尝试一下吗?

    • 右键点击(新重命名的)工程 ->   Properties -> Build -> Steps
    • 修改编译后处理脚本

    发件人:

    ${CG_TOOL_ROOT}/bin/hexpru --diag_wrap=off --array --array:name_prefix=PRU1Firmware -o pru1_load_bin.h empty_am64x-evm_icss_g0_pru1_fw_ti-pru-cgt.out

    收件人:  

    ${CG_TOOL_ROOT}/bin/hexpru --diag_wrap=off --array --array:name_prefix=PRU1Firmware -o pru1_load_bin.h ${ProjName}.out

    BR
    Jc.

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

    更新、请参阅 PRU 入门实验的 AM64x Academy 版本、而不是 Linux SDK 文档中的较旧版本。 这里讨论了提到的编译后步骤 JC:
    PRU 入门实验>实验 1 >创建 CCS PRU 工程
    https://dev.ti.com/tirex/explore/node?isTheia=false&node=A__AXrKVPpcx8pQCsM2EB7pxg__AM64-ACADEMY__WI1KRXP__LATEST

    我仍需要更新 Linux SDK 文档以指向 PRU Academy、 我们将查看 SDK 12.0 发布之前是否能够发生这种情况。

    此致、

    Nick

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

    我正在从您的链接开始加载引用工程、并略微修改代码以写入某些寄存器(任务管理器和 IEP 配置寄存器)以及写入共享 RAM (0x1_0000) 和从中读取。 写入这些地址时、我在存储器查看器中看不到值更新。 当我尝试读回这些写入的值时、我只得到 0。 我是否需要做些什么来启用对读取或写入存储器的访问? 可能是在 Acadmy 中未讨论加载/调试过程中缺少的一个步骤?

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

    其他详细信息。 我尝试使用 Memory Browser“填充存储器“选项将一系列字节写入 PRU 共享 RAM:

    但我在尝试这样做时遇到错误:

    即使我已连接并能够逐步浏览已加载的代码、也是如此。 那么、我需要在代码中设置一些设置才能写入这些地址中的任何一个吗?

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

    最后一位数据... 我将代码更改为数组访问而非指针访问、但尝试通过 DATA_SECTION pragma 将数组放置在共享 RAM 地址:

    并在链接器文件中定义该段:

    但是、当我在编译后进行链接时、我会收到一条警告、提示无法生成某项我可以加载的代码:

    构建目标:“ICSSG0_PRU1_AFDX.out"</s>“
    调用:PRU 链接器
    “c:/ti/ti_cgt_pru_2.3.3/bin/clpru -v4 --define=PRU1 --define=SLICE1 --define=SOC_AM64X --define=_debug_=1 -g --diag_warning=225 --diag_swrap=off --display_error_number --endian=little -z -m“ICSSG0_PRU1_

    “../main.c",“,第、第 29 行:警告#17003-D:从函数“main"重“重定位到符号“shared_mem_array"溢出“溢出;17 位重定位地址 0x10000 太大而无法在 16 位字段中编码 (type =“R_PRU_FOR_U16_C32_SO8s16_PCM0XFFFFFFF"(“(9)、main =“.obj",“,section、section = 0x00000068“)。
    警告#10015-D:无法在目标系统上加载和运行输出文件“ICSSG0_PRU1_AFDX.out"</s>“
     

    如何解决?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    最后一位数据... 我将代码更改为数组访问而非指针访问、但尝试通过 DATA_SECTION pragma 将数组放置在共享 RAM 地址:

    看起来链接器使用 PRU 指令 LDI 16 位立即数值(最大 0xFFFF)创建符号。  

    这应该是可行的。 此外、PRU 支持用于直接常量的 LDI32。 我还要请 Nick Saulnier  作进一步评论。

    volatile int *shared_mem_array = (volatile int*)0x10000;
    shared_mem_array[frame] = frame + 100;

    BR

    Jc.

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

    嗨、Seth、

    您的问题的其他部分在这个周末没有带宽。

    一旁的构建设置

    只是为了确认、您是否在 CCS 中开发了 PRU C 工程?

    实际上、我最终对 example.projectspec 文件进行了一些更改(这告诉 CCS 在导入工程时要使用的 PRU 工程设置)。 默认情况下、所有工程都使用的是仅适用于汇编语言的 example.projectspec 设置、但我不希望这些设置能在包含 C 代码的 PRU 工程中正常工作。

    正在进行中、此处的拉取请求:
    https://github.com/TexasInstruments/open-pru/pull/125

    截至 3 月 22 日、我尚未全面测试所有这些更改、我只是想先了解所有的结构更改、然后开始测试。

    可在此处查看到目前为止对 example.projectspec C 文件的更改:
    https://github.com/TexasInstruments/open-pru/commits/a0226750_remove_mcuplus_dependencies/examples/empty_c/firmware/am64x-evm/icss_g0_pru0_fw/ti-pru-cgt/example.projectspec 

    此致、

    Nick

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

    谢谢我在星期五上发布了一个级联,因为我在我的实验室轮班期间遇到了几个墙壁。 此时、让我们简单地说、我剩余的未决问题是:

    1) 在从 PRU C 代码写入 PRU 寄存器之前、是否需要任何项目/链接器等设置

    2) 您能否向我介绍任何解释者/文档、这些解释者/文档讨论链接器中的 PAGE 0 和 PAGE 1 等关键字及其与 TRM 中存储器映射的关系

    根据您的查询、是的、我使用 empty_c 作为我的项目起点、并且正在使用 C 语言(使用一些混合汇编行来使用 XIN 指令)进行开发。 我来看看您的 PR、看看是否有任何问题。 那么、我知道我在高层次上试图避免哪些设置可能会对 C 工程造成问题?

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

    感谢更新工作。 上周、我还通过在存储器中定义一个段来解决该问题:

    很重要

      ...

      .shared_mem > PRU_SHAREDMEM、第 2 页

    }

    并在 C 文件中声明并定义数组时添加关键字“__FAR":“:

    pragma DATA_SECTION (shared_mem_array、“.shared_mem")“)
    __far int shared_mem_array[100];

    您是否偏爱一种方法而不是另一种方法、或者他们是否都要在后台做同样的事情?

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

    感谢更新工作。 上周、我还通过在存储器中定义一个段来解决该问题:

    很重要

      ...

      .shared_mem > PRU_SHAREDMEM、第 2 页

    }

    并在 C 文件中声明并定义数组时添加关键字“__FAR":“:

    pragma DATA_SECTION (shared_mem_array、“.shared_mem")“)
    __far int shared_mem_array[100];

    您是否偏爱一种方法而不是另一种方法、或者他们是否都要在后台做同样的事情?

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

    如果要在 PRU 上调试代码、如何确保系统级 PADCONFIG 设置正确多路复用? 我使用 CCS 直接连接到 PRU0、因此在 A53(或其他 Arm 内核)上不会运行任何将设置 PADCONFIG 或启动 PRU 处理的器件。 我尝试从 PRU 代码本身写入 PADCONFIG 寄存器(ox000F_4000 地址),但我无法判断它是否正常工作 — CCS Memory Browser 显示该地址范围的所有 0、而不会影响我的任何写入尝试(包括解锁该区域的 KICK 寄存器时)。