目录

  • Mailbox架构图

    • Mailbox 寄存器
    • SWD访问mailbox示意图
  • ROM Mailbox Handler功能解析
    • Request/Response机制
    • ROM支持的Mailbox指令
    • ROM Error Defination
  • SWD访问Mailbox流程
    • 发送Authen Start命令获取数据
    • Debugger发送Authen response命令向ROM发送数据
  • 示例Code

Mailbox是NXP LPC系列产品新推的一项功能。Debugger可以通过mailbox与ROM通信,实现Flash Erase、Enter ISP mode、debug authentication等功能。

Mailbox架构图

Mailbox 寄存器

Mailbox有三个寄存器

  • CSW(Command status and Word register)
    Debugger可以通过这个寄存器指示ROM进到mailbox handler,ROM、Debugger可以通过这个寄存器获知通信状况。
  • Request register
    Debugger向这个寄存器写入数据,ROM从该寄存器中获取数据执行相应的操作。
  • Return register
    ROM向此寄存器写入数据,debugger可以从该寄存器获取ROM的信息。

SWD访问mailbox示意图

SWD访问APB-AP,实现跟Mailbox的通信

  • AP: Access Port。 绿色圈内所示连接到Mailbox
  • DP: Debug Port。 就是我们的Jlink

ROM Mailbox Handler功能解析

Request/Response机制

Mailbox基于Request/Response机制,如下图:

  • Debugger向CSW写入0x21,申请re-sync同时reset
  • ROM检测CSW re-sync被置1,进入mailbox handler,向response寄存器写入0x0.等待debugger的请求。
  • Debugger向request寄存器写入数据
  • ROM获取reqeust寄存器中的数据,根据不同的指令进行相应的处理(比如擦除flash),向response寄存器中写入数据。
  • Debugger可以根据response寄存器中的数据判断指令是否执行成功

ROM支持的Mailbox指令

  • START_DBG_MB - 0x0001
  • GET_CRP_LEVEL - 0x0002, Deprecated ans return 3
  • ERASE_FLASH - 0x0003,
  • EXIT_DBG_MB - 0x0004,
  • ENTER_ISP_MODE - 0x0005,
  • SET_FA_MODE - 0x0006,
  • DBG_AUTH_START - 0x0010
  • DBG_AUTH_RESP - 0x0011

ROM Error Defination

ERR_DM_BASE = 0x00100000,
ERR_DM_NOT_ENTERED = ERR_DM_BASE + 1, /*0x00100001*/
ERR_DM_UNKNOWN_CMD = ERR_DM_BASE + 2, /*0x00100002*/
ERR_DM_COMM_FAIL = ERR_DM_BASE + 3,   /*0x00100003*/

SWD访问Mailbox流程

以进入ISPmode为例

  1. Debugger选择APB-AP,访问mailbox
  2. Debugger向CSW写入0x21,申请re-sync同时reset
  3. ROM检测到re-sync信号,reset mailbox,进入mailbox handler,等待debugger的指令
  4. Debugger发送0x10005至request寄存器(如上如示ENTER_ISP_MODE = 0x5,高16bit为1表示通知ROM接下来还要发送一个参数,ROM根据这个参数使用相应的peripheral进入ISP)
  5. ROM读取request寄存器中数据,发现需要一个参数,向reponse寄存器中写入0x1A5A5。告知debugger其已经获知需要一个参数
  6. Debugger向request寄存器发送0x7(Use UART\SPI\I2C进入ISP mode)
  7. ROM检测SOCU是否使能了ISPCMDENROM,如果是则向response写入0x0然后根据参数0x7进入ISP mode。否则向response写入ERR_DM_UNKNOWN_CMD

发送Authen Start命令获取数据

  • Debugger向ROM发送authen start命令后,接下来向ROM发送索取数据的长度+0xA5A5. authentication结构体的长度是0x1A,
  • Debugger发送0x1AA5A5后,ROM会检测低16bits是否为0xA5A5并校验长度是否为0x1A,正确后发送一个word的数据给debugger
  • Debuuger获取到数据后,长度减1未0x19A5A5,再次请求获取数据
  • ROM检测低16bits是否为0xA5A5并且校验长度是否为0x19,通过后返回一个word的数据给Debugger
  • 直到Debugger发送0xA5A5告知ROM数据已经全部获取后,ROM停止数据的发送

ROM发送的数据结构体如下:

typedef struct __attribute__ ((packed)) debug_auth_version {uint16_t major;uint16_t minor;
} debug_auth_version_t;typedef struct __attribute__ ((packed)) debug_auth_challenge {debug_auth_version_t version;uint32_t socc; uint32_t device_uuid[4];debug_rotid_t rotid;uint32_t cc_socu_pinned;uint32_t cc_socu_default;uint32_t cc_vu;uint8_t challengeVector[32];
} debug_auth_challenge_t;

Debugger发送Authen response命令向ROM发送数据

以证书长度为2048bit长度的case为例:

  • Debugger向ROM发送0x12C0011,请求向ROM发送认证数据。0x12C为证书长度为2048bit时,ROM需要的认证数据的长度
  • ROM接到认证请求后,返回需要认证数据的长度0x12C+0xA5A5
  • Debugger发送数据
  • ROM接到数据后,长度减1,返回0x12BA5A5
  • 所有数据传送完毕后,ROM返回0,然后进行认证

示例Code

使用Python撰写,调用pylink实现debugger跟mailbox的通信

import pylink
import pylink.protocols.swd as swd
from time import sleep  class jlink(object):
def __init__(self):  self.jlink = pylink.JLink()  self.jlink.target_connection_required = False  self.jlink.open()  self.jlink.set_tif(pylink.enums.JLinkInterfaces.SWD)#select APB-AP to communicate with mailbox   self.jlink.coresight_configure()  request = swd.WriteRequest(2, data=(0x000000F0 | (2 << 24)),  ap=False)  response = request.send(self.jlink)  assert response.ack(), "No ack from JLink"  request = swd.WriteRequest(2, data=(0x00000000 | (2 << 24)), ap=False)response = request.send(self.jlink)assert response.ack(), "No ack from JLink"def swd_write(self, addr, value):request = swd.WriteRequest(addr/4, data = value, ap = True)response = request.send(self.jlink)assert response.ack(), "No ack from JLink"print('send value to addr 0x%x'%addr)print('value is 0x%x'%value)def swd_read(self, addr):request = swd.ReadRequest(addr/4, ap = True)response = request.send(self.jlink)assert response.ack(), "No ack from JLink"sleep(0.1)request2 = swd.ReadRequest(3, ap = False)response2 = request2.send(self.jlink)#read data from DP register3, not got data correctly from response registerprint ("read data: 0x%08x"%response2.data)
#start neter into mailbox
jlink = jlink()
jlink.swd_write(0, 0x21)
jlink.swd_read(0)  #enter isp mode
jlink.swd_write(4, 0x100005)
sleep(1)
jlink.swd_read(8)
jlink.swd_write(4, 0x7)
sleep(1)
jlink.swd_read(8)

转载于:https://www.cnblogs.com/richard-xiong/p/10041482.html

RT600之Mailbox相关推荐

  1. exchange 2010 search mailbox 的幕后强大功能

    铃---.半夜中被一阵急促的手机铃声吵醒,年度服务客户打来电话需要进行邮件的排查和删除工作.问其原因,原来是组织中有人发了一封关于领导的不健康的邮件,并在企业内部进行了转发,领导要求立即找出此类邮件并 ...

  2. exchange online share mailbox senditem

    客户要求从share mailbox send出去mail,要放在share mailbox的寄件备份. http://support.microsoft.com/kb/2843677 单击开始,单击 ...

  3. Office 365:如何管理Office 365中的Ophaned Mailbox

    随着科技的迅速发展,很多大中型企业为了提高员工的工作效率,高效地完成业务流程,采用Office 365作为企业数据管理和人员沟通和交流的平台,以逐步摒弃了旧的办公模式,走向无纸质办公氛围.而当下,员工 ...

  4. 安装部署Exchange Server 2010 CAS NLB MailBox DAG

    安装部署Exchange Server 2010 CAS NLB & MailBox DAG 注:本文档描写了安装部署Exchange Server 2010 NLB+DAG方面的操作步骤,如 ...

  5. 解决linux下创建用户时出现Creating mailbox file: File exists

    在linux下用useradd添加用户时,出现错误: Creating mailbox file: File exists? 为什么会出现这样的问题? 原来linux下添加用户后,会在系统里自动加一个 ...

  6. mailbox 编程_MailboxProcessor从C#

    虽然可以使用MailboxProcessor< T>直接从C#(使用C#异步扩展),如我的另一个答案中所指出的,这不是一件好事 – 我主要是为了好奇而写的. 邮箱处理器< T> ...

  7. mailbox 编程_往死里写——从站mailbox实现 | 学步园

    void ECAT_Main(void)函数里面 首先检查是否有服务储存在mailbox里面.调用MBX_Main():(This function is called cyclically to c ...

  8. linux mailbox模型

    一.device tree中的写法 二. mailbox框架 (driver/mailbox/mailbox.c) struct mbox_controller {struct device *dev ...

  9. (30)System Verilog进程间同步(邮箱mailbox)

    (30)System Verilog进程间同步(邮箱mailbox) 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog进程间同步(邮箱m ...

最新文章

  1. 慕课网_《Java微信公众号开发进阶》学习总结
  2. Flink升级到1.4版本遇到的坑
  3. php修改http header,php header函数的常用http头设置
  4. 网络营销外包——网络营销外包专员浅析提升用户体验从哪入手?
  5. egg.js ajax上传文件,上传图片功能不会使用
  6. 期初付年金(annuity-due)
  7. 深度残差网络_注意力机制+软阈值化=深度残差收缩网络
  8. html表格分页打印样式,vue部分打印(多页自动分页、打印样式自定义、多页打印表格页面顶部带表头)...
  9. css的img移上去边框效果及CSS透明度
  10. json数组对象和对象数组
  11. python实习目的_python爬虫系列---为什么要学习爬虫
  12. python编程语言-Python现在还是最火的编程语言吗?
  13. 2021-06-22 超链接伪类
  14. VS连接VSS代码管理器失败问题
  15. 如何批量裁剪PDF每页的空白区域
  16. 关于spyder打不开的问题
  17. mq使用replyto队列进行消息回复
  18. 锁升级过程(偏向锁/轻量级锁/重量级锁)
  19. android视频适配与裁剪
  20. 电脑服务器型号在哪,电脑服务器型号内存

热门文章

  1. Rider首个发布候选版加入了性能提升特性
  2. 2014 年第六届全国大学生数学竞赛预赛数学类最后一题参考解答
  3. 制作基于http的yum源2
  4. 再见BOBO,从此梅阿查再无国王!
  5. java gc会回收类么_Java GC 垃圾回收机制
  6. Java运行时动态加载类之ClassLoader方法带参数
  7. 吴恩达机器学习作业思路整理
  8. Java的知识点28——文件编码、IO流的实例
  9. 使用axios上传文件+参数
  10. Python 技术篇 - 查看python库都包含什么方法,查看python模块某个方法的具体用法源码,查看python模块所在的物理位置,查看python库都包含哪些属性