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.

[参考译文] AM68A:从 A72 内核和/或 DMA 外设到 AM68A 上的 C7x DSP 的中断配置 (J721S2)

Guru**** 2434370 points
Other Parts Discussed in Thread: AM68A

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1539835/am68a-interrupt-configuration-from-a72-core-and-or-dma-peripheral-to-the-c7x-dsp-on-am68a-j721s2

部件号:AM68A


工具/软件:

大家好:

我们正在 尝试配置和注册一个中断例程、该中断例程在基于 AM68A 的定制电路板的 C7x DSP 上执行。

中断源是为与 McASP 驱动程序配合使用而设置的 DMA 传输完成。 我已经修改了驱动程序、以便在接收 DMA 传输完成时、调用驱动程序内部的回调。

我的问题是如何通知 DSP 内核 DMA 完成? 就我可以告诉读取 J721S2 的 TRM 和 PSDK 而言、有 3 种方法可以读取它:

  • 路由到 DSP 的 DMA RX 中断
  • McASP 驱动程序回调函数内的 IPC_SET 寄存器写入。 根据 TRM、写入 IPC_SET0 应向 C7SS0 器件内核发送中断
  • 基于邮箱的中断 — 这已经用于 RPMSG 通信、但据我所知、可以使用另一个中断线路或邮箱

我不清楚的是、如何在 DSP 代码中注册自定义中断。

根据 TRM (SPRUJ28)、所有路由到 C7 DSP 的中断都来自 CLEC(集群级事件控制器)。

假设我要使用 IPC_SET 中断。 使用将运行 Linux 的 A72 中的 1 写入 CTRL_MMR_CFG0_IPC_SET0  

devmem2 0x0000100100 w 0x1

并使用 写入 CTRL_MMR_CFG0_IPC_CLR0 寄存器来清除它

devmem2 0x0000100180 w 0x1

我可以确认寄存器按预期运行。 我不知道如何配置 CLEC 并在 DSP 代码中创建中断处理程序。

我们在 J721S2(适用于 I2C 示例代码)的 PSDK 中找到一些示例、这些示例调用了 CSL_clecConfigEvent 和 HwiP_create 函数
这是一个片段

CSL_ClecEventConfig   cfgClec;
CSL_CLEC_EVTRegs     *clecBaseAddr = (CSL_CLEC_EVTRegs *)CSL_COMPUTE_CLUSTER0_CLEC_REGS_BASE;

cfgClec.secureClaimEnable = FALSE;
cfgClec.evtSendEnable     = TRUE;
cfgClec.rtMap             = CSL_CLEC_RTMAP_CPU_ALL;
cfgClec.extEvtNum         = 0;
cfgClec.c7xEvtNum         = EVT_NUM;

retVal = CSL_clecConfigEvent(clecBaseAddr, IRQ_NUM, &cfgClec);
if (retVal != CSL_PASS)
{
    return -1;
}

HwiP_Params hwiParams;
/* Clear out any pending interrupts */
HwiP_clearInterrupt(IRQ_NUM);
HwiP_Params_init(&hwiParams);
hwiParams.name = "IPC_IRQ";
hwiParams.arg = 0;
hwiParams.evtId = EVT_NUM;
HwiP_create(IRQ_NUM, isrHandler, &hwiParams);

请您确认这是正确的方法吗?

此外、您还能说明如何将 J721S2 附录电子表格中的中断号和事件 ID 解码为

  • 配置要由 DSP 内核提供的 IPC_SET 中断
  • 配置一个 DMA TX 中断、使其路由到 DSP CORED 并由其提供服务

提前感谢您!
Darko

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

    您好、

    你可以在这里查看吗:  

    您能否确认这是正确的方法?

    是的、 您也可以检查一下  appC7xClecInitDru  来自的 API  vision_apps\platform\j784s4\rtos\c7x_1\main.c

    此致、
    Sivadeep

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

    你好 Sivadeep。 感谢您的答复。

    我查看了您发送的资源、但仍然存在不足以确定我应该使用的确切中断号和事件 ID 的问题。

    假设我想配置为使用通过写入 IPC_SET0 寄存器而触发的中断。
    请访问 J721S2 附录电子表格

    中断输入线路为 COMPUTE_CLUSTER0_CLEC_SOC_EVENTS_IN_0
    中断 ID 为 0
    中断源为 CTRL_MMR0_IPC_SET0_IPC_SET_IPCFG_OUT_0

    对我来说、事件 ID 和中断 num 都应该为 0、对吧?

    在上述示例代码中、我两者都使用了 0

    CSL_ClecEventConfig   cfgClec;
    CSL_CLEC_EVTRegs     *clecBaseAddr = (CSL_CLEC_EVTRegs *)CSL_COMPUTE_CLUSTER0_CLEC_REGS_BASE;
    
    cfgClec.secureClaimEnable = FALSE;
    cfgClec.evtSendEnable     = TRUE;
    cfgClec.rtMap             = CSL_CLEC_RTMAP_CPU_ALL;
    cfgClec.extEvtNum         = 0;
    cfgClec.c7xEvtNum         = 0;
    
    retVal = CSL_clecConfigEvent(clecBaseAddr, 0, &cfgClec);
    if (retVal != CSL_PASS)
    {
        return -1;
    }
    
    HwiP_Params hwiParams;
    /* Clear out any pending interrupts */
    HwiP_clearInterrupt(0);
    HwiP_Params_init(&hwiParams);
    hwiParams.name = "IPC_IRQ";
    hwiParams.arg = 0;
    hwiParams.evtId = 0;
    HwiP_create(IRQ_NUM, isrHandler, &hwiParams);

    此假设是否正确?

    然后我从 A72 内核 devmem2 0x0000100100 w 0x1 编写、理论上应该调用我的中断例程、但实际上没有。
    中断例程只会递增一个值并复位并清除 IPC0 寄存器、但我可以确认没有发生。

    我在中看到了例如 drv/i2c/示例中 使用 Osal_Register 中断而不是 Hwip_create、我是否应该使用它?

    我确认使用 HwiP_POST 触发中断的软件有效、并调用了中断例程。

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

    您好、

    这些是要映射的值

    CLEC 的输入事件 :

    evt num(从) evt num (to) #events 映射到
    127. 64 64 DRU_COMPLET_EVENT_IN[63:0]
    191. 128 64 DRU_ERROR_EVENT_IN[63:0]
    255 192. 64 DRU_localout_event_in[63:0]

    CLEC 输出事件 :  

    大致对应   MRR.C7x_EVNUM  事件
    C7x Corepac 事件 — Corepac0 0-63 64

    rtMap :  CSL_CLEC_RTMAP_CPU_4 (C7x_0)

    您也可以查看一下  appC7xClecInitDru  psdk\vision_apps\platform\j721s2\rtos\c7x_1\main.c

    此致、
    Sivadeep

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

    你好 Sivadeep ,谢谢你的答复,这是非常有帮助的。

    为了澄清一下、这个示例用于配置 DRU/数据路由单元、这对于 DMA 中断设置肯定会很有帮助。

    但对于 CTRL_MMR 中的 IPC_SET0 寄存器、应该使用 cfgClec.c7xEvtNum 的值?

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

    您好、

    但对于 CTRL_MMR 中的 IPC_SET0 寄存器、应使用 cfgClec.c7xEvtNum 的值?
    中断输入行是 COMPUTE_CLUSTER0_CLEC_SOC_EVENTS_IN_IN_0  
    中断 ID 为 0
    中断源为 CTRL_MMR0_IPC_SET0_IPC_SET_IPCFG_OUT_0

    对于 SOC 事件:  

    此致、
    Sivadeep

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

    非常感谢、这解决了 ipc_set 问题、 修改了这样的代码后、确实正确的数字是 568

    CSL_clecConfigEvent(clecBaseAddr, 568, &cfgClec);

    并且写入 IPC_SET 寄存器时、DSP 上捕获到中断!
    中断看起来是脉冲的、如果我将其保留为默认的电平(也就是级别)、一次写入会发生两个中断。

    CSL_clecConfigEventLevel(clecBaseAddr, 568, 0);
    我可以问,你发送的表的屏幕截图,它在哪里? 我在 J721S2 TRM 中也未在附录电子表格中看到。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我可以问您发送的表格的屏幕截图、它位于哪里? 我在 J721S2 TRM 中也未在附录电子表格中看到。

    共享的屏幕截图来自内部文档。  

    在获得必要信息后、我们是否可以关闭该主题?

    此致、
    Sivadeep

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

    好的、谢谢。 请关闭它。

    我可能建议使用此信息更新 J721S2 TRM。

    例如、J721E TRM 的图 5-4 中包含此信息。 CTRL_MMR0 和 SEC_MMR0 集成


     

    我仍然希望将 DMA 中断路由到 DSP、但如果无法弄清楚、我可以打开另一个线程。

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

    您好、

    我可能建议使用此信息更新 J721S2 TRM。

    我来检查一下。  

    请将其关闭。

    谢谢你。 关闭螺纹。

    此致、
    Sivadeep