大家好、
好的、我想知道如何避免从器件非法导出固件?谢谢。
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.
大家好、
好的、我想知道如何避免从器件非法导出固件?谢谢。
UCD 器件实际上很容易锁定以实现代码安全。 与代码安全相比、我们有更多有关锁定它们的 E2E 消息。
基本上有3个步骤可防止固件导出:
1. 不要在生产代码上启用 JTAG
2.不要对生产代码启用内存调试(parm info/parm value PMBus 命令)
3.如果确实启用了生产代码返回 ROM 模式,请确保擦除所有程序闪存,而不是只清除校验和。
我们的 EVM 代码专为调试和代码添加而设计、因此它们以上述三种方式打开。 这是代码开发的理想选择、但不适用于生产代码安全。
我们的所有 UCD 器件都通过使用 IOMUX 映射到其他某个功能的 JTAG 引脚加电。 如果您将其保持在该状态、JTAG 将无法工作、因此没有人可以使用 JTAG 接口读取存储器。
我们的所有 EVM 代码均支持使用 PMBus 接口的内存调试器。 实际上、我们使用的内容远不止 JTAG、因为有时其他函数需要 JTAG 引脚、而且我们的 JTAG 需要处理器停止进行存储器访问。 这通常对 PFC 等设备来说并不方便、尤其如此。
要禁用内存调试器、只需取出 PMBus 中的 parm info/parm value 命令。 这些命令支持存储器读取和写入、包括读取程序闪存。 在较旧版本的 EVM 代码中 、PMBus 代码中有两个大开关语句、用于调用每个命令的函数。 只需从这些语句中获取 parm_info 和 parm_value 调用即可。 它们将被称为 PMBus_write_parm_info 等
在新代码中、我们使用表格、因此条目如下所示:
#define PMBus_CMD_E2_FUNCY_POINTER PMBus_READ_WRITE_parm_info
#define PMBus_CMD_E2_query (query_command_supported + query_write_supported + query_read_supported + query_man_spec)
#define PMBus_CMD_E3_FUNC功能性 指针 PMBus_READ_WRITE_parm_value
#define PMBus_CMD_E3_query (query_command_supported + query_write_supported + query_read_supported + query_man_spec)
您可以删除这些或不删除、但要禁用 parm info/parm 值、您需要找到以下两行:
#define PMBus_CMD_E2_ENABLE (1)
#define PMBus_CMD_E3_ENABLE (1)
并将其更改为:
#define PMBus_CMD_E2_ENABLE (0)
#define PMBus_CMD_E3_ENABLE (0)
这就是您需要做的所有事情。
在程序闪存的末尾有一个校验和位置。 当 UCD 启动时、它的内置 ROM 会检查校验和与程序闪存内容之间的关系。 如果内容与校验和匹配、ROM 将直接控制数据闪存中的程序。 要将新程序写入程序闪存、必须使校验和无效。 在 EVM 代码中、我们将所有零写入校验和。 通过这种方法、您可以查看那里的程序。 这有利于调试、但不适用于生产。 对于生产、您可能需要完全禁用校验和清除。 另一个选项是擦除所有闪存、而不是仅清除校验和。 为此、请在代码中查找调用 clear_integration_word 的所有位置、并将其替换为 clear_pflash。 这适用于 UCD3138和 UCD3138A 器件、它们只有一个闪存块。 具有2个和4个 pflash 块的64和128个器件的 EVM 代码可能只擦除第一个块。 您可以添加命令来擦除其他块、但每个块需要20ms。 因此、可能会发送擦除命令、然后在大约20ms 后重置器件并捕获其他块。 如果您真的担心这一点、我认为您需要要么根本不启用重新编程、要么输入大密码并尝试有限数量的内存清除。
尊敬的 Ian:
请按以下方式下载,谢谢。
嗯、看起来我们从未尝试过使用这个特定版本的代码清除程序闪存。 您需要向快速中断处理程序添加一行:
案例14://擦除整个程序闪存
{
{
寄存器 uint32 * program_index =(uint32 *) 0x19000;//存储程序的目标地址
寄存器 uint32 * source_index =(uint32 *)((void *) clear_program_flash);//设置 pflash 的源地址;
寄存器 uint32计数器;
DecRegs.FLASHILOCK.ALL = 0x42DC157E;//解锁闪存写入
for (counter=0;counter < 500;counter++)//将程序从 pflash 复制到 RAM
{