工具/软件:
大家好:
我们正在 尝试配置和注册一个中断例程、该中断例程在基于 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


