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.

[参考译文] Linux/processor-SDK-OMAPL138:从 Linux 加载 TI-RTOS DSP 固件

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/698331/linux-processor-sdk-omapl138-loading-ti-rtos-dsp-firmware-from-linux

器件型号:PROCESSOR-SDK-OMAPL138
主题中讨论的其他器件:OMAP-L138OMAPL138

工具/软件:Linux

您好!

因此、我无法从 Linux 加载编译的 TI-RTOS DSP 固件时遇到问题。

此 DSP 固件是一个经过修改的 TI-RTOS 示例、它是为 OMAP-L138编译的 USB 音频示例。

我已向工程添加了自定义资源表、并尝试使用 MessageQSingle 示例中的一些设置修改.bld 文件和 RTSC 配置文件、但最终会导致 Linux 内核在加载固件后完全锁定、固件实际上并不锁定 以这种方式加载时工作。

固件通过 CCS 调试器直接加载到芯片内部的 C6748中并通过 JTAG 调试器加载时工作。

root@omapl138-lcdk:~/projects# cd /lib/firmware
root@omapl138-lcdk:/lib/firmware ls
ipc rproc-dSP-FW
root@omapl138-lcdk:/lib/firmware unlink rproc-ds-fw
root@omapl138-lcdk:/lib/firmware ln -s IPC/ti_platforms_evmOMAPL138_DSP/omapl138_USB_audio_dsp.out rxr-ds-fw
root@omapl138-lcdk:/lib/firmware -rls-root
根 4096 Jun 4 2018 IPC
lrwxrwxrwx 1 root 根
@26 15:31 rproc-dsp-FW -> ipc/ti_plates_evmomapL138_dsp/omap138_USB_audio_dsp.out root
@omappl138-lcdk:/lib/firmware

/sys/bus/platform/drivers/davinci-rproc cd /sys/bus/platform/drivers/davinci-rproc
@

/sys/bus/platform/drivers/davinci-rproc root@rppl138-lcdk:/sys/bus/platform/drivers/davinci-rproc echo davinci-rbind dsps undertemete.0>unproc remote_remote_remote_remote_dsps:rproc rproc rproc rprobe.dsps rproc 0@
:rproc-remote_remote_remote_remote_remote_remote_dsps rproc 0:rproc rproc rproc rproc 0>remote_remote_remote_remote_remote_remote.dsps:rproc rproc 0dsps:rproc rproc rproc rproc rprobe.dsps rproc rprobe.r
rpmsg 主机处于联机
状态 remoteproc remoteproc0:注册的 virtio0 (类型7)
remoteproc remoteproc0:远程处理器 DSP 现已启动 

这是一组命令、用于复制我在 CCS 中编译的.out 文件、将其链接到系统链接文件、然后使用 remoteproc 执行该文件。

此后、Linux 内核锁定、必须重新启动 LCDK 板。 Linux 内核从 SD 卡运行。

为了使 IPC 源表正常工作、我必须修改 evmOMAPL138的 RTSC 板设置文件。

由于 IPC 使用0xC0000000到0xC1000000、我必须将 DDR 修改为0xC100000。

我附加了配置、构建和项目文件。

我希望只能通过 Remoteproc 加载固件、并支持稍后连接的共享存储器、以便能够利用128KB 的 ARM/DSP 共享存储器

共享数据缓冲区的存储器。

e2e.ti.com/.../build_5F00_configuration.zip

e2e.ti.com/.../omapl138_5F00_usb_5F00_audio_5F00_dsp.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    团队将收到通知。 他们将直接在此处发布反馈。

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

    您好 Dmitriy、

    仅供参考、您可以直接从 config.Bld 更改存储器配置、而不是更改 RTSC 平台。 您只需在项目属性中将:DSP 附加到平台,它就会自动选取 config.Bld 中指定的平台表。

    CONFIG-Bld 的优点是可以直接从应用程序级别更改存储器配置。 您的方法也起作用、我只是想让您知道这个选项。  

    现在、要在 ARM 运行 Linux 时让此示例在 DSP 上运行、您需要确保内核不会尝试使用和初始化相同的外设。 您可以查看器件树源(DTS)文件以查看 ARM 内核正在使用的内容。 对于 OMAP-L138、da850/dtsi 包含 SoC 级定义、而 da850-lcdk.dts 包含板级定义(da850和 omapl138是等效器件)。 这些文件位于 ti-processor-sdk-linux/board-support/linux/arch/arm/boot/dts 下。

    首先、通过查看 DSP 端的 mcasp_cfg.h 和 DTS 文件、我可以看到两个内核都尝试使用 McASP0、EDMA0和 I2C0。  

    您有几个选项:

    1. 让 ARM 执行所有外设配置/初始化、并移除在 DSP 端执行的任何初始化调用。
    2. 让 DSP 执行外设初始化、并在 Linux 器件树中禁用由 DSP 初始化的外设。

    例如、要禁用 UART3并阻止内核将其置于睡眠模式、您需要在器件树中添加以下内容:

    uart3{
    status ="已禁用";
    ti、无空闲;
    }; 

        3.更改 DSP cfg 或器件树、以便内核使用每个外设的不同实例、即 ARM 使用 McASP0、DSP 使用 McASP1。

    下面链接的 wiki 介绍了如何将 IPC 添加到 AM572x 的现有应用中。 它用于不同的器件、但过程与您在这里执行的操作相同。  

    如果您有任何问题、请告诉我。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢 Sahin、我将尝试进行设置、以便从 DSP 初始化所有外设、并在器件树中禁用它们。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请确保在更改设备树源文件后重建设备树二进制文件:

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

    您好、Sahin、我能够从 ARM 编译固件并将其加载到 DSP 中、但它不起作用、我认为因为 McASP 未初始化、因为我在该函数中注释掉了"board_init"函数。

    void configureAudio (void)
    {
    Board_status stat = Board_Sok;
    Board_initCfg arg = Board_init_PINMUX_config | Board_init_UART_stdio;
    //stat = Board_init (arg);
    return;
    } 

    我按照此链接中的说明进行了操作、但由于 board_init 函数的原因、我认为 McASP 和 USB 不会启动。 我已禁用器件树和 Linux 内核菜单配置中的 USB/MCASP/EDMA/I2C。

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

    该示例使用 UART、特别是 UART2、因此您仍需要在 DSP 端对其进行初始化。 引脚多路复用在 Linux 端完成、因此您可以移除该调用。

    因此、修改后的代码应如下所示:

    void configureAudio (void)
    {
    Board_status stat = Board_Sok;
    Board_initCfg arg = Board_init_UART_stdio;
    stat = Board_init (arg);
    return;
    } 

    我认为 Linux 不使用 UART2、但请仔细检查器件树文件以确保。  

    该 wiki 中的示例是将 IPC 添加到应用程序的更简单的实现。 您在这里所做的工作要复杂得多、可能需要几次迭代才能正确完成。

    我将与 Linux IPC 专家交流、看看我们在 Linux 方面是否错过了任何内容(我处理 DSP IPC 方面)。

    同时、请尝试上述修改、并告知我们修改过程如何。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    root@omapl138-lcdk:~/projects# cp
    @omapl138_USB_audio_dsp.out /lib/firmware/rproc-dsp-fw root~ omapl138-lcdk: /projects# ls /lib/firmware
    ipc rproc-dsp-FW
    root@omapl138-lcdk:~/projects# ls -l /lib/firmware
    drwxr-xr-x 3 root 根 4096 Jun 12 2018 IPC
    -rw-r--r-- 1 root 根 5776812 3月26日14:59 rproc-dsp-FW
    root@omapl138-lcdk:~μ C/projects# cd /sys/bus/platform/drivers/davinci-rproc
    
    
    
    @
    
    /sys/bus/platform/drivers/davinci-rproc root@omapl138-lcdk:/sys/bus/platform/drivers/davinci-rproc echo davinci-rproc.0 > unbind remoteproc rpproc0:releasing dsp root@mcma pl138-lcdk:/sys/bus/platform/drivers/davinci-rproc davinci remotiptek-rproc.0:rproc remotipte.0:rproc remotipotipte.0:rproc dsp_remotipotipotipte.0:rproc dsps dsps rproc remotipotipte.0s dsps rproc rproc dsps rproc rproc dsps rproc rproc remote.0:rproc remotipte.0s@
    
    rpmsg host is online
    remoteproc remoteproc0:registered virtio0 (type 7)
    ▒m}▒-▒▒}"-m}▒-▒▒▒▒▒▒▒ mߑ-▒▒▒-▒}▒B▒э▒▒▒/▒▒▒/ I
    

    当我使用 Board_init 时、它仍然会导致内核崩溃。

    我已经附加了我的器件树文件、但其中任何一个都未使用 UART。

    e2e.ti.com/.../da850_2D00_lcdk.dts.txt

    因此、该示例仅在我不执行 Board_init 时才能够加载。 USB 也无法正常工作、但我不确定 Board_init 是否对 USB 执行任何操作。

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

    Sahin 让我看看 Linux 方面。 我看到了您的原始帖子、怀疑您可能遇到了已知问题之一。 让我们先退一步。 加载 DSP 映像后 Linux 是否立即挂起并开始执行? 您能否检查 DSP 端的 DSP 代码或进行调试以查看 DSP 是否正在访问 MMR_LOCK_2寄存器? 如果 DSP 代码尝试通过触摸 MMR_LOCK_2寄存器来锁定/解锁、它将锁定系统。 您使用什么处理器 SDK? 正确的方法应该是保存 MMR_LOCK_2值、将其锁定并恢复该值。 此问题应该已经在 RTOS PSDK 4.2中修复、但我已经看到在某些情况下、在我们需要跟踪的后续版本中会弹出。 论坛 中出现了一个混乱、e2e.ti.com/.../696464。 您能否检查这是否适用于您?

    在资源表配置路径下行之前、先排除此问题。

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

    嗨、Rex、

    查看相关帖子和代码后、我找不到它使用 CSL_xbarDmaConfigure 或对 MMR_LOCK_2寄存器执行任何操作的任何位置。 如果我注释 BoardInit 函数、固件本身似乎不会锁定系统、但是如果我不注释它、则它会锁定处理器。 通过 JTAG 调试器执行该函数时、我仍然找不到它对 MMR_LOCK_2寄存器执行任何操作。

    有一个

    静态内联 void CSL_SysCfgUnlockKicker (void)
    {
    hSysCfg->KICK0R = 0x83E70B13;
    hSysCfg->KICK1R = 0x95A4F1E0;
    hSysCfg->CFGCHIP3 |= 0x4;
    
    返回;
    } 

    执行的代码  

    IF (cfg 和 Board_init_unlock_MMR)
    RET = Board_unlockMMR ();
    if (ret!= Board_SOK)
    回程; 

    我不确定是否切换 MMR_LOCK_2、因为我在其他任何地方都找不到任何对它的引用。

    我正在使用 Processor SDK 04.03.00.05、RTOS 也是如此。

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

    您的根部似乎导致了该问题。 如果我理解正确、OMAP-L138中的保护机制是通过 kicker 寄存器和其他平台、例如 AM57x 和 Keystone、通过 MMR_LOCK_2。 目前、我建议变通办法不要调用 unlockMMR ()或通过引用 pdk/.../csl/soc/am572x/src/csl_device_common.c.中的 CSL_unlockMMrLock2 ()函数来编写您自己的 unlockMMR (或 Board_init)函数 底线是在保护机制已解锁时不解锁。 顺便说一下、您能否在 KICK0R 和/或 KICK1R 被设定前检查它们是否被解锁?

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

    尊敬的 Rex:

    注释掉 Board_unlockMMR (),它调用 CSL_SysCfgUnlockKicker()来解锁 KICK0R,KICK1R 不会阻止代码进入

    静态内联 void CSL_SysCfgUnlockKicker (void)
    {
    //hSysCfg->KICK0R = 0x83E70B13;
    //hSysCfg->KICK1R = 0x95A4F1E0;
    //hSysCfg->CFGCHIP3 |= 0x4;
    
    返回;
    } 

    当我使用 JTAG 解缓冲器时,即使调用 CSL_SysCfgUnlockKicker()的定向函数被注释掉,代码仍会进入这里。

    还有一个  

    静态内联 void CSL_SysCfgLockKicker (void)
    {
    hSysCfg->KICK0R = 0x1;
    hSysCfg->KICK1R = 0x1;
    
    返回;
    }
    

    但似乎不会从代码的任何位置调用它。

    我在0x01C14038和0x01C1403C 上检查了 KICK0R 和 KICK1R 寄存器、但它们始终保持为0。 因此、它们甚至不会从我看到的值中更改为相应的值。

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

    您能否进入 Board_init()并查看哪个指令是攻击性指令?

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

    这是 lcdkOMAPL138.c 文件中的 Board_Init

    Board_status Board_init (Board_initCfg cfg)
    {
    Board_status ret = Board_Sok;
    
    IF (cfg 和 Board_init_unlock_MMR)
    RET = Board_unlockMMR ();
    if (ret!= Board_Sok)
    回程;
    
    IF (cfg 和 Board_init_module_clock)
    RET = Board_moduleClockInit();
    if (ret!= Board_Sok)
    回程;
    
    IF (cfg 和 Board_init_PLL)
    RET = Board_PLLInit ();
    if (ret!= Board_Sok)
    回程;
    
    IF (cfg 和 Board_init_DDR)
    RET = Board_DDR3Init();
    if (ret!= Board_Sok)
    回程;
    
    if (cfg 和 Board_init_watchdog_disable)
    返回 Board_UNSUPPORTED_FEATURE;
    
    IF (cfg & Board_init_PINMUX_CONFIG)
    RET = Board_pinmuxConfig ();
    if (ret!= Board_Sok)
    回程;
    
    IF (cfg & Board_init_EMIF_PINMUX)
    RET = Board_configEmifPinMux ();
    if (ret!= Board_Sok)
    回程;
    
    if (cfg 和 Board_init_uart_stdio)
    RET = Board_uartStdioInit();
    if (ret!= Board_Sok)
    回程;
    
    返回 ret;
    } 

    当使用 Board_Init 调用此函数时、cfg 输入等于 Board_init_uart_stdio。

    但出于某种原因、调试器仍然跳转到

    静态内联 void CSL_SysCfgUnlockKicker (void)
    {
    hSysCfg->KICK0R = 0x83E70B13;
    hSysCfg->KICK1R = 0x95A4F1E0;
    hSysCfg->CFGCHIP3 |= 0x4;
    
    返回;
    }
    

    它仅可通过调用  

    Board_status Board_unlockMMR (void)
    {
    CSL_SysCfgUnlockKicker();
    
    返回 Board_SOK;
    }
    

    Board_unlockMMR 只能从 Board_init 调用、但实际上从未调用过。  

    aka Board_init 实际上不会调用 Board_unlockMMR、但代码仍会跳转到 CSL_SysCfgUnlockKicker。

    但是、在这之后、KICK0R 和 KICK1R 寄存器仍然不变、存储器值保持为0、因此它们不会被解锁或锁定。

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

    您需要等待 Sahin 度假回来。 他将能够在 DSP 方面为您提供帮助。

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

    当问题发生且 Linux 内核锁定时、您是否仍可以将 EVM 或 ssh ping 到电路板中? 只是想知道它是内核锁定还是仅 UART 发生故障。

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

    它似乎只是 UART。 我仍然可以通过其 IP 向板进行 SSH。 因此内核本身不会崩溃。

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

    您提到了从 PDK USB 音频示例修改 DSP 映像。 使用未修改的 USB 音频示例时是否会出现此问题? 是否还可以在发生问题后从 ssh 会话中向我发送 dmesg?

    我怀疑它会解决我们观察到的另一个问题、即在运行 McASP 回送示例时、UART 会被锁定。 使用 dmesg 信息、我尝试查看症状是否相同。

    谢谢!

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

    是的、DSP 映像是 PDK 编译 USB 音频示例、它使用给我的指令进行了修改、以尝试将其转换为 IPC 示例。

    独立示例 PDK 示例正常工作、但 USB 遭到了噼啪声(不确定原因)。 此示例还有其他问题、但我有一个打开的线程。

    这是使用 USB 串行连接加载固件后打开的新 ssh 的 dmesg。 UART USB 连接在加载后崩溃、这可能会导致实际固件崩溃、因为从 dmesg 可以看出、它确实加载了、但它不执行任何操作。 内核会保持活动状态、因为我向它执行 ssh。

    [199.172842] remoteproc remoteproc0:发布 dsp [201.976401]
    davia-rproc davia-rproc.0:分配的保留存储器节点 dsp_proc@c3000000
    [202.003207] remoteproc rpte0:DSP 可用
    [202.168358]
    
    remotio remotipteproc 0:启动 dsp 2.578_bw dsp rpmsg 主机处于联机
    状态[202.264942] remoteproc remoteproc0:注册的 virtio0 (类型7)
    [202.318808] remoteproc remoteproc0:远程处理器 DSP 现已启动
    

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

    很抱歉、回答很慢。 上周我外出了2天。
    dmesg 来自您修改后的 USB 音频示例、对吧? 我想知道它是否显示了一些崩溃或错误等 您是否还可以从 ssh 会话中执行 cat /sys/kernel/debug/remoteproc/remoteproc2/trace0? 请首先使用 Cat /sys/kernel/debug/remoteproc/remoteproc2/name、以确保它是 DSP1、40800000.DSP。

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

    嗨、Rex、

    dmesg 来自尝试启动修改后的 PDK USB 音频示例的 OMAPL-138 LCDK。

    remoteproc0名称产生以下结果:

    root@omapl138-lcdk:~# cat /sys/kernel/debug/remoteproc/remoteproc0/name
    dsp
    

    remoteproc0 trace0产生以下结果:

    3 0xc3100000 [t=0x002e4459]
    {MODULE#82}上的资源条目:{evt:5、args=[0x0、0x230 ...]}
    计时器创建失败 

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

    很抱歉、我上周外出了。 跟踪看起来好像 DSP 应用未运行(或崩溃)。 它显示" Timer create failed (计时器创建失败)"。 在 DSP 中与 ARM Linux 之间可能存在计时器使用冲突。

    雷克斯
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将查看从 TI-RTOS 启动的深入驱动程序、并查看是否还有其他冲突。