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.

[参考译文] CC1312R7:无法可靠地使用 FlashProtectionSave

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1330987/cc1312r7-unable-to-reliably-use-flashprotectionsave

器件型号:CC1312R7

我们要锁定闪存的上半部分包含一些 NMV RO 配置信息、引导加载程序和 CCFG。 从0x0009 C000到 0x000B 0000的所有内容。

我正在使用 FlashProtectionSet ()首先设置 FLASH_WRITE_PROTECT (用 FlashProtectionGet ()读回它) ,然后用 FlashProtectionSave ()将它保存到 CCFG 中。   设置后、FlashProtectionSet 和 FlashProtectionGet 看起来都工作了、从而显示其已锁定。 显然、它不会在复位后持续。

但是、我随后将同一偏移传递到 FlashProtectionSave、这有时会返回成功而有时也会返回错误。 CCFG 反映返回值。  


扇区0x4e (0x0009c000)是 RO
扇区0x4e (0x0009c000)保存成功
扇区0x4f (0x0009e000)是 RO
扇区0x4f (0x0009e000)保存成功
扇区0x50 (0x000a0000)是 RO
扇区0x50 (0x000a0000)保存成功
扇区0x51 (0x000a2000)是 RO
扇区0x51 (0x000a2000)保存成功
扇区0x52 (0x000a4000)是 RO
扇区0x52 (0x000a4000)保存失败
扇区0x53 (0x000a6000)是 RO
扇区0x53 (0x000a6000)保存失败
扇区0x54 (0x000a8000)是 RO
扇区0x54 (0x000a8000)保存失败
扇区0x55 (0x000AA000)是 RO
扇区0x55 (0x000AA000)保存成功
扇区0x56 (0x000ac000)是 RO
扇区0x56 (0x000ac000)保存成功
扇区0x57 (0x000ae000)是 RO
扇区0x57 (0x000ae000)保存失败
扇区0x58 (0x000b0000)是 RW
扇区0x58 (0x000b0000)保存成功

我还尝试了禁用 HWI、它正在使用 driverlib 中的 ROM 函数、因此我无法轻松地遍历代码。 尝试 ROM 调试定义失败、且程序未引导。  

 以下代码:
//将 RO NVS 锁定到并包括 CCFG
// 0x9C000 - 0xB2000
对于(扇区=(MEM_NVS_RO_START / FlashSectorSizeGet ());扇区< sectorCount;扇区++)
{
  uint32_t offset =扇区* FlashSectorSizeGet ();
  FlashProtectionSet (偏移、FLASH_WRI TE_PROTECT);

  Hwi_disable ();
  CMD_printf ("\tSector 0x%02x (0x%08x)是%s\n"、扇区、偏移、
    (FlashProtectionGet (offset)= FLASH_WRITE_PROTECT)? "RO":"RW";
  uint32_t 结果= FlashProtectionSave (偏移);
  CMD_printf ("\tSector 0x%02x (0x%08x)保存%s (%u)\n"、扇区、偏移、
    (结果= FAPI_STATUS_SUCCESS)? "成功":"失败"、结果);
  Hwi_enable ();

CMD_printf ("引导加载程序和 NVM RO 已锁定\n");

附带问题、要锁定 CCFG 存储器、我需要锁定扇区0x58、(0xB0000 - 0xB2000 )是否正确? 即闪存末尾上方的扇区。 或者我是否需要锁定最后一个可用扇区、即 CCFG 中的扇区127? 我是否应该尝试将所有扇区从0x4e 锁定到0xff、即使它们不是有效的闪存位置?  

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

    您好、Lucas:

    通常、我们不建议使用 driverlib (Flash.h)。

    另一种方法是将此闪存段定义为 NVS 区域。 然后使用 NVS_LOCK API。

    https://dev.ti.com/tirex/explore/content/simplelink_cc13xx_cc26xx_sdk_7_10_02_23/docs/drivers/doxygen/html/_n_v_s_8h.html

    谢谢、

    M·H

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

    尊敬的 Marie:

      在复位后、NVS 锁定 API 并非持久的。 此外、它可以阻止读取和写入、我希望允许读取。 还有其他想法吗?

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

    作为后续操作、我可以 使用 NOROM_VersionGET/FlashProtectionSet/FlashProtectionSave 的版本 、它们的工作更加可靠、但我仍然无法锁定扇区0x57 (0x000ae000)和0x58 (0x000b0000)、扇区0x58是我对 CCFG 存储位置的理解。  

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

    您好、Lucas:

    CCFG 位于最后一个闪存页(0x000ae000至0x000b0000 )。  

    一般而言、我们不建议直接使用 Flash.h 等 driverlib API、因此我不确定能为您提供多少帮助。  

    我也不清楚您为什么要锁定闪存。 通常、我们可以选择 CCFG 来锁定调试接口(以防止您的器件在现场被篡改)。 但您尝试执行的操作会在运行时锁定闪存、因此您只需保护闪存不受自己应用的影响。

    谢谢、

    M·H

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

    尊敬的 Marie:

    我正在阅读安全启动文档(https://www.ti.com/lit/an/swra651/swra651.pdf)、如第2.2节所述、 "建议对包含 CCFG 的闪存页面以及芯片擦除禁用配置启用写保护、以保护客户配置的完整性。"

    这将防止加载未经授权的代码并在终端设备上运行。 它还会将引导程序、其启动矢量和验证密钥锁定到器件上、并防止任何篡改。 锁定 NVS 区域非常好、但可以在应用级别实现。

    我不反对使用不同的 API、但我确实想修改 CCFG 写保护寄存器。

    卢卡斯