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.

[参考译文] TCI6630K2L:将软件中断从 DSP 发布到 K2L 上的 ARM 的首选方法是什么?

Guru**** 2595770 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/580742/tci6630k2l-what-is-the-preferred-way-to-post-a-sw-interrupt-from-dsp-to-arm-on-k2l

器件型号:TCI6630K2L
Thread 中讨论的其他器件:SYSBIOS

从 Linux 驱动程序端和 SYSBIOS 端配置 ISR 的基本步骤是什么?

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

    在 Linux 端、您应该正确设置 DTS 节点。 如需参考、请参阅 keystone-K2L.dtsi 文件。 查看器件树节点中的中断父级和中断参数、例如请参阅 dsp0节点:
    dsp0:dsp0{
    兼容="ti、K2L-DSP";
    REG =<0x10800000 0x00100000>、
    0x10e00000 0x00008000>、
    0x10f00000 0x00008000>;
    reg-names ="l2sram"、"l1pram"、"l1dram";
    时钟=<&clkgem0>;
    TI、SYSCON-DEV =<&devctrl 0x844>;
    重置=<\pscrst 0>;
    interrupt-parent =<&kirq0>;
    中断=<0 8>;
    中断名称="vring (振铃)"、"exception";
    KICK GPIO =<&dspgpio0 27 0>;
    };

    如果您希望在 DSP 和 ARM 之间进行通信、则需要使用 IPC 模块。

    我还在请 RTOS 团队详细说明 SYSBIOS 方面是否有任何特定设置。

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

    感谢您的快速回复、

    我使用 request_IRQ()调用更改了 Linux 驱动程序中的 DTS 文件和寄存器 IRQ。 我在/proc/interrupts 上看到了我的新 IRQ

    Linux 端配置是否应该这样做?

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

    是的、这表示您已正确配置 IRQ。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、
    DSP 端现在左侧...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您询问如何将中断从 DSP 发送到 ARM、或者如何将 DSP 配置为接受来自 ARM 的中断?

    第二个问题在 e2e 中多次出现、请搜索如何配置中断 C66

    对于第一个问题、有多种方法。 请访问 www.ti.com/.../66ak2l06.pdf
    您可以将 DSP 设置为操作其中一个 GPIO 并将其连接到 ARM (请参阅文档的表7-23)
    也可以使用 IPC 寄存器-查看表7-25的第471至474行。
    还有其他方法。

    它能回答正确的问题吗?

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

    谢谢!

    我向 IPCGR8寄存器写入内容、在 DSP 端将 SRCx 和 IPCG 中的位16设置为1、并在 Linux 上捕获 IRQ 528=512+16。

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

    很高兴看到你让它发挥了作用!

    我也对这些东西感到麻烦。 您能否共享 DTS/DRIVER 文件以供参考?

    谢谢!

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

    我对这一点仍然有点困惑,据我所知,当我在 Linux 中执行/proc/interrupts 命令时。 我获得了类似的信息

    520:0 0 KeyStone-IPC-IRQ 2620844.dsp0
    521:0 0 KeyStone-IPC-IRQ 262088.dsp1
    522:0 0 KeyStone-IPC-IRQ 262084C.dsp2
    523:0 0 KeyStone-IPC-IRQ 262085.dsp3

    Q1:这四行是否意味着4-IRQ 已准备好从 DSP 端捕获 IPC 中断?

    问题2:如果问题1正确、为什么我们需要在 DTS 文件或驱动程序中添加我们自己的代码、那只是用来在用户空间中捕获 INTC 吗?

    Q3:我尝试写入 DSP core0中的 IPCGR8,但在行520中看不到数字增量。 为什么是这样?

    任何建议都被采纳了!

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

    你好、前锋

    DTS 修改为:

          dsp0{
          (笑声)
             中断=<0x8 0x0 0x0 0x0 0x18 0x0>
          (笑声)
          };

          dsp1{
          (笑声)
             中断=<0x9 0x0 0x1 0x0 0x19 0x0>
          (笑声)    
          };

    等等。

    驱动程序代码、用于配置 IRQ:

       if (request_IRQ ( 、您的_irqhandler、0、 ,NULL)){
          printk (Kern_ERR "错误描述\n");
          …
       }

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

    谢谢、Atmeg

    但是、我对一些问题也很好奇-请原谅我、我是器件树中的新手。

    1) 中断=<0x8 0x0 0x0 0x0  0x18 0x0>-- 最后两个元素代表什么? 老实说,中断元素的数量是4或6也令我感到困惑,我只能在中看到#interrupt-cells =<2>

    keyston.dtsi 的分支 ipcirq0。  

    2)您的 IRQ 号为512+16=528 - 512的含义是什么,您在哪里得到了这个数字? 它看起来像是基本 IPC-IRQ 编号。

    3) request_IRQ ( ,使用什么功能可以获得 IRQ 号,或者您是否直接使用528?  总共有28位可以触发 IRQ -如果我想捕获所有这些位、这是否意味着需要28个 REQUEST_IRQ 功能?

    此致。

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

    1)#interrupt-cells =<2>表示每个 IRQ 定义使用2个字段。 即、2个 IRQ 为4个字段、3个 IRQ 为6个字段。 第一个字段定义 IRQ 号。 我不知道第二个是什么意思(有人能解释一下这是什么吗?)

    2) 2)大约512偏移、我通过比较器件树中的 cat /proc/interrupts 和 IRQ 编号来获得此数字。 可能是此编号是在文档中的某个位置定义的、但我找不到。

    3) 3)我使用 platform_get_IRQ (platform_device、2)来获得 IRQ 号。 它返回528、因此对于数字、无需知道或定义该512偏移。 Remoteproc 正在使用0和1个平台 IRQ,我使用2个平台 IRQ。

    在 Remoteproc_user.c 中:

       uproc->IRQ_ctl   = platform_get_IRQ (pdev、0);
       uproc->IRQ_ring   = platform_get_IRQ (pdev、1);
       rproc->trace_IRQ = platform_get_IRQ (pdev、2); <-已添加

    trace_IRQ 是我添加到 rproc 结构中的字段、用于将 IRQ 传递给驱动程序

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

    我也有 IRQ。 感谢您提供的信息,这对您非常有帮助。

    下面是我总结的一些技巧、仅供参考、还有任何其他混淆不清的人。

    我想 K2L.dtsi 文件的中断<8 0 0 24 0>中的第一个元素是 ipcirq 的逻辑中断编号索引,它确认 IRQ-keystone-ipc.c 中的定义。 8表示 IPCGR8寄存器的 BIT12 (4+8)、同样、24表示 BIT28。 第二个元件 I supt 代表 IRQ 类型、此类型的定义可在 include/linux/irq.h 和 Documentation/devicetree/bindings/sinterrupt-controller/interrupts.txt 中找到。

    除了您请求的中断外,我们还可以在内核中输入"cat /proc/interrupts”,其中已经有4个预处理中断由 ti 启用:
    520:0 0 KeyStone-IPC-IRQ 2620844.dsp0
    521:0 KeyStone-IPC-IRQ 262088.dsp1
    522:0 KeyStone-IPC-IRQ 262084C.dsp2
    523:0 0 KeyStone-IPC-IRQ 262085.dsp3

    我们可以通过在四个 DSP 内核中的任何一个中发送1 |(1<<(4+8))来触发其中的任何一个。

    此致!

    撞锁