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.

[参考译文] UCD3138:[UCD3138]如何避免从器件非法导出固件

Guru**** 2502205 points
Other Parts Discussed in Thread: UCD3138, UCD3138A, UCD3138064

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/728762/ucd3138-ucd3138-how-to-avoid-illegal-fw-export-from-device

器件型号:UCD3138

大家好、

好的、我想知道如何避免从器件非法导出固件?谢谢。

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

    您是否询问如何防止任何人从您的设备非法导出固件?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    是的、谢谢。

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

    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 后重置器件并捕获其他块。  如果您真的担心这一点、我认为您需要要么根本不启用重新编程、要么输入大密码并尝试有限数量的内存清除。  

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

    谢谢、我听从了您的建议 、并尝试调用大容量耳机、而不是只清除校验和、但有问题、您能帮我吗、谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否确实在使用 UCD3138? 您好像使用的是064或128、因为它要求您提供块编号。 正如我在上面提到的、在这些模块上、您可能需要擦除多个块。 我们有一组代码。 如果您可以在 software_interrupt.c 或 interrupts.c 中找到软件中断、并查看案例14、您可以看到代码对块编号有何作用、并在此处工作。 或者、您可以将零或1作为参数、看看会发生什么情况。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    很抱歉、我没有注意到 UCD3138064、但现在我正在使用 UCD3138、它仍然无法清除所有的 pflash、IC 无法返回 ROM 模式...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    程序清零程序闪存和零输出完整性字都需要处于32位模式、否则它们的执行会出现问题。 若要更改它们、请首先在列表中右键单击它们、然后单击特定于文件的选项、然后取消选中其显示为"16位代码状态"的位置、然后单击"确定"。 这应该有助于使它们正常工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!
    相关的软件中断.c 文件现在应该处于 ARM 模式(32位)、但仍然无法返回到 ROM 模式、您能帮助我检查代码吗? 谢谢。
    MEGA。NZ/
    如果清零程序闪存和零输出完整性字不是在32位模式下,我检查了生产代码,它们仍然是16位模式,但 interrupt.c 和 standard_interrupt.c 除外,谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    每当您更改编译器版本时、16至32位模式往往会发生变化。 GUI 不能很好地将命令转换到编译器到新版本。

    16位的问题是编译器处理32位和16位模式之间切换的方式。
    通过擦除或只写入零来更改闪存值的代码不能位于闪存中。 当闪存被改变时、它返回所有的 FFs。 我们将代码复制到 RAM 中。 对于速度、中断必须处于32位模式、并且因为它必须只执行一些32位指令。 因此、它将使用32位入口点跳转至并开始复制。 如果16位代码在程序闪存中的32位入口点之后相对较近、这一切都很好、但情况并非总是如此。 没有什么可以保证这一点。 因此、有时它使用16位、有时不使用。 一般情况下、墨菲的法律适用。

    TI 不会让我从您放置代码的位置挑选代码。 如果您只是将整个.map 文件附加到返回消息、我会告诉您很多。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ian:

    请按以下方式下载,谢谢。

    e2e.ti.com/.../Test_5F00_clear_5F00_pflash.rar

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

    嗯、看起来我们从未尝试过使用这个特定版本的代码清除程序闪存。  您需要向快速中断处理程序添加一行:

      案例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
         {

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

    尊敬的 Ian:

    返回 ROM 模式是可行的,顺便说一下,如果我想确认是否清除了 pflash,根据下表,我是否应该 下载 pflash randess :0x10000到0x17fff,看看它是否是 FF,对吧?

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

    是的、假设您处于 ROM 模式。