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
您好!
因此、我无法从 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 共享存储器
共享数据缓冲区的存储器。
您好 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。
您有几个选项:
例如、要禁用 UART3并阻止内核将其置于睡眠模式、您需要在器件树中添加以下内容:
uart3{ status ="已禁用"; ti、无空闲; };
3.更改 DSP cfg 或器件树、以便内核使用每个外设的不同实例、即 ARM 使用 McASP0、DSP 使用 McASP1。
下面链接的 wiki 介绍了如何将 IPC 添加到 AM572x 的现有应用中。 它用于不同的器件、但过程与您在这里执行的操作相同。
如果您有任何问题、请告诉我。
您好、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 执行任何操作。
嗨、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 也是如此。
尊敬的 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。 因此、它们甚至不会从我看到的值中更改为相应的值。
这是 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、因此它们不会被解锁或锁定。
它似乎只是 UART。 我仍然可以通过其 IP 向板进行 SSH。 因此内核本身不会崩溃。
是的、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 现已启动
嗨、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 ...]} 计时器创建失败