Multi Source Translation Content

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

Multi Source Translation Content

讨论

排序依据:
如何断开调试器? 问题 我需要断开调试器,让应用程序继续运行。 只要拔出 J-Link 的 USB 电缆通常会使我的板崩溃。 有一个 断开按钮,但它是灰色的。 如何才能(优雅地)断开调试器(并让应用程序正常运行)?希望那样我能让 J-Link 掉电? 背景: 在 imxRT1024 上运行的大型 FreeRTOS 应用程序。 调试器工作绝对正常 Windows 10 上的 MCUXpresso IDE v24.9 [版本 25] [2024-09-26] segger J-Link 软件版本 V9.22(刚更新到最新版本) i.MX RT102x Re: How can I disconnect debugger? 你好@davenadler、 感谢您对 NXP MIMXRT 系列的关注! 您的应用程序使用 semihost 吗?还是软件重新配置了任何与 SWD 相关的引脚?也有可能是你的硬件在断开与调试器的连接后出现了供电问题。请帮忙检查一下。或者,也可以尝试使用串行下载模式,直接将映像下载到闪存中,然后检查运行是否正常。 因为如果你的调试器正确地将二进制文件编程到闪存中,那么断开与调试器的连接就不太可能导致崩溃。 致以最诚挚的问候, Gavin
查看全文
S32K144 引导加载程序和 CAN over UDS 应用程序闪存工具指南 你好@JonAnder_Amante   我看到了您关于使用 S32K 统一引导加载器的讨论,并注意到您已经实现了引导加载器和应用程序闪存。我正在研究 S32K144 EVB,需要您的实际指导。 能否请您分享一下 您使用的具体工具和设置尤其是 硬件工具 调试探头(PE Micro、Segger J-Link、OpenSDA 等) CAN 接口硬件(PEAK、Vector、USB-CAN 等) 任何特殊布线或终端要求 软件工具 集成开发环境(S32 Design Studio 版本) CAN 刷机工具(ECU-总线 Pro、Open总线、CANoe 等) 使用的 JSON / flash 驱动程序配置文件 通过 UDS 闪存应用程序的脚本或实用程序 测试程序 如何验证启动加载程序和应用程序切换 您如何通过 CAN 测试 UDS 闪烁 您的实践经验对我顺利完成项目大有帮助。
查看全文
Kinara ARA-SDK 许可 恩智浦团队(以及所有熟悉 Ara-2 / Kinara 工具的人员)你们好、 我想了解为 Ara-2 (Kinara) 计算模块编译模型的正确许可/访问路径,尤其是现在 Kinara 已被恩智浦收购,而且恩智浦的公开资料描述了 SDK 与恩智浦软件生态系统的集成。 我的设置/目标 硬件Geniatech Ara-2 计算模块 SDK:Geniatech 提供的 Kinara Ara-2 SDK r1.3 使用情况:个人、非商业(研究/学习/测试) 模型目标:Qwen/Qwen2.5-7B-Instruct (GPTQ Int4) 目前有效的方法 我可以完成模式 1 流程,将模型转换为 ONNX。 我的结局是 model.onnx(小图形文件) 同一目录下的 model.onnx.data(大型外部张量数据/权重)。 什么失败了 模式 2(生成可部署 .dvm 的编译阶段)因 SDK 版本工具中的许可证签出/验证错误而失败。 据我所知,这将阻止生成 .dvm即使 ONNX 导出成功。 我的困惑 我没有 Kinara 许可证密钥。 Geniatech 的文档指出,必须通过 Kinara 获取 SDK 许可证密钥。 Kinara客户支持门户网站似乎拒绝使用常见的个人电子邮件功能域(例如gmail.com)进行注册,所以我无法在那里提交申请。 我为什么要在这里提问(恩智浦/Kinara 集成混淆) ,恩智浦的公开资料显示,Kinara 的 SDK 和模型工具正在集成到恩智浦的生态系统(包括 eIQ)中,Ara-2 现在作为恩智浦的产品提供,并提供相关的 "Ara 软件开发包 "下载。 然而,在实践中,这一点并不明确: 开发人员应在其中获取用于编译的许可证密钥,以及 现在是否支持 "Ara SDK / eIQ 集成 "路径。 问题 编译 ONNX → .dvm 是否需要许可证密钥使用 Ara-2 SDK 工具链(r1.3 / ARA-SDK),甚至用于个人/非商业用途? 如果是,个人/业余爱好者用户获得评估/开发者访问权限(尤其是在没有公司电子邮件域的情况下)的官方流程是什么? 有了现有的恩智浦账户,Ara-2 用户应该从哪里获取: “官方” Ara SDK 二进制文件/工具链(编译器),和/或 编译所需的许可机制? 如果编译需要许可证密钥,而许可证密钥又不容易获得,那么是否有任何预编译的 .dvm模型软件包(例如,用于 Qwen 7B/Qwen2.5恩智浦/Kinara/合作伙伴提供给 Ara-2 用户运行的 7B)? 如果恩智浦/Kinara 的相关人员能说明计划的路径(恩智浦门户网站与传统 Kinara 门户网站的对比,以及现在如何处理许可问题),那将大有帮助。 Re: Kinara ARA-SDK Licensing 我也有同样的问题!我拿到了设备,驱动程序。但没有 SDK,我猜也没有许可证(如果需要的话)。该设备只是静默地坐在我的联想 ThinkCentre Ultra neo 电脑里什么也没做。联想从未将其整合到 Windows 11 作为 NPU。我想至少用它来运行一些模型或进行学习。现在,它已经成为我电脑中一块完全闲置的硅片。我想,如果有更多的人开始使用这项技术,将有助于技术的普及。 Re: Kinara ARA-SDK Licensing @kratafila在我通过 Geniatech 获得 Linux SDK 软件包之前,我的硅片基本上也是闲置的。老实说,它仍然是未使用的硅,因为我无法让模型编译和运行。 值得一提的是,Geniatech(我的 Kinara Ara-2 M.2 模块的供应商)与我分享了这些 SDK/runtime 下载。它们以 Linux 为重点,我不确定它们是否适用于你的 ThinkCentre 中的 Ara-2 硬件(或者在 Windows 11 上提供帮助,里面有 Windows 二进制文件,但我在 Linux 软件方面取得了更大的成功),但是如果你能在 Linux 下测试/确认你的设备能正常运行,它们可能仍然有用: 1) 驱动程序/运行时间 + .dvm 示例型号(Geniatech"客户就绪" 捆绑): hxxps://mega[.]nz/file/nJcF0K5a#W-Ote-fp59hXoq4T0GGsaQmwGTRphWz0JATowyWjQpg 2) " 模型编译 " 文件夹 Geniatech 最初寄给我(注意:仅此一项就不包括编译器二进制文件): hxxps://mega[.]nz/file/KoclFQrJ#ifNOX7w2Y1qgLM6rnm7xPnUprwZZqhuRvelFG5p0MJQ 3) Geniatech 随后提供的完整 Ara-2 SDK 压缩包(此压缩包应包含实际的工具链/编译器,例如dvrun): hxxps: //文件 [.] geniatech [.] com/down-eng/bsp/kinara_sdk_20251120 [.] tar [.] bz2 如果你尝试了上述任何一种方法并取得了进展(即使只是安装了SDK并看到设备被识别),请在这里发回去,这不仅是为了我们,也是因为多个社区似乎对于 " 官方 " 的工作路径、SDK/许可的实际来源以及如何编译和运行其他模型存在更广泛的困惑。
查看全文
S32DS v3.5 - 在创建项目时不可见 SDK& OpenSDA 调试问题 (S32K144) MCU:S32K144 板:S32K144 EVB(板载 OpenSDA) 集成开发环境:S32 Design Studio v3.5 SDK:S32K1xx SDK v4.0.1 操作系统:Windows 11 问题 1:创建项目时看不到 SDK 已成功安装 S32K1xx SDK v4.x,可在下面看到:   首选项→ S32 Design Studio → SDK 管理   但是,在创建新的 S32DS 应用程序项目时,"选择要附加的 SDK "列表是空的,没有 SDK 出现。 发生在S32DS v3.5中 SDK 在首选项中可见,但在创建项目时无法选择 问: S32DS v3.5和S32K1xx SDK v4.x 之间是否存在已知的兼容性问题? 建议 v3.5 使用哪个 SDK 版本? 问题 2:使用板上 OpenSDA (peMicro) 调试失败 在板载 O penSDA 上使用 GDB peMicro 接口调试时,我经常会遇到以下错误: "启动 GDB 服务器任务遇到问题" "执行 MI 命令失败:-exec-run" "不知道怎么跑。试试'帮助目标'" 说明: 板被检测为 OpenSDA USB 设备 即使是基本的hello_world也会出现问题 重新刷新 OpenSDA 固件后有时能正常工作 在S32DS v3.5中发生得更频繁 问题: v3.5 中 是否完全支持板载 OpenSDA,还是推荐使用外部调试器? 申请它 请告知: 针对 S32K144 推荐的S32DS + SDK版本组合 SDK 附件和 OpenSDA 调试的已知问题或变通方法 谢谢! Re: S32DS v3.5 – SDK not visible during project creation & OpenSDA debug issues (S32K144) 你好@mahesh7、 一般来说,SDK 不再得到支持和维护。 最后一个版本 - S32 SDK for S32K1xx RTM 4.0.2 - 用于 S32DS 3.4。 请使用 S32K1 的实时驱动程序而不是 SDK: S32K1_S32M24X 实时驱动程序 AUTOSAR 4.4 & R21-11 版本 2.0.0 适用于 S32DS 3.5 S32K1_S32M24X 实时驱动程序 AUTOSAR R21-11 版本 3.0.0 适用于 S32DS 3.6 可以从页面访问实时驱动程序 (RTD) https://www.nxp.com/products/S32K1软件部分。 顺祝商祺! 帕维尔 Re: S32DS v3.5 – SDK not visible during project creation & OpenSDA debug issues (S32K144) 你好@PavelL、 感谢您对 SDK 的弃用以及对 S32K1 使用实时驱动程序 (RTD) 的建议的澄清。 根据建议,我已将S32 Design Studio 3.5移至RTD。不过,我目前在RTD 的安装和使用方面也遇到了问题,尤其是在创建项目和调试时。 我面临的问题是 RTD 软件包似乎已安装,但是在创建新应用程序项目期间,RTD 并非总是可以选择或正确识别的 即使创建了项目,我在调试过程中也会遇到问题,例如调试器无法启动,或者目标程序无法在 main() 处停止。 如果您能提供或指点我一个分步骤的程序,包括S32DS 3.5 和 RTD 的完整工作流程,将对我非常有帮助: S32DS 3.5 和热电阻的正确安装顺序 如何验证S32DS 内部的RTD 安装情况 创建基于 RTD 的新项目的正确步骤 所需项目设置(编译器、SDK/RTD 路径等) 推荐的调试探针和调试配置 在 S32DS 3.5 中使用热电阻进行调试时的任何已知限制或常见陷阱 这些详细的指导将大大有助于建立稳定的开发和调试环境。 感谢您的支持。 致以最诚挚的问候, @mahesh7 Re: S32DS v3.5 – SDK not visible during project creation & OpenSDA debug issues (S32K144) 你好@mahesh7、 请查看以下相关链接: 安装 -https://community.nxp.com/t5/S32-Design-Studio-Knowledge-Base/HOWTO-offline-install-S32K1-RTD-2-0-0-in-S32DS-v3-5/ta-p/1927845 创建新项目 -https://community.nxp.com/t5/S32-Design-Studio/Install-SDK-RTD-into-S32-Design-Studio/m-p/1779464 上述主题的解决方案中有几个相关链接。 具体到 S32K1,要查看可用的 SDK/RTD,可能需要选择工具链的上一版本。 推荐的调试探针取决于您的要求,例如: 多链路调试探器:适用于许多 ARM 和 8-/16/32 位设备的调试探器 世纪佳缘 J-Link 调试探头 劳特巴赫 TRACE32 调试和跟踪解决方案 顺祝商祺! 帕维尔 Re: S32DS v3.5 – SDK not visible during project creation & OpenSDA debug issues (S32K144) 你好@PavelL、 谢谢你的参考。我使用 S32K1 SDK RTM 4.0.3 安装了 S32DS v3.4,并开始使用建议的设置创建项目。在运行 SDK 示例项目(FTM、ADC、UART、GPIO)时,我仍然会遇到版本和集成问题,希望获得有关同时使用 ConfigTools、生成的代码和 SDK 驱动程序的推荐工作流程的指导。您能否还阐明可靠地导入和构建 SDK 示例的正确方法?此外,查看运行日志的推荐工具是什么?S32DS 是否提供串行终端,还是应该通过 OpenSDA 虚拟 COM 端口使用 PuTTY?如果能就所需的驱动程序和调试工具提出建议,将非常有帮助。 Re: S32DS v3.5 – SDK not visible during project creation & OpenSDA debug issues (S32K144) 你好@mahesh7、 示例流程可能是这样的 根据示例创建项目 打开配置工具 修复所有错误(如果有 检查外围设备的引脚、时钟和设置(如果所有设置都符合板要求) 更新源代码 返回代码 - S32DS C/C++ 构建 闪存 调试时可使用 printf() -已解决:如何在 S32DS.3.5 中使用 printf 函数?- 恩智浦社区 你可以使用 S32设计工作室知识库——恩智浦社区作为参考点。 顺祝商祺! 帕维尔
查看全文
如何安装"S32ZE_R52_NXP_RTOS_4_7_181_RTM_1_1_0_D2412_DesignStudio_updatesite.zip" 您好, 我从 GreenVIP 安装了"S32ZE_R52_NXP_RTOS_4_7_181_RTM_1_1_0_D2412_DesignStudio_updatesite" ,但在下面的截图中找不到它。 如果我再次安装,就会出现错误提示。 请帮帮我。 谢谢! Re: How to install "S32ZE_R52_NXP_RTOS_4_7_181_RTM_1_1_0_D2412_DesignStudio_updatesite.zip" 你好,Lvyang508 感谢您的回复。 您是否安装了 SW32ZE_RTD_R21-11_2.0.1_D2505_? 在 S32DS IDE 中使用 DesignStudio_updatesite.zip? BR 乔伊 Re: How to install "S32ZE_R52_NXP_RTOS_4_7_181_RTM_1_1_0_D2412_DesignStudio_updatesite.zip" S32DS IDE:S32DS for Platform 3.6.5 我下载了相应的软件包并根据 UG_S32ZE_GreenVIP.pdf 进行了安装 Re: How to install "S32ZE_R52_NXP_RTOS_4_7_181_RTM_1_1_0_D2412_DesignStudio_updatesite.zip" 你好,Lvyang508 请检查您的 RTD 版本,RTD 和 RTOS 软件包之间似乎存在冲突。 另外,您使用的是什么版本的 S32DS 集成开发环境? BR 乔伊 Re: How to install "S32ZE_R52_NXP_RTOS_4_7_181_RTM_1_1_0_D2412_DesignStudio_updatesite.zip&&&& 嗨,乔伊、 我已经安装了 SW32ZE_RTD_R21-11_2.0.1_D2505_。 S32DS 集成开发环境中的 DesignStudio_updatesite.zip 文件。 谢谢您! Re: How to install "S32ZE_R52_NXP_RTOS_4_7_181_RTM_1_1_0_D2412_DesignStudio_updatesite.zip&&&& 你好,Lvyang508 感谢您的回复。 这个问题可能是由版本冲突引起的。请尝试使用 S32DS IDE 3.6.1 参考 UG_S32ZE_GreenVIP.pdf。 BR 乔伊 Re: How to install "S32ZE_R52_NXP_RTOS_4_7_181_RTM_1_1_0_D2412_DesignStudio_updatesite.zip&&&& 嗨,乔伊、    感谢您的回复。 我已经安装了 S32IDE 3.6.1、但问题依然存在。 BR、
查看全文
S32N55: ストリームゲートを無効にするRTD API こんにちは、チームの皆さん S32N55 リファレンス マニュアルによると、1588 タイマーの TMROFF_H/L を変更する前に、ストリーム ゲート インスタンスを無効にする必要があります。 現在、RTD のストリーム ゲート機能を無効にする API があるかどうか教えてください。 BR、 ブリジット RTD Re: S32N55: RTD API to disable the Stream Gate こんにちは、 ユーザーマニュアルを再度確認して確認します Re: S32N55: RTD API to disable the Stream Gate こんにちは@Bridget S32N_RTD_R21-11_1.8.0_CD07 のユーザー マニュアルによると、ストリーム ゲートを有効/無効にするには、構成ツール (EB Tresos) で設定します。 EthCtrlConfigEnableStreamGating = FALSE 設定 Re: S32N55: RTD API to disable the Stream Gate こんにちは、クオンさん。 gPTP 同期中など、場合によっては、実行時に TMROFF_H/L の値を更新する必要がある場合があります。S32N55 リファレンス マニュアルによると、1588 タイマーの TMROFF_H/L を変更する前に、Stream Gate インスタンスを無効にする必要があります。 このような状況では、Stream Gate 機能を無効/有効にする API が必要であると考えます。あなたが言及した EB の構成では、このシナリオを処理できないようです。 現在、RTD にストリーム ゲート機能を無効/有効にする API があるかどうか教えてください。 BR、 ブリジット
查看全文
i.MX8Mimi LPDDR4 ZQ0 および ZQ1 ZQ キャリブレーション リファレンス デザイン こんにちは、 ファイル SPF31399 では、R6 は DNP です。別のファイル SPF47712 も同じで、MT53D512M32D2DS はデュアルダイです。SO、R6 に 240 オームの抵抗器を配置する必要がありますか? どのビジョンが最新ですか? MT53D512M32D2DS は EOL になります。これを MT53E1G32D2FW に交換したいのですが、ハードウェアのどの部分を変更する必要があるか教えていただけますか?それとも、PCB を変更する必要がなく、完全に互換性があるのでしょうか? ありがとう! HW-オープンソース#i.MX8 mini HW-Open-Source Re: i.MX8Mimi LPDDR4 ZQ0 and ZQ1 ZQ calibration reference design こんにちは@Zack8 R6を接続する必要はありません。ZQ キャリブレーション抵抗は 1 つで十分です。 BR
查看全文
PN7642 モジュール FCC ID PN7642 をベースにした NFC モジュールを設計しましたが、モジュールとして登録するために FCC 要件を満たすためのアプリケーション ノートはありますか? Re: PN7642 Module FCC ID ありがとう、Eduardo。ガイドラインに従い、ユニットはテストに合格しました。FCC には、私が出発点として使用したパゴダ リファレンス・デザインで使用される必須スクリーン 缶などの特別な要件があります。それ以外は主に事務作業です! Re: PN7642 Module FCC ID こんにちは@gredpath あなたの調子が良いといいのですが。 申し訳ありませんが、FCC 準拠に関する具体的なドキュメントはありません。NFC アンテナの設計とチューニング、DPC 機能、レイアウトの推奨事項について説明しているPN76 ファミリ アンテナ設計ガイドに記載されているガイドラインに従っていることを確認することをお勧めします。また、 PN7642 の設計推奨事項も確認してください。 さらに、アンテナ、デバッグ、テストと認定、EMC 関連の設計の主要な側面について説明しているNFC アンテナ設計トレーニング シリーズに従うこともお勧めします。 よろしくお願いいたします エドゥアルド。
查看全文
介绍 eRPC 本教程介绍eRPC(嵌入式远程过程调用)开源项目。 eRPC(嵌入式远程过程调用)是由恩智浦创建的远程过程调用(RPC)系统。RPC是一种机制,用于通过简易本地函数调用远程系统上的调用软件例程。远程系统可以是通过通信信道连接的任何CPU:例如,网络中的服务器、多核系统中的另一个CPU内核,等等。对客户端而言,这就像在应用中调用某个库中的函数一样。唯一的区别在于通信信道引入的任何延迟或不可靠性。 重要链接: 所有与 eRPC 开发相关的内容都位于:GitHub - eRPC base eRPC开发数据位于GitHub - eRPC development。 eRPC 发布版本位于:GitHub - eRPC Releases eRPC文档位于Github - eRPC wiki eRPC已作为Python软件包发布至pypi eRPC支持多核和多处理器类型的应用。 在哪里可以找到 eRPC 示例 在 NXP MCUXpressoSDK 软件包中可以找到大量 eRPC 多核和多处理器示例。访问 https://mcuxpresso.nxp.com 可配置、构建并下载这些软件包。 要获取支持多核(包含 eRPC)的开发板列表,请基于 “中间件 (Middleware)” 进行筛选,并搜索 “multicore” 关键词。下载包含多核中间件的选定软件包后,可参考以下路径: /boards/ /multicore_examples :eRPC 多核示例(使用 RPMsg_Lite 或消息单元传输)或者 /boards/ /multiprocessor_examples :eRPC 多处理器示例(使用 UART 或 SPI 传输)。 eRPC 示例均以 “erpc_” 为名称前缀。 获取 NXP MCUXpressoSDK 的 eRPC 多核和多处理器示例的另一种方法是使用 mcux-sdk 的 GitHub 代码库。请按照 README 概述部分中关于如何使用 West 工具克隆和更新 mcuxsdk 代码库的说明操作。完成后,armgcc 版本的 eRPC 示例可以在以下文件夹中找到: mcuxsdk/examples/ /multicore_examples or in mcuxsdk/examples/ /multiprocessor_examples folders. 例如,你可以使用 evkmimxrt1170 作为 board_name。与 MCUXpressoSDK 软件包类似,这些 eRPC 示例都使用 “erpc_” 作为名称前缀。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Kunal,您好!您的问题似乎已在此得到解答:需要帮助——在iMx6sx中实现eRPC的分步过程?· 问题#5 · EmbeddedRPC/erpc-imx-demos · GitHub Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> HI [email protected]‌, 我不知道 eRPC 在 MPC5748G 上的官方使用方式。只是提醒一下:eRPC 取决于编程语言、操作系统和传输层。它没有特定于电路板的文件。所以,如果使用的是 FreeRTOS 和 C 语言,那几乎就成功了,你只需要移植你想用的传输层(如果还没有移植的话)。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan,       eRPC是否已移植到恩智浦MPC5748G?有没有可供参考的示例代码? 顺祝商祺! Alex Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi [email protected], 我在这方面没有太多经验。最近,当从多个任务中调用多个 eRPC 调用时,我们不得不添加一些互斥锁。不过我喜欢你的想法。 我快速浏览了一下源代码。你需要说明你的用例。但我认为是 i.MX Linux 与使用 RPMsg 的 M 核之间的通信。在这种情况下,我认为你可以像我们那样添加互斥锁(这将使 eRPC 调用序列化。你需要在 performRequest 函数的某个地方添加它们)。为每个线程创建端点在我看来是个好主意,但我发现有更多问题需要解决。一个更简单的解决方案可能是:传输初始化函数将初始化更多端点(基于任务数量),客户端的 eRPC rpmsg 发送 / 接收函数改为使用未使用的端点进行发送,并使用相同的端点接收消息,服务器上的 eRPC rpmsg 接收函数需要等待所有端点上的消息。 我不知道这对你来说是简单的任务还是更复杂的任务。但恐怕如果不修改代码,你将无法进行多线程调用。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan, 我目前在Cubic与Chandini共事。我只是想了解一下从多个线程调用eRPC的额外信息。当前我们采用单一端点进行即止型调用,每次调用完成后才发起下一次调用。现在我们希望通过多个线程发起多次调用,因此想了解实现该功能的最佳方案。 其实由于我对这方面了解不足,我们尝试过并发进行其他调用,不过直到出现问题,我们才意识到正在这么做。 我们已观测到eRPC返回的通信故障错误代码。 是否可以使用单一端点来实现这一点,也就是说客户端这边是否应该是线程安全的? 如果不建议执行此操作,是否应该为每个线程配置独立的端点, 或者我们应该做别的事情吗? 此致 李 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi [email protected]‌, 感谢您告知我们。真有趣,我今天因为另一项目刚刚研读过相关方案:smileygrin: Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan, 感谢您的快速回复。 通过在客户端和服务器端的套接字连接中禁用Nagle算法,并使用以下API调用,我可以在TCP中实现更好的性能(响应时间以微秒为单位)。 int result = setsockopt(sock, /* 受影响的套接字 */                         IPPROTO_TCP,     /* 在TCP级别设置选项 */ TCP_NODELAY, /* 选项名称 */ (char *) &flag, /* 类型转换是历史遗留问题 */ sizeof(int)); /* 选项值的长度 */ 参考资料:TCP_NODELAY:2018 年 TCP 优化最佳实践 | ExtraHop 谢谢! 萨西达兰。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi [email protected]‌, 或许您可以询问GitHub的相关用户(在同一主题下,或创建新主题)。至少有两名用户正在执行与TCP相关的任务: github: GitHub - EmbeddedRPC/erpc: Embedded RPC 线程1:使用具备TCP传输功能的多连接处理服务器 · 问题#32 · EmbeddedRPC/erpc · GitHub 讨论帖 2:TCP Example client /server code・Issue #39・EmbeddedRPC/erpc・GitHub 就个人而言我建议这个方案,但不确定是否适用于您的情况:linux - Ubuntu上的低延迟TCP设置 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan, 我想要将eRPC移植到TCP套接字上。 我在虚拟串口(Linux 系统内)上运行了你的示例测试代码 (test_arrays),串口的响应时间不到 1 毫秒。 当我通过TCP运行同一示例代码时,TCP的响应时间约为90毫秒。 有没有办法像优化串口那样,降低 TCP 的延迟并提升其性能呢? 谢谢! 萨西达兰。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi, Dusan. 这很有帮助。顺便说一下,示例的头文件中提到了这一点。 来自A9的函数调用运行良好,M4则可返回数据。 但当前问题出现在M4调用函数时。A9中显示如下错误:“MU传输缓冲等待清空超时!imx_mu_rpmsg_send()失败,错误码:-5”。 在出现此错误之后,数据函数调用也无法在另一端正常运行:“rpmsg_multiept rpmsg0: virtqueue_add_outbuf失败,错误码:-5” 我应该检查什么? 感谢您的帮助。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Vadim, 通常情况下,您需要执行两项任务。一项针对客户端,另一项则针对服务器。问题还在于erpc_arbitrated_client_init的输出结果应作为参数传递给初始化服务器。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 嗨,Dusan、Marek、社区。 我已经使用eRPC创建多个应用,M4(客户端)-A9(服务器)或M4(服务器)-A9(客户端)均能正常运行,但我希望在各端使用客户端/服务器应用。不过它现在无法正常工作或运行,只要从一端执行一次,应用就会挂起。 我想检查一下代码的整体结构。 我哪里做错了呢? 是不是应该在 M4 上为客户端和服务器分别使用两个独立的 FreeRTOS 任务? M4 . . erpc_transport_t transport = erpc_transport_rpmsg_lite_rtos_remote_init(.....); erpc_mbf_t message_buffer_factory = erpc_mbf_rpmsg_init(transport); erpc_server_init(transport, message_buffer_factory); erpc_add_service_to_server(create_TEST_service()); erpc_arbitrated_client_init(transport, message_buffer_factory); while (true) { erpc_server_poll(); function1(....); } A9 . . erpc_transport_t transport = erpc_transport_rpmsg_linux_init(......); erpc_mbf_t message_buffer_factory = erpc_mbf_dynamic_init(); erpc_server_init(transport, message_buffer_factory); erpc_add_service_to_server(create_TEST_service()); erpc_arbitrated_client_init(transport, message_buffer_factory); while (true) { erpc_server_poll(); function2(....); } Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> vadimfilippenko,您好!如果您仍然对使用Python版本的话题感兴趣,可以查看此线程:将MPU补丁添加到内核中 - 我无法查看新模块 · 问题#2 · EmbeddedRPC/erpc-imx-demos · GitHub。来自mhanuel26 的最后两条消息值得您关注,因其已成功使用python应用。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Dusan, Marek, 我终于成功启动了修改后的 eRPC 示例。不过在 Linux 端我用的是 C 语言,且在 M4 端使用的是 eRPC 1.5.0 版本,其中 rpmsg 初始化函数带 6 个参数(这是杜尚在 GitHub 上提到的关于第 6 个参数的提示)。感谢你们的帮助。准备好迎接新的问题吧) Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 您需要在运行python应用之前运行M4应用。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Vadim, 请在这里贴出:ls /sys/class/rpmsg 的结果 看起来 M4 没有发送命名服务(M4 是否运行了正确的固件?)。正因为如此,没有创建来自 M4 的动态宣告通道的文件夹,因此 Python 无法创建 rpmsg 传输... 请检查你的 M4 内核打印输出。 此致, Marek Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Vadim,  正如你在其他评论中看到的,我一直努力尽快回复。但这周(可能还有下周)我比较忙。 不过,从你遇到的错误来看,你应该对比一下 transport.py 中 RpmsgTransport 类里的初始化函数, 以及erpc-imx-demos/sysfs.py at master · EmbeddedRPC/erpc-imx-demos · GitHub   - class RpmsgEndpoint 请确保 GitHub - EmbeddedRPC/erpc-imx-demos: eRPC demos for i.MX devices 是最新版本,且子仓库已根据与 erpc-imx-demos 匹配的提交进行了检出 也许mareknovak能更准确地指出问题所在。 看起来 如果self.id == -1: raise Exception() 返回 -1 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 有人能帮我解决以下问题吗? 我正在 iMX6COM 开发板上使用 erpc-imx-demos 中的 eRPC 演示示例。 在M4侧启动演示应用程序: "硬件已初始化 eRPC已初始化 MatrixMultiply服务已添加" 在 Linux 中添加驱动: "root@imx6sxea-com:~# modprobe -v rpmsg_multiept insmod /lib/modules/4.1.15-2.0.3+geb0b90b/kernel/drivers/rpmsg/rpmsg_multiept.ko" (系统并未反馈关于rpmsg通道已创建的信息,并且sys/class/rpmsg目录下的rpmsg文件夹为空) 在 Linux 上启动 appl 演示: 回溯(最近一次调用在最后): 文件"example.py",第111行,在 transport = erpc.transport.RpmsgTransport() 文件"build/bdist.linux-armv7l/egg/erpc/transport.py",第 199 行,在 __init__ 文件 "build/bdist.linux-armv7l/egg/rpmsg/sysfs.py" 中,第 116 行,在__init__ 异常 异常类型错误:'需要整数' 在 <绑定方法 RpmsgEndpoint.__del__ of > 被忽略 附言: 我已构建M4 eRPC演示应用,所用平台为cmake和eclipse。 M4 rpmsg演示应用运行良好。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Vakul, 抱歉,我错过了您的评论。目前我们不支持任何加密传输。但由于eRPC是模块化的,我认为您可以轻松地将此功能添加到您的eRPC项目中。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi eRPC 通信能否通过某种加密传输方式(例如 TLS)来保障安全? 此致 Vakul Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 嗨,Evgeny,目前我们对此还没有预估。但我认为你可以通过编写自己的 erpc_malloc/erpc_free 函数实现来编写/使用自己的分配器。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan, 是否计划在其他部分(例如erpcMatrixMultiply_shim 的生成等效实现)中增加更多静态内存分配?每个输入参数是否都需要动态分配内存(从编解码器填充数据后,在函数调用结束时释放)? 比如将预先分配的内存(由用户应用静态分配)传递给框架? 谢谢! Evgeny Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 嗨,Evgeny,这看起来像是 MCUExpresso 项目文件/ IDE 的问题。顶层文件夹名称应该是虚拟目录,未来这些目录将不会存在。你磁盘上的软件包中,eRPC 的目录结构应该与 GitHub 上的类似。GitHub 的目录结构更为推荐。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan, 我注意到ERPC在运行时使用了大量动态内存分配。是否有计划使其更适合嵌入式系统,并添加静态内存分配方案? 编辑: 很抱歉我刚才的问题,我确实在代码仓库中看到了 erpc_setup_mbf_static.cpp 文件。问题在于,我的代码是基于 MCUXpresso SDK 中提供的示例 ——frdmk66f_multiprocessor_examples_erpc_server_matrix_multiply_spi 和 frdmk66f_multiprocessor_examples_erpc_client_matrix_multiply_spi。这些示例的目录结构与代码仓库中的代码大不相同。 所以我的问题再问一次,应该使用 SDK 示例的目录结构还是代码仓库中的呢?它们为什么会有这么大的差异? 谢谢! Evgeny  Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Evgeny, 首先:您是否正在使用 develop 分支中的 smac.erpc(并且应用程序是从该分支构建的)?对我来说,这个版本是可以正常工作的。 目前erpcgen应用版本和其余eRPC代码已连接。这意味着如需使用您从github构建的新版erpcgen应用,则必须将github上的github erpc_c/*文件复制至您的示例中。然后,您可以使用新版erpcgen应用重新生成代码,更新应用(erpc初始化 + 传输)功能,其他部分即可正常运行。否则,如果您不更新erpc_c文件,则必须使用提供的erpcgen应用。 查看这个页面的底部内容:入门指南・EmbeddedRPC/erpc Wiki・GitHub,对于较新的 erpcgen 版本来说,该内容应该是相当新的。 我不确定最新提交是否已修改spi,建议您暂时使用旧版实现。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hey Dusan, 当我使用自己编译的 erpcgen.exe 时,我在 smac.erpc 示例中遇到了相同的错误: error: file smac.erpc:135:5: syntax error, unexpected identifier, expecting '}' 我之前提到的目录结构是存储库中的erpc_c目录,并且: 来自SDK示例。哪个目录结构是“正确”的?结合使用我生成的文件与SDK示例代码是否安全? 谢谢! Evgeny Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hey dusancervenka-b51352, 感谢您的快速回复!我克隆了开发分支。我注意到erpc_c目录结构与Kinetis SDK提供的示例有很大不同。哪一个更合适? 谢谢! Evgeny Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi evgenyerlihman‌, 实际上,我们正在进行更频繁地更新。您需要切换到开发分支。GitHub - EmbeddedRPC/erpc at develop。最后一次代码更新是昨天。但您需要在该此构建erpcgen应用。有了smac IDL,就能正常运行。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi dusancervenka-b51352, 我正在考虑将 eRPC 框架用于我正在开发的一款新产品,该产品使用多个 NXP 的 Kinetis 器件。我注意到 eRPC 的 GitHub 仓库最后一次更新是在 6 个月前。我的问题是,这个框架目前还在维护、修复和开发吗?我尝试了 GitHub 上的示例: erpcgen.exe smac.erpc 并且它未能生成 cpp 源代码,出现了错误。 erpcgen可执行文件来自MCUXpresso SDK。 谢谢! Evgeny Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 您好,Chandini, 没关系。我也刚休完长假,希望您度过了一段美好时光。 我已通过社区消息系统(私信)给你发了邮件。 我们可以通过邮件详细讨论。大致流程是,你需要在 GitHub 上创建分支,切换到开发分支,应用你的修改,创建提交记录,再发起拉取请求。我们会审核你的修改,提出修改建议,之后将其合并到开发分支。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan , 非常抱歉回复迟了,我刚结束长假回来。已与团队成员进行内部沟通,请提供您的电子邮箱地址以便我们转发资料。根据公司政策,我们无法直接将任何内容直接上传至您的github。 谢谢 Chandini Re: Introducing eRPC 嗨,杜桑 、 当然,我会与我的前辈讨论并创建拉取请求。目前我正在度假,抱歉迟复。 谢谢 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 嗨,Chandini。很高兴你成功了。我有一个特别的提议,你能否在 eRPC 的 GitHub 开发分支上,就你新创建的传输层提交一个拉取请求(基于开发分支)?或许还需要做些工作才能让它与更新版本的 eRPC 兼容。但如果你不想更新的话,我可以来做:)通过在 GitHub 上提交拉取请求,你将成为有价值的贡献者,并且会永远出现在贡献者历史记录中。 希望 eRPC 能成为你的理想解决方案。我们会一直在这儿(或 GitHub 上)为你提供帮助:) Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi dusancervenka-b51352 , b50844 , novakma7   终于恢复正常运行,演示程序现可在Linux上配合我的c++代码运行。 非常感谢各位回答了我所有的问题。:) 特别感谢Dusan:smileyhappy 谢谢 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> HI Dusan , 由于我昨天忙于其他任务,所以未能进行任何尝试。今天我会进行尝试,并及时通知您。 我觉得我得稍微修改一下我的函数,再进行尝试。因为到目前为止,我在发送和接收函数中只传递了 char * 类型的数据。 很快会回来找您。 谢谢 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Chandini,您好!是的,没错。我当时不在公司,所以无法获知具体功能的名称。此功能是否能正常运行? Re: Introducing eRPC 你好,杜桑 感谢您的答复: write(fd、 >getBuffer(), >getUsed()😞 我可以看到getused函数(位于erpc/message_buffer.h at 9e18d069aeae19a6e80a5e8783903bc63bd9b567 · EmbeddedRPC/erpc · GitHub中),但找不到getbuffer函数。 我想我必须用下面这个函数来获取我的缓冲区,对吗? /*! * @brief This function returns pointer to buffer to read/write. * * @return Pointer to buffer to read/write. */ uint8_t *get() { return m_buf; } 因此函数为如下形式: send :erpc_status_t send(MessageBuffer *message) { write(fd, message->get, message->getUsed())};  谢谢 chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 您好,chanidi,您需要以不同的方式来做:您必须使用 transport.h。如果您不使用它,它将无法正常工作。 也许您可以使用我上面提到的 ioctl 命令: erpc_status_t receive(MessageBuffer *message) {int fd = open("/dev/rpmsg_ept1024.1", O_RDWR);} 发送:erpc_status_t send(MessageBuffer *message) { write(fd, message->getBuffer(), message->getUsed())}; 读取:erpc_status_t receive(MessageBuffer *message){size_t size = read(fd, message->getBuffer(), 500); message->setUsed(size)}; novakma7您能否确认操作步骤? Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Dusan , Marek 是的,我也参考了那些文件,但是 我正在使用trasport.h创建传输层。但面临参数不匹配的问题 transport.h中的发送和接收函数以消息缓冲区作为参数,          virtual erpc_status_t receive(MessageBuffer *message) = 0;          virtual erpc_status_t send(MessageBuffer *message) = 0; 根据 example.py 我已经创建了我的 RpmsgEndpoint 类,该类需要以下参数       RpmsgEndpoint::receive(int maxlen) RpmsgEndpoint::send(char *buffer,int dst) 根据我的理解,我们只需要从 Linux 中读取和写入 /dev/rpmsg_ept1024.1 设备即可。   所以我在想,与其使用 transport.h,或许我需要创建自己的 transport.h 版本? 感谢大家 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 不客气。您可以从/erpc-imx-demos/middleware/erpc/transport/文件夹汲取灵感。有多种传输方式。 Re: Introducing eRPC 非常感谢 Dusan 的快速回复 ,我将继续沿着这条路走下去,不久后再来找你。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 您好,Chandini。您是对的。这些步骤是正确的。您需要创建继承自transport.h的类 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Marek 我还有一个问题。 目前我的工作状态: 我已在c++中实现RpmsgEndpoint类 我正在研究如何让我的客户端应用程序现在正常运行。 erpc-imx-demos/MPU/example_erpc at master · EmbeddedRPC/erpc-imx-demos · GitHub中的 Python example.py调用继承自Transport类的 RpmsgTransport。 我的问题是,我是否应该使用transport.h(位于/erpc-imx-demos/middleware/erpc/erpc_c/infra)来确保应用正常运行。 以便我创建RpmsgTransport类,并在客户端应用中调用它。 我这样想对吗? 先感谢您 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 是的,你说得对。 Python 所做的一切都只是对文件的 IO 操作(读/写)。这在任何语言中都可以实现,包括 C/C++。 选择 Python 来演示是因为它在 Linux 用户空间中很受欢迎,但你完全可以将其移植到 C 语言中。 我想我们现在的理解是一致的了。 祝您好运! 祝好, Marek Re: Introducing eRPC 你好,马雷克 感谢您的答复,它消除了我的一些疑惑。 我们不打算在两边都使用 FreeRTOS。 我们的计划是   M4 核 - 运行 FreeRTOS—— 这一点在你们的演示中已经实现了 A7 核 - 运行 Linux—— 你们的演示中有 Python 代码,用于利用内核的 RPMSG 实现   我们只需要用C或C++来代替Python。 我认为我们可以轻松地将 Python 代码移植到 C 或 C++,对吗? 谢谢 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 您好,Chandini Indavara Basavaraju, RPMSg-Lite是RPMsg协议的实现,仅适用于运行 FreeRTOS或裸机的M4端。 在Linux/A7端,您可以放心使用内核中的RPMsg实现。(例如:GitHub - EmbeddedRPC/erpc-imx-demos:i.MX设备的eRPC演示) 或者你是打算在 M4 和 A7 两个内核上都运行 FreeRTOS?这种情况下它是可以工作的,但这并非标准用例。这需要你为 A 内核创建一个移植层,并让 FreeRTOS 在那里运行。 希望这能给你一些方向, Marek Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Marek 不知怎的,我漏掉了你的消息,对此我很抱歉 非常感谢 。我会尽快尝试您的最新版本。 您能否回答我关于RPMSG传输层的最后一个问题? 谢谢 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 您好,我理解您。 您需要新建一个(此外还可根据需求,通过github上的拉取请求将其添加到我们的存储库)。 在 Linux 端,您可以使用 /dev/ttyRPMSG(如果系统中存在)。   例如,在此处创建新的传输erpc_c/transports with: 初始化可以像这样: int fd = open("/dev/ttyRPMSG", O_RDWR); 发送:write(fd, buffer, buffer_size); read:size_t size = read(fd, buffer, expected size); 如果没有这样命名的设备,你可以从 Python 代码中获取灵感。RPMSG 不是我的专长。我不知道在 Linux 上应该如何使用它。我会把你的问题转发给 Marek。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan , Marek 我计划的是: 在 M4(freertos)和 A7(Linux)上使用rpmsg-lite 我需要: RPMSG C 包装器(在 erpc_c/setup 下),可在 M4 和 A7 侧使用 RPMSG 传输层(在 erpc_c/transports 下),可在 M4 和 A7 侧使用 我有以下问题: 请问,您是否有适用于该场景的传输层? 或 我们是否需要参考 rpmsg-python 并写出类似的内容? 任何建议都会非常有帮助 感谢大家 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 您好,我不确定是否有您需要的信息(Linux端的c传输)。但新建一个也很简单。您可以从/dev/ttyRPMSG(如果系统中存在)读取和写入。 例如: 初始化操作如下: int fd = open("/dev/ttyRPMSG", O_RDWR); 发送:write(fd, buffer, buffer_size); 读取:size_t size = read(fd, buffer, expected size); mareknovak或许能就该问题分享更多专业见解。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan , 感谢您告知我此次更新。 我想现在我对ERPC有了初步的了解。一旦我让RPMSG客户端应用程序正常运行,我就可以更新ERPC版本。 我开始研究rpmsg-lite,其中包含M4平台文件。 我想知道是否有适用于A7平台的方案?任何相关信息都将大有帮助。我的主要目标是使用C语言获取客户端应用,并使用RPMSg作为传输层 谢谢 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 我很高兴您能够独立解决问题(对我们而言,这意味着该问题对开发人员来说并不复杂)。此外,正如mareknovak在上述评论中提到的那样, 他已经在存储库中更新其imx演示应用。您在进行下一步操作可以使用该版本,因其已采用新的rpc功能 Re: Introducing eRPC 感谢您的回复 这正是我想要的信息,我已经为 TCP 创建了 C 语言包装器,在对 eRPC 做了几处修复后,它运行得很顺利。 我的下一步是将TCP层替换为rpmsg。 再次感谢 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 您好,Chandini Indavara Basavaraju, 我刚刚更新了 GitHub 上的 erpc-imx-demos 仓库(链接:GitHub - EmbeddedRPC/erpc-imx-demos: eRPC demos for i.MX devices),使其适配 eRPC 1.4.0 和 RPMSg-Lite 1.1.0。 你可以下载预编译的 erpcgen 应用程序,它用于代码生成,下载地址是:Release v1.4・EmbeddedRPC/erpc・GitHub,在下载部分选择适合你的架构即可。 然后你可以这样调用它:./erpcgen -gpy 接口定义语言文件名.erpc,这会为你生成 Python 的序列化和反序列化垫片代码。如果你省略 - gpy 参数或指定 - gc,将会得到 C 语言的垫片代码。 erpc-imx-demos 仓库的最新提交中也更新了序列化 / 反序列化垫片代码,你可以放心使用。 欢迎以拉取请求的形式提交你的修改, 感谢你使用 eRPC 和 RPMsg-Lite! Marek Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 您好,目前我们在 GitHub 仓库中没有示例。但是我们在那里有 C(c++) 测试。如果您熟悉 Linux 或 Mac,您可以以此为例。其他选项如上所述: 1. 下载支持的开发板的 SDK -> 多核/多处理器 C/Python 示例。 2. 阅读这篇文章:入门指南・EmbeddedRPC/erpc Wiki・GitHub Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan 请问你们有 C 语言的客户端应用示例吗?不是 Python 的那种。或者你们有计划编写一个吗?如果已经有的话,那会非常有用,能帮上大忙。 先感谢您 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 终于成功了,非常感谢你的帮助:)Dusan 抱歉未找到附件选项以上传补丁,故将内容粘贴如下: 来自 7a5b152524a3c82b5bced4a72ed396f21860b666 2001年9月17日星期一00:00:00 日期:2017年5月8日星期一11:33:05 +0100 主题:[补丁]修复问题以运行eRPC_demo演示 --- erpc_c/infra/transport.h | 4 +- erpc_c/setup/erpc_server_setup.cpp | 36 ++++- erpc_c/setup/erpc_server_setup.h | 2 +- erpc_c/setup/erpc_setup_rpmsg_lite_rtos_remote.cpp | 54 +++++++ erpc_c/setup/erpc_transport_setup.h | 18 ++- erpc_c/transports/rpmsg_lite_rtos_transport.cpp | 158 ++++++++++++++++++ erpc_c/transports/rpmsg_lite_rtos_transport.h | 177 +++++++++++++++++++++ erpc_c/transports/rpmsg_rtos_transport.h | 147 +++++++++++++++++ erpc_python/erpc/transport.py | 21 +++ 9 files changed, 602 insertions(+), 15 deletions(-) create mode 100644 erpc_c/setup/erpc_setup_rpmsg_lite_rtos_remote.cpp create mode 100644 erpc_c/transports/rpmsg_lite_rtos_transport.cpp create mode 100644 erpc_c/transports/rpmsg_lite_rtos_transport.h create mode 100644 erpc_c/transports/rpmsg_rtos_transport.h diff --git a/erpc_c/infra/transport.h b/erpc_c/infra/transport.h index eb7ec71..fd4862a 100644 --- a/erpc_c/infra/transport.h +++ b/erpc_c/infra/transport.h @@ -48,7 +48,7 @@ //////////////////////////////////////////////////////////////////////////////// namespace erpc { - +class MessageBuffer; /*! * @brief 传输层的抽象接口。 * @@ -89,7 +89,7 @@ public: * * @return基于发送实现。 */ - virtual erpc_status_t send(MessageBuffer *message) = 0; + virtual erpc_status_t send(const MessageBuffer *message) = 0; /*! * @brief 轮询传入消息。 diff --git a/erpc_c/setup/erpc_server_setup.cpp b/erpc_c/setup/erpc_server_setup.cpp index 51fa799..5cd4346 100644 --- a/erpc_c/setup/erpc_server_setup.cpp +++ b/erpc_c/setup/erpc_server_setup.cpp @@ -33,8 +33,10 @@ #include "basic_codec.h" #include "manually_constructed.h" #include "simple_server.h" -#include +#include "message_buffer.h" +#include "erpc_config_internal.h" #include +#include #if !(__embedded_cplusplus) using namespace std; @@ -43,6 +45,29 @@ using namespace std; using namespace erpc; //////////////////////////////////////////////////////////////////////////////// +// 类 +//////////////////////////////////////////////////////////////////////////////// + +class BasicMessageBufferFactory : public MessageBufferFactory +{ +public: + virtual MessageBuffer create() + { + uint8_t *buf = new (nothrow) uint8_t[ERPC_DEFAULT_BUFFER_SIZE]; + return MessageBuffer(buf, ERPC_DEFAULT_BUFFER_SIZE); + } + + virtual void dispose(MessageBuffer *buf) + { + assert(buf); + if (*buf) + { + delete[] buf->get(); + } + } +}; + +//////////////////////////////////////////////////////////////////////////////// // 变量 //////////////////////////////////////////////////////////////////////////////// @@ -50,29 +75,32 @@ using namespace erpc; static ManuallyConstructed s_server; SimpleServer *g_server; +static ManuallyConstructed s_msgFactory; static ManuallyConstructed s_codecFactory; //////////////////////////////////////////////////////////////////////////////// // 代码 //////////////////////////////////////////////////////////////////////////////// -void erpc_server_init(erpc_transport_t transport, erpc_mbf_t message_buffer_factory) +void erpc_server_init(erpc_transport_t transport) { // 初始化工厂。 + s_msgFactory.construct(); s_codecFactory.construct(); // 使用提供的传输初始化服务器。 s_server.construct();s_server->setTransport(reinterpret_cast (transport)); + s_server->setMessageBufferFactory(s_msgFactory); s_server->setCodecFactory(s_codecFactory); - s_server->setMessageBufferFactory(reinterpret_cast (message_buffer_factory)); g_server = s_server; } - void erpc_server_deinit() { + s_msgFactory.destroy(); s_codecFactory.destroy(); s_server.destroy(); + } void erpc_add_service_to_server(void *service) diff --git a/erpc_c/setup/erpc_server_setup.h b/erpc_c/setup/erpc_server_setup.h index 8e6a6ef..e4e9eaa 100644 --- a/erpc_c/setup/erpc_server_setup.h +++ b/erpc_c/setup/erpc_server_setup.h @@ -60,7 +60,7 @@ extern "C" { * * 此函数用于初始化服务器,且包含运行服务器所需的所有组件。 */ -void erpc_server_init(erpc_transport_t transport, erpc_mbf_t message_buffer_factory); +void erpc_server_init(erpc_transport_t transport); /*! * @brief 此函数用于取消初始化服务器。 diff --git a/erpc_c/setup/erpc_setup_rpmsg_lite_rtos_remote.cpp b/erpc_c/setup/erpc_setup_rpmsg_lite_rtos_remote.cpp new file mode 100644 index 0000000..b480d42 --- /dev/null +++ b/erpc_c/setup/erpc_setup_rpmsg_lite_rtos_remote.cpp @@ -0,0 +1,54 @@ + /* + * Copyright (c) 2014-2016, Freescale Semiconductor, Inc. + * + * 允许以源代码或二进制形式重新分发和使用,无论是否修改, + * 只要满足以下条件: + * + * o 重新分发的源代码必须保留上述版权声明、本 + * of 条件列表以及以下免责声明。 + * + * o 以二进制形式重新分发时,必须在随分发提供的 + * 提供的文档和/或 + * 其他材料中复制上述版权声明、此条件列表和以下免责声明。 + * + * o 未经事先书面许可,不得使用Freescale Semiconductor, Inc.的名称或其 + * 贡献者的姓名来认可或推广由此 + * 软件衍生的产品。 + * + * 本软件由版权所有者和贡献者“按原样”提供,并且 + * 不提供任何明示或暗示的担保,包括但不限于 + * 对适销性和针对特定用途的适用性的暗示担保 + * 免责声明。在任何情况下,版权所有者或贡献者均不对 + * 任何直接、间接、偶然、特殊、惩戒性或后果性的损害 + *(包括但不限于采购替代商品或服务; + * 使用、数据或利润损失;或业务中断)负责,无论其由 + * 何种原因引起,也无论其基于何种责任理论,无论是在合同、严格责任还是侵权行为 + *(包括疏忽或其他行为)中,以任何方式因使用本 + *软件而引起,即使已被告知可能发生此类损害。 + */ + +#include "manually_constructed.h" +#include "rpmsg_lite_rtos_transport.h" +#include "erpc_transport_setup.h" + +using namespace erpc; + +//////////////////////////////////////////////////////////////////////////////// +// 变量 +//////////////////////////////////////////////////////////////////////////////// + +static ManuallyConstructed s_transport; + +//////////////////////////////////////////////////////////////////////////////// +// 代码 +//////////////////////////////////////////////////////////////////////////////// + +erpc_transport_t erpc_transport_rpmsg_lite_rtos_remote_init( + unsigned long src_addr, unsigned long dst_addr, void *start_address, int rpmsg_link_id, void (*ready_cb)(void), bool send_nameservice) +{ + s_transport.construct(); + s_transport->init(src_addr, dst_addr, start_address, rpmsg_link_id, ready_cb, send_nameservice); + return reinterpret_cast (s_transport.get()); +} + + diff --git a/erpc_c/setup/erpc_transport_setup.h b/erpc_c/setup/erpc_transport_setup.h index 798d92f..6c3959e 100644 --- a/erpc_c/setup/erpc_transport_setup.h +++ b/erpc_c/setup/erpc_transport_setup.h @@ -34,6 +34,7 @@ #include "erpc_version.h" #include +#include /*! * @addtogroup transport_setup @@ -48,7 +49,7 @@ //! @brief 不透明传输对象类型。 typedef struct ErpcTransport *erpc_transport_t; //! @brief RPMsg-Lite传输就绪回调对象类型。-typedef void (*rpmsg_ready_cb)(void); +//typedef void (*rpmsg_ready_cb)(void); //////////////////////////////////////////////////////////////////////////////// // API @@ -106,21 +107,21 @@ erpc_transport_t erpc_transport_rpmsg_lite_master_init(unsigned long src_addr, /*! * @brief 创建RPMsg-Lite零拷贝传输。 */ -erpc_transport_t erpc_transport_rpmsg_lite_zc_master_init(unsigned long src_addr, - unsigned long dst_addr, - int rpmsg_link_id); +//erpc_transport_t erpc_transport_rpmsg_lite_zc_master_init(unsigned long src_addr, +// unsigned long dst_addr, +// int rpmsg_link_id); /*! * @brief 创建RPMsg-Lite传输。 */ erpc_transport_t erpc_transport_rpmsg_lite_remote_init( - unsigned long src_addr, unsigned long dst_addr, void *start_address, int rpmsg_link_id, rpmsg_ready_cb ready); + unsigned long src_addr, unsigned long dst_addr, void *start_address, int rpmsg_link_id, void (*ready_cb)(void), bool send_nameservice); /*! * @brief 创建RPMsg-Lite零拷贝传输。 */ -erpc_transport_t erpc_transport_rpmsg_lite_zc_remote_init( - unsigned long src_addr, unsigned long dst_addr, void *start_address, int rpmsg_link_id, rpmsg_ready_cb ready); +//erpc_transport_t erpc_transport_rpmsg_lite_zc_remote_init( +// unsigned long src_addr, unsigned long dst_addr, void *start_address, int rpmsg_link_id, rpmsg_ready_cb ready); /*! * @brief 创建RPMsg-Lite RTOS传输。 @@ -133,7 +134,8 @@ erpc_transport_t erpc_transport_rpmsg_lite_rtos_master_init(unsigned long src_ad * @brief 创建RPMsg-Lite RTOS传输。 */ erpc_transport_t erpc_transport_rpmsg_lite_rtos_remote_init( - unsigned long src_addr, unsigned long dst_addr, void *start_address, int rpmsg_link_id, rpmsg_ready_cb ready); + unsigned long src_addr, unsigned long dst_addr, void *start_address, int rpmsg_link_id, void (*ready_cb)(void), bool send_nameservice); + //@} diff --git a/erpc_c/transports/rpmsg_lite_rtos_transport.cpp b/erpc_c/transports/rpmsg_lite_rtos_transport.cpp new file mode 100644 index 0000000..e04ae91 --- /dev/null +++ b/erpc_c/transports/rpmsg_lite_rtos_transport.cpp @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * + * 允许以源代码或二进制形式重新分发和使用,无论是否修改, + * 只要满足以下条件: + * + * o 重新分发的源代码必须保留上述版权声明、本 + *条件列表以及以下免责声明。 + * + * o 以二进制形式重新分发时,必须在随分发提供的 + * 提供的文档和/或 + * 其他材料中复制上述版权声明、此条件列表和以下免责声明。 + * + * o 未经事先书面许可,不得使用 + * Freescale Semiconductor, Inc.的名称或其贡献者的姓名来认可或推广由此 + * 软件衍生的产品。 + * + * 本软件由版权所有者和贡献者“按原样”提供,并且 + * 不提供任何明示或暗示的担保,包括但不限于 + * 对适销性和针对特定用途的适用性的暗示担保 + * 免责声明。在任何情况下,版权所有者或贡献者均不对 + * 任何直接、间接、偶然、特殊、惩戒性或后果性的损害 + *(包括但不限于采购替代商品或服务; + * 使用、数据或利润损失;或业务中断)负责,无论其由 + * 何种原因引起,也无论其基于何种责任理论,无论是在合同、严格责任还是侵权行为 + *(包括疏忽或其他行为)中,以任何方式因使用本 + *软件而引起,即使已被告知可能发生此类损害。 + */ + +#include "rpmsg_lite_rtos_transport.h" +#include + +#if !(__embedded_cplusplus) +using namespace std; +#endif + +using namespace erpc; + +//////////////////////////////////////////////////////////////////////////////// +// 变量 +//////////////////////////////////////////////////////////////////////////////// +uint8_t RPMsgRTOSTransport::s_initialized = 0; +struct rpmsg_lite_instance *RPMsgRTOSTransport::s_rpmsg; + +//////////////////////////////////////////////////////////////////////////////// +// 代码 +//////////////////////////////////////////////////////////////////////////////// + +RPMsgRTOSTransport::RPMsgRTOSTransport() +: Transport() +, m_dst_addr(0) +{ +} + +RPMsgRTOSTransport::~RPMsgRTOSTransport() +{ + rpmsg_lite_deinit(s_rpmsg); + s_initialized = 0; +} + +erpc_status_t RPMsgRTOSTransport::init( + unsigned long src_addr, unsigned long dst_addr, void *base_address, unsigned long length, int rpmsg_link_id) +{ + if (!s_initialized) + { + s_rpmsg = rpmsg_lite_master_init(base_address, length, rpmsg_link_id, RL_NO_FLAGS); + s_initialized = 1; + } + + m_rpmsg_queue = rpmsg_queue_create(s_rpmsg); + m_rpmsg_ept = rpmsg_lite_create_ept(s_rpmsg, src_addr, rpmsg_queue_rx_cb, m_rpmsg_queue); + + m_dst_addr = dst_addr; + return m_rpmsg_ept == RL_NULL ? kErpcStatus_InitFailed : kErpcStatus_Success; +} + +erpc_status_t RPMsgRTOSTransport::init( + unsigned long src_addr, unsigned long dst_addr, void *base_address, int rpmsg_link_id, void (*ready_cb)(void), bool send_nameservice) +{ + if (!s_initialized) + { + s_rpmsg = rpmsg_lite_remote_init(base_address, rpmsg_link_id, RL_NO_FLAGS); + + /* Signal the other core we are ready */ + if (ready_cb != NULL) + { + ready_cb(); + } + + while (!rpmsg_lite_is_link_up(s_rpmsg)) + { + } + + s_initialized = 1; + } + + m_rpmsg_queue = rpmsg_queue_create(s_rpmsg); + m_rpmsg_ept = rpmsg_lite_create_ept(s_rpmsg, src_addr, rpmsg_queue_rx_cb, m_rpmsg_queue); + + if(send_nameservice) + { + rpmsg_ns_announce(s_rpmsg, m_rpmsg_ept, + "rpmsg-openamp-demo-channel", + 0); + } + + m_dst_addr = dst_addr; + return m_rpmsg_ept == RL_NULL ? kErpcStatus_InitFailed : kErpcStatus_Success; +} + +erpc_status_t RPMsgRTOSTransport::receive(MessageBuffer *message) +{ + int ret_val = rpmsg_queue_recv(s_rpmsg, m_rpmsg_queue, &m_dst_addr, (char *)message->get(), kRpmsgMessageBufferSize, + NULL, RL_BLOCK); + return ret_val != RL_SUCCESS ? kErpcStatus_ReceiveFailed : kErpcStatus_Success; +} + +erpc_status_t RPMsgRTOSTransport::send(const MessageBuffer *message) +{ + int ret_val = + rpmsg_lite_send(s_rpmsg, m_rpmsg_ept, m_dst_addr, (char *)message->get(), message->getUsed(), RL_BLOCK); + return ret_val != RL_SUCCESS ? kErpcStatus_SendFailed : kErpcStatus_Success; +} + +MessageBuffer RPMsgMessageBufferFactory::create() +{ + uint8_t idx = 0; + while (((m_freeBufferBitmap & idx) == 0) && (idx < kInitCountMessageBuffers)) + { + idx++; + } + + assert(idx < kInitCountMessageBuffers); + + m_freeBufferBitmap &= ~(1 << idx); + + uint8_t *buf; + buf = m_buffers[idx]; + + assert(NULL != buf); + return MessageBuffer(buf, kRpmsgMessageBufferSize); +} + +void RPMsgMessageBufferFactory::dispose(MessageBuffer *buf) +{ + assert(buf); + uint8_t *tmp = buf->get(); + + if (tmp) + { + uint8_t idx = 0; + while ((tmp != m_buffers[idx]) && (idx < kInitCountMessageBuffers)) + { + ++idx; + } + m_freeBufferBitmap |= 1 << idx; + } +} diff --git a/erpc_c/transports/rpmsg_lite_rtos_transport.h b/erpc_c/transports/rpmsg_lite_rtos_transport.h new file mode 100644 index 0000000..f1aec8a --- /dev/null +++ b/erpc_c/transports/rpmsg_lite_rtos_transport.h @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. + * + * 允许以源代码或二进制形式重新分发和使用,无论是否修改, + * 只要满足以下条件: + * + * o 重新分发的源代码必须保留上述版权声明、本 + *条件列表以及以下免责声明。 + * + * o 以二进制形式重新分发时,必须在随分发提供的 + * 提供的文档和/或 + * 其他材料中复制上述版权声明、此条件列表和以下免责声明。 + * + * o 未经事先书面许可,不得使用 + * Freescale Semiconductor, Inc.的名称或其贡献者的姓名来认可或推广由此 + * 软件衍生的产品。 + * + * 本软件由版权所有者和贡献者“按原样”提供,并且 + * 不提供任何明示或暗示的担保,包括但不限于 + * 对适销性和针对特定用途的适用性的暗示担保 + * 免责声明。在任何情况下,版权所有者或贡献者均不对 + * 任何直接、间接、偶然、特殊、惩戒性或后果性的损害 + *(包括但不限于采购替代商品或服务; + * 使用、数据或利润损失;或业务中断)负责,无论其由 + * 何种原因引起,也无论其基于何种责任理论,无论是在合同、严格责任还是侵权行为 + *(包括疏忽或其他行为)中,以任何方式因使用本 + *软件而引起,即使已被告知可能发生此类损害。 + */ + +#ifndef _EMBEDDED_RPC__RPMSG_LITE_RTOS_TRANSPORT_H_ +#define _EMBEDDED_RPC__RPMSG_LITE_RTOS_TRANSPORT_H_ + +#include "transport.h" +#include "message_buffer.h" +#include "rpmsg_lite.h" +#include "rpmsg_queue.h" +#include "rpmsg_ns.h" + +/*! + * @addtogroup rpmsg_lite_rtos_transport + * @{ + * @file + */ + +//////////////////////////////////////////////////////////////////////////////// +// 定义 +//////////////////////////////////////////////////////////////////////////////// + +enum +{ + kRpmsgMessageBufferSize = RPMSG_BUFFER_SIZE, + kInitCountMessageBuffers = 2, +}; + +//////////////////////////////////////////////////////////////////////////////// +// 类 +//////////////////////////////////////////////////////////////////////////////// + +namespace erpc +{ +/*! + * @brief 使用RPMsg RTOS API进行进程间消息传递的传输。 + * + * @ingroup rpmsg_lite_rtos_transport + */ +class RPMsgRTOSTransport : public Transport +{ +public: + /*! + * @brief 构造函数。 + * + * 此函数用于初始化对象属性。 + */ + RPMsgRTOSTransport(); + + /*! + * @brief RPMsgRTOSTransport析构函数 + */ + virtual ~RPMsgRTOSTransport(); + + /*! + * @brief 此函数调用RPMsg rtos初始化函数 - 作为RPMsg主服务器 + * + * @Param[in] src_addr 源地址。 + * @Param[in] dst_addr 目标地址。 + * @Param[in] base_address 共享内存中的RPMsg基地址。 + * @Param[in] length RPMsg共享内存区域长度。 + * @Param[in] rpmsg_link_id 选择通信将在哪些内核之间进行。 + * + * @retval kErpcStatus_Success 当rpmsg初始化函数成功执行时。 + * @retval kErpcStatus_InitFailed 当rpmsg初始化函数未成功执行时。 + */ + virtual erpc_status_t init( + unsigned long src_addr, unsigned long dst_addr, void *base_address, unsigned long length, int rpmsg_link_id); + + /*! + * @brief 此函数调用RPMsg rtos初始化函数 - 作为RPMsg远程 + * + * @Param[in] src_addr 源地址。 + * @Param[in] dst_addr 目标地址。 + * @Param[in] base_address 共享内存中的RPMsg基地址。 + * @Param[in] rpmsg_link_id 选择通信将在哪些内核之间进行。 + * @Param[in] ready_cb 在RPMsg初始化完成且内核就绪后调用的回调函数。 + * @Param [in] send_nameservice 如果为true,RPMsg主服务器会收到域名服务通知。 + * + * @retval kErpcStatus_Success 当rpmsg初始化函数成功执行时。 + * @retval kErpcStatus_InitFailed 当rpmsg初始化函数未成功执行时。 + */ + virtual erpc_status_t init( + unsigned long src_addr, unsigned long dst_addr, void *base_address, int rpmsg_link_id, void (*ready_cb)(void), bool send_nameservice); + + /*! + * @brief 将传入消息存储于消息缓冲区。 + * + * 在无消息传入时进行循环。 + * + * @Param[in] message 消息缓冲区,用于存储传入的消息。 + * + * @retval kErpcStatus_ReceiveFailed 无法接收消息缓冲区。 + * @retval kErpcStatus_Success 成功接收所有数据。 + */ + virtual erpc_status_t receive(MessageBuffer *message); + + /*! + * @brief 函数用于发送就绪消息。 + * + * @Param[in] message 传递要发送的消息缓冲区。 + * + * @retval kErpcStatus_SendFailed 无法发送消息缓冲区。 + * @retval kErpcStatus_Success 成功发送所有数据。 + */ + virtual erpc_status_t send(const MessageBuffer *message); + +protected: + /* 远程设备 */ + struct remote_device *m_rdev; /*!< 代表第二个内核的设备。*/ + struct rpmsg_channel *m_app_rp_chnl; /*!< 代表两台设备(两个内核)间的连接。*/ + unsigned long m_dst_addr; /*!< rpmsg使用的目标地址。*/ + rpmsg_queue_handle m_rpmsg_queue; /*!< 处理RPMsg队列。*/ + struct rpmsg_lite_endpoint *m_rpmsg_ept; /*!< 指向RPMsg Lite端点结构的指针。*/ + + static struct rpmsg_lite_instance *s_rpmsg; /*!< 指向RPMSG lite实例的指针。*/ + static uint8_t s_initialized; /*!< 表示rpmsg-lite是否已初始化的信息。*/ +}; + +class RPMsgMessageBufferFactory : public MessageBufferFactory +{ + uint8_t m_freeBufferBitmap; + uint8_t m_buffers[kInitCountMessageBuffers][kRpmsgMessageBufferSize]; + +public: + /*! + * @brief 构造函数。 + */ + RPMsgMessageBufferFactory() + : m_freeBufferBitmap(0xFF) + { + } + /*! + * @brief RPMsgMessageBufferFactory destructor + */ + virtual ~RPMsgMessageBufferFactory() {} + /*! + * @brief 此函数可创建用于设备间通信的消息缓冲区。 + */ + virtual MessageBuffer create(); + /*! + * @brief 此函数可处理用于设备间通信的消息缓冲区。 + */ + virtual void dispose(MessageBuffer *buf); +}; + +} // 命名空间erpc + +/*! @} */ + +#endif // _EMBEDDED_RPC__RPMSG_LITE_RTOS_TRANSPORT_H_ diff --git a/erpc_c/transports/rpmsg_rtos_transport.h b/erpc_c/transports/rpmsg_rtos_transport.h new file mode 100644 index 0000000..ad1d229 --- /dev/null +++ b/erpc_c/transports/rpmsg_rtos_transport.h @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * + * 允许以源代码或二进制形式重新分发和使用,无论是否修改, + * 只要满足以下条件: + * + * o 重新分发的源代码必须保留上述版权声明、本 + *条件列表以及以下免责声明。 + * + * o 以二进制形式重新分发时,必须在随分发提供的 + * 提供的文档和/或 + * 其他材料中复制上述版权声明、此条件列表和以下免责声明。 + * + * o 未经事先书面许可,不得使用Freescale Semiconductor, Inc.的名称或其 + * 贡献者的姓名来认可或推广由此 + * 软件衍生的产品。 + * + * 本软件由版权所有者和贡献者“按原样”提供,并且 + * 不提供任何明示或暗示的担保,包括但不限于 + * 对适销性和针对特定用途的适用性的暗示担保 + * 免责声明。在任何情况下,版权所有者或贡献者均不对 + * 任何直接、间接、偶然、特殊、惩戒性或后果性的损害 + *(包括但不限于采购替代商品或服务; + * 使用、数据或利润损失;或业务中断)负责,无论其由 + * 何种原因引起,也无论其基于何种责任理论,无论是在合同、严格责任还是侵权行为 + *(包括疏忽或其他行为)中,以任何方式因使用本 + *软件而引起,即使已被告知可能发生此类损害。 + */ + +#ifndef _EMBEDDED_RPC__RPMSG_RTOS_TRANSPORT_H_ +#define _EMBEDDED_RPC__RPMSG_RTOS_TRANSPORT_H_ + +#include "transport.h" +#include "message_buffer.h" + +extern "C" { +#include "rpmsg.h" +#include "rpmsg_rtos.h" +#include "rpmsg.h" +} + +/*! + * @addtogroup rpmsg_rtos_transport + * @{ + * @file + */ + +//////////////////////////////////////////////////////////////////////////////// +// 定义 +//////////////////////////////////////////////////////////////////////////////// + +enum +{ + kRpmsgMessageBufferSize = RPMSG_BUFFER_SIZE, +}; + +//////////////////////////////////////////////////////////////////////////////// +// 类 +//////////////////////////////////////////////////////////////////////////////// + +namespace erpc +{ +/*! + * @brief 使用RPMsg RTOS API进行进程间消息传递的传输。 + * + * @ingroup rpmsg_rtos_transport + */ +class RPMsgRTOSTransport : public Transport +{ +public: + /*! + * @brief 构造函数。 + * + * 此函数用于初始化对象属性。 + */ + RPMsgRTOSTransport(); + + /*! + * @brief RPMsgRTOSTransport析构函数 + */ + virtual ~RPMsgRTOSTransport(); + + /*! + * @brief 此函数用于调用rpmsg rtos初始化函数。 + * + * @Param[in] dev_id 设备ID号。 + * @Param[in] role 设备角色编号。 + * + * @retval kErpcStatus_Success 当rpmsg初始化函数成功执行时。 + * @retval kErpcStatus_InitFailed 当rpmsg初始化函数未成功执行时。 + */ + virtual erpc_status_t init(int dev_id, int role); + + /*! + * @brief 将传入消息存储于消息缓冲区。 + * + * 在无消息传入时进行循环。 + * + * @Param[in] message 消息缓冲区,用于存储传入的消息。 + * + * @retval kErpcStatus_ReceiveFailed 无法接收消息缓冲区。 + * @retval kErpcStatus_Success 成功接收了所有数据。 + */ + virtual erpc_status_t receive(MessageBuffer *message); + + /*! + * @brief 用于发送就绪消息的函数。 + * + * @Param[in] message 传递要发送的消息缓冲区。 + * + * @retval kErpcStatus_SendFailed 无法发送消息缓冲区。 + * @retval kErpcStatus_Success 成功发送所有数据。 + */ + virtual erpc_status_t send(const MessageBuffer *message); + +protected: + /* 远程设备 */ + static struct remote_device *m_rdev; /*!< 代表第二个内核的设备。*/ + static struct rpmsg_channel *m_app_rp_chnl; /*!< 代表两台设备(两个内核)之间的连接。*/ +}; + +class RPMsgMessageBufferFactory : public MessageBufferFactory +{ +public: + /*! + * @brief 构造函数。 + */ + RPMsgMessageBufferFactory() {} + /*! + * @brief RPMsgMessageBufferFactory destructor + */ + virtual ~RPMsgMessageBufferFactory() {} + /*! + * @brief 此函数可创建用于设备间通信的消息缓冲区。 + */ + virtual MessageBuffer create(); + /*! + * @brief 此函数可处理用于设备间通信的消息缓冲区。 + */ + virtual void dispose(MessageBuffer *buf); +}; + +} // 命名空间erpc + +/*! @} */ + +#endif // _EMBEDDED_RPC__RPMSG_RTOS_TRANSPORT_H_ diff --git a/erpc_python/erpc/transport.py b/erpc_python/erpc/transport.py index 0765e9f..c335943 100644 --- a/erpc_python/erpc/transport.py +++ b/erpc_python/erpc/transport.py @@ -31,6 +31,8 @@ import struct import serial +from rpmsg.sysfs import RpmsgEndpoint +import time import socket import threading from .crc16 import crc16 @@ -107,6 +109,25 @@ class SerialTransport(FramedTransport): class ConnectionClosed(Exception): pass +class RpmsgTransport(Transport): + def __init__(self): + self.ept = RpmsgEndpoint( + RpmsgEndpoint.rpmsg_openamp_channel, + RpmsgEndpoint.LOCAL_DEFAULT_ADDRESS, + RpmsgEndpoint.Types.DATAGRAM) + + def send(self, message): + self.ept.send(message, RpmsgEndpoint.REMOTE_DEFAULT_ADDRESS) + + def receive(self): + while True: + ret = self.ept.recv(2048) + if len(ret[1]) != 0: + return ret[1] + else: + time.sleep(0.001) + return ret[1] + class TCPTransport(FramedTransport): def __init__(self, host, port, isServer): super(TCPTransport, self).__init__() -- 2.7.4 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Dusan,谢谢 。一旦演示程序正常运行,我将创建拉取请求。 再次感谢你的回复,我已经拿到了 Python 文件。我会运行演示,很快再跟你说。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 嗨,做得真棒:)如果你愿意的话,可以为 i.MX 演示代码库创建一个拉取请求来修复这个问题。mareknovak 可以审核并将其合并到代码库中。 要生成python代码:与其他应用一样,您可以在命令行中输入"erpcgen --help"(-h也应有效)。 python -gpy idl_file -> gpy 表示生成 python。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 太好了,在更新之前我可以继续使用这个稳定版本。 经过几次修复,我的 MCU 演示现在可以正常构建和运行。感谢您的信息。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan 我已修复此问题,现在MCU演示程序恢复正常运行......感谢您推荐的稳定版本...... 你能告诉我如何使用 erpcgen 工具生成 Python 代码吗? 谢谢 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 嗨,最早也要到明天。但我不能保证一定是明天。我的同事 mareknovak 今天没来上班。不过应该很快就会处理。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 请问您能告诉我,您什么时候会更新? Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 您好,感谢您的关注。erpc似乎使用不同的erpcgen生成文件,且与Marek提交时的版本不一致(这是我们的失误)。最佳解决方案是将该演示程序更新为erpc和erpcgen的最新稳定版本。您可以从主分支GitHub - EmbeddedRPC/erpc: Embedded RPC(且已部署预构建erpcgen 1.4.0)尝试此操作。但我不知道您需要完成多少变更。或者您可以等待我们进行更新。 mareknovak Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan 我正在使用您推荐的同一个eRPC库 我遵循的步骤如下: 克隆 erpc-imx-demos(包含子模块,该子模块会克隆 eRPC 库,对应链接为 GitHub - MarekNovakNXP/erpc at 232afb209f0a0cfceb25a1be11879f7d1934e065) 1. git clone --recursive https://github.com/EmbeddedRPC/erpc-imx-demos.git 2. 进入 erpc-imx-demos/middleware/erpc 文件夹,然后像这样构建 erpcgen: 安装所需的 flex、bison 和 boost 包 make eprc 生成eprcgen sudo make install 成功获取 erpcgen 3. 尝试使用相同的 erpc_matrix_multiply.erpc 文件创建我自己的输出文件,命令如下: erpcgen -I erpc-imx-demos/MCU/example_erpc/service -o test/erpc-imx-demos/MCU/example_erpc/service erpc_matrix_multiply.erpc 成功获取以下文件: erpc_matrix_multiply.h erpc_matrix_multiply_server.cpp erpc_matrix_multiply_server.h erpc_matrix_multiply_client.cpp 4. 尝试构建 MCU/example_erpc/build/armgcc/imx7d_sdb_m4/build_all.sh。 失败并出现错误: /home/basavarajuc/test/erpc-imx-demos/MCU/example_erpc/service/erpc_matrix_multiply_server.cpp:在函数 'void* create_MatrixMultiplyService_service()' 中: /home/basavarajuc/test/erpc-imx-demos/MCU/example_erpc/service/erpc_matrix_multiply_server.cpp:168:56:错误:抽象类类型“MatrixMultiplyService_service”的 new-expression 无效 返回 new(nothrow) MatrixMultiplyService_service(); 很抱歉再次询问,只是为了澄清我的理解。 如果我使用的是 GitHub - MarekNovakNXP/erpc at 232afb209f0a0cfceb25a1be11879f7d1934e065 这个 eRPC 库,那我是否需要更新演示程序才能成功运行演示? 2. 您能否告知我erpc-imx-demos/MCU/example_erpc/service at master · EmbeddedRPC/erpc-imx-demos · GitHub中的输出文件是由哪个erpcgen版本生成的? 这样我就能暂时使用旧版本的 erpcgen 来创建我自己的文件了。 非常感谢。很抱歉打扰您 Chandini   Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 您好,感谢您的评论。 您提到的示例版本早于当前erpcgen构建版本。mareknovak也因当时官方eRPC版本未包含某些细微改动,而创建了官方eRPC存储库的分支版本。如果您点击中间件文件夹下erpc-imx-demos存储库中的eRPC引用,将重定向到其eRPC存储库。您需要借助该版本构建erpcgen。我们计划在未来更新演示。 希望我的回答对你有帮助。如果你有任何疑问,欢迎随时向我们咨询。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi 抱歉,如果我问的是基本问题。 我正在尝试理解如何使用恩智浦的erpcgen工具。 参考 https://github.com/EmbeddedRPC/erpc-imx-demos,我成功运行了示例演示。 我的下一步计划是构建 erpcgen,然后使用相同的 erpc_matrix_multiply.erpc 文件创建自己的输出文件,再次运行相同的演示,以便熟悉 erpcgen 工具的使用方法。 我得到了输出文件,但即使我使用了相同的erpc_matrix_multiply.erpc文件,我的文件与示例文件不同。 变更如下: 示例演示中的输出文件显示(erpc_matrix_multiply_server.h): erpc_status_t erpcMatrixMultiply_shim(erpc::Codec * in, erpc::Codec * out, uint32_t sequence); 我的文件 (erpc_matrix_multiply_server.h): erpc_status_t erpcMatrixMultiply_shim(erpc::Codec * codec, uint32_t sequence); 为什么文件会不同呢?我是不是漏掉了什么配置? 我是否需要手动编辑 erpc_matrix_multiply_server.h 和 erpc_matrix_multiply_server.cpp 文件? 先感谢您 Chandini
查看全文
我们是否需要 4 字节 UID,即 Mifare 经典身份验证命令的输入参数 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 我在验证 Mifare Classic 4K IC MF1S70YYX_V1 时遇到问题。我没有收到 0x60、0x00、CRC(2 字节)命令的响应。我已经阅读了数据表,在表格和图表中这是命令结构,但在描述中,有人提到我们需要为Mifare Authenticate命令提供4字节的UID作为输入参数。 请说明并确认成功验证所需的方法。 我使用的是 TRF7970A 读码器。 我可以读取 UID。我已按照 ISO14443 标准成功完成了防碰撞和 "选择 "程序,激活了这张卡。 但是在发送 Mifare 经典身份验证命令 0x60、0x00、CRC(2 字节)之后, 载波频率变低了,我没有收到 MF1S70YYX_V1 IC 的任何回应。您能告诉我出现这种行为的可能原因吗? 感谢并致意 苏尼 射频 Re: Do we need 4byte UID, Input parameter for Mifare Classic Authentication Command 你好 我正在使用 ST25R200 读卡器读/写 MIFARE Classic 1K 卡的数据块。但是,我没有收到对身份验证命令的正确响应(块 0x04 上密钥 A 的 0x60)。当收到响应时,卡会发出 NACK,如超时错误、无效命令或奇偶校验/CRC 错误。 如果你熟悉 MIFARE Classic 1K 卡的完整身份验证流程,或者你有任何与此相关的参考代码或文档,那么分享一下会很有帮助。 提前谢谢您。 Re: Do we need 4byte UID, Input parameter for Mifare Classic Authentication Command <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 你好,苏尼尔、 希望你一切顺利。我已经在你的内部案例中回答了这个问题。 如果您有任何问题,请随时提出。 顺祝商祺! 里卡多
查看全文
[MIMXRT1160-EVK] 1XK搭載: NXP-WIFIドライバをSDRAMに こんにちは!外部SDRAMを使用してRT1160-EVKでNXP Wi-Fiドライバを正常に実行できた方はいますか?オーバーレイで zephyr,sram = &sdram0 を設定したにもかかわらず、ファームウェアのロード中に 0x40000 (DTCM 制限) でバス障害が発生します。ヒープが SDRAM で正しく初期化されていないか、SDIO DMA の正しい MPU/Nocache 構成が欠落しているようです。何かヒントはありますか?また、.overlayも添付しますCASEとして、prj.confも保存してください。 Re: [MIMXRT1160-EVK] with 1XK: NXP-WIFI driver into SDRAM こんにちは、 @jaseze01 Zephyr OS を使用していますか? Zephyr のバージョンと Zephyr SDK のバージョンを教えていただけますか? この問題を再現するための詳細な手順を教えていただけますか? より良いサポートを提供できるよう、ローカルで再現できるかどうか試してみます。 よろしくお願いいたします。 Christine。 Re: [MIMXRT1160-EVK] with 1XK: NXP-WIFI driver into SDRAM こんにちは、クリスティン。 ご協力ありがとうございます。あなたが要求した情報は次のとおりです: ボード: NXP MIMXRT1160-EVK (Rev A) WiFi モジュール: M.2 インターフェース経由の Embedded Artists 1XK (Murata 1XK / NXP IW416)。 Zephyr OS バージョン: 4.3.0 Zephyr SDK バージョン: 0.17.4 ホストOS: Windows 私はこのプロジェクトに個別に取り組んでおり、アドレス `BFAR アドレス: 0x40000` で `正確なデータ バス エラー` (バス障害) が発生しています。このエラーは、ドライバが電圧スイッチを正常にネゴシエートした直後に発生します。 ハードウェアが正しく応答するようになったため (ログで「カードが 1.8V 信号に切り替えられました」と確認されています)、物理的な接続と電源は正常であると考えています。しかし、その直後に事故が起こります。 障害アドレス (`0x40000`) は、内部 ITCM/DTCM の 256 KB 境界と一致します。このことから、問題はメモリの配置に関連しているのではないかと疑っています。WiFi ファームウェアは約 500 KB なので、デフォルトの内部 RAM に収まらないか、DMA がアクセスが許可されていないメモリ領域 (DTCM など) にアクセスしようとしている可能性があります。 再現可能な手順 1.MIMXRT1160-EVK で `nxp,wifi` ドライバを有効にする Zephyr アプリケーションを構築しています。 2. `mimxrt1160_evk.overlay`を修正しましたファームウェアを収容するために外部 SDRAM (64MB の `&sdram0`) を有効にします。 3. 重複を避けるために、さまざまなメモリ構成 (システムとファームウェア用に SDRAM を分割) を試しました。 4. 起動時に、システムは SDIO バスを初期化し、1.8V に切り替えて、バス障害でクラッシュします。シーケンスを示すログ出力は次のとおりです。 [00:00:01.123,000] sd: カードが1.8V信号に切り替えられました [00:00:05.266,000] os: ***** バス障害 ***** [00:00:05.272,000] os: 高精度データ バス エラー [00:00:05.277,000] OS: BFAR アドレス: 0x40000 [00:00:05.283,000] OS: r0/a1: 0x80006945 r1/a2: 0x00040000 r2/a3: 0x0000000c [00:00:05.305,000] os: 障害のある命令アドレス (r15/pc): 0x3000242e リンカーがデータ/スタックを配置する場所と、WiFi ドライバが DMA 操作のためにそれを配置すると想定している場所に関して競合があるようです。 MIMXRT1160 で WiFi ファームウェアを外部 SDRAM に適切にロードするための推奨メモリ構成(オーバーレイ/リンカー)について教えてください。問題をローカルで再現して修正できる場合は、動作するオーバーレイ ファイルを共有していただけますか? よろしくお願いいたします! Re: [MIMXRT1160-EVK] with 1XK: NXP-WIFI driver into SDRAM こんにちは、 @jaseze01 帯域幅が限られているため、返信が遅くなり申し訳ありません。 以下の内容を参考に試してみてはいかがでしょうか。 NXP M.2 Wi-Fi および BT シールド — Zephyr プロジェクト ドキュメント また、このディレクトリにはデフォルトのnxp_m2_1xk_wifi_bt.overlayがあります。 https://github.com/nxp-zephyr/nxp-zephyr/tree/nxp-v4.3-branch/boards/shields/nxp_m2_wifi_bt/ この.overlayもCANで参照できます1xk(M.2に適合インターフェース)を I.MXRT1160-EVK に接続します。 https://github.com/nxp-zephyr/nxp-zephyr/blob/nxp-v4.3-branch/boards/shields/nxp_m2_wifi_bt/boards/mimxrt1060_evk_mimxrt1062_qspi_C.overlay 上記が参考になったかどうかお知らせください。 まだ何か問題がある場合はお知らせください。 よろしくお願いいたします。 Christine。
查看全文
IMX8QXP 上 CAN-FD 帧丢失 你好 我正在使用 MCIMX8QXP-CPU 板和 MCIMX8QXP-8X-BB。我在使用数据速率为 2Mbit/s 的 can-fd 帧时遇到了一些问题。使用"classic" CAN 和 CAN-FD 1Mbit/s 时一切正常,但使用 2Mbit/s 时,帧丢失严重。我知道我的输入信号并不完美,因为它们来自免接触式CAN总线读卡器,而且我观察到一些噪音。但我可以使用 Kvaser、pcan 等 CAN 记录器读取所有帧,不会出现问题。 我在另一个主题上看到,CAN 控制器时钟可能会影响帧丢失? 在我的配置中,CAN 时钟频率为 40MHz。 我试图修改它,但没有成功。我首先尝试修改设备树,然后读到它也可能在固件中(scfw)。有关信息,我使用 yocto 来版本系统 你认为这个时钟可能是我丢帧的原因吗?如果是,我该如何更新? 感谢您的帮助。 Re: CAN-FD frames loss on IMX8QXP 你好 问题可能确实与 CAN 控制器的时钟配置有关。对于以更高数据速率(2Mbit/s)运行的 CAN-FD,时钟精度变得至关重要。使用当前的 40MHz CAN 时钟,以及使用会引入一定噪声的免接触式 CAN 总线读卡器时,时序容差可能会变得更加严格。 解决这一问题有两种可能的方法: 1. **SCFW修改**:CAN 控制器时钟在系统控制器固件 (SCFW) 中配置。您需要修改 SCFW 配置文件来调整时钟设置。这需要重建 SCFW。 2。**设备树修改**:您也可以尝试调整设备树中的 CAN 定时参数。对于 CAN-FD 操作,您可能需要启用发射器延迟补偿 (TDC),这对于高于 2.5Mbps 的数据速率尤其重要。 对于免接触式 CAN 总线读取器引入噪声的特定情况,调整位定时参数以更能容忍信号变化可能会对您有所帮助。这可以通过修改设备树配置中的传播分段值来完成。 由于你使用的是 Yocto,你可以通过设备树叠加层或直接修补内核源代码来实现这些更改。 此致     Re: CAN-FD frames loss on IMX8QXP 谢谢谢谢 感谢感谢您的反馈。 I 尝试两个 选项 1) SCFW 修改: 我成功生成了固件 scfw_tcm.bin 文件 然后,在我的 yocto 项目中,我有这些生成的文件: bl31 - im x8qx。bin bl3 1- im x8qx。bin - 选择 m4_image。bin mkimage_imx8 mx8qxc0-ahab-容器。img mx8qx -m ek- scfw-tc m。bin scfw_tcm 。bin soc 。做个小孩。bin u -b oot - imx8qxp-mek。bin - sd u - boot - spl。bin - imx8qxp-mek-sd 当我使用 imx-mkimage 工具时,我必须复制这些文件: bl31 - im x8qx。 bin,u -boot- boot - imx8qxp -mek。 bin - sd,scfw_tcm 。 bin 和 mx8qxc0 -ahab-容器。 img 到我的 imx - mkimage 工具然后当我尝试生成新的二进制文件时我遇到了这个错误: 包括杂项.制造 包括 m4.mak 包括安卓.嗡嗡声 包括测试.使 包括 autobuild.制作 包含别名.mak 使[1]: *** 没有règle pour fabriquer la cible " mx8qxb0-ahab-容器.img",为 "flash "所必需。 设置. 使: ***[Makefile:26: flash] 错误 2 我看到 yocto 生成了 mx8qxc0-ahab-容器.img 而不是 mx8qxc0-ahab-容器.img,所以我还 尝试重命名它,但还是出现了同样的问题。 2) 我成功修改了我的设备树,我可以在板上看到 新的 时钟频率。 然后I 尝试命令更新控制器的时序,但我的新 新设置并没有应用。 你写道:你可能需要启用发射器延迟补偿(TDC),我没有找到任何相关文档。如果我明白可以直接在设备树上设置定时参数吗? Re: CAN-FD frames loss on IMX8QXP 你好 我的问题依然存在:canfd 帧丢失。 正如我所说,我成功地将控制器时钟更新到了 80Mhz。但这还不够。 我无法修改时间。我不知道具体该怎么做?至于启用发射器延迟补偿 (TDC),我没有找到 imx8 的相关文档。 感谢您的帮助、 纪尧姆
查看全文
i.MX93 A55 の Zephyr こんにちは、 i.MX93 Cortex-A55 で Zephyr を実行するための例が提供されており、hello_world をビルドし、u-boot プロンプト経由で DDR で実行できます。 u-bootの使用は避けたいです。ATF コードを参照しましたが、bl31 のビルドのみがサポートされています。「BootROM -> ATF BL2 -> ATF BL31 -> Zephyr」を実現したいのですが、BL2 をビルドするためのリファレンスはありますか? また、hello_world の例を OCRAM で実行したいのですが、手順を教えていただけますか。また、ここでもブートローダーが必要ですか。それとも JTAG 経由でバイナリを OCRAM に直接ロードできますか。 ありがとうございます Re: Zephyr on i.MX93 A55 こんにちは、 DDR 上で、BootROM --> BL2 --> BL3 --> Zephyr の順で Zephyr を起動できます。 内部 RAM で zephyr を実行したいです。ここに何か参考になるものはありますか? ありがとうございます
查看全文
[乱用] 投稿者: @JohnKlug / ボード: imx-processors / 報告者: thzuyfoc thzuyfoc は、 @JohnKlug が投稿した 「Could not invoke dnf for external kernel module in Yocto kirkstone」という 投稿について、以下の理由で報告しました: 理由:誤解を招く、または虚偽の情報 詳細: 投稿リンク: https://community.nxp.com/t5/i-MX-Processors/Could-not-invoke-dnf-for-external-kernel-module-in-Yocto/mp/1627964#M203740 投稿者: @JohnKlug |メール著者 報告者: thzuyfoc |メールレポーター 報告された投稿には 2 件の返信があります。
查看全文
S32K358 HSE Random Number Generation based on AUTOSAR drivers Dear support, Customer Aptiv is working with S32K358 RTD version: Crypto_43_HSE_TS_T40D34M60I0R0 HSE FW version: HSE_FW_S32K358_9_2_72_0 While trying to generate a Random number after integrating Crypto RTD and flashing HSE firmware on the MCU, we are observing an issue where the firmware seems to get stuck at the Hse_Ip_ServiceRequest() function, specifically while waiting for Mu_Ip_IsResponseReady(). Please find the attached screenshot of the call stack for your reference. Could you please help us understand: Possible reasons why the firmware might be stuck at this point? Recommended solutions or debugging steps to resolve this issue? PS: I have configured CSM_Init, CriIf_Init and Crypto_Init in BSWM configuration CSM, CryIf configured in Vector Davinci, Init functions of the CSM, CryIF, Crypto invoked from BSWM_Init callouts. HSE was installed using Demo APP and verified by reading version number and MU status register as shown below: Customer has asked for working AUTOSAR example based on AUTOSAR xdm configuration CSM,  CriIf and Crypto drivers (not the code from DEMOAPP). Attached their Crypto xdm file. (so far from NXP side Sunny X and Dhan Raj  were involved inot a debug call, we did not find the final root course yet ...) Best Regards, Viktor Board: S32K358 Priority: CRITICAL SW Variant: STANDARD Re: S32K358 HSE Random Number Generation based on AUTOSAR drivers Hello Cuong, we got help and [email protected] created an example. Let us keep this ticket open till next week when customer tried it out. I will grant you access to the example on sharepoint. Best Regards Viktor   Re: S32K358 HSE Random Number Generation based on AUTOSAR drivers Hi @viktorfellinger  I'm creating an example for you. Meanwhile, can you let me know that: 1. How often do you get this issue? Does it alsway happen or sporadic 2. Value of pRequest and pHseSrvDesc when call to Hse_Ip_ServiceRequest() Could you try to increase Timeout value in pRequest to see if it can pass this issue? Re: S32K358 HSE Random Number Generation based on AUTOSAR drivers Hi @viktorfellinger  Do you get any feedback? If there's no update then I would like to close this topic. Customer later can raise another question then you can mention again to this topic
查看全文
[LG]SE051H2HQ1/Z0112Zについて こんにちは、専門家の皆様 AVNET経由でLGより問い合わせがありましたので、詳細は以下をご参照ください。 1. ファームウェアがまだ完成しておらず、後でファームウェアが更新された場合、部品番号が変更になると通知されました。これは正しいですか? アモテックは会議でLGから情報を得た。お客様によれば、それは LG の唯一の部品番号である可能性があるとのことです。 正しいかどうか確認してください。 2. これが正しい場合、現在の部品番号のどの部分がファームウェア バージョンに対応していますか? 3. 注文後にファームウェアのアップデートが発生した場合、新しいファームウェアを適用した部品を供給することは可能ですか? 4. ファームウェアが更新された場合、Amotech は現在保有している在庫のファームウェアを更新できますか? 5. お客様からICの事前準備依頼をいただいており、発注後、比較的早く納品できると伺っています。NXP側でも何か準備は進んでいますか? ご説明をよろしくお願いいたします。 ありがとう、そしてよろしく。 カン Re: [LG]Regarding SE051H2HQ1/Z0112Z こんにちは、カンさん LG とのプロジェクトで新しいタイプが必要になりますが、ここで参照されているタイプであることを確認する必要があります。プロジェクトの参考資料はありますか? 部品番号も常にセキュア エレメントの特定の FW バージョンと構成に対応していることは事実です。配送内容に変更があった場合、明確に区別するために別の部品番号が必要になります。そうしないと、お客様は何を受け取るのか分からなくなってしまいます。部品番号がカスタムタイプのCASEに限り、リリース後にお客様と合意の上、構成を変更することも可能です。 部品がまだリリースされていない場合、ファームウェアを固定する部品がリリースされるまで、配布するサンプルは異なる FW / 構成のままになる可能性があります。 SE051 は基本的にCAN、SO 現場で FW をアップデートできます。ただし、アップデートはリリースされたソース タイプにのみ適用CANため、注意が必要です。 5) については、プロジェクトごとに行われ、事前に計画CANができますが、販売を検討する必要があります。 敬具、 マイケル
查看全文
S32K388CVB-Q289 駆動 PTC21 親愛なるチーム 私は S32K388CVB-Q289 を使用しており、TJA1153 CAN0 とともに FlexCAN_0 を有効にしています。テスト目的で物理バスに 2 番目のノードをコネクテッドしています。 しかし、FlexCAN_0は送信時にAckエラーが発生します TJA1153 トランシーバが有効になっていることを再確認し、J95 のピン 5 を測定すると、約 2 ボルトと表示されます。また、GPDO85 レジスタを 0 と 1 の間で変更しても、ピンで読み取られる電圧は影響を受けません。 GPDO85レジスタでピンがハイに設定され、MSCR85で出力ドライバが有効になっていることがわかりますが、 構成: Re: S32K388CVB-Q289 Driving PTC21 こんにちは、 ピンレベルを確認するには、J95.5-6ジャンパーを取り外し、MCU(5)とTJA1153(6)側を確認します。 TJA1153のVIOはJ804を使用してVDD_HV_B_PERH(VDD_HV_B 3.3V)にコネクテッドされていますが、使用されているMCUピンはVDD_HV_A(5V)にコネクテッドされています。 ユーザーが TJA1153 モードを切り替える必要がない限り、EN ピンを駆動する必要はありません。EN と STB_N は両方とも外部抵抗によって VIO にプルアップされます。デバイスがバニラ状態の場合、ローカル構成を可能にするために、MCU によって STB_N を低く駆動する必要があります。TJA1153 の構成の最後に、STB は EN、STB_N がハイの状態で通常モードに戻ります。 バス上にメッセージが表示されても ACK されない場合は、両方のノード間の CAN ビット タイミングが一致していないことが原因である可能性が最も高くなります。 とにかく、S32K388EVBのサンプルはここに掲載されている。 https://community.nxp.com/t5/S32K/Need-MCAL-working-CAN-Configuration-for-S32K388-EVB-bench/mp/1923345/highlight/true#M38660   BR、ペトル Re: S32K388CVB-Q289 Driving PTC21 ご返信ありがとうございます。 電圧レベルは今のところ良好なようです。EN と nSTB がハイになります。それでも、Ack エラーが発生し、テスト測定ツールのバスには何も表示されません。 トランシーバがバニラ状態であるため、一度設定するまで動作しない可能性はありますか? 例を読みましたが、現在のセットアップでは、トランシーバを相互に接続するよりも、テスト ツールから CAN メッセージを送信する方がはるかに簡単です。送受信のみの基本構成(セキュリティ要件は不要)の場合、初期化シーケンスと、CAN経由で送信する必要があるものについて教えていただけますか? Re: S32K388CVB-Q289 Driving PTC21 こんにちは、 デフォルトではデバイスはバニラ状態になっているSO、ホストまたはリモートから構成する必要があります。設定後、状態を変更できますが、例では通常 Vanilla 状態に維持されるため、電源を入れるたびに init が必要です。 掲載された例がボード上の FlexCAN モジュール間で動作している場合、CAN ツールに 1 つのモジュールだけをコネクテッドしても同様に動作するはずです。この例では、送信される ID が CAN0 トランシーバのパスリストに追加され、他の構成はデフォルトのままになります。 別の init シーケンスについては、IP レベルで実行された以下の例を参照してください。 https://community.nxp.com/t5/S32K-Knowledge-Base/Example-S32K358-FlexCAN-TXRX-ISR-S32DS35-RTD400-500/ta-p/1981987 トランシーバもバニラ状態にあることを想定しており、トランシーバのパスリストをすべてのstdおよびext IDを通過させるように設定し、バスからのメッセージをブロックしないようにします。最後に、不揮発性メモリへの書き込みやトランシーバのロックを行わずにコンフィギュレーションモードを終了します(バニラ状態を維持)。 BR、ペトル
查看全文
S32K144 CAN通讯异常 各位大佬:   我发现个异常的现象,我基于S32K144的CAN通讯DEMO整改了一下,在DEMO板可以正常外发报文通讯,我的CAN模块的时钟使用的内部48M的,移植到自制板子通讯也正常,但是我们我把时钟源切换到外部晶振,一旦倍频数值大于28,CAN通讯外发报文功能就消失了,不是特别理解原因,有什么需要特别注意的地方么?   回复: S32K144 CAN通讯异常 我的IDE是S32 for platform 3.5,SDK是4.0.1,我同事的是S32 for ARM 2.2,SDK是4.0.1,SDK是3.0.0,他修改clockout也没有用 你如果倍频输配置到28可以么?工程传不上来,一直加载 回复: S32K144 CAN通讯异常 仅供参考 回复: S32K144 CAN通讯异常 Hi@NanMo 我没看懂,你能详细的解释下嘛 回复: S32K144 CAN通讯异常 更新状态,发现通过S32K144配置时钟树选择配置一下clockout这一路的配置后状态就正常了,大家小心工具,痛并快乐着......   Re: S32K144 CAN通讯异常 Hi@NanMo 我复现了该问题,我也没在数据手册中看到有这样的限制要求,所以我创建了一个内部帖子等待设计团队的人给我一个回复,请你耐心等待。 回复: S32K144 CAN通讯异常 原理未知,可靠性未知,望答复 回复: S32K144 CAN通讯异常 红色框图部分原来我没有修改,默认状态下去生成代码后CAN功能在我使用不同时钟源的状态下功能不一致,后面把这两个选择点开配置成spll sclock,编译烧录发现通讯正常了,再把这里的配置依照印象改回去(不一定和原来一模一样奥),编译烧录发现通讯一直正常,我想知道为啥,折磨了我两天半了 回复: S32K144 CAN通讯异常 Hi@NanMo1 你可以分享这些第三方代码给我,我可以看看。 这个问题我已经在和内部的设计团队进行确认了,这个需要点时间。如果你的项目有需求,你现在FLEXCAN完全可以使用外部的晶振时钟,这个应该是没有问题的。 回复: S32K144 CAN通讯异常 这个账号是我使用公司邮箱注册的账号,这个问题还在困扰着我,但是我发现有部分第三方代码可以实相同配置下的CAN通讯,这个具体原因是什么? 回复: S32K144 CAN通讯异常 Hi@NanMo 我测试将PLL倍频设置为40是工作不OK的,我已经提交了case至设计团队来询问时钟的限制,因为我在数据手册中没看到有这样的限制要求。 其次你说了改了CLKOUT又可以,但是我改了也没用,你要是有成功的例程,你可以发送给我测试一下。 回复: S32K144 CAN通讯异常 Hi@NanMo 如果PLL倍频设置为40,PE时钟选择为外设时钟,我的CAN通信也异常。 回复: S32K144 CAN通讯异常 仅供参考 回复: S32K144 CAN通讯异常 Hi@NanMo1 你提供的工程所使用的时钟是外部晶振时钟,这个有什么问题?这和你的问题不一样吧 回复: S32K144 CAN通讯异常 CAN的PE模块一直都是用的外部时钟,发现如果系统使用外部倍频的时钟有时候CAN不正常,而且在不同板子上现象不一样。 回复: S32K144 CAN通讯异常 我第一次上传的例程就是 回复: S32K144 CAN通讯异常 Hi@NanMo1 上传你的demo 回复: S32K144 CAN通讯异常 我的demo板是100pin的,我的自制板子是64pin的,我在100PIN的基础上直接切换成64PIN会有问题,但是如果切换完后删掉所有的配置重新走配置流程功能就正常了 Re: S32K144 CAN通讯异常 谢谢您的答复。我现在明白了问题的原因。 Re: S32K144 CAN通讯异常 Hi@NanMo 抱歉,让您久等了。 这是 S32 DS IDE 的一个错误。 我发现这是 S32 DS 工具中的一个错误,我录制了一个视频供你参考。 问题在于,我们修改 SPLL 因子后,并没有更新生成的代码,从而导致 FLEXCAN 配置错误。 在"clock_config.c" 中,"SCG_SPLL_CLOCK_MULTIPLY_BY_28" 不会改变,即使我们尝试改变 修改 SPLL 因子。 .spllConfig = { .initialize = true, .monitorMode = SCG_SPLL_MONITOR_DISABLE,/* Monitor disabled */ .locked = false, /* unlocked */ .prediv = (uint8_t)SCG_SPLL_CLOCK_PREDIV_BY_1,/* Divided by 1 */ .mult = (uint8_t)SCG_SPLL_CLOCK_MULTIPLY_BY_28,/* Multiply Factor is 28 */ .src=0U, .div1 = SCG_ASYNC_CLOCK_DIV_BY_2, /* System PLL Clock Divider 1: divided by 2 */ .div2 = SCG_ASYNC_CLOCK_DIV_BY_4, /* System PLL Clock Divider 3: divided by 4 */ }, 1.直接修改底层配置代码。 2.我发现先将运行模式切换到 HSRUN,然后再切换回 RUN,并在此过程中修改 SPLL 因子,这样就能正常生成代码。
查看全文
PN7160 PN7220 Android 15 Porting to i.MX8MN EVK Introduction We have an official PN7160/PN7220 Android 15 porting guide (PN7160/PN7220 – Android 15 porting guide). But the patches only for Android 15 AOSP r1 (android-15.0.0_r1). If customer want to porting to the newer release of AOSP, there will have many errors during the source code compiling. This document is for customer reference to solve the error one by one.  NOTE :  All the modifications are just for reference. They are NOT a NXP official patches for the newer release of AOSP porting. So the modifications may not be the best solution. Customer please base on their needs to modify the AOSP source code.  Hardware boards: i.MX8MN EVK PN7160 EVK PN7220 EVK Build the Android for i.MX8MN EVK The i.MX Android BSP that I used is Android 15.0.0_2.0.0 (L6.12.20_2.0.0 BSP). It could be downloaded from here: Android OS for i.MX Applications Processors | NXP Semiconductors 1. Download the "Documentation" and the "Install Source Package".  2. Follow the Android User's Guide to build the Android BSP for i.MX8MN EVK first.  According to the android_build/.repo/manifests/aosp-android-15.0.0_2.0.0.xml, you will see the AOSP version is android-15.0.0_r32. Now, follow the PN7160/PN7220 – Android 15 porting guide to porting the NFC to i.MX Android BSP.  1. Kernel Driver : To establish connection with the PN7220 or PN7160, the Android stack uses the nxpnfc kernel driver.  You could download the driver from github below: nfcandroid_platform_drivers/drivers at br_ar_16_comm_infra_dev · nxp-nfc-infra/nfcandroid_platform_drivers · GitHub git clone "https://github.com/nxp-nfc-infra/nfcandroid_platform_drivers.git" -b br_ar_16_comm_infra_dev There is driver for Kernel 6.6 and 6.12. So, please download the correct one for your porting. For example, the kernel in i.MX Android BSP Android 15.0.0_2.0.0 is 6.12. So I will use the 6.12 driver for my porting. In your porting, make sure the PATH in Makefile and Kconfig files are setting properly.  For example in my porting: android_build/vendor/nxp-opensource/kernel_imx/drivers/nfc$ tree . ├── Kconfig ├── Makefile └── pn7160         ├── common.c         ├── common.h         ├── i2c_drv.c         ├── i2c_drv.h         ├── Kbuild         ├── Kconfig         ├── Makefile         ├── spi_drv.c         └── spi_drv.h 1 directory, 11 files android_build/vendor/nxp-opensource/kernel_imx/drivers/nfc$ cat Makefile # # Makefile for the kernel nfc device drivers. # obj-y += pn7160/ android_build/vendor/nxp-opensource/kernel_imx/drivers/nfc$ cat Kconfig source "drivers/nfc/pn7160/Kconfig" 2. Adding the "nxpnfc" to the i.MX8MN EVK device tree file. Show the connections table on the board. Show the pictures &i2c3 { clock-frequency = <100000>; pinctrl-names = "default", "gpio"; pinctrl-0 = <&pinctrl_i2c3>; pinctrl-1 = <&pinctrl_i2c3_gpio>; scl-gpios = <&gpio5 18 GPIO_ACTIVE_HIGH>; sda-gpios = <&gpio5 19 GPIO_ACTIVE_HIGH>; status = "okay"; nxpnfc@28{ compatible = "nxp,nxpnfc"; reg = <0x28>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_nfc>; nxp,nxpnfc-irq = <&gpio3 22 0>; nxp,nxpnfc-ven = <&gpio3 20 0>; nxp,nxpnfc-fw-dwnld = <&gpio3 21 0>; }; &iomuxc {         pinctrl_nfc: nfcgrp {                 fsl,pins = <                         MX8MN_IOMUX_SAI5_RXC_GPIO3_IO20                 0X19  // VEN                         MX8MN_IOMUX_SAI5_RXD0_GPIO3_IO21                0X19  // FW-DWNLD                         MX8MN_IOMUX_SAI5_RXD1_GPIO3_IO22                0X19  // IRQ                 >;         }; Show the schematic.  3. Modify the imx8mn_gki.fragment nano vendor/nxp-opensource/kernel_imx/arch/arm64/configs/imx8mn_gki.fragment Add the CONFIG_NXP_NFC_I2C=m 4. Go to the device/nxp/imx8m/evk_8mn/  Modify the BoardConfig.mk. # selinux permissive +BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive BOARD_SEPOLICY_DIRS := \        $(CONFIG_REPO_PATH)/imx8m/sepolicy \        $(IMX_DEVICE_PATH)/sepolicy  \ +       vendor/nxp/nfc/sepolicy \ +       vendor/nxp/nfc/sepolicy/nfc ShareBoardConfig.mk     $(KERNEL_OUT)/drivers/net/phy/realtek.ko \     $(KERNEL_OUT)/drivers/pps/pps_core.ko \     $(KERNEL_OUT)/drivers/ptp/ptp.ko \     $(KERNEL_OUT)/drivers/net/ethernet/freescale/fec.ko +    $(KERNEL_OUT)/drivers/nfc/nfc/nxpnfc-i2c.ko endif     $(KERNEL_OUT)/drivers/trusty/trusty-core.ko \     $(KERNEL_OUT)/drivers/trusty/trusty-log.ko \     $(KERNEL_OUT)/drivers/trusty/trusty-ipc.ko \     $(KERNEL_OUT)/drivers/trusty/trusty-virtio.ko \ +    $(KERNEL_OUT)/drivers/nfc/nfc/nxpnfc-i2c.ko else BOARD_VENDOR_RAMDISK_KERNEL_MODULES += \     $(KERNEL_OUT)/drivers/input/touchscreen/goodix_ts.ko \     $(KERNEL_OUT)/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_i2c.ko Endif Compatibility_matrix.xml             netutils-wrapper         1.0                 android.hardware.emvco         1                      IEmvco             default             device_framework_matrix.xml             nxp.hardware.secureime         1                     ISecureIME             default                         nxp.hardware.imx_dek_extractor         1                     IDek_Extractor             default                         vendor.nxp.nxpnfc         2.0                     INxpNfc             default                         android.hardware.emvco         1                     IEmvco             default             evk_8mn.mk # -------@block_bluetooth------- # Bluetooth HAL PRODUCT_PACKAGES += \     android.hardware.bluetooth \     android.hardware.bluetooth-service.default.nxp # NXP 8987 Bluetooth vendor config PRODUCT_PACKAGES += \     bt_vendor.conf # ------nfc------- $(call inherit-product, vendor/nxp/nfc/device-nfc.mk) $(call inherit-product, vendor/nxp/emvco/device-emvco.mk) PRODUCT_PACKAGES += \         android.hardware.nfc-service.nxp PRODUCT_PACKAGES += \         com.nxp.emvco \         com.nxp.nfc \         nfc_nci_nxp_pn72xx # -------@block_usb------- Init.rc on post-fs && property:vendor.skip.charger_not_need=0     # Swap in only 1 page at a time     write /proc/sys/vm/page-cluster 0     # Grant permission for fetching available_pages info of statsd     chown system system /proc/pagetypeinfo     chmod 0440 /proc/pagetypeinfo     exec u:r:vendor_modprobe:s0 -- /vendor/bin/modprobe -a -d \     /vendor/lib/modules nxpnfc_i2c     write /sys/power/wake_lock nosleep on post-fs-data && property:vendor.skip.charger_not_need=0     setprop vold.post_fs_data_done 1 ueventd.nxp.rc /sys/devices/virtual/thermal/thermal_zone* trip_point_0_hyst 0660 system system /sys/devices/virtual/thermal/thermal_zone* trip_point_1_hyst 0660 system system /dev/dmabuf_imx           0664   system     system /sys/class/backlight/* brightness 0660 system system /dev/ttymxc1              0666   nfc   nfc /dev/ttymxc2              0666   nfc   nfc /dev/nxpnfc               0666   nfc   nfc # for libcamera /dev/media* 0660 system camera /dev/v4l-subdev* 0660 system camera 5.  hardware/interfaces/compatibility_matrices/compatibility_matrix.202404.xml             android.hardware.wifi.hostapd         1                     IHostapd             default                         android.hardware.wifi.supplicant         2                     ISupplicant             default                         nxp.hardware.imx_dek_extractor         1                     IDek_Extractor             default                         vendor.nxp.nxpnfc         2.0                     INxpNfc             default                         vendor.nxp.emvco         1                     INxpEmvco             default             6.  android_build/vendor/nxp/nfc/device-nfc.mk android_build/vendor/nxp/emvco/device-emvco.mk Two approach. 1. NXP NFC Patch to Android AOSP and then build. If the Android release is too new, It will be a lot of errors, 2. Copy the R1 files to R30 first, then run NXP NFC patch. Then build. I use the second. Download the AOSP R1 source code. Copy the R1 replace the folders below. Apply the patches. build the code. Here is the error list and the reference solution.
查看全文
i.MX6DL PCIe x1 Gen1 链路训练失败 我们使用的是运行内核 5.10.235 的 i.MX6DL,出现了 PCIe Gen1 链路训练问题。日志显示,链接训练从未完成--链接在不断地重新训练。Debug0 寄存器显示链路不稳定,表明某些东西正在触发信号再训练。 观察到的 LTSSM 过渡: L0 → S_POLL_CONFIG → S_RCVRY_RCVRCFG → S_CFG_LINKWD_START → S_POLL_CONFIG 我们还注意到,尽管 pcii-imx6.c 和 pcii-imx6.c 寄存器的 LnkCap 寄存器值(每个电源周期)都会发生变化,但 LnkCap 寄存器的值并没有改变。和 pcie-designware.c为 Gen1 明确配置链路。还有什么可能会修改这个寄存器? 示例: 情况 1:0x1ffc07c = 值 0x0011cc12 LnkCap:端口 #0,速度 5GT/s,宽度 x1,ASPM L0s/L1,退出延迟 L0s<1us,L1<8us LnkCtl2:目标链接速度 2.5GT/s 情况 2:0x1ffc07c = 值 0x00100001 LnkCap:端口 #0,速度 2.5GT/s,宽度 x1,ASPM L0s/L1,退出延迟 L0s<1us,L1 无限制 LnkCtl2:目标链接速度 2.5GT/s 此外,禁用加扰器似乎能稳定链路: devmem2 0x1ffc710 w 0x00010122 查找以下信息: 1.最初达到 L0 后会触发信号链路再训练什么? 2。还有哪些硬件/软件部分可能会修改 LNKCap? 详情请见附件。 Re: i.MX6DL PCIe x1 Gen1 Link Training Failure 你好 1。关于达到 L0 状态后可能触发链路重新训练的因素: -PCIe 通道上的信号完整性问题可能导致链路不稳定 -电源波动或噪声影响 PCIe PHY -时钟抖动或 PCIe 参考时钟不稳定-与 PCIe 走线阻抗或长度匹配 相关的硬件设计问题 -可能引发不必要的重新训练的软件/驱动程序错误 2. 对于波动的 LnkCap 寄存器值: -寄存器可以通过硬件初始化序列和软件驱动程序进行修改 -在 i.MX6 PCIe 实现中,都是 pci-imx6.c和 pcie-designware.c尝试配置链路参数 -链路能力协商在训练期间进行,值可能会根据终端设备报告的内容进行调整。 您观察到禁用加扰器会稳定链路 (devmem2 0x1ffc710 w 0x00010122),这表明存在潜在的信号完整性或时钟问题。这与之前通过硬件调整解决 i.MX6 平台 PCIe 链路稳定性问题的情况一致。 我建议查阅 i.MX 6Dual/6Quad 和 i.MX 6Solo/6DualLite " 的应用笔记 AN4784 " PCIe 认证指南,其中包含专门针对 i.MX6DL 平台的详细PCIe SERDES 设置信息。本文档提供全面的 PCIe 认证指导,有助于解决间歇性链路培训故障。 对于特定的持续再训练问题,请考虑: -验证 PCIe 参考时钟信号质量和抖动 -检查 PCB 设计中的走线长度是否匹配-确认 PCIe 通道上的端接和阻抗正确 -检查负载条件 下的电力轨道 稳定性您看到的 LNKCap 寄存器修改可能与初始化序列期间的硬件级寄存器访问有关,可能受到 PHY 校准变化的影响。 此致 Re: i.MX6DL PCIe x1 Gen1 Link Training Failure 再补充一些细节。 根据下面的观察结果,禁用加扰器时 Gen1 链路是稳定的。有没有办法强制主机只进行第一代训练,而不尝试第二代? * LnkCap is 5GT/s root# lspci -s 00:00.0 -vv |grep LnkCap LnkCap: Port #0, Speed 5GT/s, Width x1, ASPM L0s L1, Exit Latency L0s <1us, L1 root# devmem2 0x1ffc07c /dev/mem opened. Memory mapped at address 0xb6f5c000. Read at address 0x01FFC07C (0xb6f5c07c): 0x0011CC12 <<< gen2 root# ltssm_debug.sh |grep curr LTSSM current state | 0x7 | S_CFG_LINKWD_START LTSSM current state | 0x11 | S_L0 LTSSM current state | 0x7 | S_CFG_LINKWD_START LTSSM current state | 0xf | S_RCVRY_RCVRCFG * Setting Lnkcap to gen1 but value is getting overwritten root# devmem2 0x1ffc07c w 0x00100011 root# devmem2 0x1ffc07c /dev/mem opened. Memory mapped at address 0xb6fb1000. Read at address 0x01FFC07C (0xb6fb107c): 0x0011CC12 root# ltssm_debug.sh |grep curr LTSSM current state | 0x7 | S_CFG_LINKWD_START LTSSM current state | 0xf | S_RCVRY_RCVRCFG LTSSM current state | 0x7 | S_CFG_LINKWD_START * Disable scrambler root# devmem2 0x1ffc710 w 0x00010122 root# devmem2 0x1ffc710 /dev/mem opened. Memory mapped at address 0xb6f66000. Read at address 0x01FFC710 (0xb6f66710): 0x00010122 * LnkCap was set to Gen1 again, and the value remains stable. root# devmem2 0x1ffc07c w 0x00100011 root# devmem2 0x1ffc07c /dev/mem opened. Memory mapped at address 0xb6f0a000. Read at address 0x01FFC07C (0xb6f0a07c): 0x00100011 * Gen1 changes reflected here root# lspci -s 00:00.0 -vv |grep LnkCap LnkCap: Port #0, Speed 2.5GT/s, Width x1, ASPM not supported root:~# ltssm_debug.sh |grep curr LTSSM current state | 0x11 | S_L0 LTSSM current state | 0x11 | S_L0 Link stable. 谢谢! Re: i.MX6DL PCIe x1 Gen1 Link Training Failure 你好 感谢您的指点。 但是,如果我们强制将链路速度设为 Gen1,那么在什么情况下,硬件仍能将链路能力宣传为 Gen2 并启用ASPM 相关选项? 例如,我们看到 LnkCap: Port #0, Speed 5GT/s, Width x1, ASPM L0s L1, Exit Latency L0s <1us, L1 <8us 我们还在训练序列中观察到5 GT/s和自主变化 TS1。 TS1/TS2 日志附后。 谢谢!
查看全文