本帖最后由 小恩GG 于 2020-1-21 14:01 编辑
RT1050 HAB加密后软件复位第二次无效分析与解决
一,问题描述
前一段时间,遇到一个客户在做RT1050 HAB加密的时候,遇到比较怪异的问题:HAB加密之后,app代码里面有软件复位,发现第一次软件复位可以正常运行,但是第二次软件复位之后,就无法工作,只有POR能够重新工作,通过层层问题剥离,发现也和SJC_DISABLE=1 fuse值打开有关。如果HAB加密SJC_DISABLE=0, 也不会出现上述软件复位的问题。那么到底问题出在哪里,并且该如何解决呢?下面我们仔细分析下具体问题复现的步骤。
问题复现步骤如下:
1. MIMXRT1050-EVKB板子修改外部电阻,选择从QSPI启动,实际上从hyper 启动也可能有上面的软件复位问题。
OPTION1: USE Hyperflash( by default)
OPTION2: USEQSPI FLASH(Mount R153~R158, DNP R356,R361~R366)
2. 准备一个可以实现软件复位的代码
- int main(void)
- {
- char ch;
- /* Init board hardware. */
- BOARD_ConfigMPU();
- BOARD_InitPins();
- BOARD_BootClockRUN();
- BOARD_InitDebugConsole();
- PRINTF(" \r\n \r\n BOARD RESET start.\r\n");
- PRINTF(" Helloworld.\r\n");
- // setup systick to 1ms
- SysTick_Config(SystemCoreClock / 1000);
- while (1)
- {
- s_delay_cnt = 500; // toggle led every 500ms
- while (s_delay_cnt)
- {
- // check user button
- if (USER_BUTTON) {
- while (USER_BUTTON); // wait for user button to be depressed
- PRINTF("WAKEUP key pressed, will do software system reset.\r\n\r\n\r\n");
- // Issue a system reset request to ARM Cortex Core
- NVIC_SystemReset();
- }
- }
- USER_LED_TOGGLE();
- }
- }
复制代码
3. 做HAB加密
可以参考我另外一篇经验分享:
4. 使能SJC_DISABLE=1
做了HAB烧录,并且SJC_DISABLE=1,可以发现烧录之后,第一次软件复位可以起来,板上Led小灯正常闪烁,但是第二次WAKEUP按键按下,做第二次软件复位,代码卡住,不能正常启动。
二,解决方案
像上述这样用的客户确实不是很多,但是遇到这种问题,还是要仔细去分析并且找出解决方案,经过和内部专家的仔细测试与分析,发现这个问题和JTAG_TRSTB引脚在复位过程中的状态有关。
有两种方法可以去解决这个问题:
2.GPIO_AD_B0_11_JTAG_TRSTB引脚从硬件上直接添加下拉电阻
修改之后,测试结果如下:
可以发现,已经能够多次软件复位并且正常启动了。
总之,就是要保证在复位的时间,JTAG_TRSTB引脚电平是低电平,如果不配置,在复位的时候浮空或者为高会有上面的问题,导致这个问题的原因,是使能了相关的secure模式, 复位的时候,如果JTAG_TRSTB引脚为高或者浮空,会导致重复切换fuse状态,TCLK被使能和禁止之间切换,然后导致芯片检测到JTAG的变化,认为是安全攻击导致启动出错。
|