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.

[FAQ] [参考译文] [常见问题解答] CC1312R7:不同大小、串行跟踪和加密 MCUBoot 教程

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1302558/faq-cc1312r7-different-size-serial-tracing-and-encrypted-mcuboot-tutorial

器件型号:CC1312R7
Thread 中讨论的其他器件:SysConfigUNIFLASH

最近,我不得不经历一个艰难的过程,搜索和尝试做一个不同大小的程序,然后添加串行跟踪和最后能够加密它。

本教程的想法是让任何希望执行相同操作的人都能执行必要的步骤、从而使加密正常工作、感谢 Arthur R.和 Lucas Holzen 提供的帮助。

我知道有些步骤需要更多的解释、但考虑到这是一个相当复杂的主题、我认为这是理所当然的、任何愿意这样做的人都具备足够的知识来解决这个细节问题(例如:如何将 tinyScript 库连接到 MCUBoot)。

  1. 向程序添加跟踪:按照 Arthur 在本线程中提供的步骤操作(警告程序不适合示例引导加载程序):

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1276823/cc1312r7-update-throught-serial-port-modify-bim-or-modify-bootloader

来自 Arthur 的报价:

"要进行日志记录、您需要禁用 exclude_trace 符号、例如、在项目设置中将"x"附加到该符号中:"

之后、您需要从 CCS 中复制 iTM_private、trace.c 和 trace.h 文件。  sdk_path\source\third_party\mcuboot\ti\source\mcuboot_app\mcuboot_config  至  mcuboot_config  文件夹  mcuboot_app  默认项目。

最后、将电源驱动程序添加到 SysConfig

然后、如果使用 CC1312R7、则将调试输出更改为

1 - 在 trace.c 中将 ITM_3000000更改为 ITM_115200、以将波特速度更改为115200 (在本例中、此程序的速度与主程序相同)。  

2 - IOCPortConfigureSet (IOID_13、IOC_PORT_MCU_SWV、IOC_STD_OUTPUT)更改为 IOCPortConfigureSet (IOID_3、IOC_PORT_MCU_SWV、IOC_STD_OUTPUT);  到正常串行端口中的串行布线。

恭喜您、已启用串行跟踪、但现在程序无法装入插槽中、让我们进行更改。

2.更改时隙大小:示例中的默认时隙不要为用户保存数据留出空间、例如使用 NVS 和引导加载程序空间对我来说有点小、因此我也必须更改它。

  1. 确定存储器组织:第一个插槽程序大小、这将是您将来更新程序可用的最大程序大小、在本例中、它为(0x40000)(256KB)、为新固件(另一个0x40000)、NVS 空间(0x20000)(128Kb)和引导加载程序(0x10000)(64KB)留出空间。

 2.使用计算出的值、转到 flash_map_backend.h 并更改中的值(我的情况是 DeviceFamily_CC13X2X7)

#elif defined(DeviceFamily_CC13X2X7) || defined(DeviceFamily_CC26X2X7)
    #define BOOTLOADER_BASE_ADDRESS             0x000A0000
    #define BOOT_BOOTLOADER_SIZE                0x00010000-0x58

    #define BOOT_PRIMARY_1_BASE_ADDRESS         0x00000000
    #define BOOT_PRIMARY_1_SIZE                 0x00040000


    #define BOOT_SECONDARY_1_BASE_ADDRESS       0x00040000
    #define BOOT_SECONDARY_1_SIZE               0x00040000

出于某种原因、引导加载程序的大小必须比分配的时隙小0x58。

3、更改 SysConfig/器件配置中闪存矢量表的地址(不执行此操作、程序在调试中正常运行、但不使用 uniflash 下载)

4.修改 mcuboot_config.h 以使用 MCUBOOT_OVERRIT_ONLY ,如果您使用例如 MCUBOOT_DIRTE_XIP ,您将无法使用加密,您必须为每个扇区的 cmd 和 SysConfig 指定启动闪存地址。 (我不建议这样做、因为有必要使用不同的参数为扇区1或2编译程序。)

5. 现在我们必须将.cmd 更改为插槽的大小、在本例中为(mcuboot_cc13x2x7_cc26x2x7.cmd)、并使用新的起始地址和大小(我还为新的 FW 和 NVS 添加了一些空间)。

#define NEW_FW_BASE             0x40000
#define NEW_FW_SIZE		        0x40000

#define FLASH_BASE              0xA0000
#define FLASH_SIZE              0x10000
#define RAM_BASE                0x20000000
#define RAM_SIZE                0x24000
#define GPRAM_BASE              0x11000000
#define GPRAM_SIZE              0x2000


/* System memory map */

MEMORY
{
    /* Application stored in and executes from internal flash */
    FLASH (RX) : origin = FLASH_BASE, length = FLASH_SIZE

    NEW_FW (RWX) : origin = NEW_FW_BASE, length = NEW_FW_SIZE
    /* Application uses internal RAM for data */
    SRAM (RWX) : origin = RAM_BASE, length = RAM_SIZE
    /* Application can use GPRAM region as RAM if cache is disabled in the CCFG
    (DEFAULT_CCFG_SIZE_AND_DIS_FLAGS.SET_CCFG_SIZE_AND_DIS_FLAGS_DIS_GPRAM = 0) */
    GPRAM (RWX): origin = GPRAM_BASE, length = GPRAM_SIZE
}

在应用程序端、我们还必须对.cmd 进行一些更改(我将为此使用闪烁示例)。

//size of the programs

#define PROGRAM_SIZE 0x40000
#define HDR_SIZE 0x80


	#define FLASH_BASE              HDR_SIZE
	#define FLASH_SIZE              PROGRAM_SIZE-HDR_SIZE
	#define RAM_BASE                0x20000000
	#define RAM_SIZE                0x24000
	#define GPRAM_BASE              0x11000000
	#define GPRAM_SIZE              0x2000


	/* Export the header address to the blinky app */
	MCUBOOT_HDR_BASE = HDR_SIZE;

7.在构建更改中的后处理步骤中:  

sign --header-size 0x80 --align 4 --slot-size 0x56000 --version 1.0.0 --pad-header --pad      
 至  

sign --header-size 0x80 --align 4 --slot-size 0x40000 --version 1.0.0 --pad-header --pad 

现在、您应该能够使用 MCU 引导加载程序加载闪烁负载(以检查一切都在达到这一点)。

为此、请执行以下操作:

1-打开 uniflash。

2-转至设置并选择:擦除所有未保护的扇区。 (具有空起点)

加载生成的 MCUBoot 的.Hex 文件(不是闪烁!)。

4 -转到设置并选择:仅必要部分(保留扇区内的非触摸内容)

在0x40000中(在本例中)加载闪烁程序生成的.bin 文件。

6 -在 trace.c 中以选定的 iTM 速度打开调试端口的串行终端、在本例中为115200 (以便与我的主程序中的相同)。

重置器件。

如果一切运行正常、电路板应呈红色闪烁、然后是绿色闪烁3次(次级扇区中的良好程序)、再开始呈绿色闪烁和红色闪烁。

在串行终端中,你应该得到一个日志与大量的[01],我所做的是将它复制到记事本++并将它替换为没有提供更可读的文本(如果有人知道如何摆脱这个[01],这将是非常感激的)。

3-如何在 MCUBoot (EC256)中解密应用程序并对应用程序进行加密  

按照卢卡斯·霍尔岑的指示和大量的研究,我能够使加密工作,但有一些关键的步骤需要找到。

将 Tiny crypt TI 实现从复制到 MCUBoot 文件夹并链接到:cc13xx_cc26xx_sdk\source\ti\mesh\Zephyr\Subsys\Bluetooth\mesh\tinycrypt

2-在 ecc_platform_special.c 中实现 CSPRNG 函数:

void default_CSPRNG(uint8_t *dest, unsigned int size) {

    TRNG_Params trngParams;
    TRNG_Handle trngHandle;

    // Initialize TRNG
    TRNG_Params_init(&trngParams);
    trngHandle = TRNG_open(0, &trngParams);

    if (trngHandle == NULL) {
        // Error in initialization
        return;
    }

    // Generate random numbers
    TRNG_getRandomBytes(trngHandle, dest, size);

    // Close TRNG
    TRNG_close(trngHandle);
}

感谢 ChatGPT (是的,我正在尝试写一些代码与聊天 GPT 以查看结果,到目前为止还不错)。

三相加 SysConfig 中的 TRNG 支持。

4-修改 mcuboot_config.h:

注释掉:

MCUBOOT_USE_TI_CRYPTO
 

包括

#define MCUBOOT_OVERWRITE_ONLY
#define MCUBOOT_ENC_IMAGES 1
#define MCUBOOT_ENCRYPT_EC256
#define MCUBOOT_USE_TINYCRYPT 1
#define MCUBOOT_SIGN_EC256

5-更改 tc_CTR_MODE 功能。

rc = tc_ctr_mode(out, inlen, in, inlen, counter, &blk_off, ctx); 
 至  

rc = tc_ctr_mode(out, inlen, in, inlen, counter, ctx); 

在 AES_CTR.h 中、这消除了我之前未使用的偏移、并且是 TI Tinicrypt 中使用的实现。

6-在程序中取消注释请求的函数,该函数将产生错误。

7-尝试编译它,它现在应该可以工作。

8-in 应用程序端现在使用–encrypted 命令和所需的证书(首先请参阅第4部分)(未使用示例证书进行测试):

${COM_TI_SIMPLELINK_CC13XX_CC26XX_SDK_INSTALL_DIR}/tools/common/mcuboot/imgtool                 sign --header-size 0x80 --align 4 --slot-size 0x40000 --version 1.1.1 --pad-header --pad    --key ${COM_TI_SIMPLELINK_CC13XX_CC26XX_SDK_INSTALL_DIR}/source/third_party/mcuboot/root-ec-p256.pem           --encrypt ${COM_TI_SIMPLELINK_CC13XX_CC26XX_SDK_INSTALL_DIR}/source/third_party/mcuboot/root-ec-p256.pem              ${ProjName}-noheader.bin ${ProjName}_Encripted.bin

恭喜您、现在引导加载程序具有解密功能、我们知道如何加密程序、那么我们如何生成密钥并加以实施呢?  

 4-生成您自己的证书并实施密钥。

安装 python 3来运行我们将要使用的 imgtool 程序。

2.转至 sdk_path\source\third_party\mcuboot\source\scrips

3.在那里打开一个终端。

4.若要生成证书,请使用:

python imgtool.py keygen -k Test_certificate.pem -t ecdsa-p256

 这将创建 Test_certificate.pem  

5.我将创建另一个来签署标题:

 

python imgtool.py keygen -k Test_certificate_header.pem -t ecdsa-p256


6.现在关键点:应用程序签名需要公钥,加密需要私钥(这一点让我疯狂了一个星期)。

7. 要获取用于签名的公钥,请使用:  

python imgtool.py getpub -k Test_certificate_header.pem -l c

并将它们复制/粘贴到 MCUBoot 第110行的 keys.c 中(记住包含长度! ! 并擦除或注释旧密钥)。

8. 若要获取私钥以进行加密,请使用:  

python imgtool.py getpriv --minimal -k Test_certificate.pem

 并将其复制/粘贴到第271行的 keys.c 中(记住包括长度! 并擦除或注释旧密钥)。

9.现在、我们必须使用此证书创建应用程序映像、如果您位于 SDK 的默认文件夹中、请使用以下内容修改编译后处理步骤:

${COM_TI_SIMPLELINK_CC13XX_CC26XX_SDK_INSTALL_DIR}/tools/common/mcuboot/imgtool                 sign --header-size 0x80 --align 4 --slot-size 0x40000 --version 1.1.1 --pad-header --pad    --key ${COM_TI_SIMPLELINK_CC13XX_CC26XX_SDK_INSTALL_DIR}/source/third_party/mcuboot/ scrips/ Test_certificate_header.pem  --encrypt ${COM_TI_SIMPLELINK_CC13XX_CC26XX_SDK_INSTALL_DIR}/source/third_party/mcuboot/scrips/ Test_certificate.pem  ${ProjName}-noheader.bin ${ProjName}.bin

 

这样、您就可以使加密正常工作、程序加载的方式与不加密的方式相同、但应考虑到由于解密、引导需要更长时间。

非常感谢  Arthur R.和 Lucas Holzen 提供的帮助,如果有任何错误或需要澄清,反馈将非常感谢。

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

    Javier、您好!

    非常感谢您的详细步骤、这肯定会对很多人有用。

    此致、

    亚瑟