查看: 2146|回复: 0

[原创] 【经验分享】RT1050 HAB加密后软件复位第二次无效分析与解决

[复制链接]

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
20147
最后登录
2024-5-6
发表于 2020-1-21 14:00:45 | 显示全部楼层 |阅读模式
本帖最后由 小恩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. 准备一个可以实现软件复位的代码

  1. int main(void)
  2. {
  3.     char ch;

  4.     /* Init board hardware. */
  5.     BOARD_ConfigMPU();
  6.     BOARD_InitPins();
  7.     BOARD_BootClockRUN();
  8.     BOARD_InitDebugConsole();

  9.     PRINTF(" \r\n \r\n BOARD RESET start.\r\n");
  10.     PRINTF(" Helloworld.\r\n");


  11.     // setup systick to 1ms
  12.     SysTick_Config(SystemCoreClock / 1000);

  13.     while (1)
  14.     {
  15.             s_delay_cnt = 500;        // toggle led every 500ms
  16.             while (s_delay_cnt)
  17.             {
  18.                     // check user button
  19.                     if (USER_BUTTON) {
  20.                             while (USER_BUTTON);        // wait for user button to be depressed

  21.                              PRINTF("WAKEUP key pressed, will do software system reset.\r\n\r\n\r\n");
  22.                             // Issue a system reset request to ARM Cortex Core
  23.                             NVIC_SystemReset();
  24.                     }
  25.             }
  26.             USER_LED_TOGGLE();
  27.     }
  28. }
复制代码


3. HAB加密

  可以参考我另外一篇经验分享:


4. 使能SJC_DISABLE=1

47.jpg
HAB encrypted_qspi_SJC_DISABLE1_reproduce the problem.jpg



做了HAB烧录,并且SJC_DISABLE=1,可以发现烧录之后,第一次软件复位可以起来,板上Led小灯正常闪烁,但是第二次WAKEUP按键按下,做第二次软件复位,代码卡住,不能正常启动。

二,解决方案

   像上述这样用的客户确实不是很多,但是遇到这种问题,还是要仔细去分析并且找出解决方案,经过和内部专家的仔细测试与分析,发现这个问题和JTAG_TRSTB引脚在复位过程中的状态有关。

有两种方法可以去解决这个问题:

  • 软件上面使能JTAG_TRSTB内部下拉电阻
    可以在pinmux.c里面加上这段代码:
    IOMUXC_SetPinConfig(
         IOMUXC_GPIO_AD_B0_11_JTAG_TRSTB,       /* GPIO_AD_B0_09 PAD functional properties : */
          0x2000u);  


      2GPIO_AD_B0_11_JTAG_TRSTB引脚从硬件上直接添加下拉电阻

修改之后,测试结果如下:

After workaround.png

可以发现,已经能够多次软件复位并且正常启动了。

总之,就是要保证在复位的时间,JTAG_TRSTB引脚电平是低电平,如果不配置,在复位的时候浮空或者为高会有上面的问题,导致这个问题的原因,是使能了相关的secure模式, 复位的时候,如果JTAG_TRSTB引脚为高或者浮空,会导致重复切换fuse状态,TCLK被使能和禁止之间切换,然后导致芯片检测到JTAG的变化,认为是安全攻击导致启动出错。

【经验分享】RT1050 HAB加密后软件复位第二次无效分析与解决.pdf (427.51 KB, 下载次数: 13)
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2024-5-7 00:37 , Processed in 0.098462 second(s), 19 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表