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.

[参考译文] J784S4XEVM:C7x GPIO 中断路径问题

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1496341/j784s4xevm-c7x-gpio-interrupt-path-issue

器件型号:J784S4XEVM
主题:SysConfig 中讨论的其他器件

工具/软件:

尊敬的专家:

我正在使用 SDK RTOS 10.1为 J784S4 EVM 构建 FreeRTOS 应用。

我尝试将中断从主 GPIO0存储体0 (引脚11)路由到 C7x 内核1。

电路板处于"无引导模式"、我将应用程序加载到 c7x 内核1上。

我已正确初始化焊盘配置和 GPIO。 按下 SW3按钮后可以读取 GPIO0_11的值。

我已经 使用 SysConfig 修改 sciclient_defaultBoardcfg_rm.c 并设置中断。

但我无法到达 回调函数。

这是我对中断路径的理解:  

145 = GPIOMUX_INTRTR0_IN_145 (=来自 GPIO0组0的 INTRTR0输入)

44 = COMPUTE_CLUSTER0_CLEC (=向 CLEC 输出 INTRTR)

56 = SCIServer 为主机 C7x_0_1设置 GPIOMUX_INTRTR0控制寄存器56

440 = COMPUTE_CLUSTER0_CLEC_SOC_EVENTS_IN_440 (=来自 GPIOMUX_INTRTR0 56的 CLEC 输入)

40 = GPIO 示例中使用的 C7x 中断号

我使用了"J784S4_TLO.20150116.xlsx" Register_Public_来获取以下寄存器地址:

  • GPIOMUX_INTRTR0
  • GPIO0
  • COMPUTE_CLESTER0_CLEC

使用 CCS 存储器浏览器视图、我检查了每个寄存器、它们看起来都是正确的。

0xa000e4 = 0x10091

0x600008 = 0x1

0x600010 = 0xFFFFFFFF

0x600034 = 0x0

0x79b81000 = 0x411000028

我可以通过写入 CLEC 发送寄存器来触发中断(代码到达回调函数)。

按下 SW3按钮后、可以在 组中断状态寄存器中看到该标志。

我试过 :

  • 编译的软件包文件。
  • 使用 OSAL、然后使用 CSL 层+对寄存器进行写入。
  • 使用 不同的 引脚、组、然后使用 wkup GPIO 模块。

我找到这篇帖子、与我的问题非常接近、但没有答案: J784S4XEVM:C7x GPIO 中断问题-处理器论坛-处理器- TI E2E 支持论坛

感谢你的帮助

Charles

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

    尊敬的 Charles:

    感谢您提供深入的信息、您已设置为 C7x 生成 GPIO 中断所需的所有内容。  

    您能否 为您的修改提供 sciclient_defaultBoardcfg_rm.c? 完整文件或与 SDK 中原始文件的差异。

    我可以通过写入 CLEC send reg.
    来触发中断(代码到达回调函数)

    那是哪个寄存器?

    谢谢、

    Neehar

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

    嗨、Neehar、

    这是  sciclient_defaultBoardcfg_rm.c 的差异

    e2e.ti.com/.../sciclient_5F00_defaultBoardcfg_5F00_rm.txt

    我在 CLEC_EVT_CFG_ESR_j 中写入、以触发来自  Register_Public_的中断、CLEC 是"J784S4_CLI.20250116.xlsx"中的"事件发送寄存器"。

    我直接 从内存浏览器在寄存器中写入, 我使用了 CSL_clecSendEvent()函数(两个函数都起作用)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Charles:

    感谢您提供此信息。

    您能否确认 sciclient 是否能够成功注册和配置中断路径?

    谢谢、

    Neehar

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

    嗨、Neehar、

    以下 sciclient 函数工作正常:

    - Sciclient_rmGetResourceRange

    - Sciclient_rmIrqTranslateIrOutput

    - Sciclient_rmIrqSet

    当我在 Sciclient_rmIrqSet 之后检查 INTRTR 路由器内存时:

    0xa000e4 = 0x10091

    这是 GPIOMUX 56地址(对应于 sciclient_defaultBoardcfg_rm.c)。

    数据表示 INT_ENABLE = 1且 MUX_CNTL = 145 (=组中断:主 GPIO0组0)。

    谢谢

    Charles

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

    尊敬的 Charles:

    谢谢、由于带宽较低、我将进一步查看并在几天内做出响应。

    谢谢、

    Neehar

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

    尊敬的 Charles:

    很抱歉耽误你的时间。

    [引述 userid="545647" url="~/support/processors-group/processors/f/processors-forum/1496341/j784s4xevm-c7x-gpio-interrupt-path-issue/5751740 #5751740"]

    当我在 Sciclient_rmIrqSet 之后检查 INTRTR 路由器内存时:

    0xa000e4 = 0x10091

    [/报价]

    根据该寄存器、GPIOMUX_INTRTR 145的输入是否为39? 是这样吗?

    [报价 userid="545647" url="~/support/processors-group/processors/f/processors-forum/1496341/j784s4xevm-c7x-gpio-interrupt-path-issue ]0x600034 = 0x0

      中断触发时、是否从未设置中断状态寄存器?

    [引述 userid="545647" url="~/support/processors-group/processors/f/processors-forum/1496341/j784s4xevm-c7x-gpio-interrupt-path-issue

    0x79b81000 = 0x411000028

    [/报价]

    这是  CLEC 输入440的正确寄存器吗? 寄存器映射似乎源于我的计算。

    谢谢、

    Neehar

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

    嗨、Neehar、

    根据该寄存器、是否为 GPIOMUX_INTRTR 145的输入、输出为39? 正确吗?

    基于 J784s4_GPIOMUX_INTRTR_CFG_muxcntl Register_Public  寄存器不会提供输出:

    但输出应该是44 CF PDK 用户指南4.12.7.2.2。 中断目标 ID (J784S4_DEV_COMPUTE_CLUSTER0_CLEC = 44)

      触发中断时是否从未设置中断状态寄存器?

    即在按下 SW3按钮时、在初始化时清除该按钮、以便发生下一个中断。

    这是 向 CLEC 输入440的正确寄存器吗? 从我的计算结果来看、寄存器映射似乎已关闭。

    将我的代码用于配置 CLEC 事件。

    dst_host_irq 是  Sciclient_rmIrqTranslateIrOutput()的输出、值为440。

    int32_t               ret;
    CSL_ClecEventConfig   cfgClec;
    CSL_CLEC_EVTRegs     *clecBaseAddr = (CSL_CLEC_EVTRegs *)CSL_COMPUTE_CLUSTER0_CLEC_REGS_BASE;
    eventId  = dst_host_irq; /* CLEC i/p Event Idx - Use Range from BoardCfg (value is 440)*/
    intNum = 40
    
    /* Configure CLEC for GPIO */
    cfgClec.secureClaimEnable = FALSE;
    cfgClec.evtSendEnable = TRUE;
    cfgClec.rtMap = CSL_clecGetC7xRtmapCpuId();
    cfgClec.extEvtNum = 0;
    cfgClec.c7xEvtNum = intNum;
    
    CSL_clecClearEvent(clecBaseAddr, eventId);
    CSL_clecConfigEventLevel(clecBaseAddr, eventId, CLEC_EVT_CFG_MMR_HIGH_LEVEL);
    ret = CSL_clecConfigEvent(clecBaseAddr, eventId, &cfgClec);
    
    if (ret != CSL_PASS)
    {
        PRINT_LOG("CSL_clecConfigEvent failed %d\n", ret);
    }

    基于 J784s4_evt Register_Public 440公式(索引439)

    1B7h*1 0000h]

    =>我使用 TI CSL 函数并通过计算值得到了同一寄存器 addr。 对我来说、寄存器映射似乎正确

    谢谢、

    Charles

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

    尊敬的 Charles:

    根据 J784s4_GPIOMUX_INTRTR_CFG_muxcntl Register_Public  寄存器不提供输出:

    GPIOMUX_INTRTR 总共有180个输入中断和64个输出中断。 GPIOMUX_INTRTR_CFG_muxcntl_j 寄存器会使用该寄存器通过中断路由器将输入中断多路复用到输出中断。 j 的值将描述输出中断、因为 j=0至63d、位[8:0]将启用 MUXCNTL 来实现输入中断。

    但是、根据您的寄存器值、我计算出输出为39、您能否仔细检查并确认?

    这是我按下 SW3按钮时的情况、但我在 init 时将其清除、以便下一次发生中断。

    好的、感谢您确认、这是正确的预期行为。

    [引述 userid="545647" url="~/support/processors-group/processors/f/processors-forum/1496341/j784s4xevm-c7x-gpio-interrupt-path-issue/5775127 #5775127"]

    基于 J784s4_evt Register_Public 440公式(索引439)

    1B7h*1 0000h]

    [/报价]

    是的,我现在看到,对不起的混淆,因为我使用1B8h 440。

    说到 C7x 内核1、您指的是 c7x_1?

    对于 CLEC 来说,寄存器值也是正确的,用于生成 c7x 事件编号40。

    I 写到 CLEC_EVT_CFG_ESR_j 以触发来自 CLEC 的中断、CLEC 是
    中的"事件发送寄存器"

    当成功中断内核时、您向该寄存器写入了什么值?

    谢谢、

    Neehar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    j 的值将描述输出中断、因为 j=0至63d、

    我同意 j 的值将决定 GPIOMUX_INTRTR 输出、然后决定 CLEC 输入。  

    我计算出使用的 GPIOMUX 是56

    A0 00E4h = 38h*4h+4h+A0 0000h

    38h = 56d

    基于该寄存器、是 GPIOMUX_INTRTR 145的输入、输出为56

    此输出连接到 CLEC 事件440。

    如果您说 C7x 内核1、则表示 c7x_1?

    视情况而定、它是第一个内核(在 CCS 中称为 C7x_0或 在编译时称为 C7x_1)。

    成功中断内核时、您对此寄存器写入了什么值?

    我使用了"CSL_clecSendEvent"函数、但 寄存器应忽略写入的值。

    谢谢、

    Charles

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

    尊敬的 Charles:

    让我仔细检查一下、然后返回给您。

    谢谢、

    Neehar

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

    嗨、Neehar、

    我在 IPC 驱动程序中找到了解决方案! 该误差来自 CLEC 配置。

    IPC 驱动程序将 C7X_CLEC_OFFSET 用于事件编号。 在 CLEC 事件中、该偏移量为992。

    GPIO 驱动程序未使用此偏移。

    我可以通过将此偏移量添加到事件编号来获取 ISR 回调函数。

    感谢你的帮助。

    Charles

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

    尊敬的 Charles:

    感谢您向我提出此问题、我看到并理解事件偏移的问题不正确。 它与映射到正确 CLEC 事件所需的事件偏移不对应、如下面的输入事件映射中所示:

    我会在 GPIO 驱动程序中向开发团队提出此问题。

    谢谢、

    Neehar