湛江市微信网站建设企业,wordpress主题花园,200m的空间可以做大大的网站,成都芯片设计公司1. Tricore 调试加密以及加密情况下调试方法
1.1 设置调试加密
设置调试加密实际上就是下面这个位#xff0c;注意这个位会在 SSW 自动从 UCB_DBG 中装载到下面寄存器#xff0c;前提是 UCB_DBG 的 CONFIRMATION 状态会 UNLOCK 或者 CONFIRMED 设置调试加密的有三种方法注意这个位会在 SSW 自动从UCB_DBG中装载到下面寄存器前提是UCB_DBG的CONFIRMATION状态会UNLOCK或者CONFIRMED设置调试加密的有三种方法分别是在UDE界面上设置在程序中用数据定义UCB区域内容在代码中直接用Flash命令操作UCB。1.1.1 通过 UDE 解密进行设置在连接PLSload elf文件后会自动弹出下面对话框或通过Tools | Programming打开点击UCBs选择UCB_DBG勾选”Debug Interface Lock”, 点击Write configuration.如果要解除保护则可以点击”Erase configuration ” (仅支持在 Unlocked 状态下擦除)在弹出的下面对话框设置密码(0x12345678), 共有8个字 (32字节)的密码可以设置。在实际应用中应该把”Set UCB to confirmed state” 勾选上把CONFIRMED状态改成CONFIRMED, 具体看第3节。(在调试和测试时可以先不勾选)注如果操作不成功则重新连接和加载elf以及烧录一下BMHD例如下面再试试。1.1.2在程序中用数组定义 UCB 区域内容:在工厂生产时UCB部分内容不可能再使用调试器去设置这时往往需要把UCB内容和程序一起烧录进去然后重新上电后UCB的内容就有效了。可以用数组的方式定义UCB内容来实现这种方式。UCB_DBG区域定义如下在Tasking的link文件中定义一段UCB区域group (ordered) { group dbg_orig (run_addrmem:ucb[0x2400]) { select .rodata.dbg_orig; } … } 在程序中定义下面数组 #pragma section farrom dbg_orig const Ifx_Dbg_Config dbg_orig { 0x00000002, /* procondbg, DBGIFLOK1 */ { 0x00000000, /** \brief 0x004: Reserved */ 0x00000000, /** \brief 0x008: Reserved */ 0x00000000, /** \brief 0x00C: Reserved */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x010: Reserved (0x010 - 0x01F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x020: Reserved (0x020 - 0x02F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x030: Reserved (0x030 - 0x03F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x040: Reserved (0x040 - 0x04F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x050: Reserved (0x050 - 0x05F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x060: Reserved (0x060 - 0x06F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x070: Reserved (0x070 - 0x07F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x080: Reserved (0x080 - 0x08F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x090: Reserved (0x090 - 0x09F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x0A0: Reserved (0x0A0 - 0x0AF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x0B0: Reserved (0x0B0 - 0x0BF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x0C0: Reserved (0x0C0 - 0x0CF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x0D0: Reserved (0x0D0 - 0x0DF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x0E0: Reserved (0x0E0 - 0x0EF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x0F0: Reserved (0x0F0 - 0x0FF) */ }, 0x12345678, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x100: PW0-PW3 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x110: PE4-PW7 */ { 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x120: Reserved (0x120 - 0x02F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x130: Reserved (0x130 - 0x03F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x140: Reserved (0x140 - 0x04F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x150: Reserved (0x150 - 0x05F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x160: Reserved (0x160 - 0x06F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x170: Reserved (0x170 - 0x07F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x180: Reserved (0x180 - 0x08F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x190: Reserved (0x190 - 0x09F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x1A0: Reserved (0x1A0 - 0x0AF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x1B0: Reserved (0x1B0 - 0x0BF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x1C0: Reserved (0x1C0 - 0x0CF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x1D0: Reserved (0x1D0 - 0x0DF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x1E0: Reserved (0x1E0 - 0x0EF) */ }, 0x43211234, /** \brief 0x1F0: .confirmation: 32-bit CODE, (always same)*/ { 0x00000000, /* 0x004, Reserved */ 0x00000000, /* 0x008, Reserved */ 0x00000000, /* 0x00C, Reserved */ } };1.1.3在代码中直接用 Flash 命令操作 UCB:可以用Flash Command直接写UCB.可以用Erase Logical Sector Range命令擦UCB。可以用Enter Page Mode, Load Page和Write Page命令来写UCB区域。1.2 加密情况下调试如果在调试加密的情况下正常连接仿真器会连不上。这个时候在下面界面输入正确的密码然后再次连接就可以连上了。下图显示连接成功2. HSM 调试加密HSM 使能后HSM的SSW会判断下面DMU_SP_PROCONHSM.HSMDBGDIS如果这个位是1则会锁住HSM的调试接口反之则使能HSM的调试接口设置HSM调试加密实际上就是设置下面这个位注意这个位会在SSW中自动从UCB_HSM中装载到下面寄存器前提是UCB_HSM的CONFIRMATION状态会UNLOCK或者CONFIRMED设置HSM调试加密的有三种方法分别是在UDE界面上设置在程序中用数据定义UCB区域内容在代码中直接用Flash命令操作UCB。2.1 设置调试加密设置HSM调试加密的有三种方法分别是在UDE界面上设置在程序中用数据定义UCB区域内容在代码中直接用Flash命令操作UCB。2.1.1在 UDE 界面上设置调试加密选择UCB_HSM勾选”Disable HSM debugging”, 点击Write configuration.注意- 在上面的第二个选项也可以设置 Tricore 的调试保护效果等同于第一节描述- UCB_HSM 没有密码因此当 COMFIRMATION 状态设为 CONFIRMED 后将不能再改。由于没有密码在 UDE 界面中不支持输入密码调试。- 如果要解除保护则可以点击”Erase configuration ” (仅支持在 Unlocked 状态下擦除)2.1.2在程序中用数组定义 UCB 区域内容:在工厂生产时UCB部分内容不可能再使用调试器去设置这时往往需要把UCB内容和程序一起烧录进去然后重新上电后UCB的内容就有效了。可以用数组的方式定义UCB内容来实现这种方式。UCB_HSM区域定义如下在Tasking的link文件中定义一段UCB区域/*Fixed memory Allocations for HSM Configuration*/ group (ordered) { group hsmx_orig (run_addrmem:ucb[0x2600]) { select .rodata.hsm_orig; } … } 在程序中定义下面数组 #pragma section farrom hsm_orig const Ifx_Hsm_Config hsm_orig { 0x00000001, /* PROCONHSM */ { 0x00000000, /* 0x004, Reserved */ 0x00000000, /* 0x008, Reserved */ 0x00000000, /* 0x00C, Reserved */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x010: Reserved (0x010 - 0x01F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x020: Reserved (0x020 - 0x02F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x030: Reserved (0x030 - 0x03F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x040: Reserved (0x040 - 0x04F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x050: Reserved (0x050 - 0x05F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x060: Reserved (0x060 - 0x06F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x070: Reserved (0x070 - 0x07F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x080: Reserved (0x080 - 0x08F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x090: Reserved (0x090 - 0x09F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x0A0: Reserved (0x0A0 - 0x0AF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x0B0: Reserved (0x0B0 - 0x0BF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x0C0: Reserved (0x0C0 - 0x0CF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x0D0: Reserved (0x0D0 - 0x0DF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x0E0: Reserved (0x0E0 - 0x0EF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x0F0: Reserved (0x0F0 - 0x0FF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x100: Reserved (0x100 - 0x100) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x110: Reserved (0x110 - 0x01F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x120: Reserved (0x120 - 0x02F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x130: Reserved (0x130 - 0x03F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x140: Reserved (0x140 - 0x04F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x150: Reserved (0x150 - 0x05F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x160: Reserved (0x160 - 0x06F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x170: Reserved (0x170 - 0x07F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x180: Reserved (0x180 - 0x08F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x190: Reserved (0x190 - 0x09F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x1A0: Reserved (0x1A0 - 0x0AF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x1B0: Reserved (0x1B0 - 0x0BF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x1C0: Reserved (0x1C0 - 0x0CF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x1D0: Reserved (0x1D0 - 0x0DF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /** \brief 0x1E0: Reserved (0x1E0 - 0x0EF) */ }, 0x43211234, /** \brief 0x1F0: .confirmation: 32-bit CODE, (always same)*/ { 0x00000000, /* 0x004, Reserved */ 0x00000000, /* 0x008, Reserved */ 0x00000000, /* 0x00C, Reserved */ } };2.1.3在代码中直接用 Flash 命令操作 UCB:这个操作方法同 1.1.3。2.2 加密情况下调试如果在HSM调试加密的情况下正常连接仿真器会连不上。擦除保护后连接HSM恢复正常。3. UCB CONFIRMATION 状态UCB的CONFIRMATION状态分为UNLOCK和CONFIRMED在UNLOCK状态时UCB可以重复擦写当CONFIRMED状态时相当于写保护只有输入正确的密码用”DisableProtection”命令对UCB临时解密才能再操作UCB。在UDE界面下一旦UCB处在CONFIRMED状态则就不能再改变UCB的状态了。更正当输入正确密码后UCB 处在 CONFIRMED 也可以被更改更改后可以再变为unlocked状态在量产的程序中必须改为CONFIRMED状态因为在UNLOCK状态下UCB的Password部分是可以读出来的在调试器连接不上情况下也还是可以通过ASCBootloader读出来。在使能了调试保护后当UCB_DBG的CONFIRMATION改为CONFIRMED后只要知道调试密码依然还是可以调试。在使能了调试保护后当UCB_HSM的CONFIRMATION改为CONFIRMED后那么HSM 的代码就永远不能调试了除非在 HSM 的代码中加入一段后门代码例如检测到一个信号或者命令后把UCB中的调试保护解除。UCB_HSM被CONFIRMED后只有 HSM代码才能操作这块UCB。4. 实际应用的安全考虑在实际应该中即使 MCU 不能被调试但是用外部工具通过和 Bootloader 通讯还是可以把 Flash 程序读出来有下面两种方式可以进入 Bootloader 模式。Bootstrap mode set by external pin:When PINDIS0, and HWCFG[4:5]01/00Bootstrap mode set by internal BMI:When PINDIS1, and HWCFG100/011如果PINDIS为1而且HWCFG] 111. 那么程序一定会从内部Flash启动而且不可能进入任何内部bootloader。因此结论是调试加密BMHD 设置PINDIS 为 1且 HWCFG] 111能保证只有知道调试密码的外部工具才能连接芯片用其他手段无法读取 Flash 以及调试 MCU对于HSM的程序保护需要把 HSM 程序空间设置为HSM_Exclusive(操作UCB_HSMCOTP0/1), 这样主核和外部工具就无法读取HSM程序空间了。如果您对英飞凌AURIX™ 系列产品感兴趣请填写客户信息咨询表我们将后续跟进。QA:问题一、这句话咨询“在量产的程序中必须改为 CONFIRMED 状态因为在 UNLOCK 状态下UCB 的Password 部分是可以读出来的在调试器连接不上情况下也还是可以通过 ASCBootloader 读出来。”疑问1TC3xx量产时UCB_DBG是建议设置为CONFIRMED状态是吧是不是开启了写保护Ans: 量产时建议把UCB_DBG设为Confirmed状态有写保护的作用但是只要知道密码还是可以通过Disable Protection命名临时解除保护然后还是可以继续操作这个UCB例如设为解除调试保护疑问2ASCBootloader是需要使用外部的CAN总线给芯片的RAM里注入代码那当调试口密码认证开启后调试器都连接不上芯片如何烧录代码呢即使可以通过ASCBootloader读取UCB的密码那么操作也很复杂是吧。Ans: 调试保护和ASC bootloader没有关系即使使能调试保护还是可以用和ASC bootloader进行通讯前提需要让MCU进入Generic booloader/ASC bootloader mode疑问3UCB_DBG的CONFIRMED 和UNLOCK 可以随机切换UCB_HSM一旦设置为CONFIRMED 就不能再设置回UNLOCK 了吧。Ans: UCB_DBG的CONFIRMED和UNLOCK可以切换前提是需要知道密码UCB_HSM一旦设置为CONFIRMED不能切回UNLOCK, 因为UCB_HSM无密码。问题二你好 我通过memtool操作Debug加密时把OCDS Lock和Debug interface Lock两个选项都勾上了导致现在解锁不了有什么办法可以解决吗在下面这里输入正确的密码