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.

[参考译文] CC2652R7:CC2652R7 OpenThread 协议下的 OTA 实现

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1438034/cc2652r7-ota-implementation-under-openthread-protocol-of-cc2652r7

器件型号:CC2652R7
主题中讨论的其他器件: SysConfigUNIFLASH

工具与软件:

尊敬的 TI:
我的工程需要 CC2652R7在 OpenThread 协议下执行 OTA、但我了解到 OpenThread 没有内置 OTA。
我找到的唯一 OTA 解决方案是使用 OpenThread 中的 CoAP 来传输固件、然后使用 MCUboot 更新固件(我不知道 ChatGPT 的说法是否正确)。
我在互联网上未找到根据 OpenThread 协议实现 OTA 的任何方法、也未找到 CoAP 的实现、我现在对 MCUboot 知之甚少。
欢迎您提出任何建议!

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

    我使用的 SDK 和示例如下:

    SDK:6.41.00.17
    RTOS:temp_sensor
    nortos:mcuboot

    我修改了 temp_sensor 的 coapHandleServer 方法、如下所示:

    #include <ti/devices/cc13x2_cc26x2/driverlib/flash.h>
    #define OTA_BUFFER_SIZE 512  // Define size of each packet
    #define FIRMWARE_MAX_SIZE 0x56000  // Maximum firmware size
    static bool otaInProgress = false;
    static uint32_t firmwareOffset = 0x56000;  // Example starting offset for firmware storage
    static const uint32_t flashPageSize = 4096; // Typical flash page size for CC26x2
    
    // Updated OTA initialization - to start and stop OTA
    static void StartOTA() {
        otaInProgress = true;
        firmwareOffset = 0x56000;  // Reset to initial offset
        // Additional steps to prepare the device for OTA, if necessary
    }
    
    static void StopOTA() {
        otaInProgress = false;
        firmwareOffset = 0;
        // Optional: add post-OTA verification or reset
    }
    
    // Flash write function (replace with actual flash writing logic)
    static otError WriteFirmwareToFlash(const uint8_t *data, uint16_t length) {
        otError error = OT_ERROR_NONE;
    
        if ((firmwareOffset + length) > FIRMWARE_MAX_SIZE) {
            return OT_ERROR_NO_BUFS;
        }
    
        // Erase page if needed
        if (firmwareOffset % flashPageSize == 0) {
            FlashSectorErase(firmwareOffset);
        }
    
        if (FlashProgram((uint32_t *)data, firmwareOffset, length) != FAPI_STATUS_SUCCESS) {
            error = OT_ERROR_FAILED;
        } else {
            firmwareOffset += length;
        }
    
        return error;
    }
    
    void TriggerReboot() {
        SysCtrlSystemReset();  // Trigger a reset to boot into new firmware
    }
    
    static void coapHandleServer(void *aContext, otMessage *aMessage,
                                 const otMessageInfo *aMessageInfo) {
        otError error = OT_ERROR_NONE;
        otMessage *responseMessage = NULL;
        otCoapCode messageCode = otCoapMessageGetCode(aMessage);
    
        if (OT_COAP_CODE_POST == messageCode) {
            if (!otaInProgress) {
                StartOTA();
            }
    
            uint16_t payloadLength = otMessageGetLength(aMessage) - otMessageGetOffset(aMessage);
            uint8_t buffer[OTA_BUFFER_SIZE];
    
            otMessageRead(aMessage, otMessageGetOffset(aMessage), buffer, payloadLength);
    
            error = WriteFirmwareToFlash(buffer, payloadLength);
            otEXPECT(OT_ERROR_NONE == error);
    
            if (firmwareOffset >= FIRMWARE_MAX_SIZE) {
                StopOTA();
    
                responseMessage = otCoapNewMessage((otInstance *)aContext, NULL);
                otEXPECT_ACTION(responseMessage != NULL, error = OT_ERROR_NO_BUFS);
                otCoapMessageInitResponse(responseMessage, aMessage, OT_COAP_TYPE_ACKNOWLEDGMENT, OT_COAP_CODE_CHANGED);
                otCoapMessageSetToken(responseMessage, otCoapMessageGetToken(aMessage), otCoapMessageGetTokenLength(aMessage));
                otCoapMessageSetPayloadMarker(responseMessage);
    
                const char *msg = "OTA Complete";
                otMessageAppend(responseMessage, msg, strlen(msg));
    
                error = otCoapSendResponse((otInstance *)aContext, responseMessage, aMessageInfo);
                otEXPECT(OT_ERROR_NONE == error);
    
                TriggerReboot();
            }
        }
    
        exit:
        if (error != OT_ERROR_NONE && responseMessage != NULL) {
            otMessageFree(responseMessage);
        }
    }
    



    寄存器

    #define MCUBOOT_OVERWRITE_ONLY

    但当我打开 mcuboot.syscfg 时,我收到一个错误 :在脚本文件中解析 CLI 参数时出错:错误:无法识别的参数:- rtos

    我还没有解决这个问题、但有人能告诉我这项计划是否可行?

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

    您好!

    感谢您问这个问题。

    我会在5个工作日内对其进行调查并提供更新。

    谢谢!
    Toby

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

    您好、Toby:

    感谢您让我知道。 我期待着最新情况。

    此致!

    Gasen

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

    尊敬的 Gasen:

    但是当我打开 mcuboot.syscfg 时、出现错误 :解析脚本文件中的 CLI 参数时出错:错误:无法识别的参数:--rtos

    MCUBoot 项目实际上并不使用 SysConfig。 用于 MCUBoot 的 SysConfig 仅用于 CCFG。

    任何引脚修改等应直接在项目中完成。

    总之、Thread 未指定任何 OTA 机制(仅指定网络层)。

    您是否在使用 Matter? 或者说它是 Thread 吗?

    如果您有一个非 Matter Thread 项目、则可以从以下菜单开始:

    DOORLOCK_OAD_SECURE (dev.ti.com/.../node 和 BIM.

    并参阅以下内容:

    https://dev.ti.com/tirex/explore/node?a=BSEc4rl__6.41.00.17&node=A__APfm9cZhCrJY84-fPJ2IbA__com.ti.SIMPLELINK_CC13XX_CC26XX_SDK__BSEc4rl__6.41.00.17

    谢谢!
    Toby

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

    尊敬的 Toby:

    感谢您的指导。

    我使用的是 Thread、而不是 Matter。 我按照说明使用doorlock_oad_securebim_offchip SDK 6.41.00.17版中的工程。 下面是我做的:

    1. 首先、我将doorlock_oad_secure应用程序二进制文件刷写到器件中。
    2. 然后、我将bim_offchip二进制文件刷写到器件中。
    3. 刷写完毕后、连接了一个波特率为115200的串行终端。 然而、串行输出非常有限、似乎doorlock应用程序未运行或未成功刷写。

    您能否说明刷写顺序(先应用、然后 BIM)是否正确? 或者、我是否需要执行其他步骤才能使设置正常工作?

    此外、我是否需要对 SysConfig 设置进行任何更改、或者此工程组合是否需要特定配置?

    提前感谢您的帮助。

    谢谢!
    Gasen

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

    尊敬的 Gasen:

    如果使用 Uniflash: https://dev.ti.com/tirex/content/cc13xx_cc26xx_simplelink_academy_7_41_00_00/_build_cc13xx_cc26xx_simplelink_academy_7_41_00_00/source/ble5stack/ble_enhanced_oad_fundamentals/ble_enhanced_oad_fundamentals.html#oad-target-setup、您应该能够将 BIM 和应用程序加载在一起、与此处所示的类似

    如果要使用 CCS、应首先在 BIM 项目中输入调试会话来加载 BIM、然后在会话中通过以下方式加载应用:

    1. 窗口-->显示视图-->内存浏览器
    2. 单击图标的箭头  
    3. Load Memory
    4. 指定.bin 应用程序的位置
    5. 文件类型:二进制
    6. 起始地址:在应用程序的链接器文件(.cmd)中指定的起始地址、请参阅"存储器"部分

    谢谢!
    Toby