主题中讨论的其他器件:UNIFLASH、controlSUITE
您好!
我正在尝试使用 UniFlash 首次配置 DCSM、并且我必须做一些错误的操作、因为在打开安全性后、即使加载了密码值、我也无法重新编程或连接到目标。 我的错误可能很简单、但在我砖砌另一个电路板之前、我希望获得有关我使用该工具的反馈、以最大程度地减少我所经历的电路板数量。
我的目标是打开 CPU1中的 DCSM、其中所有闪存段和 RAM 都安全在区域1下。 我正在使用第一个区域块、因此我将链路指针保留为全 FS。 我目前没有尝试仅提供 exe 保护、也不需要安全的 CRC 生成功能。 我将引导选项/引脚保留为默认值/引导至闪存。
我的理解是、一旦打开 DCSM 区域安全、如果加载了正确的密码值并正确执行密码匹配流程、您仍然可以使用 UniFlash 对器件进行重新编程 (我假设在加载正确的密码值并单击解锁按钮时、UniFlash 可以执行此操作)。
以下是我的事件序列:
使用 hex2000从.out 文件创建.hex 文件。 创建的十六进制文件中没有链接任何 OTP 配置。 我希望在 Blinky with DCSM 示例项目之后最终实现这一目标、但首先我想了解一种使用 UniFlash 的基本方法。 我不认为这一点很重要、但我的 hex2000命令行是:hex2000.exe -romwidth=16 -memwidth=16 -i "%REL_path%Release\product.out"-o "%REL_path%ProgrammingFiles\production.hex"
在 DCSM 处于默认空白状态的器件上、我可以通过"UniFlash Using Program -> C28xx_CPU1 -> Load Image"成功地对十六进制文件进行编程
对映像进行编程后、我将移至"Settings & Utilities -> C28xx_CPU1"并设置以下内容:
Z1-LINKPOINTER1 (0x78000)(32位) 0xFFFFFFFF -保留所有三个链路指针副本的默认值、以便链路指针指向第一个区域块。
Z1-LINKPOINTER2 (0x78004)(32位) 0xFFFFFFFF
Z1-LINKPOINTER3 (0x78008)(32位) 0xFFFFFFFF
Z1-PSWDLOCK (0x78010)(32位) 0xFFFFFFFE -技术参考手册指出除0xF / 0b1111以外的任何值都应锁定密码、因此我选择了0xE 或0b1110。
Z1-CSMPSWD3 (0x5F016)(32位) 0x111111 -这些不是我正在使用的实际密码值、而是将所有四个位置编程为非0xFFFFFFFF 和非零值(TRM 说所有零都是永久锁定)
Z1-CSMPSWD2 (0x5F014)(32位) 0x22222222
Z1-CSMPSWD1 (0x5F012)(32位) 0x3333
Z1-CSMPSWD0 (0x5F010)(32位) 0x444444
Z1-GRABSECT (0x5F01A)(32位) 0xFF5555 -所有闪存扇区至区域1
Z1-GRABRAM (0x5F01C)(32位) 0xFFFFFF5555 -所有 RAM 至区域1、此时不使用 CLA、因此留空。
该页面上的所有其他设置、我保留默认值。
在将这些值加载到"Settings & Utilities -> C28xx_CPU1"页面上的 UniFlash 字段中后、我单击"Program All Zone 1 Security Settings button"、该操作将在没有错误的情况下完成。
执行上述序列后、我会对目标进行循环通电、然后转至"Settings & Utilities -> C28xx_CPU1"页面。 然后向下滚动到 CSMPSWD 部分并单击解锁按钮。 我假设这是执行密码匹配流程并取消目标安全保护的按钮、因此我需要对电路板进行重新编程。 当我按下 解锁按钮时、我得到并错误:"[ERROR] C28xx_CPU1:连接到目标时出错:(错误-1156 @ 0x0)器件可能在低功耗模式下运行。 是否要使其退出此模式? 选择"是"以强制器件唤醒、然后重试此操作。 选择"否"以在不唤醒器件的情况下重试此操作。 (仿真包8.2.0.00004)"
Blow 是上述序列中导致错误的 UniFlash 控制台输出。 在下面的序列中、我对该器件进行了两次编程、以确认图像未对 OTP 进行编程、因为我之前已经用 DCSM 示例文件复制过 Blinky 进行了实验。
UniFlash 控制台日志:
[10/3/2019、5:15:49 PM][INFO_C28xx_CPU1:GEL 输出:存储器映射初始化完成
[10/3/2019、5:15:49 PM][INFO_C28xx_CPU1:如果在一个内核上执行擦除/编程(E/P)操作、则另一个内核不应从共享 RAM (SR)执行、因为它们用于 E/P 代码。 此外、CPU1将被暂停以确定将运行闪存插件代码的 CPU 的 SR 所有权、之后 CPU1将被设置为运行其应用。 在对两个闪存组进行编程后、可以开始从 SR 执行用户代码。
[10/3/2019、5:16:00 PM][成功]程序加载已成功完成。
[10/3/2019、5:16:06 PM][INFO_C28xx_CPU1:GEL 输出:存储器映射初始化完成
[10/3/2019、5:16:17 PM][成功]程序加载已成功完成。
[10/3/2019、5:22:29 PM][INFO_C28xx_CPU1:GEL 输出:存储器映射初始化完成
[10/3/2019、5:22:29 PM][INFO_C28xx_CPU1:执行安全操作...
[10/3/2019、5:22:29 PM][INFO_C28xx_CPU1:对 LINKPOINTER 寄存器进行编程...
[10/3/2019、5:22:30 PM][INFO_C28xx_CPU1:计算得出的链路指针偏移:0x20
[10/3/2019、5:22:30 PM][信息] C28xx_CPU1:对 OTPSECLOCK 寄存器进行编程...
[2019年10月3日、5:22:31 PM][信息] C28xx_CPU1:对 OTPBOOTCTRL 寄存器进行编程...
[10/3/2019、5:22:32 PM][INFO_C28xx_CPU1:编程密码...
[10/3/2019、5:22:33 PM][INFO_C28xx_CPU1:对 EXEONLYGRABProgram 寄存器进行编程...
[10/3/2019、5:22:34 PM][成功] C28xx_CPU1:操作成功完成。 -->此时,我对目标进行循环通电。 当我尝试解锁目标时、日志会继续下面的内容。
[10/3/2019、5:23:02 PM][错误] C28xx_CPU1:连接到目标时出错:(错误-1156 @ 0x0)器件可能在低功耗模式下运行。 是否要使其退出此模式? 选择"是"以强制器件唤醒、然后重试此操作。 选择"否"以在不唤醒器件的情况下重试此操作。 (仿真包8.2.0.00004)
我使用的是 Code Composer Studio 版本:9.1.0.00010和 XDS200USB JTAG 电缆。 对于 CCS"检查更新"报告、未找到更新、因此我认为开发工具都是最新版本。
UniFlash 版本: 5.1.0.2397 (上周下载)。
我还尝试仅使用 UniFlash 按钮对每个字段单独编程密码值、密码锁定、捕捉器和 grabsect 值、而不对所有其他值进行编程、并获得相同的结果。
对于硬件、引导模式选择引脚(GPIO72和 GPIO84)通过上拉电阻器(GET/Flash 引导模式)被拉高。 目标硬件是定制的控制板、但 DSP 硬件的电源、JTAG、复位过孔 IC、PCB 布局等... 基本上是 TI 参考设计。
下一步是再次读取引导引脚和引导模式以及 OTP ECC 的工作原理、以查看我是否未正确处理这些引脚、但目前引导模式设置完全为默认值、并且我没有更改任何 ECC 设置 默认值。
如果有人看到我做了些错误的事,我将非常感谢对建议的任何更正。 感谢你能抽出时间。
以下是对理解项目的一些确认:
作为 DCSM 新手、我已经阅读了 TRM 中的 DCSM 部分、 并在此处搜索论坛帖子。 以下是我迄今为止学到的一些要点。 如果我在这些问题上有任何问题、请告诉我、因为这将帮助我找出问题(以及未来的问题)。 我还将更正或删除任何不正确的陈述、以便不会使人感到困惑。
-将所有零编程为您的密码值可能不是您想要做的-完成此操作后、器件将被永久锁定。
-您可能会认为,如果您将所有内存锁定在一个区域中,就不会有任何内存访问问题。 这种情况并非如此、因为共享 RAM (GSx)和 M0/M1无法受到保护。 此外、您还无法将数据从安全闪存复制到非安全 RAM (我认为)。 这意味着、如果 ramfuncs 段运行的是 GSx RAM 或非安全本地 RAM、则当您尝试将 ramfuncs 从安全闪存复制到不安全 RAM 时、在运行时会遇到问题。 如果 ramfuncs 闪存是安全的、那么 Ramfuncs 应该位于安全 RAM 中。
-您可能希望堆栈处于不安全的 RAM 中、以便任何函数调用都可以使用堆栈。 如果您的堆栈位于安全 RAM 中、并且调用了不安全闪存中的函数、则该函数将无法访问堆栈。 如果在不安全的存储器中有一组函数指针被调用、如果栈位于安全 RAM 中、它们也会有问题。
-如果您在链接 ramfunc 的闪存上打开了 exe Only 选项、则需要使用 TI 提供的内置 SafeCopy 函数。 如果只打开 exe、则即使在同一安全区域内完成该闪存段、也无法将其读取到 RAM 中、这就是提供 SaveCopy 函数的原因。
-有两个安全区域。 双区域允许您将代码/IP 锁定在一个区域下、并将 RAM/Flash 保持打开状态以便第三方进行开发、然后第三方可以使用另一个区域锁定其 IP。 如果您是单个开发人员、只想锁定所有内存、您实际上只需要使用一个区域。
双核 F28379D 部件的每个内核都有自己的 DCSM。 如果您希望保护两个内核、则需要配置两个 DSM。 在 CPU1中打开安全功能不会保护 CPU2。
-DCSM OTP 值只能写入一次,但某些值(password、grab RAM/Sect 和 exe only 设置)在 OTP 内存中有30个副本。 如果您希望在对初始集编程后更改为其他集、这些选项将非常有用。 LINKPOINTER 选择30个区域块中的哪一个。 如果链接指针全部为 fs、则默认情况下将使用第一个区域块。 要选择第二个区域块、您需要将链接指针中的位0设置为零。 要选择第三个区域块、您需要将位1设置为零、以此来通过位29将区域块重置至块30。
- LINKPOINTER 有三个副本,它们都应设置为相同的值。 使用三个副本是因为 LINKPOINTER 不受 ECC 内存保护。
-即使将所有 FS 写入 OTP 值、也会为该空值写入相应的 ECC (链接指针除外)。 这意味着、如果您写入所有0xFFs、您将无法稍后返回并写入非0xFF 值 、因为 ECC 将之前被写入、并且您的新值将不会相同。
-如果您要将 OTP 配置链接到您的项目、请按照安装 controlSUITE 后获得的 Blinky with DCSM 示例项目中的示例进行操作。 示例工程位于文件夹结构中的 device_support 下。 OTP 段被有意拆分以避免保留区域。 如果写入这些保留区域、则会产生错误。 此外、当您准备好尝试 OTP 的实际编程时、请记住注释掉2837xD_DSCM_lnk_CPU1.cmd 文件中的 type = DSECT 选项。 type = DSECT 是一个虚拟加载选项、可防止段链接到中。 最后、如果您使用除默认第一个区域块之外的任何区域块(指向链接指针是否为全 FS)、则必须将 DCSM_ZSEL_Z1_Px 的原点更新到所使用的区域、每个区域的长度为0x10。
- OTP 中有 DCSM 内存,CPU RAM 寄存器中也有 DCSM 相关寄存器。 您想要设置的任何配置都应编程到 OTP 存储器中。 CPU RAM 寄存器用于查看 OTP 存储器中的内容。 当 OTP 被访问时、RAM 寄存器被更新。 DCSM RAM 寄存器还有一些与 DCSM 相关的状态值(如安全或非安全状态)、用于解锁目标的密码密钥值被写入 CPU 寄存器(Zx_CSMKEY0至 ZxCSMKEY3)。

