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.

[参考译文] TMS320F28375D:代码安全模块-更新 FLSEM 寄存器失败

Guru**** 2535750 points
Other Parts Discussed in Thread: CONTROLSUITE, UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/595600/tms320f28375d-code-secure-module---failing-to-update-flsem-register

器件型号:TMS320F28375D
主题中讨论的其他器件:controlSUITEUNIFLASH

我的问题基本上与 此帖子相同、这是一个安全引导加载程序、可以更新安全闪存中的代码。 当引导加载程序用于更新代码时、CPU 似乎会复位并从引导加载程序跳转到指向的应用程序地址。

我遵循了上述链接(下面的代码)中发布的解决方案、但我无法更新 FLSEM 寄存器值以使区域1的信标启用。

DcsmCommonRegs.FLSEM.ALL = 0xA501;// 0xA502表示 Zone2

我还尝试在使用 CCS 进行手动调试时更新 FLSEM 寄存器、但也无法更新 FLSEM 寄存器值。

总之、我有两个问题:

  1. 要更新 FLSEM 寄存器、在更新寄存器之前是否需要执行其他步骤?
  2. 当信号量未启用时、复位 CPU 是预期的结果、它将通过启用信号量来解决这个问题?

谢谢、

Justin

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

    您好 Justin、

    [引用]要更新 FLSEM 寄存器、在更新寄存器之前是否需要执行其他步骤? [/报价]

    您需要确保这段代码仅从 ZONE1运行、否则它将无法更新信标值。 此外、该寄存器也无法通过 CCS 更新。

    [引用]未启用信标时、复位 CPU 是预期结果、它将通过启用信标来解决该问题? [/报价]

    如果启用了看门狗、则可以重置器件。 也可能有其他原因需要重置。  请更正步骤1并查看这是否有用。

    此致、

    Vivek Singh

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

    您好、Vivek、

    我的结果好坏参半、但我很可能会遇到不同的问题。

    我从 controlSUITE 示例中复制了 dcsm_Z1_ZoneSelectBlock.asm 文件。  我还修改了2837xD_DCSM_lnk_CPU1.cmd 文件并删除了"type = DSECT"。

    SECTIONS
    {
    DCSM_OTP_Z1_LINKPOINTER:>DCSM_OTP_Z1_LINKPOINTERPAGE = 0
    DCSM_OTP_Z1_PSWDLOCKPAGE= 0 DCSM_OTP_Z1_LINKPOLOCK
    :>DCSM_OTP_Z1_OTP_CLOCKPAGE = 0 DCSM_Z1_PSWDLOC_OTP_Z1_OTP_TOP_CLOTP_CLOTP_PAGE
    
    = 0 DCSM_Z1_OTP_Z1_CLOTP_TRL
    
    = 0 DCSM_DCLOTP_DCL_CL_TOP_TOP_TOP_TOP_PAGE= 0 DC_Z1_CL_CL_CL_CL_CL_CL_CLOTP_CL_CLOTP_TRL:>0 DCSM_CL_CL_CL_TRL = 0 DCSM_Z1_OTP_CL_CL
    >DCSM_OTP_Z2_PSWDLOCKPAGE = 0,TYPE = DSECT
    DCSM_OTP_Z2_crclock:>DCSM_OTP_Z2_CRCLOCKPAGE = 0,TYPE = DSECT
    DCSM_OTP_Z2_BOOTctrl:>DCSM_OTP_Z2_BOOTCTRLPAGE = 0,TYPE = 0,DCSM_Z2_DSECT_Z2
    = DSECT_Z2
    :> DSECT_DSCL_ZECT_TYPE = 0 

    现在我看到的问题是、当我取消注释 以下用于配置安全存储器和密码的行时、引导加载程序无法跳转到应用程序。

    .sect "Dcsm_zsel_Z1"
    长整型0xFFFFFFFF ;Z1-EXEONLYRAM
    长整型0xFFFFFFFF ;Z1-EXEONLYSECT
    长整型0xFFFFFF5555 ;Z1-GRABRAM
    长整型0xF55555 ;Z1-GRABSECT
    
    长0x12345678 ;Z1-CSMPSWD0 (128位密码的 LSW)
    长整型0x90ABCDEF ;Z1-CSMPSWD1
    长0x12345678 ;Z1-CSMPSWD2
    长整型0x90ABCDEF ;Z1-CSMPSWD3 (128位密码的 MSW) 

    如果我注释掉上述行、引导加载程序将跳转到应用程序。

    谢谢、

    Justin

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

    请注意、安全引导加载程序您只能在安全闪存中更新代码而不会解锁该区域。 要更新用户 OTP 中的安全设置、您需要使用正确的密码解锁器件。

    此致、

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

    这是更新。

    在为 CSM 搜索更多案例后、我可以获得一些有用的信息。

    我的固件映像由三个文件组成。 引导加载程序、应用程序映像0、 应用程序映像1。 应用程序映像0和映像1是相同的。 加电后、引导加载程序将运行并跳转至应用程序映像之一(如果映像0无效)。

    问题:

    • 如果我下载修改的引导加载程序(跳转禁用。 打开 LED 进行测试)本身、CODE/JTAG 已成功锁定。 我必须使用等待引导模式来解锁它。
    如果我下载整个固件映像(BL + Image0 + Image1)、则无法运行引导加载程序-从一开始就根本没有运行的软件
    • 我已仔细检查、只有 Dx 和 LSx RAM 用于引导加载程序、image0和 image1

    CSM 仅在引导加载程序工程中启用、因此我尝试将相同的 CSM 配置应用于 Image0和 Image1。 我观察到 CSM 应用和非 CSM 应用生成的二进制文件大小不同。 CSM 应用的构建映像比非 CSM 应用的版本大两倍。 我比较了映射文件、但唯一的区别是添加了 CSM 部分、这不能解释两倍大小的差异。 因此、超出了定义的闪存大小、我无法尝试此操作。

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

    您好 Justin、

    [引用]在我的案例中、我发现 MX 正由.stack 段使用、因此我将其更改为使用 LSx RAM。 [/报价]

    您应该能够将 MX RAM 用于.stack。 这不应该是问题。 事实上、如果您的代码也从非安全 RAM 运行、那么将安全 RAM 用于.stack 可能会产生问题。

    如果启用了 CSM、我不确定映像文件大小是否会达到两倍。 请检查映射文件。

    我在上一个帖子中询问您是否还在尝试在用户 OTP 中对值进行编程。 如果您可以更详细地解释您在这里尝试做什么以及如何做(每个步骤)、那将是很好的。

    此致、

    Vivek Singh

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

    更新:

    首先、由于我仅使用 zone1和区域选择内容、因此我的 CSM 链接器命令文件如下所示。

    内存
    {
    PAGE 0:/*程序内存*/*
    
    Z1 OTP。 LinkPointers */
    DCSM_OTP_Z1_LINKPOINTER:origin = 0x78000,length = 0x00000C
    // Z1 OTP。 PSWDLOCK/保留*/
    DCSM_OTP_Z1_PSWDLOCK:origin = 0x78010,length = 0x000004
    // Z1 OTP。 CRCLOCK/保留*/
    DCSM_OTP_Z1_CRCLOCK:origin = 0x78014,length = 0x000004
    // Z1 OTP。 被保留/BOOTCTRL */
    DCSM_OTP_Z1_BOOTCTRL:origin = 0x7801C,length = 0x000004
    
    // DCSM Z1区域选择内容(!可移动!!) */
    /* Z1 OTP。 Z1密码位置/闪存和 RAM 分区*/
    DCSM_ZSEL_Z1_P0:origin = 0x78020,length = 0x000010
    
    // Z2 OTP。 LinkPointers */
    DCSM_OTP_Z2_LINKPOINTER:origin = 0x78200,length = 0x00000C
    // Z2 OTP。 GPREG1/GPREG2 */
    DCSM_OTP_Z2_GPREG:origin = 0x7820C,length = 0x000004
    // Z2 OTP。 PSWDLOCK/保留*/
    DCSM_OTP_Z2_PSWDLOCK:origin = 0x78210,length = 0x000004
    // Z2 OTP。 CRCLOCK/保留*/
    DCSM_OTP_Z2_CRCLOCK:origin = 0x78214、length = 0x000004
    // Z2 OTP。 GPREG3/BOOTCTRL */
    DCSM_OTP_Z2_BOOTCTRL:origin = 0x7821C,length = 0x000004
    
    // DCSM Z1区域选择内容(!!可移动!!) */
    /* Z2 OTP。 Z2密码位置/闪存和 RAM 分区*/
    DCSM_ZSEL_Z2_P0:origin = 0x78220,length = 0x000010
    
    }
    
    SECTIONS
    {
    Dcsm_otp_z1_linkpointer:>DCSM_otp_z1_LINKPOINTERPAGE = 0,type = DSECT
    DCSM_OTP_Z1_pswdlock:>DCSM_OTP_Z1_PSWDLOCKPAGE = 0,type = DSCLDCSM_OTP_CK_clock
    :>DCSM_CK_OTP_CK_clock_clock_clock_clock_clock_clock_clock_tp
    :>DCSM_DCT_clock_clock_clock_tp > DCSM_OTP_Z1_BOOTCTRLPAGE = 0、TYPE = DSECT
    DCSM_ZSEL_Z1:> DCSM_ZSEL_Z1_P0PAGE = 0
    } 

    工作部件:

    • 加载启用 CSM 的引导加载程序.out 文件正常工作。
      • 引导加载程序起始地址为0x80000
      • 在调试模式下、DCSMZSEL_Z1_P0 (0x78030)和0x80000之间的空洞填充值为0xFF、而.bin 文件空洞填充为0x00。
        • 若要生成.bin 文件、添加了以下编译后处理步骤:
          • "${CCS_INSTALL_ROOT}/utils/tiobj2bin/tiobj2bin.bat ""${BuildArtiftFileName}""${BuildArtiftFileBaseName}.bin""${CG_TOOL_ROOT}/bin/ofd2000.exe ""${CG_TOOL_ROOT}/bin/hex2000.exe ""${CCE_INSTALL_ROOT}/utils/tiobj2bin/mkhex4bin.exe

    • 假设在0x78030和0x80000之间保留00s 将锁定 zone2密码段、这将锁定所有内容。 因此、我尝试以下两种方法来解决该问题。

    方法1问题:

    • 根据该结果、我比较了.out 文件和.bin 文件。 空洞用0x00填充、因此我在 hex2000.exe 文件执行中添加了--fill=0xFFFF 选项。
      • 我尝试使用 Uniflash 刷写此.bin 文件。 我输入0x78020作为加载二进制文件的起始地址、并收到以下两条不同的错误消息:
        • [13:24:13]开始启动会话操作。
          [13:24:18]操作启动会话返回。
          [13:24:18]将目标配置从:C:\Users\Justin \Documents\XDS510_Delfino.ccxml
          [13:24:46]开始写入闪存操作。
          [13:24:48] C28xx_CPU1:GEL 输出:
          存储器映射初始化完成
          
          [13:24:48] C28xx_CPU1:如果在一个内核上执行擦除/编程(E/P)操作、则另一个内核不应从共享 RAM (SR)执行、因为它们用于 E/P 代码。 此外、CPU1将被暂停以确定将运行闪存插件代码的 CPU 的 SR 所有权、之后 CPU1将被设置为运行其应用。 在对两个闪存组进行编程后、可以开始从 SR 执行用户代码。
          
          [13:24:49]在0x7820上加载程序:C:\Empower \FlexGate_Gen_2_Code\Flexgate_engine\bootloader_CCS\Enable_DCSM\ems_bootloader_cpu01.bin
          [13:24:50]警告>> C28xx_CPU1:加载程序的一个或多个部分落入不可写的存储器区域。 这些区域实际上不会写入目标。 检查链接器配置和/或存储器映射。
          
          [13:24:52]错误>> C28xx_CPU1:文件加载器:验证失败:地址0x0000000000000000B818处的值不匹配请验证目标存储器和存储器映射。
          
          [13:24:52]错误>> C28xx_CPU1:GEL:文件:C:\Empowers\FlexGate_Gen_Two \Code\Flexgate_engine\bootloader_ccs\Enable_dcs\EMS_bootloader_cpu01.bin:发生数据验证错误、文件加载失败。
          
          [13:24:52]文件:C:\Empower\FlexGate_Gen_Two\Code\Flexgate_engine\bootloader_ccs\Enable_dcs\EMS_bootloader_cpu01.bin:发生数据验证错误、文件加载失败。
          [13:24:52]返回写入闪存存储器的操作。
          

        • [14:42:17]开始启动会话操作。
          [14:42:21]操作启动会话返回。
          [14:42:21]已从:C:\Users\Justin \Documents\XDS510_Delfino.ccxml
          [14:42:33]加载目标配置、开始写入闪存操作。
          [14:42:35] C28xx_CPU1:GEL 输出:
          存储器映射初始化完成
          
          [14:42:35] C28xx_CPU1:如果在一个内核上执行擦除/编程(E/P)操作、则另一个内核不应从共享 RAM (SR)执行、因为它们用于 E/P 代码。 此外、CPU1将被暂停以确定将运行闪存插件代码的 CPU 的 SR 所有权、之后 CPU1将被设置为运行其应用。 在对两个闪存组进行编程后、可以开始从 SR 执行用户代码。
          
          [14:42:35]在0x78020上加载程序:C:\Empower \FlexGate_Gen_Two \Code\Flexgate_engine\bootloader_CCS\Enable_DCSM\ems_bootloader_cpu01.bin
          [14:42:35] C28xx_CPU1:写入闪存@长度为0x00003ff8的地址0x00078020 (第0页)
          
          [14:42>CPU1_编 程闪存错误代码:错误代码:C28xx_CPU1:写入闪存错误代码:错误代码:写入0x00003ff8 (错误)。 操作已取消。
          
          [14:42:37]错误>> C28xx_CPU1:文件加载器:存储器写入失败:未知错误
          
          [14:42:37]错误>> C28xx_CPU1:GEL:文件:C:\Empower\FlexGate_Gen_two\Code\Flexgate_engine\bootloader_ccs\Enable_DCSM\Enable_Dcs\EMS 引导加载程序_cpu01.bin:加载失败。
          
          [14:42:37]文件:C:\Empower\FlexGate_Gen_Two\Code\Flexgate_engine\bootloader_ccs\Enable_dcs\EMS_bootloader_cpu01.bin:加载失败。
          [14:42:38]返回写入闪存存储器的操作。 

    方法2问题:

    • 根据方法1的结果、我将0xFFFF 填充孔洞恢复为 hex2000.exe 的默认值、该值将用0x00填充孔洞。 然后、除了 DCSMZSEL_Z1_P0部分、我只使用0xFF 填充 Z1和 Z2。
      • 我尝试使用 Uniflash 刷写此.bin 文件。 我输入 0x78020 作为加载二进制文件的起始地址、并收到以下错误消息:
        • [13:49:29]开始会话操作。
          [13:49:37]操作启动会话返回。
          [13:49:37]已从:C:\Users\Justin \Documents\XDS510_Delfino.ccxml
          [13:49:44]加载目标配置开始解锁操作。
          [13:49:46] C28xx_CPU1:GEL 输出:
          存储器映射初始化完成
          
          [13:49:46]错误>> C28xx_CPU1:写入寄存器 XAR0时出现问题:错误0x00001004/-1041错误发生在:寄存器、目标、设备驱动程序:仿真控制器出现问题。 建议复位仿真器。 这会将每个目标与仿真器断开。 然后、应对目标进行下电上电或硬复位、然后进行仿真并重新连接到每个目标。
          
          [13:49:48]错误>> C28xx_CPU1:GEL:执行 OnReset (0)时出错:目标无法在
          XAR0=*(unsigned long *) 0x78018)[f28375d_CPU1.GEL:401]
          at SetupDCSMS()[f28375d_CPU1 0x78018][f28375d_CPU1
          
          
          :0x10024]错误:0x10024]错误:0x242[f_10024_C18_10024]错误:0x10024_10024_10024_C24_10024_C24_10024_C24_C24_0_C24_C24_10024_100_100_10024_100_100_10024_0 存储器、寄存器、目标、器件驱动程序:仿真控制器有问题。 建议复位仿真器。 这会将每个目标与仿真器断开。 然后、应对目标进行下电上电或硬复位、然后进行仿真并重新连接到每个目标。
          
          [13:49:49]错误>> C28xx_CPU1:闪存操作期间发生错误:目标无法写入0x5FB00@程序
          
          [13:49:49]错误>> C28xx_CPU1:写入长度为0x2的第1页上的0x5f800处的存储器块时出错:错误0x00001002/-1156内存、目标、丢失处理器时钟期间出错。 器件可能在低功耗模式下运行。 是否要使其退出此模式?
          
          [13:49:51]错误>> C28xx_CPU1:在闪存操作期间发生错误:无法写入0x0005F800@数据:目标未连接
          
          [13:49:51]错误>> C28xx_CPU1:在闪存操作期间发生错误:无法读取0x70268@程序:目标未连接
          
          [13:49:51]错误>> C28xx_CPU1:无法读取0x70xx@程序:无法读取0x700xx 目标未连接
          
          [13:49:51]错误>> C28xx_CPU1:在闪存操作期间发生错误:无法写入0x5FB00@程序:目标未连接
          
          [13:49:51]返回操作解锁。 

        • 在这个消息之后、CPU 被锁定了、所以我无法再次对这个 CPU 进行编程。

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

    [引用]•假设在0x78030和0x80000之间保留00s 将锁定 zone2密码段、这将锁定所有内容。 因此、我尝试以下两种方法来解决该问题。 [/报价]

    您的假设是正确的。 我们绝不应使用所有0x0对安全设置进行编程、否则器件将被永久锁定、这就是您尝试的方法2中发生的情况。

    我正在邀请我们的 Uniflash 专家来调查您遇到的错误。

    此致、

    Vivek Singh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    使用十六进制文件而不是二进制文件是避免写入0或不必要的存储器段编程的权变措施。 这是因为 hex 文件指定要写入的存储器地址。