This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC1314R10:CC1314 — 使用专有 RF 命令和 MCUboot 实现 OTA 过程

Guru**** 2770105 points

Other Parts Discussed in Thread: CC1314R10, LP-EM-CC1314R10, UNIFLASH

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1598129/cc1314r10-cc1314---implementing-ota-process-using-proprietary-rf-commands-and-mcuboot

器件型号: CC1314R10
主题中讨论的其他部分:UNIFLASH

您好、

我们正在使用 CC1314R10 MCU 开发一款产品(传感器-网关模型)。
我们使用专有的 RF 命令和 Phy : 5kbps 长距离- 868MHz
目前我正在使用 LP-EM-CC1314R10 EVK 板测试流程。

现在、我希望在传感器端集成 OTA、这意味着 GW 板必须通过射频传输固件箱、传感器应接收并将其存储在非易失性存储器(内部闪存)上。 然后、验证并运行新固件。

我已经使用 Uniflash 完成了 PoC。  、
1.(从读取一些 OAD 文档..)、我已启用辅助插槽并覆盖模式。  
2.我有两个版本号为 1.0.0(主要 1、次要 0)和 2.0.0 的区间。
3、在主时隙上保留 v1.0.0 时、我已使用 Uniflash 工具在辅助时隙上刷写了固件版本 v2.0.0、即存储器 0x31000。
关闭电源后、我的版本 2.0.0 从主插槽运行。

一切都很棒。

现在、我要从固件进行测试。
Q1) 那么、我的流程是什么?

我到目前为止所做的、
我定义了一些命令、在 0x31000 上定义了一个大小为 0x2b000 的 nV 区域、还在 NV 区域 0x31000 上实现了逐块接收和写入。 因此、我将从网关接收固件文件箱(我假设我在 UniFlash 中刷写的同一个文件箱将通过 RF 传输)。
在传感器侧、我收到了数据并将数据写入辅助槽位。


问题 2)。 我是否需要检查 CRC、如何检查?  
问题 3)。 如何运行新的 FW:是否可以使用 SysCtrlSystemReset() 触发软件重置?
Q4) 我们已将插槽大小设置为 0x2b000、然后使用以下编译后命令设置版本、

${COM_TI_SIMPLELINK_CC13XX_CC26XX_SDK_INSTALL_DIR}/tools/common/mcuboot/imgtool sign --header-size 0x80 --align 4 --slot-size 0x2b000 --version 2.0.0 --pad-header --pad --key ${COM_TI_SIMPLELINK_CC13XX_CC26XX_SDK_INSTALL_DIR}/source/third_party/mcuboot/root-ec-p256.pem ${BuildArtifactFileBaseName}-noheader.bin ${BuildArtifactFileBaseName}.bin

现在、我的 Ho-header 区间仅为 49KB、而我的整个区间为 172KB (0x2b000)。
那么、我的 OTA 固件是否必须具有完全大小?

image.png

请帮助我了解流程。 提前感谢

此致、
Muniyappan R.M.

 

 

 

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

    对于 Q4)  那么、我的 OTA 固件是否必须完全大小?

    >>我已删除 --垫  从我的编译后命令和我的当前容器大小减少到我的正常 no_header.bin 的大小。
    但当使用从插槽中的 UniFlash 工具刷新它时(版本号较高),它不会复制到我的主插槽。 我的旧固件(固件版本较低)仍在运行。  

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

    尊敬的 Muniyappan:

    我不太明白这个问题。 这是自定义 OAD 实现还是我们的示例之一? 问题的第一部分(您成功运行 OAD 的位置)和第二部分 (OAD) 之间有什么区别?

    请查看以下指南 https://dev.ti.com/tirex/explore/node?isTheia=false&node=A__ASjZ9RLT3t-JeXWUfsK50w__com.ti.SIMPLELINK_ACADEMY_CC13XX_CC26XX_SDK__AfkT0vQ__LATEST

    以及用户指南 OAD 专有射频 https://dev.ti.com/tirex/explore/node?isTheia=false&node=A__AF4qnA2RLWd6BQ856R4f-w__com.ti.SIMPLELINK_CC13XX_CC26XX_SDK__BSEc4rl__LATEST 

    Q1) 是的、下载后您必须检查 CRC 以验证映像的完整性、否则您可能会尝试引导至损坏的映像。 请查看其中一个示例中的 crc232.c

    Q2) 是的、您需要进行重新启动并拥有引导加载程序 (BIM/MCUBoot)。 您可以使用 SysCtrlSystemReset()。 例如、检查位于 oad_client.c 中的 OADClient_processEvent() 中的 rfOADClient 示例

    void OADClient_processEvent(uint32_t *pEvent)
    {
        /* Is it time to send the next sensor data message? */
        if(*pEvent & oadClientParams.oadReqEventBit)
        {
            static int32_t prevBlock = -1;
            static bool oadComplete = false;
    
            if(oadComplete)
            {
                /* Reset to BIM */
                SysCtrlSystemReset();
    
                /* Clear complete flag in case reset did not work */
                oadComplete = false;
            }

    Q3) Q4) 是的、我相信您可能需要将映像填充到插槽的整个大小、因为您使用的是 BIM 还是 MCUBoot 限制 (e2e.ti.com/.../cc2340r5-why--pad-paramter-is-needed-in-imgtool-for-dual-image-oad-but-not-for-on-chip-oad

    此致、

    Daniel

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

    尊敬的 Daniel:

    感谢您的答复。 请查找我的答复 ,

    我不太理解这个问题。 这是自定义 OAD 实现还是我们的示例之一? [/报价]

    >>这是自定义 OAD 实现。 我相信 OAD 实现在 TI Stack 15.4 中使用(我希望它使用 IEEE 802.15.4 MAC 层)传感器/收集器示例。 当我在工程中使用自己的 RF 命令时。

    您成功运行 OAD 的问题的第一部分与第二部分有何区别?

    >>第一部分,我创建了一个更高版本的容器,并刷新了 NV 存储器中的辅助插槽,即 0x31000 使用了 Uniflash 工具 然后重新设计了电路板。
    我需要在固件上实施的同样操作、即通过 RF 从网关接收新的固件容器、写入我的 NV(在辅助插槽)和触发器复位。

    您使用的是 BIM 还是 MCUBoot?

    >>我仅使用 MCUboot 引导加载程序。



    感谢您的指导、我已经通过 OTA 成功更新了新固件。  
     我已经执行了以下步骤、
    1) 首先、刷写了我的引导加载程序 (MCUboot)、然后刷写了存储器 0x6000(主槽位)上的 V1.0.0 二进制文件。 现在 V 1.0.0 FW 正在运行

    2.我正在通过 RF 和从内存写入 NV 来查看新固件 v2.0.0 rcvd 0x31000(次插槽)
    3.之后触发 SysCtrlSystemReset();
    4.现在固件版本 V2.0.0 正在运行。

    唯一的问题是固件的填充。 目前我正在通过 RF 传输整个 172KB、即我的插槽大小、但我的实际固件只有 65KB。  

    (重要说明:
    根据我的观察、在我 65KB 的固件休息后、在最后 16 个字节有一些尾数据。 即使我修改了固件或固件版本、尾数据也不会更改。 有人能解释一下它是什么吗?

    如果它是常量数据、那么我可以执行以下操作吗?
    1.擦除 172KB 的整个插槽 2 存储器
    2.从网关仅传输 172KB 中的 65 KB(我的实际纸槽大小)。在传感器上,我可以在插槽末端写入尾部数据 — 2.  
    3.重置。

    我知道这不是可取的、但我尝试通过射频减少 OTA 固件传输时间。 仅当传感器本身知道尾部数据时、它才起作用。

    请分享您的想法。



    此致、
    Muniyappan R.M.

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

    尊敬的 Muniyappan:

    如您所知、OAD 映像采用 bin 文件格式。 此格式仅包含数据、无地址、因此如果器件闪存上有空空间后跟有效数据、则 BIN 文件将包含 FF 以替换空闪存。  

    我不知道有 16 个字节是什么。 但您可以检查映射文件并查看它们是否与对象名称一起列出。

    谢谢、

    Marie H

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

    尊敬的 Marie:

    感谢您的答复。

    是的、我知道闪存的擦除操作(擦除闪存=在整个闪存中将位设为 0 至 1)。
    我更想知道谁在更新的二进制文件中写入最后 16 个字节(尾数据)。

    因为在原始容器 (65KB) 中、尾数据不存在。 将其用作 OAD 兼容段后、我的填充段中只存在尾数据 (172KB)

    所以、添加了一个 imgtool  ?.

    [引述 userid=“627168" url="“ url="~“~/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1598129/cc1314r10-cc1314---implementing-ota-process-using-proprietary-rf-commands-and-mcuboot
    ${COM_TI_SIMPLELINK_CC13XX_CC26XX_SDK_INSTALL_DIR}/tools/common/mcuboot/imgtool sign --header-size 0x80 --align 4 --slot-size 0x2b000 --version 2.0.0 --pad-header --pad --key ${COM_TI_SIMPLELINK_CC13XX_CC26XX_SDK_INSTALL_DIR}/source/third_party/mcuboot/root-ec-p256.pem ${BuildArtifactFileBaseName}-noheader.bin ${BuildArtifactFileBaseName}.bin[/报价]

    如果该工具添加了该内容、则表示它不会出现在.map 文件中、对吧?


    此致、
    Muniyappan R.M.

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

    您好、

    如果它不存在于您的 RAW bin 文件,听起来就像 oad 图像工具正在添加它。 不知道为什么会这样。 如您所知、元数据位于 oad 映像标题中(即文件开头)。

    您使用的是哪个版本的 SimpleLink F2 SDK? 我想我们可能修复了 8.30 版本中与 oad 映像工具相关的错误。 我认为这与 CC13x4 器件的 CCFG 存储在与 CC13x2 器件不同的地址有关。

    谢谢、

    Marie H

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

    尊敬的 Marie:

    感谢您的答复。

    您使用的是哪个版本的 SimpleLink F2 SDK

    我们使用的是 8.31.00.11



    我认为这与以下事实有关:CC13x4 器件的 CCFG 存储在与 CC13x2 器件不同的地址。

    我将查看这个 CCFG 配置。

    感谢您的持续帮助。


    谢谢。此致、
    Muniyappan R.M.

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

    尊敬的 Muniyappan:

    我刚刚使用 SimpleLink F2 SDK 8.32.00.07 进行了构建测试。

    应用程序映像 bin 文件 (ns_CoAP_oad_offchip_LP_EM_CC1314R10_tirtos7_ticlang-noheader.bin) 大小为 327KB。 通过 oad 映像工具 (ns_CoAP_oad_offchip_LP_EM_CC1314R10_tirtos7_ticlang.bin) 运行映像后、文件大小已增加到 367KB。 我可以在文件的末尾看到有一堆 0xFF 后跟一些其他字符。 因此、在较新的 SDK 中、这似乎仍然是一个问题。

    以下是调用 oad 映像工具的编译后命令:

    ${CG_TOOL_ROOT}/bin/tiarmobjcopy -O ihex ${BuildArtifactFileName}${BuildArtifactFileBaseName}.hex
    ${CG_TOOL_ROOT}/bin/tiarmobjcopy ${BuildArtifactFileBaseName}.out --output-target binary ${BuildArtifactFileBaseName}-noheader.bin
    ${COM_TI_SIMPLELINK_CC13XX_CC26XX_SDK_INSTALL_DIR}/tools/common/mcuboot/imgtool 符号--header-size 0x80 --align 4 --slop-size 0x5A000 --pad --version 1.0.0 --pad-header --key ${COM_TI_SIMPLELINK_CC13XX_CC26XX_SDK_INSTALL_DIR}/source/third_party/mcuboot/root-ec-p256.pem ${ArtifacArtifactFileName}-noheader.bin

    我认为这里的罪魁祸首是“Pad"命令“命令。 如果我将其删除并重试、则删除填充。  

    您可以在以下位置找到编译后处理命令:“Project"->"Properties"->"Build"->"Steps"->"Post-build"步骤“步骤。“。</s>“ ““““““这是我在片外 OAD 工程中使用的命令:

    ${CG_TOOL_ROOT}/bin/tiarmobjcopy -O ihex ${BuildArtifactFileName}${BuildArtifactFileBaseName}.hex
    ${CG_TOOL_ROOT}/bin/tiarmobjcopy ${BuildArtifactFileBaseName}.out --output-target binary ${BuildArtifactFileBaseName}-noheader.bin
    ${COM_TI_SIMPLELINK_CC13XX_CC26XX_SDK_INSTALL_DIR}/tools/common/mcuboot/imgtool 符号--header-size 0x80 --align 4 --slop-size 0x5A000 --version 1.0.0 --pad-header --key ${COM_TI_SIMPLELINK_CC13XX_CC26XX_SDK_INSTALL_DIR}/source/third_party/mcuboot/root-ec-p256.pem ${BuildfacArtifactBaseName}-noheader.bin ${BuildFileArtiFileName}

    希望这有所帮助。 谢谢、

    Marie H

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

    尊敬的 Marie:

    感谢您的答复。

    是的、我也完成了该测试。
    从命令中删除--pad 后、尾字符串将被删除、图像箱大小也将减小。
    但是 问题是在没有--pad 的情况下生成的新固件箱将无法正常工作 (我已使用 Uniflash 工具进行了验证。)

    关于 Q4)  那么、我的 OTA 固件是否必须具有完全大小?

    >>我已删除 --垫  从我的编译后命令和我的当前容器大小减少到我的正常 no_header.bin 的大小。
    但当使用从插槽中的 UniFlash 工具刷新它时(版本号较高),它不会复制到我的主插槽。 我的旧固件(固件版本较低)仍在运行。  [/报价]


    那么、  您是否可以检查不使用--pad 命令的新生成的固件 bin 是否正常工作? 使用 Uniflash 工具时、可以看到什么?。 (请在辅助插槽中使用最高版本号刷新未填充的纸槽并重置主板,以进行检查。)

    **我希望它不是一些垃圾值;它是一些由引导加载程序验证的数据。 如果映像工具生成的二进制文件中不存在、则引导加载程序不会跳转到该固件。


    此致、
    Muniyappan R.M.

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

    尊敬的 Muniyappan:

    嗯,我很抱歉我错过了你的帖子.  

    我已经联系了拥有此软件的 SW RND 团队。 恐怕本周我可能不会收到任何反馈。 有他们的反馈时、我会通知您。

    谢谢、

    Marie H

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

    尊敬的 Marie:


    我会告诉您我何时收到他们的反馈。

    没问题。

    另外、您能否确认、对于不同的固件代码和固件版本、此尾字符串是恒定的? 。

    因为目前我已经在传感器端(即 OTA 数据包接收器)应用了补丁、方法是在从网关接收新固件箱后、在辅助插槽的末尾手动写入尾字符串(即 16 字节数据)。

    非常感谢您的持续支持。

    此致、
    Muniyappan R M

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

    您好、

    我不确定这个字符串是什么。 当您查看非填充纸槽的末端时、它是相似的吗?

    您可以尝试加入 MCUBoot 断电线。 他们可能提供有关此标志的更多详细信息。

    https://docs.mcuboot.com/

    谢谢、

    Marie H

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

    尊敬的 Marie:

    感谢您的答复。

    [引述 userid=“277653" url="“ url="~“~/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1598129/cc1314r10-cc1314---implementing-ota-process-using-proprietary-rf-commands-and-mcuboot/6175719

    您可以尝试加入 MCUBoot 断电线。 他们可能提供有关此标志的更多详细信息。

    [/报价]

    我当然会加入这种不和。

    当您查看非填充容器的末尾时、它是相似的吗?

    编号 它不存在于非填充纸槽中。



    此外、我还查看了 SDK 中的图像工具脚本。  刚才我找到了这个 python 脚本 dumpinfo.py



    这是我们要查找的数据。



    它看起来是一个幻数。 (但它有两个幻数)。  

    我需要分析脚本以了解更多详细信息。 您也可以分享您的想法。


    谢谢。此致、
    Muniyappan R M

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

    尊敬的 Muniyappan:

    映像末尾的字节称为 bootmagic。 这是一个 16 字节的密钥、在映像验证期间会进行检查。

    我还不能弄清楚是否可以将这个魔法存储在闪存结束以外的其他地方。  

    谢谢、

    Marie H

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

    尊敬的 Marie:

    感谢您的答复。

    [引述 userid=“277653" url="“ url="~“~/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1598129/cc1314r10-cc1314---implementing-ota-process-using-proprietary-rf-commands-and-mcuboot/6184096

    我还不能弄清楚是否可以将这个魔法存储在闪存结束以外的其他地方。  

    [/报价]

    哦、还可以。

    从该脚本中、我可以看到两组 boot_magic 数字。

    现在我正在对我的辅助插槽末尾的第一个 bootmagic 值进行硬编码、并且工作正常。 如果可能的话,你能告诉我另一个引导幻数和它应该在哪里使用吗?.  

    非常感谢您的持续支持。

    此致、
    Muniyappan R.M.

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

    您好、

    我会检查,并试图回到你下周初.

    谢谢、

    Marie H

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

    您好、

    这是我得到的答案:

    BOOT_MAGIC 和 BOOT_MAGC_2 都验证映像、但也提供有关字节对齐方式的信息。 与中一样、如果最后 16 个字节与 boot_magic 匹配、则表示默认为 8 字节写入对齐。 否则、如果最后 14 个字节与 boot_magic_2 匹配、则表示有自定义写入对齐、魔法字段的前 2 个字节表示实际对齐值、在这种情况下、接下来的 14 个字节与 boot_magic_2 匹配。 这使得 MCUboot 能够支持任何对齐值(16、32、64 等)、而无需每个值使用不同的魔术常数。


    例如 0x20 0x00 | 0x2D 0xe1 0x5d 0x29 0x41 0x0B 0x8d 0x77 0x67 0x9C 0x11 0x0F 0x1f 0x8a
    前 2 个字节:小端字节序格式中的 0x20 0x00 = 32(对齐值)
    剩余 14 个字节:boot_magic_2 签名
    请参阅同一文件中的以下代码片段:

    if trailer_magic == BOOT_MAGIC:
          max_align = 8  # Default alignment
    elif trailer_magic[-len(BOOT_MAGIC_2):] == BOOT_MAGIC_2:
          max_align = int.from_bytes(trailer_magic[:2], "little")  # Custom alignment   

    MCUboot 在固件映像末尾的映像尾存储状态信息。 这包括以下字段:
    image_ok — 图像是否已确认正常工作
    COPY_DONE — 交换操作是否完成
    SWAP_INFO — 交换状态信息
    swap_size — 交换操作的大小
    在引导/升级过程中、必须单独写入这些字段中的每一个字段。 由于闪存对齐要求、每个字段必须至少占用 max_align 字节、即使实际数据仅为 1 字节也是如此。
    示例
    使用 8 字节对齐:
    | SWAP_SIZE(4 个字节)|填充(4 个字节)|总共<- 8 个字节
    | SWAP_INFO(1 字节)|填充(7 字节)|总共<- 8 个字节
    | COPY_DONE(1 字节)|填充(7 字节)|总共<- 8 字节
    | image_ok(1 字节)|填充(7 字节)|总共<- 8 字节
    | boot_magic(16 字节)|

    谢谢、

    Marie H

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

    感谢您的持续支持、Marie。

    此致、
    Muniyappan R.M.