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.

[参考译文] CC2538-OTA-Image-A.ICF,用于CC2538SF23

Guru**** 2540720 points
Other Parts Discussed in Thread: CC2538, Z-STACK

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/581014/cc2538-ota-image-a-icf-for-cc2538sf23

主题中讨论的其他部件:CC2538,Z-stack

尊敬的支持人员:

我的项目使用 CC2538SF23而不是CC2538SF53,您是否为我更新了CC2538-OTA-Image-A.ICF。

顺便说一句,如果我想执行OTA过程,256K闪存对我来说是否足够? 还是应该使用CC2538SF53的512K闪存,如ZStack演示软件?

巴西,

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

    我们没有用于此特定部件的链接器文件,但您可以从提供的链接器文件开始作为基础,然后修改它以适应较小部件的闪存大小。

    根据您使用的设备类型和堆栈,256k闪存可能是足够的,也可能不够。 例如,Zha OTA -2a终端设备在CC2538上需要85k闪存,因此256k足以支持1.2。 但是,3.0 仍需13万个闪存,因此25.6万个闪存不足以支持OTA。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Jason:

    感谢您的回复。

    因为作为协调员,我们不需要通过OTA更新,所以我们使用SCI来更新协调员固件。因此这对我们来说不是问题。

    作为设备 ,我们应使用OTA通过协调员更新设备固件。

    根据您的描述,对于我的项目,设备和协调员来说,也许256k就足够了。

    如果我修改了ICF文件,应该修改ZStack中的其他哪些. c文件? 这是一项巨大的工作吗?

    巴西,

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我用于终端设备的大小是基线Z-Stack 1.2 SampleLight.2a (已删除所有MT接口)。 您的应用程序大小因您正在执行的操作而异,因此您需要确保您的应用程序不超过可用闪存大小的一半。

    如果您决定使用256k部分,则只需对ICF文件和IAR中的目标设备配置进行更改。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们刚刚使用ADC模块来获取温度并将AD值发送给协调器,这是一个非常简单的功能,我们只需要非常低的电流消耗已用省电功能。
    所以我认为128K就够了。
    关于更改,我有一个类似hal_board_cfg.h的问题:
    //闪存由128页2 KB 组成。
    #define HAL_FLASH_PAGE_SIZE 2048


    #define HAL_IMG_A_beg FLASH_BASE
    #define HAL_IMG_B_Beg (FLASH_BASE + 0x0003E000)

    #IF已定义HAL_IMG_AREA
    #define HAL_NVIC_OSET 512
    #IF (HAL_IMG_Area == 0)
    #define HAL_NVIC_ADDR (HAL_IMG_A_Beg + HAL_NVIC_OSET)
    #Elif (HAL_IMG_Area == 1)
    #define HAL_NVIC_ADDR (HAL_IMG_B_Begg + HAL_NVIC_OSET)
    #否则
    #ERROR HAL_IMG_AREA无效。
    #endif
    #否则
    #define HAL_NVIC_ADDR FLASH_BASE
    #endif

    #define HAL_NV_PAGE_END 254.

    #define HAL_OTA_LICK_PAGE 248.
    #define HAL_OTA_LADER_PAGE_ADDR (FLASH_BASE +(HAL_OTA_LADER_PAGE * HAL_FLASH_PAGE_SIZE))

    地址必须溢出256K,就像hal_board_cfg.h中的上限设置一样,是否有任何修改?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的Jason,附件中的ICF已更新,hal_board_cfg.h也已更新。

    请帮我检查是否正常。

    我的项目使用OTA.bin的组合示例w(enddevice-OTAC1-ImageA-withBootloader)和CC2538-OTA-Image-A。ICF的修改如下:

    //*************************************************************************************************
    //
    // CC2538的链接器配置文件,配置为构建映像A
    //
    //版权所有(c) 2012-2013 Texas2013 Texas Instruments Incorporated。  保留所有权利。
    //
    //*************************************************************************************************

    //
    //定义包含的整个4 GB 寻址空间的内存区域
    //处理器。
    //
    使用大小= 4G定义内存内存;

    //
    //定义片上程序代码空间的区域- OTA后处理工具将填充
    //前492个字节,带OTA报头和虚拟字节。 CRC计算从前导码开始。

    define region flash = mem:[从0x0.2001万EC到0x0021DFFF];

    //
    //为OTA CRC结构定义一个区域。
    //
    定义区域CRC = mem:[从0x0.2001万EC到0x0.2001万F3];

    //
    //为OTA前导码结构定义一个区域。
    //
    定义区域前导码= mem:[从0x0.2001万F4到0x0.2001万FF];

    //
    //为NVIC表定义一个512字节对齐的区域。
    //
    定义区域INTVEC = MEM:[从0x20.02万到0x0.2003万FF];

    //
    //定义片上非易失性(NV )存储器的区域。
    //  “HAL_NV_PAGE_CNT”页的片上闪存(最初为6页)
    //  指定用于将Z-Stack NV项目存储在程序代码空间之外。
    //  此区域的大小必须与"HAL_NV_PAGE_CNT"定义的大小匹配
    //  文件:hal_board_cfg.h
    //
    定义区域NV_MEM = MEM:[从0x0023C800到0x0023F7FF];

    //
    //定义片上工厂调试参数的区域。
    //  指定了一页片上闪存(原第255页)
    //  用于在程序代码空间外“委托”各种参数。
    //
    //密钥建立“隐式证书283”
    定义区域CP_IMPC_283 = mem:[从0x0023FED4到0x0023FF1F];
    //
    //密钥建立“证书颁发机构公共密钥283”
    定义区域CP_CAPK_283 = mem:[从0x0023FF20到0x0023FF47];
    //
    //密钥建立"设备私钥283"
    定义区域CP_DEPK_283 = mem:[从0x0023FF48到0x0023FF6B];
    //
    //密钥建立"隐式证书"
    定义区域CP_IMPC = mem:[从0x0023FF6C到0x0023FF9B];
    //
    //密钥建立"证书颁发机构公共密钥"
    定义区域CP_CAPK = mem:[从0x0023FF9C到0x0023FFB3];
    //
    //密钥建立"设备私钥"
    定义区域CP_DEPK = MEM:[从0x0023FFB4到0x0023FFCB];
    //
    //设备的唯一64位IEEE地址
    定义区域CP_IEEE = mem:[从0x0023FFCC到0x0023FFD3];


    //
    //在闪存中为客户配置区域定义一个区域。
    定义区域FLASH_CCA = MEM:[从0x0023FFD4到0x0023FFDFDFD];

    //
    //定义闪存中锁定位的区域。
    定义区域FLASH_LCK = MEM:[从0x0023FFE0到0x0023FFFFF];

    //
    //定义映像引导管理器(IBM) Ledger页面的区域。
    define region ledger_page = mem:[从0x0023C000到0x0023C7FF];

    //
    //定义映像引导管理器(Image Boot Manager, IBM)的区域
    define region bootloader_page = mem:[从0x0023F800到0x0023FD00];

    //
    //定义片上SRAM的区域。
    //
    定义区域SRAM = mem:[从0x2000.4万到0x2.0007万FFF];

    //
    //为堆定义块。  大小应设置为其它值
    //如果使用C库中需要堆的内容,则为零。
    //
    定义块堆,使对齐=8,大小= 0x0.01万{};

    //
    //表示读/写值应通过从复制进行初始化
    //闪烁。
    //
    通过copy { readwrite };进行初始化

    //
    //表示noinit值应保留为单独值。  这包括
    //堆栈,如果初始化,将销毁中的返回地址
    //初始化代码,导致处理器分支为零并出现故障。
    //
    不初始化{ section .noinit };

    //
    //放置OTA CRC结构。
    //
    置于CRC起始处{只读部分.crc };

    //
    //放置OTA前导码结构。
    //
    放在前导码开头{只读部分.前导 码};

    //
    //放置中断向量。
    //
    放在INTVEC的开头{只读部分.intvec };

    //
    //将CCA区域置于闪光灯的末端。
    //
    放在FLASH_CCA {只读部分.CCA }的开头;

    //
    //放置调试参数项目。
    //
    放置在CP_IEEE的开头{只读部分IEEE-address_space };
    放置在CP_DEPK的开头{只读部分dev_private_key_address_space };
    置于CP_CAPK的开头{只读部分CA_PUOR_KEY_ADDRESS_SPACE };
    放置在CP_IMPC的开头{只读部分implicate_certificate_address_space };
    放置在CP_DEPK_283的开头{只读章节PRIV_KEY_283_ADDRESS_SPACE };
    放置在CP_CAPK_283的开头{只读部分CA_PUB_KEY_283_ADDRESS_SPACE };
    放置在CP_IMPC_283的开头{只读部分impl_CERT_283_address_space };

    //
    //将只读项目的其余部分放入闪存中。
    //
    放入闪存{只读};

    //
    //将RAM矢量表放在SRAM的开头。
    //
    放置在SRAM的起始位置{ section vtable };

    //
    //将所有读/写项目放入SRAM中。
    //
    放置在SRAM中{ readwrite, block heap };

    //
    //放置分类帐页(如果已定义)
    //
    放置在ledger_page { section .dedger };
    请勿初始化{ section .ledger };

    //
    //如果已定义startup ewarm,请放置bootloader页面
    //
    放置在bootloader_page { section .bootloader }的开头;

    但IT固件无法进入主功能,您能否帮助我检查问题是什么?

    谢谢你。

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

    hal_board_cfg.h的修改如下:

    /*----------------------------------
     *                             多映像管理
     *----------------------------------
     */

    /*下载到和就地运行区域必须从偶数页边界开始。
     * NVIC矢量表必须放置在512字节边界上。
     *目前OTA标题已预先安装到映像并下载到就地闪存,但是
     *将来更改此策略不会影响映像引导管理器的功能。
     *图像区域的大小不必相同,但必须始终能够找到其中一个图像
     *另一个。 对这些常量的更改需要在链接程序配置文件中进行相应的更改。
     */
    #define HAL_IMG_a_beg            FLASH_BASE
    #ifdef CC2538SF53      
       #define HAL_IMG_B_BEGB           (FLASH_BASE + 0x0003E000)
    #否则      
       #define HAL_IMG_B_BEGB           (FLASH_BASE + 0x0001E000)
    #endif
    #IF已定义HAL_IMG_AREA
    #define HAL_NVIC_OSET            512
    #IF   (HAL_IMG_Area == 0)
    #define HAL_NVIC_ADDR           (HAL_IMG_A_beg + HAL_NVIC_OSET)
    #Elif (HAL_IMG_Area == 1)
    #define HAL_NVIC_ADDR           (HAL_IMG_B_BEP + HAL_NVIC_OSET)
    #否则
    #ERROR HAL_IMG_AREA无效。
    #endif
    #否则
    #define HAL_NVIC_ADDR            FLASH_BASE
    #endif

    #ifdef CC2538SF53       
     #define HAL_NV_PAGE_END          254
    #否则
     #define HAL_NV_PAGE_END          126      
    #endif
         
    #ifdef CC2538SF53       
     #define HAL_OTA_LICK_PAGE      248
    #否则
     #define HAL_OTA_LICK_PAGE      120  
    #endif
         
    #define HAL_OTA_LADER_PAGE_ADDR (FLASH_BASE +(HAL_OTA_LADER_PAGE * HAL_FLASH_PAGE_SIZE))

    /*----------------------------------
     *                        内部闪存页实施OSAL NV。
     *----------------------------------
     */

    //闪存包含256页2 KB。
    #define HAL_FLASH_PAGE_SIZE      2048
    #define HAL_FLASH_WORD_SIZE      4.

    // Z-Stack使用NV的闪存页面
    #define HAL_NV_PAGE_CNT          6.
    #define HAL_NV_PAGE_beg          (HAL_NV_PAGE_END_HAL_NV_PAGE_CNT+1)
    #define HAL_NV_START_ADDR        (((FLASH_BASE)+(HAL_NV_PAGE_Beg * HAL_FLASH_PAGE_SIZE))

    //工厂调试位置现在位于“锁定位”页面中。  。
    //证书存储在下面定义的位置。
    //注意:这些地址必须与关联链接程序中定义的地址匹配
    //控制文件(.icf)
    //注释:调试项目与HAL_FLASH_WORD_SIZE对齐并填充

    // 74字节隐式证书(用于二进制283密钥建立)
    #ifdef CC2538SF53       
     #define HAL_FLASH_IMPLICT_CERT_283_ADDR (0x0027FED4)
    #否则
     #define HAL_FLASH_IMPLICT_CERT_283_ADDR (0x0023FED4)  
    #endif      
    #define HAL_FLASH_IMPLICT_CERT_283_SIZE (74+2 )/2字节PAD

    // 37字节CA公钥(用于二进制283密钥建立)
    #ifdef CC2538SF53  
     #define HAL_FLASH_CA_PUNAL_KEY_283_ADDR (0x0027FF20)
    #否则
     #define HAL_FLASH_CA_PUNAL_KEY_283_ADDR (0x0023FF20)  
    #endif
    #define HAL_FLASH_CA_PUNT_KEY_283_SIZE (37+3) // 3字节的PAD

    // 36字节设备私钥(用于二进制283密钥建立)
    #ifdef CC2538SF53      
       #define HAL_FLASH_DEP_PRIVE_KEY_283_ADDR (0x0027FF48)
    #否则
       #define HAL_FLASH_DEP_PRIVE_KEY_283_ADDR (0x0023FF48)  
    #endif      
    #define HAL_FLASH_DEP_PRIVATE_KEY_283_SIZE (36)

    // 48字节隐式证书(用于密钥建立)
    #ifdef CC2538SF53      
       #define HAL_FLASH_IMPLICAT_CERT_ADDR (0x0027FF6C)
    #否则
        #define HAL_FLASH_IMPLICAT_CERT_ADDR (0x0023FF6C)
    #endif      
    #define HAL_FLASH_INIMPLICAT_CERT_SIZE (48)

    // 22字节CA公钥(用于密钥建立)
    #ifdef CC2538SF53      
       #define HAL_FLASH_CA_PUNAL_KEY_ADDR (0x0027FF9C )
    #否则
         #define HAL_FLASH_CA_PUNAL_KEY_ADDR (0x0023FF9C )
    #endif      
    #define HAL_FLASH_CA_PUNT_KEY_SIZE (22+2 )// 2字节PAD

    // 21字节设备私钥(用于密钥建立)
    #ifdef CC2538SF53      
       #define HAL_FLASH_DEP_PRIVE_KEY_ADDR (0x0027FFB4)
    #否则
        #define HAL_FLASH_DEP_PRIVE_KEY_ADDR (0x0023FFB4)  
    #endif      
    #define HAL_FLASH_DEP_PRIVATE_KEY_SIZE (21+3) // 3字节PAD

    // 8字节IEEE地址(每个设备唯一)
    #define HAL_FLASH_IEEE-ADDR ( 0x0023FFCC )
    #define HAL_FLASH_IEEE_SIZE (8 )// 在此处重新定义Z_EXTADDR_LEN

    // SoC工厂IEEE地址的位置(信息页)
    #define HAL_INFO_ADDR 0x28万
    #define HAL_INFO_IEEE_Ofst 0x028
    #define HAL_INFO_IEEE_ADDR (HAL_INFO_ADDR + HAL_INFO_IEEE_Ofst)

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

    尊敬的Jason:

    现在我已经解决了这个问题,除了更改ICF和hal_board_cfg.h文件之外,我还在startup ewarm.c.中将flash_start_adDR从0x0027F800修改为0x0023F800

    感谢您的回复。

    巴西,

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

    很高兴听到它对您有用。