53

博客园Logo
首页
新闻
博问
专区
闪存
班级

代码改变世界
搜索
注册
登录
痞子衡嵌入式
定期分享程序设计、嵌入式开发、应用方案解析、嵌入式前沿热点新闻等相关文章
版权声明: 所有文章均为痞子衡原创,转载必须标明出处

博客园 首页 新随笔 联系 订阅 管理 随笔 - 199 文章 - 0 评论 - 329
痞子衡嵌入式:揭秘i.MXRT600的ISP模式下用J-Link连接后PC总是停在0x1c04a的原因(Debug Mailbox)

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT600中的Debug Mailbox实现对JLink调试的影响。

事情缘起痞子衡的同事 - 喜欢打破砂锅问到底的Kerry小姐姐,她最近在研究i.MXRT600这款芯片,她发现在芯片ROM串行下载(ISP)模式下,连上芯片USB端口可以在设备管理器中正常看到枚举的HID设备(0x1fc9,0x0020),这个HID设备可配合上位机工具blhost.exe进行应用程序下载。但是当使用JLink正常连上芯片(选择的是MIMXRT685,不是CM33)后,之前的那个HID设备不见了,看起来芯片像是退出了ROM正常运行,这个体验跟i.MXRT1050上不太一样,这是为什么?这其实是Debug Mailbox在捣鬼,且听痞子衡细聊:

一、引出调试问题

按照我们之前在i.MXRT1050上的调试经验,将芯片设为串行下载模式后,使用JLink连接上芯片,并halt住内核,此时芯片PC是正常停在ROM区域的(0x200000之后),让我们同样的过程在i.MXRT600上也操作一次:

我们发现PC指向了0x1c04a,并且不管你如何reset再重新halt,它一直停在这个地方,更奇怪的是这个地方不在ROM区域(0x03000000或0x13000000之后)里,这是怎么回事?

二、什么是Debug Mailbox?

与i.MXRT1050不同的是,i.MXRT600中引入了Debug Mailbox机制,这个机制由ROM负责实现,因此连接上JLink后的行为是由Debug Mailbox机制决定的。

翻开i.MXRT600的User Manual,在Debug subsystem这一章节可以找到Debug Mailbox相关信息,Debug Mailbox其实最早是NXP LPC系列新推的一项功能,后来也用在了i.MXRT600上面。

下图是i.MXRT600的SWD调试系统内部连接图,其中蓝框标出的DM AP便是Debug Mailbox。

我们知道i.MXRT600是基于Cortex-M33内核的MCU,这款ARM内核主打特点是安全,因此NXP在设计芯片时也加入了很多安全方面的特性,Debug Mailbox便是其一,Debug Mailbox基于NXP debug authentication protocol version 1.0,主要作用是实现外部调试器与芯片内ROM的通信,从而赋予调试器擦写Flash、进入ROM ISP、调试认证等功能。

三、ROM中Debug Mailbox实现

那么ROM中的Debug Mailbox机制到底是什么?简单理解就是如下一段代码插入了ROM的初始化流程。这个机制其实很简单,就是确保debug特性是正常开启的,然后根据芯片复位类型来初始化debug port并决定要不要进入Mailbox命令处理。

// 确认IFR里debug特性正常开启
if (kStatus_DBG_Success != debug_auth_evaluate_dcfg_socu())
{
__set_FAULTMASK(1);
__WFI();
}
volatile uint32_t reset_status = RSTCTRL0->SYSRSTSTAT;
// 根据复位类型设置初始debug port状态
if (kStatus_DBG_Success != debug_auth_hal_set_initial_debug_port_state(reset_status))
{
__set_FAULTMASK(1);
__WFI();
}
if (reset_status & 0x20)
{
// 处理mailbox收到的来自debugger的命令
debug_mailbox_GetRequest();
}
  RSTCTRL0->SYSRSTSTAT[5]位即ARM_APD_RESET,表明ARM内核是否发生了软复位(warm reset),正常芯片上电,这个位不会被置1,但是如果有调试器接入给内核发软复位,这个位就会被置位。一旦这个位被置起来,ROM初始化过程中便会进入Mailbox命令处理函数debug_mailbox_GetRequest(),不再往后执行正常的ROM串行下载/启动流程。

debug_mailbox_GetRequest()函数是Debug Mailbox机制的核心,它借助的是如下三个Mailbox寄存器来实现调试器与ROM的互动。

CSW:命令状态寄存器,调试器操作这个寄存器指示ROM进入mailbox命令解析状态
REQUEST:请求寄存器,调试器将mailbox命令写入这个寄存器指示ROM去执行
RETURN:结果寄存器,调试器通过读这个寄存器获取ROM执行mailbox命令结果

对于使用者来说,一般借助调试器先向CSW寄存器写入0x21申请re-sync同时reset device ,然后再按需写入如下具体的命令进REQUEST寄存器,便可实现Debug Mailbox相应功能。

#define ENTER_DEBUGGER_MAILBOX (0x0001) // Start Mailbox debug
#define GET_CRP_LEVEL (0x0002) // Deprecated and retuen 3
#define DM_ERASE_FLASH (0x0003) // Mass erase flash
#define EXIT_DEBUGGER_MAILBOX (0x0004) // Exit Mailbox debug
#define ENTER_ISP_MODE (0x0005) // Enter specified ISP mode
#define SET_FA_MODE (0x0006) // Set to “Fault Analysis” mode
#define START_DEBUG_SESSION (0x0007) // Start Debug session
#define DEBUG_AUTH_START (0x0010) // Start Debug Authentication Protocol
#define DEBUG_AUTH_RESP (0x0011) // Debug Authentication response
四、激活Debug Mailbox的JLink Script

了解了Debug Mailbox机制原理,我们再来看JLink连接i.MXRT600时必须要加载执行的如下Script内容(开头痞子衡说了必须选择MIMXRT685,而不是CM33,因为在JLink DLL / JLinkDevices.xml里MIMXRT685才默认指定了配套Script脚本)。关于JLink Script知识,可以先看痞子衡之前文章 《JLink Script文件基础及其在IAR下调用方法》。

这个脚本内容其实在i.MXRT600的User Manual中已经给出了相应伪代码,通过调用JLINK_CORESIGHT_WriteAP()来写Mailbox寄存器(index 0对应CSW,index 1对应REQUEST),基本是按照前面介绍的Debug Mailbox使用流程来的,最后通过写入START_DEBUG_SESSION命令进REQUEST寄存器开启芯片调试模式。

void InitTarget(void) {
int v;

JLINK_CORESIGHT_Configure(“IRPre=0;DRPre=0;IRPost=0;DRPost=0;IRLenDevice=4”);
// Pre-select that we have a Cortex-M33 connected
CPU = CORTEX_M33;
// J-Link is allowed to use a TAP reset for JTAG-chain auto-detection
JTAG_AllowTAPReset = 0;

JTAG_SetDeviceId(0, 0x6BA02477);

// Read AP ID register to identify DM AP at index 2
JLINK_CORESIGHT_WriteDP(2, 0x020000f0);
v = JLINK_CORESIGHT_ReadAP(3);
JLINK_SYS_Report1(“DAP-IDCODE:”, v);
// Select DM AP index 2
JLINK_CORESIGHT_WriteDP(2, 0x02000000);
JLINK_CORESIGHT_ReadDP(0);

// Active DebugMailbox
JLINK_CORESIGHT_WriteAP(0, 0x21);
JLINK_CORESIGHT_ReadAP(0);

// Enter Debug Session
JLINK_CORESIGHT_WriteAP(1, 0x07);
JLINK_CORESIGHT_ReadAP(0);
}
五、芯片调试模式(REQUEST = 0x07)下的状态

前面讲了JLink Script会使芯片进入调试模式,那调试模式下芯片到底是什么状态?ROM其实是通过如下函数加载执行了0x1c040 - 0x1c04B处的一小段代码,并最终停在了0x1c04a处的while(1);,至此真相大白。

void go_debug_mode(void)
{
#define VECTOR_DUMMY_ROUTINE 0x0001c000u
#define APP_ENTRY (VECTOR_DUMMY_ROUTINE + 0x40 + 1)
uint32_t dummy_loop_routines[] = {
VECTOR_DUMMY_ROUTINE + 0x1000, // SP
APP_ENTRY, // Reset Handler
APP_ENTRY, // NMI Handler
APP_ENTRY, // HardFault_Handler
APP_ENTRY, // MemManage_Handler
APP_ENTRY, // BusFault_Handler
APP_ENTRY, // UsageFault_Handler
APP_ENTRY, // SecureFault_Handler
0, // Reserved
0, // Reserved
0, // Reserved
APP_ENTRY, // SVC_Handler
APP_ENTRY, // DebugMon_Handler
0, // Reserved
APP_ENTRY, // PendSV_Handler
APP_ENTRY, // SysTick_Handler
// Below are the binary codes for :
// register uint32_t dummy = SCB->CPUID;
// while(1);
0x5000f64eu,
0x0000f2ceu,
0xe7fe6801u,
};

{
    uint32_t *dest = (uint32_t *)VECTOR_DUMMY_ROUTINE;
    uint32_t *src = (uint32_t *)&dummy_loop_routines[0];
    for (uint32_t i = 0u; i < ARRAY_SIZE(dummy_loop_routines); i++)
    {
        *dest++ = *src++;
    }
    jump_to_boot_image(VECTOR_DUMMY_ROUTINE);
}

}
六、Debug Mailbox对JLink调试的影响

基于上面分析,最后痞子衡再总结一下Debug Mailbox对JLink调试的影响:

当芯片在ROM中执行(比如ISP模式,比如Flash中没有应用程序)时,JLink要想正常连接,必须加载使能芯片调试模式的Script才行,否则会连不上芯片。
通过加载执行JLink Script成功连接上芯片后,PC总是停在0x1c04a,这是Debug Mailbox机制决定的。
只有当芯片正常启动Flash里的应用程序后(即离开了ROM),用JLink连接芯片(选择CM33,不加载Script),halt住内核,PC指向的才是真实的应用程序位置。
  至此,i.MXRT600中的Debug Mailbox实现对JLink调试的影响痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园主页、CSDN主页、知乎主页、微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

最后欢迎关注痞子衡个人微信公众号【痞子衡嵌入式】,一个专注嵌入式技术的公众号,跟着痞子衡一起玩转嵌入式。
痞子衡嵌入式-微信二维码痞子衡嵌入式-微信收款二维码痞子衡嵌入式-支付宝收款二维码
衡杰(痞子衡),目前就职于恩智浦MCU系统部门,担任嵌入式系统应用工程师。
专栏内所有文章的转载请注明出处:http://www.cnblogs.com/henjay724/
与痞子衡进一步交流或咨询业务合作请发邮件至 hengjie1989@foxmail.com
可以关注痞子衡的Github主页 https://github.com/JayHeng,有很多好玩的嵌入式项目。
关于专栏文章有任何疑问请直接在博客下面留言,痞子衡会及时回复免费(划重点)答疑。
痞子衡邮箱已被私信挤爆,技术问题不推荐私信,坚持私信请先扫码付款(5元起步)再发。

分类: D1.单片机i.MXRT-CM33
好文要顶 关注我 收藏该文
痞子衡
关注 - 9
粉丝 - 192
+加关注
1 0
« 上一篇: 《痞子衡嵌入式半月刊》 第 20 期
posted @ 2020-11-23 21:59 痞子衡 阅读(41) 评论(0) 编辑 收藏
刷新评论刷新页面返回顶部
登录后才能发表评论,立即 登录 或 注册, 访问 网站首页
博客园派送云上免费午餐,AWS注册立享12个月免费套餐
【推荐】News: 大型组态、工控、仿真、CADGIS 50万行VC++源码免费下载
【推荐】从零开始的RPG游戏制作教程,来《魔兽争霸III》共同成长
【推荐】了不起的开发者,挡不住的华为,园子里的品牌专区
【推荐】未知数的距离,毫秒间的传递,声网与你实时互动
【福利】AWS携手博客园为开发者送免费套餐与抵扣券
【推荐】 阿里云折扣价格返场,错过再等一年

相关博文:
· ISP-OB,pedestal以及ISP概述
· debug
· 调试备忘录-J-LinkRTT的使用(原理+教程+应用+代码)
· HowtoCreateDLL(Dynamiclinklibrary)
· idea-debug
» 更多推荐…
声网专区
最新 IT 新闻:
· 招股书披露Roblox选择了腾讯作为中国区市场合作伙伴
· “好奇号”发现火星曾发生过史前大洪水的证据
· 在出租屋崩溃的年轻人
· 不吹不黑,国产的游戏不香么?
· 特斯拉研发疫苗打印机的背后有什么故事?
» 更多新闻…
历史上的今天:
2019-11-23 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(10)- KBOOT特性(可靠升级)
公告

微信公众号:痞子衡嵌入式

痞子衡嵌入式-微信二维码
衡杰(Jay),网名痞子衡,本硕毕业于苏州大学电子信息学院,2013年开始参加工作,目前就职于恩智浦(NXP)半导体MCU系统部门,担任高级嵌入式系统应用工程师。

痞子衡会定期分享嵌入式相关文章,关于文章有任何疑问请在博客下面留言。扫描二维码关注痞子衡微信公众号,第一时间获取最新文章。

欢迎加痞子衡好友 (微信id “henjay724”),痞子衡拉你进嵌入式技术交流群(微信群),群里个个都是能人异士,搞得好技术,吹得好牛皮,时刻等你加入!

昵称: 痞子衡
园龄: 6年7个月
粉丝: 192
关注: 9
+加关注
< 2020年11月 >
日 一 二 三 四 五 六
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 1 2 3 4 5
6 7 8 9 10 11 12
搜索

找找看
积分与排名
积分 - 183043
排名 - 3647
随笔分类
B1.嵌入式基础(7)
C1.内核Cortex-M(21)
D1.单片机i.MXRT-CM33(15)
D2.单片机i.MXRT-CM7(62)
D3.单片机Kinetis(8)
D4.单片机LPC(1)
D5.开发环境MCUXpresso(3)
F1.差错控制(4)
F2.音视频技术(4)
F5.二维码技术(2)
F8.人工智能物联网(2)
G1.技术标准(7)
G2.技术整理(7)
G3.工具推荐(5)
G4.版本控制Git(9)
H1.嵌入式半月刊(21)
H2.项目-串口工具(7)
H3.项目-语音工具(7)
I1.职场经验与感悟(4)
专栏公告(3)
随笔档案
2020年11月(9)
2020年10月(6)
2020年9月(10)
2020年8月(8)
2020年7月(10)
2020年6月(6)
2020年5月(4)
2020年4月(8)
2020年3月(9)
2020年2月(9)
2020年1月(3)
2019年12月(8)
2019年11月(4)
2019年10月(3)
2019年9月(2)
2019年5月(5)
2019年4月(4)
2019年2月(1)
2019年1月(1)
2018年12月(2)
2018年11月(2)
2018年9月(2)
2018年8月(1)
2018年7月(2)
2018年6月(5)
2018年5月(5)
2018年4月(2)
2018年3月(5)
2018年2月(4)
2018年1月(9)
2017年12月(6)
2017年11月(3)
2017年9月(4)
2017年8月(4)
2017年6月(5)
2017年5月(8)
2017年4月(5)
2017年3月(1)
2016年12月(10)
2016年11月(1)
2016年10月(3)
最新评论

  1. Re:痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(6)- Bootable image格式与加载(elftosb/.bd)
    博主您好,我想请教几个有关系统时钟的问题: 假设从Serial_NOR_Flash启动,并原地执行。MCU上电后,ROM会根据Fuse或IO电平以及Configuration Block中的数据配置F…
    –ZijianZheng
  2. Re:痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记(2) - 识别当前i.MXRT型号

–friedCoder
3. Re:痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记(1) - 执行在不同CM内核下
😂完全看不懂,进错房间了。
–风口旁的猪
4. Re:痞子衡嵌入式:ARM Cortex-M调试那些事(1)- 4线协议标准(JTAG)
大神,为什么很多链接失效了呢,比如 ARM Cortex-M调试那些事(2)- 2线协议标准(SWD)
–chen_hewen
5. Re:痞子衡嵌入式:开启NXP-MCUBootUtility工具的BEE/OTFAD加密功能 - image_enc
@痞子衡 我没有说清楚,工具是会把image加密后写入flash,同时还指定加密了另一块区域N(不是image占用的区域),然后下传的image运行后会从其他接口接收到数据,要把接收到的数据写入加密区…
–hello_world789
6. Re:痞子衡嵌入式:开启NXP-MCUBootUtility工具的BEE/OTFAD加密功能 - image_enc
@hello_world789 工具会自动将你的明文加密后写进flash的…
–痞子衡
7. Re:痞子衡嵌入式:开启NXP-MCUBootUtility工具的BEE/OTFAD加密功能 - image_enc
您好,在开启BEE加密时使用Fixed Otpmk(SNVS) Key,BEE参数设置加密区域时指定了image区域和另一块用来存放升级APP的区域,在该加密区域写入数据后,CPU访问时会进行解密,即…
–hello_world789
8. Re:痞子衡嵌入式:ARM Cortex-M文件那些事(2)- 链接文件(.icf)
还是太深奥了。。。希望可以在细致点
–wdliming
9. Re:痞子衡嵌入式:导致串行NOR Flash在i.MXRT下无法正常下载/启动的常见因素之SFDP
感觉你文章写的特别好
–北京记忆
10. Re:痞子衡嵌入式:一种i.MXRT下从App中进入ROM串行下载模式的方法
1312
–joker_you
阅读排行榜

  1. 痞子衡嵌入式:极易上手的可视化wxPython GUI构建工具(wxFormBuilder)(12853)
  2. 痞子衡嵌入式:超级好用的可视化PyQt GUI构建工具(Qt Designer)(11238)
  3. 痞子衡嵌入式:微控制器CPU性能测试基准(EEMBC-CoreMark)(7385)
  4. 痞子衡嵌入式:并行NAND接口标准(ONFI)及SLC Raw NAND简介(6805)
  5. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(5)- 再聊eFUSE及其烧写方法(6570)
  6. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(6)- Bootable image格式与加载(elftosb/.bd)(6486)
  7. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(2)- Boot配置(BOOT Pin/eFUSE)(5788)
  8. 痞子衡嵌入式:恩智浦MCU安全加密启动一站式工具NXP-MCUBootUtility用户指南(5689)
  9. 痞子衡嵌入式:史上最强ARM Cortex-M学习资源汇总(持续更新中…)(5654)
  10. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(1)- Boot简介(5585)
    推荐排行榜
  11. 痞子衡嵌入式:ARM Cortex-M文件那些事(2)- 链接文件(.icf)(7)
  12. 痞子衡嵌入式:ARM Cortex-M文件那些事(1)- 源文件(.c/.h/.s)(4)
  13. 痞子衡嵌入式:16MB以上NOR Flash使用不当可能会造成软复位后i.MXRT无法正常启动(3)
  14. 《痞子衡嵌入式半月刊》 第 12 期 (3)
  15. 《痞子衡嵌入式半月刊》 第 7 期(3)
    Copyright © 2020 痞子衡
    Powered by .NET 5.0.0 on Kubernetes
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值