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.

[参考译文] AM6526:创建从 PRU 到 R5F 的中断

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/779597/am6526-creating-an-interrupt-from-pru-to-r5f

器件型号:AM6548

我们有一个示例来说明如何为来自 ICSSG2/PRU0 (PRU->R5F)的其中一个 R5F 内核生成中断。 用于配置和触发的源代码片段也会有所帮助。 我们希望使用其中一个 PRU 寄存器作为中断源。

谢谢、
Eddie

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

    我们没有独立的构建盒类型 PRU/R5F 中断设置示例、但 Processor SDK RTOS 中的 EMAC 驱动程序和 icssg 固件包含客户可以参考的必要配置:

    R5F 驱动程序:pdk_am65xx_1_0_3\packages/ti\drv\emac\src\v5
    PRU 固件:pdk_am65xx_1_0_3\packages/ti\drv\emac\firmware\icss_eth\src

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

    [编辑]

    与 PRU-ICSSM 主机中断直接连接到 AM335x 中的 ARM 中断控制器或通过 AM57x 中的交叉开关不同、PRU-ICSSG 主机中断通过电平或脉冲中断路由器路由到 MCU R5F、请参阅 TRM 图9-1。 SoC 中断架构  

    和图6-110。 PRU_ICSSG 集成:

    因此、中断路由器需要通过 CSL 函数进行配置、如下所示:

     CSL_RouterIntraCfg RouterCfg;

      uint32_t          pruIntRtrInIntNum、pruIntRtrOutIntNum;

     

     /*初始化主 MCU 中断路由器配置结构*/

      RouterIntraCfg.pRouterIntraRegs =(CSL_intr_router_cfgRegs *)(uintptr_t)(CSL_MAIN2MCU_LVL_INTR0_CFG_base);

      RouterinCfg.pIntdRegs      =(CSL_intr_router_intd_cfgRegs *)(uintptr_t)空;

      RouterinCfg.numInputIntrs  = 192;

      RouterinCfg.numOutputIntrs = 64;

      

      /*将 PRU int 路由器输出路由到 MAIN2MCU int 路由器输出、MAIN2MCU int 路由器输出 int 编号

        *源自 MCU GIC 中断号。*/

      /* 32:ICSSG_0_HOST_INT0 PRU_ICSSG0主机中断2、请参阅 TRM 9.4.10 MAIN2MCU_LVL_INTR0中断映射*

      pruIntRtrInIntNum = 32;

      pruIntRtrOutIntNum = CSL_GIC0_INTR_PRU_ICSSG0_BUS_PR1_HOST_INTR_PEND 0 - CSL_MCU0_INTR_MAIN2MCU_LVL_INTR0_OUTL_0;//286 -160、请参阅 cslr_intr_gic0.h 和 cslr_intr_mcu0.h

      CSL_INROUTERCfgMux (&INROUTERCfg、pruIntRtrInIntNum、pruIntRtrOutIntNum);

     

    并通过 OSAL 函数在 R5F 中注册中断:

       hwip_handle hwiHandle =空;

        OsalRegisterIntrParams_t interruptRegParams;

           /*使用默认值初始化*/

                  OSAL_RegisterInterrupt_initParams (&interruptRegParams);

            interrRegParams.corepacConfig.isrRoutine =(&PRU_hwiFxn);

            interruptRegParams.corepacConfig.priority = 0x20U;

                  interruptRegParams.corepacConfig.name=NULL;

                  interruptRegParams.corepacConfig.corepacEventNum=CSL_MCU0_INTR_MAIN2MCU_LVL_INTR0_OUTL_0;

                  interruptRegParams.corepacConfig.intVecNum=CSL_MCU0_INTR_MAIN2MCU_LVL_INTR0_OUTL_0;/*主机中断矢量*/

            /*寄存器中断*/

                  OsalRegisterInterrupt (&interruptRegParams、&(hwiHandle));

    注意:如前一个帖子所述、PRSDK 中没有现有的独立 R5F/PRU 中断示例代码。 以上代码仅基于其他示例供参考。

    此致、

    Garrett

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

    器件型号:AM6548

    您好!

    我尝试在 ARM 内核 R5F 和 PRU 之间进行交互。 我想从 R5F 向 PRU 发送一个"中断"。

    我的问题是、我不知道/不了解如何使用 R5F 生成特定的系统事件。 我搜索了 CSL 封装、阅读了 AM6548的 TRM、信息量让我不知所措。

    我想我的第一个问题是、我不知道术语"中断"和"系统事件"的确切定义。 两者有何区别?
    第二个问题:是否需要启用 ICSSG 的 OCP 端口以在 ARM 和 PRU 之间发送中断?

    图6-111. PRU_ICSSG 集成向我展示、PRU_ICSSG0_External Events [64...159]是"来自各种器件外设的系统事件"。 我能否使用 R5F 生成这样的系统事件?

    我已经以这样的方式配置了 PRU_ICSSG 的 INTC、SysEvent 0映射到通道0、而通道0映射到主机0。 我还为 ICSSG 上的主机0启用了中断。 所以我“只”需要以某种方式生成 SysEvent 0....

    提前非常感谢!

    Thomas

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

    由于您的问题似乎与 Eddie 在这里发布的内容类似、我已合并了该主题。 请查看 Garrett 在此处提供的有关如何配置 R5F 中断的指导。

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

    Thomas、

    TRM 第9.4.5节 PRU_ICSSG0中断映射列出了事件[64:159]到 PRU_ICSSG0外部中断输入的所有映射。 和9.4.3 MCU_R5_CORE0中断映射列出了事件到 MCU_R5_CORE0的映射。 您尝试从 R5F 生成哪个 PRU_ICSSG0_External 事件? 请注意 PRU_ICSSG 中断控制器(INTC):

    最多64个内部事件、由 PRU_ICSSG 内部的模块生成

    最多96个外部事件,由系统生成

    关于主机和通道、请参阅 6.4.6.1 PRU_ICSSG 中断控制器功能说明

    •主机中断0并行连接到 PRU0和 PRU1寄存器31 (R31)中的位30。
    •主机中断1并行连接到 PRU0和 PRU1的寄存器31 (R31)中的位31。
    •从 PRU_ICSSG 导出并映射到器件级中断 控制器的主机中断2至9。

    "大多数系统事件直接路由到各种处理元素、但在某些情况下、将某个组的所有事件(例如 GPIO 事件)路由到每个处理元素是不切实际的。 为此、SoC 集成了多个中断路由器(INTRTR)实例。 每个中断路由器

    通过使用 简单的组合逻辑(一组多路复用器)聚合多个系统事件并将每个事件路由到给定的处理元件。 事件选择通过 每个中断路由器内的相关寄存器进行控制。"、因此您不必启用 OCP 端口即可在 ARM 和 PRU 之间发送中断。

    此致、
    Garrett

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

    请注意、我已编辑 interruptRegParams.corepacConfig.corepacEventNum 上的上一帖子。 仅在 C66X 中、中断需要被组合到4个32位事件寄存器中的{0、1、2、3}中的任何一个、而在 AM654x 上、它应该等于 intVecNum。

    此致、
    Garrett
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢您在 Garret 跳过。 我没有收到任何有关我的主题已合并的电子邮件通知、我现在就注意到了。 我现在将看一下它并返回结果。

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

    您好、Garrett、

    问题"您尝试从 R5F 生成哪个 PRU_ICSSG0_External Event?"
    我没有想到特定事件、我只是想将系统事件发送到 PRU、该事件由 R5F 软件生成。

    但是、同时我找到了函数"PRUICSS_pruSendEvent (pruHandle、ARM_PRU0_EVENT);"、该函数为我执行任务。 再次感谢 Garrett 的解释。

    但返回到该线程的原点:创建从 PRU 到 R5F 的中断。

    我在从 ICSSG0的 PRU0创建一个系统并将其发送到第一个 R5F 方面需要一些时间。

    下面是我如何理解从 PRU0到 R5F 的中断链的工作原理:您能否检查我是否错过了那里的内容?

    1.从 Pru0生成 INTC 系统事件

    将0x20写入 R31将生成 PRU_ICSSG0内部中断16我认为这也称为 PRU_ICSSG 的主机中断2、在阅读第6.4.7.1章 PRU_ICSSG 中断控制器功能说明时、我不确定。

    PRU_ICSSG0的主机2连接到 MAIN2MCU_LVL_INTRTR0。

    因此、对于 MAIN2MCU_LVL_INTR0路由器的配置、输入中断号为32、如您在示例中所述。



    MCU_R5_CORE0的中断编号162是来自 ICSSG0的主机中断2吗? 因此、我必须配置 MAIN2MCU_LVL_INTR0、以便输入中断号为32、输出中断号为162?

    我到这里的路径/链是否正确?

    我不理解您此行的示例代码:
    pruIntRtrOutIntNum = CSL_GIC0_INTR_PRU_ICSSG0_BUS_PR1_HOST_INTR_PEND 0 - CSL_MCU0_INTR_MAIN2MCU_LVL_INTR0_OUTL_0;//286 -160、请参阅 cslr_intr_gic0.h 和 cslr_intr_mcu0.h

    为什么从286中减去160?

    希望您能给我一些提示
    此致、
    Thomas

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

    您描述的路径/链是正确的。 一些澄清:

    1。
    >>将0x20写入 R31将生成 PRU_ICSSG0内部中断16。 我假设这也称为 PRU_ICSSG 的主机中断2、当>>阅读第6.4.7.1章 PRU_ICSSG 中断控制器功能说明时、我不确定。

    请参阅第6.4.7.2节 PRU_ICSSG 中断控制器基本编程模型、将事件16映射到主机中断2。
    2)。 通过 ICSSG_CH_MAP_Regi (其中 I=0至39)通道映射寄存器将事件映射到 INTC 通道。
    3)。 通过 ICSSG_HINT_MAP_REG0将通道映射到主机中断、并将其映射到 ICSSG_HINT_MAP_REG4寄存器。

    2.>>为什么要从286中减去160?
    实际上、它应该是162、如您所示。 CSL_RouterCfgMux ()获取 MCU R5中断号(如 inpdk_am65xx_1_0_3\packages/ti\drv\gpio\test\led_blink\src 中所示),而不是从 IC0获取中断号。 我偶然地查看了另一个具有"MCU GIC"的器件的示例代码。

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

    您好、Garrett、

    感谢您的澄清!

    然而、当我生成 PRU_ICSSG0的主机中断2时、isrRoutine 不会被执行。 我仍在搜索原因。

    只需清除第2点:
    应该从286中减去162,还是只需使用 outputIntrNum of CSL_RouterCfgMux 的值162?

    这来自我的代码:

    int pruIntRtrInIntNum = 32;
    int pruIntRtrOutIntNum =/*CSL_GIC0_INTR_PRU_ICSSG0_BUS_PR1_HOST_INTR_pend_0 -*/ CSL_MCU0_INTR_MAIN2MCU_LVL_INTR0_OUTL_2;
    CSL_RouterCfgMux (&trRouterMain2MCUCfg、pruIntRtrInIntNum、pruIntRtrOutIntNum); 

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

    我可以解决该问题:

    我不知道、MAIN2MCU_RTR_LVL_MUX_INTR 0连接到 MCU_R5_CORE0_INT_IN 160
    因此、它需要从 CSL_MCU0_INTR_MAIN2MCU_LVL_INTR0_OUTL_2中减去160。

    ISR 现在将在 R5上执行! 感谢 Garrett 的耐心和提示!

    此致、
    Thomas

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

    尊敬的 Thomas:

    感谢您的更新、很高兴知道您能够让这项工作正常! 该主题对其他客户也有很大帮助。

    在输入和输出中断编号上、MAIN2MCU_LVL_INTR0_MUXCNTL_y 寄存器的描述似乎不太清楚。 如果查看 CSL_RouterCfgMux ()的实现:

       /*配置多路复用器值*/

        CSL_fins (regVal、INTR_ROUTER_CFG_MUXCNTL_ENABLE、inputIntentNum);

        CSL_REG32_WR (&pCfg->pRouterIntraRegs->MUXCNTL[outputIntraNum]regVal);

    使用以下配置从 CSL_MCU0_INTR_MAIN2MCU_LVL_INTR0_OUTL_2中减去160是有道理的:

     RouterinCfg.numInputIntrs = 192;

     RouterinCfg.numOutputIntrs = 64;

    此致、

    Garrett

x 出现错误。请重试或与管理员联系。