Multi Source Translation Content

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Multi Source Translation Content

Discussions

Sort by:
GUI Guider v1.7.2 オフライン テンプレートをダウンロードできません。 公式サイトからGUI Guider v1.7.2 オフライン テンプレートをダウンロードできません。ダウンロードしたバージョンは自動的に最新の 1.10.1 バージョンに更新されます。サーバーのリソース パスが正しいかどうかを確認してください。 Re: I can't download the GUI Guider v1.7.2 Offline Template. こんにちは@zzxx 、 この問題を報告していただきありがとうございます。試してみましたが、まさに説明どおりに動作しました。これを社内チームに報告し、修正が提供されるのを待ちます。 BR セレステ Re: I can't download the GUI Guider v1.7.2 Offline Template. こんにちは@zzxx 、 現時点ではこの問題に関してそれ以上の進展はありません。クリスマス休暇および EMEA と AMEC のタイム ゾーン全体の休日期間のため、プロセッシング時間は通常より長くなる場合がありますのでご了承ください。 皆様のご理解とご協力に心より感謝申し上げます。 楽しい一日をお過ごしください! BR セレステ Re: I can't download the GUI Guider v1.7.2 Offline Template. こんにちは@zzxx 、 すべてが順調に進んでいることを祈っています。問題が解決したことをお知らせしたかったのです。   BR セレステ    
View full article
无法将 iMX93EVK 中的 lpuart1 更改为 lpuart7 在过去的一个多月里,我一直在尝试将默认控制台从 lpuart1 更改为 lpuart7。我想更改 linux 控制台和 u-boot 控制台,或者至少我想查看日志。这是为了让 iMX93EVk 的 SOC 在新的载体上工作。然而,我却无法做到这一点。这是我尝试使用的补丁。还有我发现的所有我认为可以帮助我的帖子。我错过了什么? i-MX-93-91-使用yocto项目调试控制台重定位 i-MX-Processors/Change-UART-for-imx93-in-uboot-and-kernel i-MX 处理器/imx8ULP 将 u-boot 串行控制台从 UART5 更改为 UART4 非常感谢你们的帮助,谢谢 Linux Re: Cant change lpuart1 to lpuart7 in iMX93EVK 你好 要成功地将调试控制台从 lpuart1 更改为 lpuart7,你需要修改三个关键元器件:U-启动、Arm 可信固件和 Linux 内核配置。 完整解决方案: 1.对于 U-Boot(lf_v2024.04 分支): - 修改设备树文件以更新控制台路径和引脚配置 - 更新板配置以指向 lpuart7 - 使用 imx93_11x11_evk_defconfig 作为配置基础 2. 对于 Arm 可信固件(lf_v2.10 分支): - 更改 ATF 源中的 UART 控制台位置 - 更新 IMX_LPUART_BASE 以指向 lpuart7 的基址 - 在取消设置 LDFLAGS 后使用 "make plat=imx93" 构建 3. 对于 Linux 内核: -将 bootargs 更新为引用 ttylP6(对应于 lpuart7) -更新设备树中的选定部分 该过程需要使用这些修改后的元器件重建 flash.bin 映像。另一位客户需要将 i.MX93 上的 UART1 重新映射到 UART8,也成功解决了类似问题。 此致 Re: Cant change lpuart1 to lpuart7 in iMX93EVK 谢谢,我无法确认该解决方案是否有效。我已经执行了您的所有更改,但发现错误出在硬件本身。一旦定制载体修好了,一切都测试好了,我就可以确认了。 感谢您的回复
View full article
HSEコンセプト こんにちは、NXPさん M7 と A53 から HSE に並行してアクセスするために、内部で同期が行われますでしょうか?完全に分離されていますか? M7 で SHE 仕様に従って HSE が使用され、A53 で pkcs11 に従って HSE が使用される場合、理論的にはそれらは互いのキーにアクセスできますか (一部の暗号化に同じキーを使用)?SHE でキーをプロビジョニングして、それを他のパーティションで使用することはできますか? s32g274を使用したカスタムボード よろしくお願いいたします。 あんぱ Re: HSE concept こんにちは、 @anpa711 ご投稿ありがとうございます。 1. 通常、M7 部分は 1 つの MU を介して HSE にアクセスしますが、A53 部分は別の MU を介して並行して HSE にアクセスする場合があり、HSE は内部ロジックに基づいてこれらの要件を処理し、ユーザーには透過的です。 2. HSE では、SHE キーは HSE_KEY_TYPE_SHE であり、共通操作は HSE_KEY_TYPE_AES である可能性がありますが、これらは HSE では異なるタイプであり、SHE 操作は SHE サービス経由でのみプロビジョニングできるため、 HSE_KEY_TYPE_SHE タイプのキーをエクスポートすることはできません。 BR チェイン Re: HSE concept こんにちは、 @anpa711 ご返信ありがとうございます。 はい、可能です。 BR チェイン Re: HSE concept こんにちは、 @anpa711 ご返信ありがとうございます。 1. S32G の観点からは、HSE_DEMOAPP に含まれる SHE ベースのセキュア ブート デモのみが提供されています。これは、NXP アカウントの HSE FW ダウンロード ページから入手できます。 2. S32K の部分については、あまり詳しくないので申し訳ありませんが、返信は、この掲示板に返信した同僚によって提供されるはずです: https://community.nxp.com/t5/S32K/bd-p/S32K BR チェイン Re: HSE concept こんにちは、 chenyin_hさん ありがとう、これは良さそうです。 s32K および s32g の MCAL には、SHE 仕様 (EB Autosar スタックと MCAL を使用しています) に従って、または他の形式で、いくつかのキー プロビジョニング デモ/テストが付属していますか? よろしくお願いいたします。 あんぱ Re: HSE concept こんにちは、 chenyin_h さん 回答ありがとうございます。 1. わかりました。同期は必要ないようですね。 2. キーを抽出するつもりはなく、次のUSE CASEを意味しました。SHE 仕様では、AES キーをスロット 8 にプロビジョニングします。このキーが存在する場合、A53 側でこのキーを使用して pkcs11 を使用して復号化/暗号化します。これは可能ですか? よろしくお願いいたします。 あんぱ
View full article
串行下载器 - 奇怪的问题 我在 RT1052 上遇到了一个奇怪的问题,如果我将启动引脚配置为串行启动。 它无法启动固件,也不会进入串行下载器模式(既不是 UART 或非 USB)。 但当我将 GPIO_B0_15 下拉至 GND 时,串行下载正常工作。 我找不到任何关于这个信号对启动过程的影响的文档。 - 处理器出厂时是全新的 - TXD1/RXD1 有上拉电阻 顺便说一下:烧录 BT_FUSE_SEL 串行下载后可以正常工作 我们已经开发了几个类似的电路,以前从未遇到过这个问题。
View full article
在 FRDM-IMX93 上使用 GPIO 如何使用 FRDM-IMX93 板上的 GPIO?像简单的 GPIO、CAN、I2c 等? 谢谢 拉尔夫
View full article
GD3162 新しい回路図デザインで GD3162 ゲート ドライバを使用する予定です。NXP のサイトで短いデータシートを見つけました。完全なデータシートはありますか? Re: GD3162 この製品に関して要求されたドキュメントは管理リリース下にあり、NDA (秘密保持契約) に基づいてセキュア ファイル経由でアクセスできます。 アクセスをリクエストするには、こちらをクリックしてください: https://www.nxp.com/webapp-signup/docstoreReg  フォームの送信時に、有効な NDA のコピーをアップロードするよう求められることにご注意ください。NXPについてにまだNDAがない場合は、まずNDAのフォームにご記入ください。 https://www.nxp.com/webapp-signup/ndaReqForm NDA の準備ができたら、安全なファイルへのアクセスをリクエストできます。 プロセスを理解するには、以下のリンク/FAQを確認してください。 https://www.nxp.com/support/support/secure-access-rights:SEC-ACCESS https://www.nxp.com/support/support/secure-access-rights/secure-access-rights-faqs:SEC-ACCESS-FAQS
View full article
S32G3:热关机 嗨,团队 硬件:基于 S32G3。 读取 1 区温度(A-core)时。当温度达到 "64 摄氏度 "时,硬件将重新启动。 下面是 Linux 系统的信息。连续读取三个区域的温度值,问题发生时的值如下。 64350(0 区) 64350(1 区) 62850(2 区) kernel[435]:[ 7919.187233] thermalthermal_zone1: a53_cores:达到临界温度,正在关闭 内核[435]:[ 7919.187252] 重新启动:硬件保护关闭(温度过高) 在 Linux DTS 中配置的警戒温度为 80 度,临界温度为 100 度,尽管我们配置了 100 度,但在 64 度时仍可观察到重启。 Re: S32G3: Thermal Shutdown 你好,@yellapu_anishkh 感谢您的回复。 自 BSP39 以来,有几个与 TMU 相关的问题,其中一些已在 BSP40 中修复,而另一些已在以后的版本中修复,如果可能的话,我建议在 BSP42 上对其进行测试 BR 切宁 Re: S32G3: Thermal Shutdown 您好, 我看到了该驱动程序的一个提交 (c5697686c8d19ff1edbce015fa5562ba2a2065e6)。评论中提到了它,但 Jira ID (ALB-10663) 并不匹配。请您确认一次。 Re: S32G3: Thermal Shutdown 你好,@yellapu_anishkh 感谢您的回复。 我检查了源代码,建议尽可能在 BSP42(或更新版本)下对您的情况进行测试,因为从这个版本开始应用了一些错误修复,从现有信息来看,您提到的错误也得到了修复。 BR 切宁 Re: S32G3: Thermal Shutdown 您好, 在 BSP39 上可以观察到这种情况,BSP39 版本说明中提到了以下问题。 我查看了从 BSP39 到 BSP44 的版本说明,发现当前的错误尚未修复。能否请您确认一下,是否已经修复? Re: S32G3: Thermal Shutdown 你好,@yellapu_anishkh 谢谢您的帖子。 我知道你可以在基于 S32G3 的定制板上对其进行测试,对吗?我能知道你在使用哪个版本的电路板支持包吗?一旦确认,我会首先检查内核代码。 BR 切宁
View full article
ADV7535:显示屏上无图像输出 嗨,团队、 我们正在基于 Verdin Yavia IMX8M Plus 的定制载板上开发 DSI 转 HDMI 变流器 ( ADV7535)。 我们已经替换了 ADV7535 而不是 LT8912B MIPI DSI 转 HDMI 桥接器 ,后者自带 Toradex 载板。我们使用 I2C 通道 2 与 ADV7535 DSI 转 HDMI 桥接器进行 通信,这与使用不同的 I2C 通道的 Yavia 载板不同。因此,我们对设备树进行了以下更新以反映这一变化: 设备树变更 1. verdin-imx8mp_dsi-to-hdmi_overlay.dts 删除现有 hdmi_lontium_lt8912 节点。 在 I2C2 节点下新增 hdmi_adv7535 节点。 2. imx8mp-verdin.dtsi 删除了 hdmi_lontium_lt8912 节点。 从 hdmi_connector 节点中删除了 Lontium 引脚连接细节。 已添加 hdmi_adv7535 作为 I2C2 下的子节点。   更改后的观察结果 成功读写 ADV7535 的内部寄存器。 能够转储 I2C 数据: torizon@verdin-imx8mp-15404184:~$ i2cdump -y -f 1 0x39 No size specified (using byte-data access) 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef 00: 14 00 00 00 00 00 00 00 00 00 41 0e bc 18 01 13 ?.........A????? 10: 25 37 00 00 00 00 38 00 46 62 04 a8 00 00 1c 84 %7....8.Fb??..?? 20: 1c bf 04 a8 1e 70 02 1e 00 00 04 a8 08 12 1b ac ?????p??..?????? 30: 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 b0 ...........?...? 40: 00 50 f0 76 10 68 68 68 68 00 80 00 00 00 00 00 .P?v?hhhh.?..... 50: 00 00 02 0d 6d 02 00 00 00 00 00 00 00 00 00 00 ..??m?.......... 60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 70: 01 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ??.............. 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 90: 00 00 00 00 c0 00 40 00 03 02 e0 18 30 61 00 00 ....?.@.????0a.. a0: 00 00 a4 a4 08 04 00 00 00 00 00 40 00 00 40 14 ..????.....@..@? b0: 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 ..........?..... c0: 00 00 00 00 00 00 06 00 00 03 00 00 02 00 01 04 ......?..?..?.?? d0: 0c ff 80 80 80 00 00 00 00 00 00 00 00 00 88 01 ?.???.........?? e0: d0 70 01 00 00 00 fd 00 00 00 52 46 00 00 00 00 ?p?...?...RF.... f0: 95 04 ff 00 00 00 00 00 00 00 7d aa 1c 00 b0 00 ??........}??.?. 检测 HDMI 显示器,并在 i.MX8MP 上检索 EDID 数据。HDMI-A -1 是 DSI 转 HDMI 端口,HDMI-A-2 是原生 HDMI 端口。 root@verdin-imx8mp-15288064:/home/torizon# cat /sys/class/drm/card0-HDMI-A-1/edid | edid-decode edid-decode (hex): 00 ff ff ff ff ff ff 00 30 ae 86 10 01 01 01 01 22 15 01 03 80 29 1a 78 ee e5 b5 a3 55 49 99 27 13 50 54 af ef 00 61 40 81 c0 81 80 81 8a 81 90 95 00 95 0f 01 01 64 19 00 40 41 00 26 30 18 88 36 00 a0 1d 00 00 00 18 00 00 00 fc 00 4c 45 4e 20 4c 31 39 35 30 77 44 0a 20 00 00 00 fd 00 32 4c 1e 51 0e 00 0a 20 20 20 20 20 20 00 00 00 ff 00 42 33 34 33 32 38 34 35 0a 20 20 20 20 01 0b 02 03 21 71 4e 06 07 02 03 15 96 11 12 13 04 14 05 1f 90 23 09 07 07 83 01 00 00 65 03 0c 00 10 00 8c 0a d0 90 20 40 31 20 0c 40 55 00 b9 88 21 00 00 18 01 1d 80 18 71 1c 16 20 58 2c 25 00 b9 88 21 00 00 9e 01 1d 80 d0 72 1c 16 20 10 2c 25 80 b9 88 21 00 00 9e 01 1d 00 bc 52 d0 1e 20 b8 28 55 40 b9 88 21 00 00 1e 02 3a 80 d0 72 38 2d 40 10 2c 45 80 b9 88 21 00 00 1e 00 00 00 00 d0   遇到的问题 连接的 HDMI 显示器上没有图像输出 。 dmesg 日志错误:   imx_sec_dsim_drv 32e60000.mipi_dsi: failed to get pmsk for: fin = 12000, fout = 0   故障排除尝试 我们尝试修改设备树中的 MIPI DSI 控制器时钟设置,如下所示: mipi_dsi: mipi_dsi@32e60000 { #address-cells = <1>; #size-cells = <0>; compatible = "fsl,imx8mp-mipi-dsim"; reg = <0x32e60000 0x10000>; clocks = <&media_blk_ctrl IMX8MP_CLK_MEDIA_BLK_CTRL_MIPI_DSI_PCLK>, <&media_blk_ctrl IMX8MP_CLK_MEDIA_BLK_CTRL_MIPI_DSI_CLKREF>; clock-names = "cfg", "pll-ref"; assigned-clocks = <&clk IMX8MP_CLK_MEDIA_MIPI_PHY1_REF>; assigned-clock-parents = <&clk IMX8MP_CLK_24M>; assigned-clock-rates = <11000000>; interrupts = 18 IRQ_TYPE_LEVEL_HIGH>; power-domains = <&mipi_phy1_pd>; status = "disabled"; port@0 { dsim_from_lcdif: endpoint { remote-endpoint = <&lcdif_to_dsim>; }; }; }; 不过,在 dmesg 日志中,默认频率仍显示为 12 MHz 。   要求澄清 我们希望您能就以下几点提供指导: 如何正确更新 fin 和 fout 的值,以解决 pmsk 错误? 要通过 ADV7535 实现正确的图像输出,是否需要对设备树进行任何其他更改? 期待您的见解和建议。 请参阅随附的 dmesg 日志,该话题中的设备树叠加层。 谢谢& , Rupesh Kathar imx8mplus#adv7535 #dsi #hdmi #mipi #i2c #i2s i.MX 8M | i.MX 8M Mini | i.MX 8M Nano Re: ADV7535: No image output on display 如果您使用的是 5.15,只需将分支更改为 5.15,因为您的源代码是第三方公司的,我不清楚您的驱动程序如何,但请参考 nxp adv7535 驱动程序 linux-imx/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c at lf-5.15.y - nxp-imx/linux-imx - GitHub 并不是所有的分辨率都能支持,有效时钟如下,如果需要新时钟,必须在时钟驱动程序中添加新时钟。 静态常量 int valid_clocks[] = { 148500, 135000, 132000, 108000, 78750, 74250, 65000, 49500, 40000, 31500, }; Re: ADV7535: No image output on display 您好@joanxie, 感谢您对恩智浦内核源代码的指导。 我们已经使我们的设备树与恩智浦内核5.15y(不是你共享的6.12)的imx8mp-evk.dts保持一致,我们的显示器适用于某些分辨率,但不适用于我们的目标分辨率,即1024x768。 除了 adv7535 的设备树外,我们没有做任何其他更改。使用 Toradex 内核 5.15.2.x。 下面的表格列出了哪些方法有效,哪些方法无效。 分辨率 宽高比 标准 常见刷新率 Realtek 显示器 戴尔显示器 640×480 4:3 双向 60 赫兹 工作 工作 800×600 4:3 VESA 60-75 赫兹 工作 工作 1024×768 4:3 VESA 60-75 赫兹 空白/闪烁时 禁用 内部定时发生器 无输出 1280×768 5:3 VESA 60 赫兹 无输出 无输出 1280×720 16:9 双向 24/25/30/50/60 赫兹 工作 工作 1366×768 16:9 VESA 60 赫兹 无输出 无输出 1920×1080p 16:9 双向 24/25/30/50/60 赫兹 工作 工作 只有 1024x768 不工作的可能原因是什么?其他分辨率只需插入 HDMI 即可正常工作。 Re: ADV7535: No image output on display 我之前已经分享过 imx8mp dts 文件,首先,您需要在 dts 中正确设置该桥接器,然后 adv7535 驱动程序就会 https://github.com/nxp-imx/linux-imx/blob/lf-6.12.y/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c Re: ADV7535: No image output on display 嗨 @joanxie, FYR,我们正在使用类似于 Toradex 的 Yavia 载板的定制板。唯一的变化是用 ADV7535 取代了 lontium DSI 转 HDMI 适配器。我们选用 ADV7535,因为恩智浦也在其部分产品中使用该器件。 因此,我们在 Toradex 为 Yavia-WiFi dts 提供的设备树及其父设备树源的基础上进行了设备树修改。 问题中的设备树节点是 1。MIPI-DSI-这里没有修改任何内容(与之前的文章不同,改回了默认值)。其他恩智浦设备也必须使用它。 2。ADV7535 特定的节点和叠加层,我们在上一篇文章中提供了。 驱动程序为sec_mipi_dsim-imx.c,sec-dsim.c,adv7511_drv.c,adv7533.c. 现在,在调整了设备树叠加层之后。我们不再收到 fin、fout 错误。 以下是上述驱动程序的 dev_dbg 日志。 torizon@verdin-imx8mp-15404184:~$ dmesg | grep drm [ 0.000000] Kernel command line: root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_defau lt=0 plymouth.ignore-serial-consoles splash fbcon=map:3 ostree=/ostree/boot.1/torizon/7b778d635701b4e0bbc49652c 421a587ae63ff3c6cbfc07d964084a23df7631d/0 [ 2.771129] imx-drm display-subsystem: bound imx-lcdifv3-crtc.0 (ops lcdifv3_crtc_ops) [ 2.771181] imx-drm display-subsystem: bound imx-lcdifv3-crtc.1 (ops lcdifv3_crtc_ops) [ 2.772099] imx-drm display-subsystem: bound 32e60000.mipi_dsi (ops imx_sec_dsim_ops [sec_mipi_dsim_imx]) [ 2.772141] imx-drm display-subsystem: bound 32fd8000.hdmi (ops dw_hdmi_imx_ops) [ 2.772468] [drm] Initialized imx-drm 1.0.0 20120507 for display-subsystem on minor 0 [ 2.869610] imx-drm display-subsystem: [drm] fb0: imx-drmdrmfb frame buffer device [ 5.099098] systemd[1]: Starting Load Kernel Module drm... [ 5.188031] systemd[1]: [email protected]: Deactivated successfully. [ 5.188992] systemd[1]: Finished Load Kernel Module drm. [ 5.262319] [drm] Initialized vivante 1.0.0 20170808 for 40000000.mix_gpu_ml on minor 1 torizon@verdin-imx8mp-15404184:~$ dmesg | grep dsim [ 0.000000] Kernel command line: root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_defau lt=0 plymouth.ignore-serial-consoles splash fbcon=map:3 ostree=/ostree/boot.1/torizon/7b778d635701b4e0bbc49652c 421a587ae63ff3c6cbfc07d964084a23df7631d/0 dy [ 2.759952] Kernel module loaded from ramdisk: sec_dsim - result: 0 [ 2.771246] imx_sec_dsim_drv 32e60000.mipi_dsi: sec-dsim bridge bind begin [ 2.771290] imx_sec_dsim_drv 32e60000.mipi_dsi: version number is 0x1060200 [ 2.772085] imx_sec_dsim_drv 32e60000.mipi_dsi: sec-dsim bridge bind end [ 2.772099] imx-drm display-subsystem: bound 32e60000.mipi_dsi (ops imx_sec_dsim_ops [sec_mipi_dsim_imx]) [ 2.916294] Kernel module loaded from ramdisk: sec_mipi_dsim_imx - result: 0 [ 3.259164] imx_sec_dsim_drv 32e60000.mipi_dsi: p: min = 1, max = 6, m: min = 88, max = 1023, s: min = 0, ma x = 5 [ 3.259252] imx_sec_dsim_drv 32e60000.mipi_dsi: fout = 390000, fin = 12000, m = 130, p = 1, s = 2, best_delt a = 0 [ 3.259262] imx_sec_dsim_drv 32e60000.mipi_dsi: no pre-exist hpar can be used [ 18.521539] imx_sec_dsim_drv 32e60000.mipi_dsi: p: min = 1, max = 6, m: min = 88, max = 1023, s: min = 0, ma x = 5 [ 18.521629] imx_sec_dsim_drv 32e60000.mipi_dsi: fout = 390000, fin = 12000, m = 130, p = 1, s = 2, best_delt a = 0 [ 18.521640] imx_sec_dsim_drv 32e60000.mipi_dsi: no pre-exist hpar can be used torizon@verdin-imx8mp-15404184:~$ dmesg | grep adv [ 0.000000] Kernel command line: root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:3 ostree=/ostree/boot.1/torizon/7b778d635701b4e0bbc49652c421a587ae63ff3c6cbfc07d964084a23df7631d/0 [ 1.052362] adv7511 1-0039: Rev. 20 [ 4.325789] systemd[1]: System time before build time, advancing clock. torizon@verdin-imx8mp-15404184:~$ 有了它,我们还能通过使用 i2cset 直接在 ADV7535 上设置寄存器来生成测试色条图案,这意味着 ADV7535 至 HDMI Sink 显示器的工作正常。问题出在 iMX8MP 与 ADV7535 的通信方式上。 显示屏上仍然没有任何输出。 我们希望了解,恩智浦在其产品中实现 ADV7535 的方式与我们在软件和硬件方法上实现 ADV7535 的方式是否存在差异。 Re: ADV7535: No image output on display 看来这个错误信息是你自己的驱动程序造成的,我在 nxp 驱动程序源代码中没有找到这个信息,而且这个设置也不正确,你无法获得你想要的任何时钟,时钟父频是 24Mhz,如果你设置了 11Mhz,你只能获得 24/2=12Mhz 的时钟、 assigned-clock-parents = <&clk IMX8MP_CLK_24M>; assigned-clock-rates = <11000000>; 你可以参考恩智浦源代码作为参考,检查你关于 lcdif、mipi dsi 和 adv7535 的设置是否正确 linux-imx/arch/arm64/启动/dts/freescale/imx8mp-evk.dts 位于 lf-6.12.y · nxp-imx/linux-imx · GitHub linux-imx/arch/arm64/启动/dts/freescale/imx8mp.dtsi 位于 lf-6.12.y · nxp-imx/linux-imx · GitHub 参考日志,似乎 pll 设置不正确,pll 驱动程序在 linux-imx/drivers/gpu/drm/imx/sec_mipi_pll_1432x.h at lf-6.12.y - nxp-imx/linux-imx - GitHub 您可以仔细检查
View full article
S32K396s ブートラウダー S32K396sブートローダープロジェクトでは、ldファイルをどのように変更すればよいでしょうか?K396用のブートローダーの例はありますか? Re: S32K396s bootlouder こんにちは、 1. S32K3シリーズ用統合ブートローダデモ NXP は、S32K396 を含む S32K3 ファミリをサポートする統合ブートローダ デモを提供しています。このデモには以下が含まれます: ブートローダーとアプリケーションプロジェクト フラッシュ・メモリ・コンフィグレーション 起動とアプリケーションへのジャンプロジック 公式投稿とダウンロード リンクは、こちらにあります: NXPコミュニティの統合ブートローダー デモ。 https://community.nxp.com/t5/S32K-Knowledge-Base/Unified-bootloader-Demo/ta-p/1423099 2. S32 Design Studio(S32DS)とRTD ブートローダの例を使用するには、次のものが必要です。 S32 Design Studio (S32DS) S32K3 リアルタイム ドライバ (RTD) パッケージ S32K396開発パッケージ これらは、S32DS の拡張機能と更新メニューからCANインストールできます。インストールしたら、次のようなサンプル テンプレートから新しいプロジェクトを作成 CAN。 ポート_例_S32K396 Bootloader_Example (RTD バージョンで利用可能な場合) セットアップの詳細については、S32K396-BGA-DC1のスタートガイドをご覧ください。 https://www.nxp.com/document/guide/getting-started-with-s32k396-bga-dc1-evaluation-board:GS-S32K396-BGA-DC1?section=get-software よろしくお願いいたします。 ピーター
View full article
MCUXpresso SDK:CI/CD 流水线 概述 在不断发展的嵌入式系统开发领域,支持自动化和高效的工作流程变得越来越重要。本文将探讨如何使用 GitHub Actions、Docker、MCUXpresso SDK 和 Visual Studio Code 为嵌入式项目量身打造一个强大的 CI/CD 管道。通过集成这些工具,开发人员可以自动构建、运行测试,并确保在不同团队和环境中一致地交付固件。 我们首先概述了 CI/CD 在嵌入式工作流程中的优势,包括更快的迭代周期、减少人为错误以及增强协作。接下来,我们深入探讨实际设置:使用 Docker 封装构建环境,利用 GitHub Actions 协调构建和测试,以及在 VS Code 中借助 MCUXpresso SDK 来管理和开发固件项目。真实案例和可重复使用的模板将引导读者创建一个可扩展、可维护且针对基于恩智浦的开发板进行了优化的管道。 无论您是希望实现工作流程现代化的嵌入式工程师,还是希望缩短交付时间的产品经理,本指南都将帮助您在开发生命周期中利用自动化的力量。 前提条件 MCUXpresso for VS Code MCUXpresso SDK 24.12 或更高版本 Git GitHub 帐户 Docker 目录 嵌入式工作流程中的 CI/CD 优势 容器 - Docker 自动化 - GitHub Actions 使用流水线 结束语 1. CI/CD 在嵌入式工作流中的优势 在嵌入式系统开发中实施持续集成和持续部署 (CI/CD) 具有变革性优势,尤其是在使用 MCUXpresso SDK 等复杂工具链和特定硬件限制时。以下是主要优势: 自动构建和测试 CI/CD 管道通过自动编译、链接和闪存流程,消除了手动构建步骤。这可确保每次代码更改都能在一致的构建环境中得到验证,从而降低人为错误的风险,节省宝贵的工程时间。 及早发现问题 通过将自动单元测试、静态分析和在环硬件 (HIL) 测试集成到管道中,开发者可以在错误和回归进入生产硬件前及早发现。这将使固件更加稳定,减少集成过程中的意外情况。 使用 Docker 实现一致的环境 使用 Docker 对构建环境进行容器化,可确保开发机器和 CI 运行程序之间的一致性。开发人员不再需要担心工具链版本不匹配或依赖项缺失的问题,一切都已定义并可重现。 改善协作和代码质量 CI/CD 鼓励频繁提交和拉取请求,这些请求会自动验证。这促进了团队成员间更好的协作,执行编码标准,并确保只有经过测试的代码被合并到主分支中。 更快的迭代和部署 借助自动化管道,固件更新可以快速构建、测试并部署到目标设备或暂存环境中。这加快了开发周期,实现了快速原型开发,尤其适用于敏捷或迭代开发模式。 可追溯性和可审计性 CI/CD 系统会记录每一次构建、测试结果和部署,从而提供清晰的更改历史记录。这对于在汽车或医疗设备等受监管行业中进行调试、确保合规性和维持高质量标准至关重要。 跨项目的可扩展性 管道一旦建立,就可以在多个嵌入式项目中重复使用或调整。这种可扩展性减少了新板或应用程序的设置时间,并促进了团队之间的最佳实践。 2. 容器 - Docker 什么是容器? 容器是轻量级、可移植的软件单元,它将代码与其所有依赖项、库和配置文件组成一个代码包,因此可以在不同的计算环境中可靠地运行。 将容器视为一个独立的盒子,其中包含应用程序运行所需的一切。有几个平台可以用来容器化工作区。本指南将重点介绍 Docker。 Docker是什么? Docker 是一个开源平台,它使开发人员能够在容器中构建、打包和运行应用程序。它简化了创建隔离环境的过程,该环境包括应用程序在不同系统上持续运行所需的代码、库、工具和设置等所有内容。 Docker 的核心是确保开发、测试和部署环境相同,无论您是在本地还是在云中工作,都能帮助解决“它在我的机器上运行”的问题。 使用 Docker 对 MCUXpresso SDK 和构建系统进行容器化的步骤 使用 Docker 对 MCUXpresso SDK 和构建系统进行容器化需要以下组件。 Dockerfile - 这是一个文本文件,其中定义了构建 Docker 镜像的步骤,例如安装软件包、复制文件和设置环境变量。 Docker 镜像 - 这是容器环境的快照。它由 Dockerfile 构建,用于创建容器。 Docker 容器 - Docker 镜像的运行实例。它具有隔离性、轻便性和便携性。 编写 dockerfile 1. 打开文本编辑器(例如 VS Code) 2. 创建一个新的文本文件。将其命名为 dockerfile。将此文件保存为 Docker 文件类型。 3. 创建用于容器化 MCUXpresso SDK 和构建系统的 dockerfile 时,必须指定所需的所有元器件。我们在下面提供了一个模板,你可以复制并粘贴到 dockerfile 中。 该模板的用途: - 使用 Ubuntu 22.04 作为容器的基础。这为构建和运行嵌入式工具提供了稳定的 Linux 环境。 - 防止安装期间出现交互式提示 - 安装使用 MCUXpresso SDK 所需的所有软件包(部分为可选软件包) 安装 ARM GNU 13.2 工具链 - 设置一个工作区,以便使用 West 克隆 MCUXpresso SDK - 配置工具链路径环境变量 # Use Ubuntu 22.04 as the base image FROM ubuntu:22.04 # Set environment variables for non-interactive installations ENV DEBIAN_FRONTEND=noninteractive # Install necessary packages /some optional RUN apt update && apt install -y \ curl \ wget \ ca-certificates \ xz-utils \ libncurses5 \ cmake \ ninja-build \ git \ python3 \ python3-pip \ build-essential \ device-tree-compiler \ unzip \ && rm -rf /var/lib/apt/lists/* # =========================================================================================================== # Notes on flags used: # (-LO) follows http redirects and saves the downloaded file with same name as in URL # (-k) ignores SSL certificate verification. This is needed when system security prevents certain actions # Contact IT to whitelist arm servers if needed. # ============================================================================================================ RUN curl -LO -k https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x86_64-arm-none-eabi.tar.xz && \ tar xf arm-gnu-toolchain-13.2.rel1-x86_64-arm-none-eabi.tar.xz && \ rm arm-gnu-toolchain-13.2.rel1-x86_64-arm-none-eabi.tar.xz # Install additional Python packages RUN pip3 install --upgrade west imgtool requests # Set the workspace directory WORKDIR /workspace # Clone the mcuxsdk-manifests repository RUN git clone https://github.com/nxp-mcuxpresso/mcuxsdk-manifests.git # Set the MCUXpresso SDK path environment variable ENV MCUX_SDK_PATH=/workspace/mcuxsdk-manifests # Initialize and update the west workspace RUN cd $MCUX_SDK_PATH && \ west init -l . && \ west update # ARMGCC ENV variable ENV ARMGCC_DIR=/arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi # Default command: Start a shell CMD ["/bin/bash"] 构建容器映像 在继续之前,建议设置一个 GitHub 存储库并配置凭据,以便在后续步骤中使用。 1. 创建一个新的存储库。暂时留空。稍后,它将包含以下项目: .github/workflows/docker-build.yml my_app dockerfile README.md 2. 生成个人访问令牌(PAT)。这将允许您访问 GitHub API。 - 点击“我的”图标 - 选择设置 > 开发者设置 > 个人访问令牌 > 令牌(经典版) - 选择“生成新令牌(经典)” - 范围可以根据您的需求自定义。请在本指南中使用以下范围:delete:packages、repo、write:packages - 点击“生成令牌”。生成令牌后,请务必复制并保存该令牌。 - 然后,将个人访问令牌 (PAT) 存储为 GitHub 密钥。GitHub 密钥将用于工作流文件中的身份验证。这样做是为了在不修改工作流文件的情况下提高可重用性、安全性和轮换性。 - 导航到已创建的存储库,然后单击“设置”。 - 选择密钥和变量,然后单击操作。 - 我们将在此处添加 2 个密钥。一个是用户名,另一个是个人访问令牌。点击“新建存储库密钥”。 用户名的密钥 - 这可以个性化定制。然而,在本指南稍后将介绍的工作流文件中,该变量设置为 GH_USERNAME。将名称设置为 GH_USERNAME。在 “密钥” 字段中输入您的 GitHub 用户名。 令牌的密钥 - 工作流已将变量设置为 GH_PAT。将名称设置为 GH_PAT。在 “密钥” 字段中粘贴您的个人访问令牌。 3. 现在我们可以通过命令行构建容器镜像。 - 克隆存储库的本地副本。打开该位置的命令行界面。 - 将 dockerfile 保存到克隆存储库的根目录下。 登录到 GitHub 容器注册表。运行: echo | docker login ghcr.io -u --password-stdin 输出: -构建容器镜像。这是本指南中最长的步骤,但只需构建一次镜像,就能将其推送到 ghcr 以供使用。运行: docker build -t . 输出: - 要验证您的镜像详细信息,请运行: docker images - 标记 Docker 镜像。此命令不会创建新镜像;它只为现有镜像提供新名称和标签。当你准备将镜像推送到像 GHCR 这样的注册表时尤其有用。Docker 要求在推送镜像前必须标记注册表 URL 和存储库名称。运行: docker tag - 将镜像推送到容器注册表。运行: docker push **注意:由于服务器错误,输出可能显示为失败。如果出现这种情况,只需再次运行该命令即可。 再次运行该命令: 恭喜!MCUXpresso SDK 和构建系统现已集成在容器镜像中,可以用于构建项目。接下来,我们将配置 GitHub 以实现自动化。 3. 自动化 - GitHub Actions 为什么要使用 GitHub Actions? GitHub Actions 是 GitHub 内置的自动化工具,允许你定义工作流,根据推送或拉取请求等事件来构建、测试和部署代码。它使用 YAML 文件来配置这些工作流,从而可以直接在存储库中轻松设置 CI/CD 管道。 1. 在本地克隆您的存储库。然后导航到其根目录。 - 在项目根目录内创建 .github/workflows 目录。 - 导航至 VS 代码并创建一个新文件。将其命名为:docker-build.yml - 我们在下面提供了一个模板,您可以将其复制并粘贴到 docker-build.ymll 中。 该模板的用途: 在推送或 PR 时运行 使用包含 MCUXpresso SDK 工具的容器 检查您的存储库 将您的应用复制到 West 工作区 使用 West 为 FRDM-MCXA153 构建它 name: Build MCUXpresso Project on: push: # branches: [ main ] pull_request: jobs: build: runs-on: ubuntu-latest container: image: ghcr.io/nxp-jose/mcuxpresso-sdk:latest steps: - name: Checkout repository uses: actions/checkout@v3 - name: Copy my_app into west workspace run: | cp -r $GITHUB_WORKSPACE/my_app /workspace/mcuxsdk-manifests/my_app - name: Build project using west working-directory: /workspace/mcuxsdk-manifests run: | echo "Building project..." west build -b frdmmcxa153 my_app 4. 使用管道 完成您的工作区设置 该过程的最后一步是创建一个项目以用于我们的管道。 1. 打开适用于 VS Code 的 MCUXpresso 2. 点击“从存储库导入示例” 3. 从 MCUXpresso SDK 24.12 或更高版本导入一个项目,作为独立示例。将导入位置设置为克隆存储库的根目录。 4. 将更改暂存、提交并推送到您的存储库。现在,您的存储库中应该包含: *注意:如果在本地构建项目,您将看到 .vscode 目录。将此目录推送到存储库是完全可选的。 5. 推送完成后,在 GitHub 上启用工作流。启用工作流后。连续的推送或拉取请求将触发自动项目构建。 6. 检查构建细节。 - 导航至 GitHub 上的“操作”选项卡 - “操作”选项卡将显示工作流已运行的所有实例。 - 点击“构建”查看详细信息。 - 显示的详细信息是构建过程中执行的各个步骤。点击步骤以查看具体详情。 5. 结论 本指南中概述的 CI/CD 管道为使用 Docker、MCUXpresso SDK 和 GitHub Actions 自动构建提供了一个简单而有效的起点。虽然该示例以基本工作流为重点,但可对其进行广泛自定义,以满足项目的特定需求,例如集成自动测试、添加质量检查或使用自定义 MCUXpresso SDK 清单。利用这些工具,团队可以简化开发流程,确保一致性,并以最少的人工干预来扩展流程。 MCUXpresso SDK
View full article
blhost を使用して LPC54(S)0xx フラッシュをプログラム/消去します 注:このドキュメントでは、フラッシュローダーに関する簡単な説明を提供し、フラッシュローダーの詳細については、 SDK_2.5.0_LPCXpresso54S018\middleware\mcu-boot\doc にある LPC540xxフラッシュローダーユーザーズGuide.pdf 入門を参照してください。 LPC54S0xx SDKをダウンロードします。 フラッシュローダープロジェクトをコンパイルしてflashloader.binを生成します プロジェクトはsdk \ boards \ lpcxpresso54s018 \ bootloader_examples \ flashloaderにあります dfu-util.exe または IDE を使用して、flashloader.bin を RAM にロードします。 dfu-util は http://dfu-util.sourceforge.net/releases/ からダウンロードできます。 ISPピンを構成してから、チップをリセットして、チップをUSB1 DFUブートモードにします。 ブート・モード ISP2の PIO0_6ピン ISP1 PIO0_5ピン ISP0 PIO0_4ピン 形容 USB1 DFUブート LOW LOW HIGH USB DFUクラスは、USB1高速ポートを介してSRAMにイメージをダウンロードするために使用されます。 LPC54S0xxデバイスUSB1高速ポートとPCをUSBで接続します。以下は、flashloader.binをロードするコマンドラインです。 dfu-util.exeドル –D flashloader.bin   blhost を使用して LPC540xxM/LPC54S0xxM フラッシュをプログラム/消去 フラッシュローダバイナリがダウンロードされ、LPC54S0xxプラットフォーム上で実行が開始され、LPC54S0xxプラットフォーム USB1(High-Speed) とホストの間に物理的なUSB接続が残ると、フラッシュローダはコマンドを受信する準備が整います。 blhost -u 0x1fc9,0x01a2 -- プロパティ 12 を取得 blhost -u 0x1fc9,0x01a2 -- メモリいっぱい 0x2000d000 4 0xc0000004 blhost -u 0x1fc9,0x01a2 -- configure-memory 0xa 0x2000d000 blhost -u 0x1fc9,0x01a2 -- プロパティ取得 25 0xa blhost -u 0x1fc9,0x01a2 -t 100000 -- フラッシュ消去領域0x10000000 0x100000 blhost -u 0x1fc9,0x01a2 -t 100000 -- 書き込みメモリ 0x10000000 xxx.bin 注:xxx.bin フラッシュにダウンロードする必要があるターゲットファイルです。 著者: ハオ・リュウ  Hao Liuさん、ありがとうございました。
View full article
FTF-ACC-F1247 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 本次会议将涵盖当前变更管理面临的各种主题,包括产品变更通知 (PCN) 对飞思卡尔客户的重要性(特别是在降低成本方面)以及产品和制造流程的质量改进。本次会议还将讨论从金线到铜线转变的几个方面,包括这一转变的技术细节、飞思卡尔为实现这一转变所做的工作、按产品系列进行的推出时间审查以及客户批准的重要性。FTF-ACC-F1247 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 本次会议将涵盖当前变更管理面临的各种主题,包括产品变更通知 (PCN) 对飞思卡尔客户的重要性(特别是在降低成本方面)以及产品和制造流程的质量改进。本次会议还将讨论从金线到铜线转变的几个方面,包括这一转变的技术细节、飞思卡尔为实现这一转变所做的工作、按产品系列进行的推出时间审查以及客户批准的重要性。FTF-ACC-F1247
View full article
i.MX 上的 wxWidgets <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 组装 wxWidgets 版本 2.8。使用 TinyX。由 4 英寸 - 8 英寸的触摸屏供电。
View full article
FRDM-i.MX95 上的外部 JTAG 调试器连接未输出预期的 JTAG 信号 你好, 我正在尝试将外部 JTAG 调试器连接到 FRDM-i.MX95 板。 根据板原理图,JTAG/DAP 信号似乎被连接到 PCB 上的测试点,一些相关元器件被标记为 DNP。 基于此,我对电路板进行了如下修改: 连接测试点的 JTAG 信号 安装与 JTAG/DAP 信号路径相关的 DNP 电阻器 添加了外部调试器的连接器 将 VTref、GND、TCK、TMS、TDI、TDO 和 RESET 连接到外部调试器 但是,我无法从调试器/电路板端观察到预期的 JTAG 信号输出。 例如,在调试器连接序列期间,TCK/TMS/TDI 没有按预期出现。 请您确认以下几点? 上述修改方法是否适用于将外部 JTAG 调试器连接到 FRDM-i.MX95 板? 要启用外部 JTAG/DAP 接口,是否需要额外的电阻器、跳线、焊桥或板修改? 外部调试器开始驱动 JTAG 信号之前,VTref 电压等级或电源时序是否有任何要求? FRDM-i.MX95 上的 i.MX95 在 JTAG/DAP 接口可访问之前是否需要任何启动模式、熔丝设置、网络安全设置或软件初始化? 外部 JTAG 调试器能否直接访问该板上的 Cortex-A55、Cortex-M33 和 Cortex-M7 内核,还是需要引导加载程序/固件进行额外的初始化? 在使用 FRDM-i.MX95 时,是否有推荐的连接器引脚分配或参考修改指南,以便将外部调试器与 FRDM-i.MX95 配合使用? 如果您能提供在 FRDM-i.MX95 板上启用外部 JTAG 调试的任何指导、原理图参考或所需修改细节,我将不胜感激。 顺祝商祺! Re: External JTAG debugger connection on FRDM-i.MX95 does not output expected JTAG signals 1. 你的修改方法是否正确? 原则上,是的。 如果 FRDM 原理图显示: TCK TMS TDI TDO nTRST 或 RESET VTREF GND 通过测试点和 DNP 填充选项,然后将这些信号路由到连接器通常是正确的方法。 但是,由于搜索结果中没有返回原理图,因此我无法确认所有必需的 DNP 电阻器是否都已安装到位。用户手册中不包含 JTAG 电路图。 2. 为什么检测不到 TCK/TMS/TDI 活性? 通常情况下,当连接 JTAG 探针时: TCK/TMS/TDI 由调试器驱动。 目标板不会生成它们。 如果您在 TCK/TMS 上完全看不到任何切换: 最常见原因 1:未检测到 VTref 许多探针(Lauterbach、J-Link、PE Micro、ULINK 等)只有在 VTref 存在且在有效范围内时才会驱动 JTAG 引脚。 检查: 连接器处的 VTref 电压。 共用接地连接。 探针软件会报告目标电压。 对于 FRDM-i.MX95,DAP I/O 电源似乎与 3.3 V 功能域 (NVCC_CCM_DAP) 有关。板文档显示该功能域由VDD_3V3供电。 最常见原因二:电路板未通电 大多数调试器仅使用 VTref 进行检测。 它们不会为目标提供动力。 核实: 电路板由 J25 供电。 PMIC启动。 VDD_3V3 存在。 电路板上的LED指示灯亮起。 该板需要外部PD电源。 最常见原因#3:缺少信号路由重构 如果 JTAG 路径包含: 0Ω DNP电阻器 隔离电阻器 其他馅料选择 即使缺少一个电阻,也可能导致 TCK/TMS 断开连接。 由于搜索结果中没有原理图,我无法核实电阻器的确切配置。 最常见原因#4:引脚映射错误 用欧姆表验证: 探针引脚 → 连接器引脚 → 电阻器 → 测试点 → i.MX95 球。 不要假设测试点标签与标准的 ARM 20 引脚顺序一致。 3. 是否需要特殊的启动模式? 对于不安全的设备: 观察 JTAG 时钟活动不应该需要启动模式。 一旦调试器检测到 VTref 并开始扫描序列,TCK/TMS 就应该切换。 启动开关会影响: eMMC启动 SD启动 序列号下载器 这与调试器是否生成 TCK 无关。 4. 是否涉及安全设置/熔丝? 有可能。 i.MX95 实现了认证调试和调试访问控制。[i.MX95RM_Rev4 | PDF] 、 [i.MX95RM_Rev2 | PDF] 、 [i.MX95 Sec...2026-final | PowerPoint] 然而: 网络安全设置通常会阻止成功的调试访问。 它们通常不会阻止调试器生成 TCK/TMS 本身。 由于您报告完全没有 TCK 活性,我首先会调查以下问题: VTREF 探针配置 电缆引脚排列 缺失的人口选项 在怀疑网络安全之前。 5. A55、M33 和 M7 可以调试吗? i.MX95调试架构支持: Cortex-A55 Cortex-M33 Cortex-M7 通过 CoreSight/DAP 基础设施。[i.MX95RM_Rev2 | PDF] , [i.MX95RM_Rev5 | PDF] 所以从硅芯片的性能角度来看,是的。 所有功能域是否立即可见取决于: 系统状态, 网络安全配置, 支持调试器。 但调试器通常不需要额外的引导加载程序初始化即可检测到 DAP 本身。 推荐测量方法 在进一步修改电路板之前,我会检查以下几点: 电源 VTref = ?V VDD_3V3 存在 板正常启动 连续性 TCK 连接器 ↔ SoC 路径 TMS连接器↔SoC路径 TDI 连接器 ↔ SoC 路径 TDO 连接器 ↔ SoC 路径 RESET 连接器 ↔ SoC 路径 探针侧 调试软件是否报告目标电压? 它是否显示“检测到目标”? 它是否报告尝试进行 JTAG 链扫描? 示波器 直接探测: 调试器连接器引脚 SoC侧测试点 连接尝试期间。 如果调试器连接器处存在 TCK,但 SoC 测试点处不存在 TCK,则问题几乎肯定出在电路板返工上。 Re: External JTAG debugger connection on FRDM-i.MX95 does not output expected JTAG signals 感谢您的支持。 我们检查了外部 JTAG 调试器连接,发现 问题是由FRDM-i.MX95板和电路板之间的线路长度引起的。 外部 JTAG 调试器。 缩短并重新排列 JTAG 信号线后,调试器…… 能够正确检测到目标,并观察到了JTAG信号。 预期的。 因此,通过改进JTAG接线方式,这个问题已经得到解决。 长度和连接质量。 再次感谢您的帮助。 Re: External JTAG debugger connection on FRDM-i.MX95 does not output expected JTAG signals @kuni1你好,请问你能否提供一些关于如何附加调试器的最新进展或信息?你是如何将 RESET 线连接到电路板上的?你使用的是哪种调试连接器?(J-Link、MCU-Link 等) 我目前也遇到了同样的问题,无法将调试器连接到我的FRDM板,非常感谢您的帮助。 谢谢
View full article
RT1160(外部SDRAMおよびウェイトピン付きSRAM搭載) 私はRT1160を外部16ビットSDRAMと16ビットSRAM(FPGA通信用)と組み合わせて使用しています。SRAMインターフェースは、待機ピン付きのSRAM読み書き操作(SRAM)として非同期モードとして構成されます。待機信号がSDRAMのリフレッシュタイミングと競合して何らかの問題を引き起こすのではないかと考えています。SDRAMにコードを書き込んで、SRAM ASYNC書き込み時にwaitピンを約10ms以上ローレベルに保つようにテストしましたが、時々約1msで終了してしまうことがあり、その理由はわかりません。 SDRAMとSRAMの両方を使う場合に制限があるのでしょうか?ご協力いただきありがとうございます。 Re: RT1160 with external SDRAM and SRAM with wait pin こんにちは 約1ミリ秒で終了するとおっしゃっていますが、具体的に何を指しているのでしょうか?SRAMへの書き込みはエラーを返すのか、それともハードフォルトに入るのか?これはどのくらいの頻度で起こりますか? 以下のテストを手伝ってもらえますか? 1. 内部メモリ(SDRAMではない)からコードを実行し、長時間かかる非同期SRAM書き込みを繰り返します。 2. 内部メモリからコードを実行したまま、同じテストを再度実行しますが、今回はSDRAMを有効にした状態でアイドル状態にします。 3. 最初に述べたとおりにテストを実行しますが、SRAM待機信号をアクティブに保持します。 さらに、上記の検査を含めて、以下の点を確認してもらえますか? 転送中にSRAM信号を監視できますか? 各テストのSTEMCイントラレジスタ値を教えてもらえますか? 結果を教えてください。 よろしくお願いします、 パブロ
View full article
RDBESSK358BMU 以太网配置 我目前正在开发恩智浦的 RDBESSK358BMU,该主板有 S32K358 和 GMAC 连接到 Marvell Alaska 88e1510 收发器,还有一个以太网千兆端口(附有硬件方案)。 我想知道,在这种配置下,我是否可以使用带有 lwip_baremetal 示例的 tcpip 协议栈。 使用 Gmac_Loopback 的示例起作用了,但是 lwip_baremetal_example 在 Gmac_initDMA 上失败了,就像我在其他文章中看到的那样,这是一个时钟参考问题,但我正在使用的主板上有外部时钟,所以我不明白如何使这个示例适应我的硬件。有人能提供帮助吗?谢谢!   Re: RDBESSK358BMU Ethernet configuration 你好@gferretts、 是的,我就是这么发现的。你更快 您可以从 RTD 5.0.0 复制缺失的定义: #define DCM_GPR_DCMRWF1_MAC_TX_RMII_CLK_LPBCK_EN_MASK (0x80000000U) #define DCM_GPR_DCMRWF1_MAC_TX_RMII_CLK_LPBCK_EN_SHIFT (31U) #defineDCM_GPR_DCMRWF1_MAC_TX_RMII_CLK_LPBCK_EN_WIDTH (1U) #define DCM_GPR_DCMRWF1_MAC_TX_RMII_CLK_LPBCK_EN(x) (((uint32_t)(((uint32_t)(x)))) << dcm_gpr_dcmrwf1_mac_tx_rmii_clk_lpbck_en_shift)) & dcm_gpr_dcmrwf1_mac_tx_rmii_clk_lpbck_en_mask) ......只是注意到 RTD 的解决方法使用了 |= 关于 Eth_T_InitPhys()--是的,这也是正确的模式--这个例程值得深入检查。 顺祝商祺! 帕维尔 Re: RDBESSK358BMU Ethernet configuration 非常感谢@PavelL!我注意到 GMAC 速度仍为 100 米,因此将其设置为 1G,以匹配 125MHz 时钟,现在它可以在端口 7 上正常 ping 和 TCP echo! 我还注释了"Eth_T_InitPhys();" ,因为我的 PHY 不在 PHY 列表中,它是通过频带配置的。     Re: RDBESSK358BMU Ethernet configuration 你好@PavelL,感谢您的回复。我在使用 lwip 时仍然遇到问题,我也有 s32k3x8evb-q289 但我没有 TJA 子板所以我需要在 S32K358BMU 上测试以太网。 我使用的是"TCPIP STACK 1.0.3 版 RTD3.0.0D2306", 我附上我的 .mex我尝试复制你显示的内容(时钟配置、GMAC 外设和引脚排列)的配置文件和 " 设备.c "用引脚上的 ETH_RESET。 因为我的 RTD 没有环回定义,所以我也尝试手动复制您的 RTD 回转: void device_init(void) { uint16 pitPeriod; /* 为 DCM 模块中的 EMAC 设置 RMII 配置 */ //ip_dcm_gpr->dcmrwf1 = (ip_dcm_gpr->dcmrwf1& ~dcm_gpr_dcmrwf1_emac_conf_sel_mask) | dcm_gpr_dcmrwf1_emac_conf_sel(1u); /* 手动 RTD 转换 */ IP_DCM_GPR->DCMRWF1 = 0x80000040; IP_DCM_GPR->DCMRWF3 = 0x2000; ....}   在这种配置下,示例能够在不超时的情况下实现 Gmac_Ip_InitDMA,并到达主环路,但从我的电脑上 ping 192.168.0.200 结果却是无法连接主机和 ping 超时。 我用示波器验证了 RXC 的存在(当 Phy 协商 100Mbps 时为 25MHz 或 1Gbps 时为 125MHz),因此有一些流量来自 ETH 端口。同时在 TXC 上我现在也能看见 125MHz 但是 TXD0,1 从未被触发。 我希望你们能找到问题所在。   Re: RDBESSK358BMU Ethernet configuration 你好@gferretts、 对于延迟回复,我深表歉意。 遗憾的是,我没有 RD-BESSK358BMU,因此无法为您改编 lwip 示例。总之,我为 S32K358EVB-Q289 和 RGMII 100Mbps 修改了 lwip 示例,没有出现任何问题。让我分享一下我在采用过程中使用的基本步骤(请注意,某些细节可能与 S32K3 RTD / TCPIP 版本有关): 配置工具 - 引脚 采用引脚来适应板的接线 将回转速率设置为最快设置(如适用 应为 RGMII 输出 TX_CLK 配置工具 - 时钟 GMAC 时钟应该是这样的(注意 GMAC 1Gbps:25MHz -> 125MHz;50MHz -> 250MHz)。 配置工具 - GMAC 驱动程序 ETH_MAC_LAYE_TYPE_XGMII, REDUCED, 设置正确的速度 ETH_MAC_LAYER_SPEED_xxx 源代码-设备.c 在 device_init() 的第一行添加 RTD 解决方法 /* 设置 DCM 模块中 GMAC0 的 RGMII 模式配置 */ IP_DCM_GPR->DCMRWF1 |= DCM_GPR_DCMRWF1_MAC_CONF_SEL(0x01) | DCM_GPR_DCMRWF1_MAC_TX_RMII_CLK_LPBCK_EN_MASK; /* 设置 RGMII RX_CLK 直接从 DCM 模块中 GMAC 的 RX_CLK 引脚到达 */ IP_DCM_GPR->DCMRWF3 |= DCM_GPR_DCMRWF3_MAC_RX_CLK_MUX_BYPASS(0x01); 源代码 - test.c 或者,注释掉在一段时间后关闭 TCP/IP 协议栈的部分 这部分比较简单。 从原理图上看,您需要定义 GPIO PTC1 以向 PHY 提供有效的 RESET 脉冲信号,并等待一段时间再初始化 GMAC。PHY 通常在非托管模式下独立工作,只是通过引脚绑扎进行配置。有时,PHY 需要通过 SMI 进行管理。 您使用的是哪个版本的 S32K3 RTD 和哪个版本的 TCP/IP 协议栈? 顺祝商祺! 帕维尔
View full article
链接文件 我试图将 HCS12 控制器的代码从 cosmic 移植到 CodeWarrior 5.2,当我试图使用 #pragma CODE_SEG PAGE_32 在 PAGE 32 部分下创建一个函数时,只有部分在映射文件中更新,起始地址保持不变。 Re: Linker file 你好,@Aswin_5232、 您没有说明 MCU 的部件编号。 改用类似的方法: 链接器 SEGMENTS PAGE_32 = READ_ONLY 0x8000 TO 0xBFFF PAGE 32; END PLACEMENT MyPage32Funcs INTO PAGE_32; END   主要 #pragma CODE_SEG MyPage32Funcs void MyFunc(void) { ... } #pragma CODE_SEG DEFAULT 此致, 丹尼尔 Any support, information, and technology (“Materials”) provided by NXP are provided AS IS, without any warranty express or implied, and NXP disclaims all direct and indirect liability and damages in connection with the Material to the maximum extent permitted by the applicable law. NXP accepts no liability for any assistance with applications or product design. Materials may only be used in connection with NXP products. Any feedback provided to NXP regarding the Materials may be used by NXP without restriction.
View full article
IMX8MP 远程核心共享内存驱动程序 日安 我正在尝试使用 DDR 缓冲区实现内核间的数据交换,以处理大量数据。我在 IMX8MP 上使用的是 Verdin devkit。内核版本 5.15我已经使用"/dev/rpmsg_ctrl0 "通过 RPMSG 实现了通信。 现在,我想从 CMA 空间分配 DDR 中的内存,并通过 RPMSG 消息将地址发送给 CortexM。为此,我使用了恩智浦的 "低功耗音频应用 - AN12195SW "示例。我从补丁中提取了 "rmtcore_shm "驱动程序代码,并通过 devshell 在内核环境中进行了编译。 然后,我在系统中安装了模块 "rmtcore-shm.ko"。 root@verdin-imx8mp-14762892:~# insmod ./rmtcore-shm.ko [ 235.945223] RMTCORE module started! root@verdin-imx8mp-14762892:~# 但是新设备 “/dev/rmtcore_shm” 没有出现在系统中。而当我试图打开它时,却出现了错误: rmtcore_shm_fd = open(RMTCORE_SHM_DEV, O_RDWR); ******************* "Unable to open device /dev/rmtcore_shm" ******************* 我可能需要更改设备文件。现在,我的 RPMSG 覆盖图是这样的: /dts-v1/; /plugin/; #include / { compatible = "toradex,verdin-imx8mp"; rmtcore_shm { compatible = "fsl,rmtcore-shm"; status = "ok"; }; }; &{/} { imx8mp-cm7 { compatible = "fsl,imx8mp-cm7"; clocks = <&clk IMX8MP_CLK_M7_DIV>; mbox-names = "tx", "rx", "rxdb"; mboxes = <μ 0 1 μ 1 1 μ 3 1>; memory-region = <&vdevbuffer>, <&vdev0vring0>, <&vdev0vring1>, <&rsc_table>, <&m7_reserved>; rsc-da = <0x55000000>; syscon = <&src>; fsl,startup-delay-ms = <500>; }; }; &i2c3 { status = "disabled"; }; &pwm4 { status = "disabled"; }; &resmem { #address-cells = <2>; #size-cells = <2>; m7_reserved: m7@0x80000000 { no-map; reg = <0 0x80000000 0 0x1000000>; }; vdev0vring0: vdev0vring0@55000000 { no-map; reg = <0 0x55000000 0 0x8000>; }; vdev0vring1: vdev0vring1@55008000 { no-map; reg = <0 0x55008000 0 0x8000>; }; vdevbuffer: vdevbuffer@55400000 { compatible = "shared-dma-pool"; no-map; reg = <0 0x55400000 0 0x100000>; }; rsc_table: rsc_table@550ff000 { no-map; reg = <0 0x550ff000 0 0x1000>; }; }; &sai3 { status = "disabled"; }; &sdma3 { status = "disabled"; }; μ { status = "okay"; }; &uart4 { status = "disabled"; }; 请告诉我需要做哪些更改,才能使 /dev/rmtcore_shm 出现在系统中,并能访问 DDR 中的内存分配?如果有人已经遇到过这种解决方案和示例。 感谢您的帮助。 Re: IMX8MP Remote core share memory driver 你好@Stan88 你查清楚了吗? 谢谢! 安迪 Re: IMX8MP Remote core share memory driver 是的,我也试过了 - 我在内核中编译了它,在内核菜单配置中看到了它 -"Remote Core Share Memory Driver" ,并激活了它。编译并部署了内核,构建了镜像并将其安装在板上。 lsmod无法显示该驱动程序,因为它不是动态加载的,而是内置模块。 dmseg也不包含有关该驱动程序的任何信息。尝试卸载模块时会出现错误,提示系统中存在此类模块: root@verdin-imx8mp-14762892:~# modprobe -r rmtcore-shm modprobe: FATAL: Module rmtcore_shm is builtin. Re: IMX8MP Remote core share memory driver 你好 如果你编译模块,你必须编译内核本身才能使其正常运行,并在 dmseg 输出中查看。 此致 Re: IMX8MP Remote core share memory driver 您需要: rmtcore_shm { compatible ="fsl,rmtcore-shm"; status ="ok"; }; 如果有其他人想要 FRDM_IMX8MPLUS 的这个版本,请在这里查看: https://github.com/AndrewCapon/rmtcore-shm/tree/main
View full article
こんにちは、NPU!i.MX 9でTFLiteモデルを実行 以下は、Pytorch と Tensorflow でシンプルなモデルをトレーニングし、i.MX93 Ethos-65 ニューラル プロセッシング ユニット (NPU) を使用してアプリケーションにデプロイするためのガイドです。 このガイドに従うと、次のことが達成されます。 MNISTデータセットでシンプルなCNNをトレーニングする モデルを tflite に変換し、量子化して i.MX93 NPU (Ethos-65) 用にコンパイルします。 モデルによって数字を描画および識別できる簡単なアプリケーションを実行します。 前提条件 このガイドに従うには次のものが必要です: Yocto イメージ、C++ の例では GTKMM3 のサポートが必要ですが、Python の例では事前にビルドされたイメージを使用できます。 i.MX93ボード Pythonの例を実行する アプリケーションの実装は Python と C++ の両方で提供されます。Pythonアプリケーションを使用する場合は、代わりに事前に構築された完全なイメージを使用できます。Python スクリプトをターゲットにコピーして、次のように実行するだけです。 # Running quantized example on the CPU ./run.py -m cnn_tf_quant.tflite # Running example on the Ethos NPU ./run.py -m cnn_tf_quant_vela.tflite -d /usr/lib/liblitert_ethosu_delegate.so 添付ファイルには事前に構築されたモデルが提供されていますが、モデルのトレーニングと生成に使用される手順とスクリプトも含まれています (以下を参照)。 GTKMM3 サポート付きのイメージのビルディング (C++ の例のみ) デモンストレーションに使用される GUI アプリケーションはGTKMM3 ( GTKライブラリの C++ ラッパー) で記述されているため、GTKMM3 をサポートするイメージが必要ですが、幸いなことに、これを Yocto イメージに簡単に統合できるレシピが既にあります。 イメージをビルドするには、 Yocto ユーザー ガイドの指示に従うだけです。この記事の執筆時点では最新の BSP は 6.12.49_2.2.0 なので、これを使用します。 ホストとインストールされたリポジトリですべての要件を設定したら、次のようにビルド環境を設定できます。 リポジトリ init -u https://github.com/nxp-imx/imx-manifest -b imx-linux-walnascar -m imx-6.12.49-2.2.0.xml リポジトリ同期 ターゲットに応じてビルド ディレクトリを設定できるようになりました。例として、X11 をサポートする Wayland グラフィックスとiMX93 Freedomボードを使用します。 ディストリビューション=fsl-imx-xwayland マシン=imx93-11x11-lpddr4x-frdm ソース imx-setup-release.sh -b 93-frdm-xwayland ボードに合った MACHINE 構成を選択するだけです。 これでビルドを開始する準備がほぼ整いました。まだイメージに GTKMM3 サポートを追加する必要があります。conf/local.conf の下にある local.conf ファイルを変更し、次のコードを追加するだけです。 IMAGE_INSTALL:append = "gtkmm3" ビルド時に問題が発生しないように、gtkmm3 の前にスペースがあることを確認してください。ビルドはリソースを大量に消費するため、ビルド中にメモリ不足の問題が発生する可能性があります。一度にビルドを試みる同時レシピの数を制限するために、以下も追加することをお勧めします。 BB_NUMBER_THREADS="8" PARALLEL_MAKE="-j8" BB_PRESSURE_MAX_CPU ?= "50000" BB_PRESSURE_MAX_IO ?= "100000" BB_PRESSURE_MAX_MEMORY ?= "25000" その後、local.conf は次のようになります。 注意:ビルドを完了するには 500 GB 以上必要なので、マシンに十分なストレージ容量があることを確認してください。 これでビルドを開始できます。GTKMM アプリケーションをソースからビルドする場合は、利用可能な SDK が必要であり、次のように作成します。 bitbake imx-image-full -c populate_sdk 画像を作成するには、次のようにするだけです。 bitbake imx-image-full すべての Tensorflow Lite ライブラリとさまざまな例が含まれているため、完全なイメージが必要です。 ビルドが完了したら、ツールチェーンをインストールし、イメージをボードにフラッシュできます。 ツールチェーンをインストールするには: ./tmp/deploy/sdk/fsl-imx-xwayland-glibc-x86_64 -imx-image-full-armv8a-imx93-11x11-lpddr4x-frdm-toolchain-6.12-walnascar.sh その後、ツールチェーンを使用するたびに次の操作を実行します。 ソース /opt/fsl-imx-xwayland/6.12-walnascar-full-gtkmm3/environment-setup-armv8a-poky-linux イメージを SD カードにフラッシュするには: zstdcat imx-image-full-imx93-11x11-lpddr4x-frdm.rootfs.wic.zst | sudo dd of=/dev/mmcblk0 bs=1M conv=fsync これで、アプリケーションを構築し、いくつかのモデルをトレーニングしてデプロイする準備が整いました。 GTKMM3 ビルディング アプリケーション (C++) アプリケーションのソースはここにあります。また、ビルド済みのバイナリも提供されており、ここに添付されています。 アプリケーションには、マウスまたはタッチ ディスプレイを使用して数字を簡単に描画できる描画領域と、描画領域をクリアするためのボタンと、モデルの実行をトリガーして数字を予測するためのボタンの 2 つのボタンが含まれています。 最初からビルドするには、CMake と、GTKMM3 をサポートするツールチェーン (上記参照) が必要です。プロジェクトをビルドするには、次の手順に従ってください。 sudo apt install cmake git クローンhttps://github.com/ManRod2982/drawing_window_imx cd drawing_window_imx/drawing_window_cpp/ ソース /opt/fsl-imx-xwayland/6.12-walnascar-full-gtkmm3/environment-setup-armv8a-poky-linux cmake -B ビルド -DCMAKE_TOOLCHAIN_FILE=$OECORE_NATIVE_SYSROOT/usr/share/cmake/OEToolchainConfig.cmake cmake --build ビルド この後、ビルド ディレクトリの下に window というバイナリが作成され、それをターゲットの SD カードに簡単にコピーできるようになります。 Linux を使用している場合はファイルシステムがマウントされるので、バイナリをルート ディレクトリにコピーするだけです。 sudo cp build/window /media/user/root/root/ ボードへの接続がすでに確立されている場合も SCP を使用できます。 scp ビルド/ウィンドウ [email protected]:/root そして、この後、ターゲット上でアプリケーションを次のように起動できます。 ./window -m model_path [オプション] -d delegate_path [オプション] -v アプリケーションでは次の 3 つのパラメータが受け入れられます。 モデルへのパス: -m または --model_path [オプション] デリゲートへのパス(存在する場合): -d または --delegate_path。指定されていない場合は、 XNN デリゲートを使用して CPU 上でモデルの実行が試行されます。 [オプション] 詳細フラグ。存在する場合、モデルはより多くの情報を出力します。 ここで、実行するモデルが必要です。 シンプルなCNNモデルのトレーニング このリリースの機械学習ユーザーガイドを見てみましょう。各デバイスで利用可能なコンピューティング エンジンに関するさまざまなフレームワークのサポートは次のとおりです。 Tensorflow Lite とLiteRT (Tensorflow Lite の最新リリースであり、今後リリースされる唯一のもの) は、i.MX9 ファミリのほとんどのコンピューティング エンジンで広くサポートされているフレームワークです。このガイドでは、例として C++ を使用し、LiteRT の現在のリリースでは Python のみがサポートされているため、Tensorflow Lite を使用しますが、インターフェースとプロセスはほぼ同じです。 環境の設定 サンプル リポジトリには、モデルをトレーニングして tflite 形式に変換するために使用されるさまざまな Python スクリプトが含まれています。次の手順を実行するには、python3 のインストールが必要です。 仮想環境を設定することをお勧めします。 python3 -m venv myenv ソース myenv/bin/activate pip インストール -r 要件.txt これにより、Tensorflow と Pytorch の両方に必要なすべてのパッケージがインストールされます。 Tensorflowでモデルをトレーニングする Tensorflow を使用すると、モデルを量子化して Tensorflow Lite に変換するための簡単なパスが可能になり、畳み込みニューラル ネットワーク (CNN) アーキテクチャは次のようになります。 model = tf.keras.models.Sequential([ tf.keras.layers.Input(batch_shape=(1, 28, 28, 1)), tf.keras.layers.Conv2D(16, 5, padding='same', activation='relu'), tf.keras.layers.Conv2D(32, 3, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.MaxPool2D(2, strides=(2,2)), tf.keras.layers.Flatten(), tf.keras.layers.Dense(100, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax') ]) train_tf.pyスクリプトを実行してモデルをトレーニングすることができます。通常のノートPCでトレーニングするには約 2 分かかり、テスト データセットで 99.05% の精度を達成します。フレームワークの詳細については、公式のTensorflow ドキュメントを参照してください。 スクリプトを実行した後、 eIQ ツールキットモデル ビジュアライザーまたはNetron.app を使用してモデルを視覚化できます。 i.MX93 には、重み、バイアス、入力が整数である必要があるArm Ethos-65 NPUが搭載されており、現在のモデルは float32 を使用しているため、モデルを量子化する必要があります。これを実現するには、モデルを量子化して tflite に変換する tf2quant_tflite.py を実行します。 整数の入力と出力を取り、重みとバイアスも量子化されており、ファイル サイズの違いが簡単に確認できます。 量子化モデルは 555 KB ですが、float32 モデルは 2.2 MB です。これは、float32 では重みとバイアスをそれぞれ保存するのに 4 バイトが必要なのに対し、量子化モデルでは 1 バイトしか必要ないからです。 これで、ターゲットで使用できるモデルができました。ただし、現状では、XNN デリゲートを使用して CPU 上で実行されます。モデルを実行するには、次のようにするだけです。 ./window -m cnn_tf_quant.tflite これで、Arm Ethos NPU 用に量子化モデルをコンパイルできるようになりました。eIQ ツールキットが使用されます。モデル ツールを使用してモデルを開きます。 量子化されたモデル(この場合は cnn_tf_quant.tflite)があるフォルダーに移動して開きます。モデルを視覚化できるはずです。オプション メニューをクリックして変換を選択します。 i.MX93 コンバータを選択すると、保存先フォルダも選択するように求められます。 宛先フォルダを選択した後、すべてがうまくいけば変換が完了し、Ethos で実行できるように最適化されたモデルを視覚化できるようになります。NPU でサポートされていない操作はすべて CPU によって表示および実行されます。この単純な例では、すべての操作は NPU によって実行されます。 そして、次のようにしてターゲット上でモデルを実行できるようになりました。 ./window -m cnn_tf_quant_vela.tflite -d /usr/lib/libethosu_delegate.so Pytorchでモデルをトレーニングする リポジトリには、畳み込みニューラル ネットワークを使用して MNIST データ セットをトレーニングするサンプル モデルが含まれています。モデル構造は次のとおりです。 NeuralNetwork( (cnn): Sequential( (0): Conv2d(1, 16, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2)) (1): ReLU() (2): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1)) (3): ReLU() (4): Dropout(p=0.2, inplace=False) (5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (6): Flatten(start_dim=1, end_dim=-1) (7): Linear(in_features=5408, out_features=100, bias=True) (8): ReLU() (9): Dropout(p=0.2, inplace=False) (10): Linear(in_features=100, out_features=10, bias=True) ) ) Pytorch モデルは、Tensorflow lite (量子化なし) に簡単に変換して CPU 上で実行できます。また、 Open Neural Network Exchange モデル (ONNX)も同様です。ただし、最近リリースされたExecutorchは組み込みデバイス上の Pytorch モデル用の推論モデルであり、現在そのサポートが進められています。 Pytorch モデルは pytorch_model.py で定義されています。 #!/usr/bin/env python3 import torch from torch import nn # Define model class NeuralNetwork(nn.Module): def __init__(self): super().__init__() self.cnn = nn.Sequential( # Input 28x28x1, after padding 32x32x1, output 28x28x16 nn.Conv2d(in_channels=1, out_channels=16, kernel_size=5, padding=2), nn.ReLU(), # Input 28x28x16, output 26x26x32 nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3), nn.ReLU(), nn.Dropout(p=0.2), # Input 26x26x32, output 13x13x32 nn.MaxPool2d(kernel_size=2, stride=2), nn.Flatten(), nn.Linear(13*13*32, 100), nn.ReLU(), nn.Dropout(p=0.2), nn.Linear(100, 10) ) def forward(self, x): logits = self.cnn(x) return logits トレーニングは train_pytorch.py を実行して実行され、テスト データセットで 99.3% の精度を達成し、通常のノートPCで完了するまでに約 7 分かかります。フレームワーク自体とトレーニング プロセスの詳細については、公式のpytorch ドキュメントを参照してください。 その後、pytorch モデルは pytorch_model.pth に保存されますが、pytorch はグラフ情報ではなく重みとバイアスのみを保存します。保存したモデルをnetronまたはeIQ ツールキットモデル ビジュアライザーで視覚化すると、分離された重みとバイアスを観察できます。 モデルをより良く視覚化するために、スクリプトpytorch2onnx.pyを使用してONNX形式に変換するだけです。そして、Neutron 上でモデルのグラフを視覚化できるようになりました。 注: ONNX は量子化して量子化されたモデルを tflite に変換する方法も提供している可能性がありますが、onnx-tf のテストではツールが最新の Tensorflow フレームワークと同期していないようでした。Tensorflow で同様のモデルを作成し、量子化してエクスポートする方が簡単でした。 これでモデルを tflite にエクスポートできるようになりました。モデルは量子化されていないため、CPU (XNN デリゲート) 上で実行されます。エクスポートするには、 pytorch2tflite.py を実行し、エクスポートされたモデルを視覚化できるようになりました。 そして、次のようにしてこのモデルをターゲット上で実行できます。 ./window -m pytorch_cnn.tflite モデルのデプロイと実行 これで、数字を描画できるアプリケーションと、それらの数字を検出できるモデルができましたが、アプリケーションはそのモデルを実行して結果を取得できる必要があります。これが次のステップです。 ターゲット上でモデルを実行できるようにするには、次のことが必要です。 モデルをロードする tfliteインタープリターを作成する 外部デリゲートがある場合はロードする テンソルを割り当てる C++の例 ここでは最小限の例が提供されていますが、NPU でモデルを実行するために必要な外部デリゲートの読み込みは含まれていません。 必要なヘッダーは次のとおりです。 #include "tensorflow/lite/delegates/external/external_delegate.h" #include "tensorflow/lite/interpreter.h" #include "tensorflow/lite/interpreter_builder.h" #include "tensorflow/lite/kernels/register.h" #include "tensorflow/lite/model_builder.h" TFLite APIを使用して次のようにモデルをロードできるようになりました。 std::unique_ptr<:flatbuffermodel> model = tflite::FlatBufferModel::BuildFromFile(model_path); ここでインタープリターを作成する必要があります。そのためには、モデルだけでなく操作リゾルバーも必要です。 tflite::ops::builtin::BuiltinOpResolver resolver; std::unique_ptr<:interpreter> interpreter; tflite::InterpreterBuilder(*model, resolver)(&interpreter); デリゲートが必要な場合は、それを作成して実行グラフを更新し、インタープリターがサポートされている操作でデリゲートを呼び出すことを認識できるようにする必要があります。 // Create external delegate option and pass the delegate library TfLiteExternalDelegateOptions external_delegate_options = TfLiteExternalDelegateOptionsDefault(delegate_path); // Create the External Delegate. This will load the delegate. TfLiteDelegate *external_delegate = TfLiteExternalDelegateCreate(&external_delegate_options); // Add External Delegate into TFLite Interpreter to automatically delegate nodes. if (interpreter->ModifyGraphWithDelegate(external_delegate) != kTfLiteOk) { std::cerr << "Failed to add delegate" << std::endl; } これで、モデルにテンソルを割り当てることができます。 // Allocate tensors for the model if (interpreter->AllocateTensors() != kTfLiteOk) { std::cerr << "Failed to allocate tensors" << std::endl; } これで、モデルを使用して推論を実行する準備が整いました。 最後のステップは、入力バッファにデータを入力し、インタープリタを呼び出して、出力バッファから結果を取得することです。次の例では、float モデルを使用しています。 // Fill input buffers // Note: The buffer of the input tensor with index `i` of type T can // be accessed with `T* input = interpreter->typed_input_tensor (i);` float *input_tensor = interpreter->typed_input_tensor (0); std::memcpy(input_tensor, input.data(), input.size() * sizeof(float)); // Run inference if (interpreter->Invoke() != kTfLiteOk) { std::cerr << "Failed to invoke Interpreter!" << std::endl; return {}; } // Read output buffers // Note: The buffer of the output tensor with index `i` of type T can // be accessed with `T* output = interpreter->typed_output_tensor (i);` float *output_tensor = interpreter->typed_output_tensor (0); std::memcpy(output, output_tensor, output.size() * sizeof(float)); 私たちのサンプル アプリケーションでは、インタープリターの作成と推論の呼び出しは NnModel というクラスにラップされています。その実装はリポジトリで確認できますが、変更なしで float モデルと int8 モデルの両方を処理できます。 クラスはメイン ルーチン内でインスタンス化され、予測ボタンがクリックされるたびに推論が呼び出されます。 // Create model with parsed parameters NnModel nn(model_path, delegate_path, verbose); void Window::on_predict_clicked() { // Save screen to file std::cout << "Predict clicked!" << std::endl; // Call inference on NnModel depending on the type // the model expects int number; auto data_type = nn_.get_dtype(); switch (data_type) { case kTfLiteFloat32: { std::vector drawing = mouse_drawing.export_to_vector (28, 28, 255.0); std::vector output_vec_f = nn_.infer (drawing); number = get_max_index (output_vec_f); break; } case kTfLiteInt8: { std::vector drawing = mouse_drawing.export_to_vector (28, 28, 255.0); std::vector output_vec_int = nn_.infer (drawing); number = get_max_index (output_vec_int); break; } default: std::cerr << "Cannot handle input type: " << std::to_string(data_type) << std::endl; break; } std::string display = "You drew a: " + std::to_string(number); std::cout << display << std::endl; text_view.set_text(display); } Pythonの例 Python でインタープリターを作成するプロセスはほぼ同じですが、デリゲートが使用されている場合はそれをロードし、モデルをロードしてテンソルを割り当てる必要があります。 この例では、代わりに LiteRT が使用されていますが、API は同じままで、必要な変更は解釈されたものがどこからインポートされるかだけです。 次の最小限のコードを使用して、モデルと外部デリゲートを読み込むことができます。 from ai_edge_litert.interpreter import Interpreter # Create interpreter if delegate_path is not None: # attempt to load external delegate if provided (platform specific) try: from ai_edge_litert.interpreter import load_delegate delegate = load_delegate(delegate_path) self.interpreter = Interpreter(model_path=model_path, experimental_delegates=[delegate]) except Exception as e: raise RuntimeError(f"Failed to load delegate: {e}") else: self.interpreter = Interpreter(model_path=model_path) self.interpreter.allocate_tensors() これで使用できるインタープリターができました。入力テンソルを入力し、インタープリターを呼び出して、モデルからの結果を含む出力テンソルを取得するだけです。 # Set input input_details = self.interpreter.get_input_details()[0] self.interpreter.set_tensor(input_details['index'], input_data) # Run inference self.interpreter.invoke() # Get results out_details = self.interpreter.get_output_details()[0] output_data = self.interpreter.get_tensor(out_details['index']) これらの手順は、 nn_model.pyの下のラッパー クラスに含まれています。 モデルのベンチマーク リリースには、ランダムな入力を生成し、モデルで推論を実行するのにかかる時間を測定するための事前構築されたベンチマーク ツールが付属しています。以下は、i.MX93 でさまざまなモデルを実行した結果です。 ./benchmaark_model --graph=モデル --num_threads=コア数   CPU 1コア CPU 2コア NPU pytorch_cnn.tflite 1559.61米ドル 1023.22米ドル N/A cnn_tf_quant.tflite 585.37米ドル 379.69米ドル N/A cnn_tf_quant_vela.tflite N/A N/A 221.84米ドル これはもちろん単なる例ですが、専用ハードウェア上で実行すると推論速度が大幅に向上することがわかります。 以下は、Pytorch と Tensorflow でシンプルなモデルをトレーニングし、i.MX93 Ethos-65 ニューラル プロセッシング ユニット (NPU) と i.MX95 eIQ Neutron NPU を使用してアプリケーションにデプロイするためのガイドです。
View full article
T4240から間違ったIDCODEを読み取ったため、USB-TAP経由でダウンロードできません T4240 (T4240RDB に類似) をベースにしたボードをデバッグしています。私の問題は、Codewarrior で USB-TAP 経由でコードをダウンロードできないことです。 1.ハードコードされた RCW をテストしたところ、T4240 は電源投入後約 10 ミリ秒以内に RESET_REQ をアサートすることがわかりました。 2. Codewarrior によって「JTAG チェーンを正しく構成できませんでした」というエラー メッセージが表示され、コンソールに表示されるチップ IDCODE は、QorIQ T4240 リファレンス マニュアルに記載されている 0x0022001d ではなく、0x1022001d になります。 3. Codewarrior のコンソールの出力メッセージには、「エラー メッセージ: T4240: トランザクション中に HRESET が発生しました」と表示されました (以下に添付)。 4. 電源とクロックをすべて測定しましたが、問題ないようです。 誰かこの問題を解決するのを手伝ってくれませんか? ---------------------------------------------------------------------------- ccs_open ipaddr = 127.0.0.1 ポート = 41475 タイムアウト = 15 サーバーh = 0 ccs_open; ccs_error = 0 ccs_get_connection_count サーバーh = 0 カウント = 1 ccs_get_connection_count; ccs_error = 0 ccs_available_connections サーバーh = 0 カウント = 1 ccs_available_connections; ccs_error = 0 ccs_available_connections サーバーh = 0 カウント = 1 ccs_available_connections; ccs_error = 0 ccs_cc_バージョン サーバーh = 0 cc = 0 バージョン.メジャー = 1 バージョン.マイナー = 3 ccs_cc_version; ccs_error = 0 ccs_set_timeout サーバーh = 0 タイムアウト = 15 ccs_set_timeout; ccs_error = 0 ccs_available_connections サーバーh = 0 カウント = 1 ccs_available_connections; ccs_error = 0 ccs_config_server サーバーh = 0 cc = 0 サーバー構成 = 0 値 = 4040 ccs_config_server; ccs_error = 0 ccs_config_chain サーバーh = 0 cc = 0 device_list: (サイズ = 1) デバイス[0]:: core_type=テストコア(20) ccs_config_chain; ccs_error = 0 ccs_jtag_ロック サーバーh = 0 cc = 0 ccs_jtag_lock; ccs_error = 0 JTAG診断   プローブ テスト時の始動電力... テスト結果: 合格   IR スキャン テストを開始しています... テスト結果: 合格   バイパス スキャン テストを開始しています... テスト結果: 合格   任意の TAP 状態移動テストを開始しています... テスト結果: 合格   検出されたJTAG IDコード: OK デバイス0 IDコード: 0x1022001D   ccs_jtag_unlock サーバーh = 0 cc = 0 ccs_jtag_unlock; ccs_error = 0 ccs_config_chain サーバーh = 0 cc = 0 device_list: (サイズ = 1) デバイス[0]:: core_type=T4240(206) ccs_config_chain; ccs_error = 39 エラーメッセージ: T4240: トランザクション中に HRESET が発生しました ccs_get_subcore_error サーバーh = 0 cc = 0 エラー = 60 チェーン位置 = 0 ccs_get_subcore_error; ccs_error = 0; 期間=2ミリ秒 ccs_close サーバーh = 0 ccs_close; ccs_error = 0 Re: Wrong IDCODE read from T4240 and cannot download via USB-TAP こんにちは、 CW の問題のスクリーンショットを共有してください。RCW が間違っている可能性があります。RCWは SB_EN ビットが設定されたターゲットにロードされましたか? 他のボードでもこの問題は発生しますか? WCTAP が他のデバイスで正しく動作していることを確認できますか? Re: Wrong IDCODE read from T4240 and cannot download via USB-TAP サポートありがとうございます。スクリーンショットを以下に添付します。ハードコードされた RCW を使用しており、この場合 SB_EN は無効になっています。私は 5 つのボードを持っていますが、すべて同じ問題で動作しています。現時点では、USB-TAP をテストできるリファレンス ボードがありません。 Re: Wrong IDCODE read from T4240 and cannot download via USB-TAP こんにちは、 RCW が有効でないか、JTAG クロック速度が速いことが原因である可能性があります。JTAGクロック速度を下げて試してください。
View full article