您尚未登录。

楼主 #1 2021-03-07 13:19:31

metro
会员
注册时间: 2019-03-09
已发帖子: 341
积分: 321.5

【重开旧坑】8051上的CMSIS-DAP调试器——TinyDAP开发过程记录

知识共享许可协议本作品采用知识共享署名 4.0 国际许可协议进行许可。

项目简介

如标题所述,TinyDAP是一个在兼容8051的单片机上实现的CMSIS-DAP调试器,不仅可以用于调试和烧录ARM Cortex-M系列单片机,配合第三方工具还能支持RISC-V等其它单片机和SoC。可以说,CMSIS-DAP是最适合实现的开源调试器协议(个人认为没有之一),而TinyDAP的目标就是做CMSIS-DAP的最小实现方案(同样没有之一!)

TinyDAP在软件和硬件两个层面都将做到极致:

  • 在软件上,通过汇编级别的优化,将CMSIS-DAP协议的几乎所有功能一一实现在小于16KB的Flash中,可以兼容JTAG和SWD的调试线协议,还能通过支持CMSIS-DAP v2达到不输于闭源调试器(如ST-Link/V2)的速度

  • 在硬件上,可以运行在CH551/552等超低价格(1.x RMB)的单片机上,芯片占用的面积可以低至4.9x3.0 mm²(CH552E),预计成品体积不大于STLINK-V3MINI,还能直接在开发板上板载。

当然,截止至今日,TinyDAP还在初步开发阶段,不过前期的验证工作已经结束(参见帖子:晒一下CH558跑的CMSIS-DAP v2调试器,下载速度可以达到70KB/s(Flash)和300KB/s(SRAM)),可以证明这个目标是能够实现的(无非就是多掉几根头发而已)

除此之外,TinyDAP还将依赖于以下工作:

  • 利用SPI等外设加快调试速度。由于SWD和JTAG都是属于类SPI协议(串行输入/输出,并且有独立时钟引脚),因此可以通过SPI等外设加快数据传输,从而加快总体的调试速度。

  • 对CMSIS-DAP的算法进行深度优化。通过阅读代码发现,当前的CMSIS-DAP代码控制调试线时的算法在有些情况下不够高效,可能会导致性能降低。在CMSIS-DAP的代码之外,作者还会参考ARM的其它文档(见下文),重新整理CMSIS-DAP的算法,进一步提升调试的性能。

  • 参考DAPLink的代码,实现更多定制的功能。DAPLink也是基于CMSIS-DAP协议的实现,在完全开源的基础上做出了虚拟串口、拖拽烧录等实用功能。在存储空间和外设允许的前提下,作者也会在项目后期尝试将这些功能加入到TinyDAP中。

由于作者已经工作(四舍五入996的那种),所以这个项目必然不会很快完成(否则也不会从去年鸽到现在),还请大家耐心等待。当然,由于TinyDAP是一个比较随性的项目,所以也不会给自己设定各种时间上的目标,但会借此机会尝试用文字等方式将自己的想法表述出来供大家参考,因此本帖会尽可能地持续更新(可以想起来的时候常来看看hhh)

文档结构

本文的目标是记录开发的过程,分享一些开发过程中遇到的问题和解决方法,也欢迎和大家一同探讨各种相关话题。

本文将会按照以下顺序编写文档:

  1. ARM调试接口

  2. CMSIS-DAP协议

  3. USB设备的协议栈(包括HID和WinUSB等)

  4. WCH CH54x/CH55x

  5. TinyDAP的实现细节

参考代码和文档

参考代码以ARM官方维护的代码为主,包括:

  • CMSIS-DAP:ARM基于CMSIS-DAP协议的一个简单实现,集成在CMSIS Version 5中。这一版本的CMSIS-DAP使用RTX v5 RTOS和Keil提供的USB设备协议栈与驱动,其中后者似乎并不开源。

  • DAPLink:ARM基于CMSIS-DAP协议的另一个实现,加入了虚拟串口、拖拽烧录等实用功能,由ARM Mbed维护。这一版本的CMSIS-DAP使用RTX v4 RTOS和开源的USB设备协议栈与驱动,代码完全开源并且可以方便地添加新设备的支持。DAPLink的主要缺点是编译后二进制文件太大(完整配置超出STM32F103C8T6的Flash空间,只能上CBT6)。

  • DesignStart:ARM的一个项目,提供了Cortex-M0和M3的RTL代码(经过混淆处理),在实现调试接口时作为参考。

参考文档则是覆盖了上面所说的所有内容,包括:

  • CMSIS-DAP:ARM官方的CMSIS-DAP文档。CMSIS-DAP包括协议和实现两部分,这个文档主要覆盖了协议部分,重要性无需多言。

  • ARM Debug Interface Architecture Specification:ARM调试接口的文档,版本是ADIv5.2。需要注意的是,该文档的最新版本是ADIv6.0,但当前主流的ARM单片机似乎并不使用v6.0,所以v5.2已经够用(v5.x加入了很多实用功能)。

  • USB相关的各个标准,包括(除了最后一项外都可以在USB官网找到):

    • USB Specification 2.0:USB 2.0的主标准。

    • 与BOS(Binary Device Object Store)描述符相关的补充标准:于Wireless USB Specification 1.0引入,在USB 3.0时被写入主标准中,主要用于实现WinUSB、WebUSB等功能。

    • USB Device Class Definition for Human Interface Devices (HID):HID类的标准,主要用于实现CMSIS-DAP v1的免驱动安装。

    • Microsoft OS 2.0 Descriptors Specification:MS OS描述符标准,主要用于实现CMSIS-DAP v2的免驱动安装(通过WinUSB),这里我们使用的是2.0的标准,可以兼容Windows 8.1和10。

  • 8051的指令集和单片机的数据手册及相关文档。

更新记录
  • 2021/3/7:开坑,更新简介部分.

离线

#2 2021-03-08 12:37:07

chaplin1999
会员
注册时间: 2019-11-08
已发帖子: 15
积分: 14.5

Re: 【重开旧坑】8051上的CMSIS-DAP调试器——TinyDAP开发过程记录

关注:)

离线

#3 2021-03-08 16:22:18

hox
会员
注册时间: 2020-02-17
已发帖子: 22
积分: 16

Re: 【重开旧坑】8051上的CMSIS-DAP调试器——TinyDAP开发过程记录

关注一下,看看最终还有几根头发 big_smile

离线

#4 2021-03-09 13:44:15

wm20031015
会员
注册时间: 2017-10-18
已发帖子: 29
积分: 29

Re: 【重开旧坑】8051上的CMSIS-DAP调试器——TinyDAP开发过程记录

顶楼主,关注中!

离线

#5 2021-03-13 04:41:31

iamseer
会员
注册时间: 2020-06-06
已发帖子: 25
积分: 24.5

Re: 【重开旧坑】8051上的CMSIS-DAP调试器——TinyDAP开发过程记录

 关注

离线

楼主 #6 2021-04-05 00:08:08

metro
会员
注册时间: 2019-03-09
已发帖子: 341
积分: 321.5

Re: 【重开旧坑】8051上的CMSIS-DAP调试器——TinyDAP开发过程记录

第一部分:ARM调试接口
ARM的调试架构

ARM调试接口(即ADI,ARM Debug Interface),定义了基于ARM的SoC中所有调试组件的功能;而我们常说的DAP(即Debug Access Port),可以认为是基于ADI标准的一个实现。
对于DAP,我们又可以进一步分为两个部分:

  • Debug Port:面向调试器的接口,主要用于接收来自调试器的请求,并将Access Port的数据和响应传回到调试器。

  • Access Port:面向SoC内各个组件的接口,主要用于将Debug Port传来的请求转换成对SoC内对应组件的传输操作,并且将结果返回到Debug Port。

DAP的基本架构如下图所示。
block-diagram-of-an-adiv5-implementation.svg
可以发现,对于一个部署了ADI的系统来说,通常会存在一个DP和若干个AP,并且DP通过选择AP的方式一次只和一个AP进行交互。一方面,DP与(外置的)调试器相连,并根据调试器的协议进行数据交换;另一方面,AP和系统中的某个组件(一般是总线之类的组件)相连,可以将DP传来的请求进一步翻译成系统可以处理的操作(一般是寄存器或内存的读写操作)。
下图展示了一种包含了DPv0 JTAG-DP和通用AP的示意图,可以一窥DAP的架构。
structure-of-the-dap.svg
常见的DP包括:

  • JTAG-DP:使用了JTAG接口,一种四线(另有可选的TRST,加上之后有五线)的全双工同步协议。

  • SW-DP:使用了SWD接口,一种两线的半双工同步协议。

  • SWJ-DP:同时兼容JTAG-DP和SW-DP接口,并且包含了JTAG/SWD双协议切换的一种特殊协议。

常见的AP包括:

  • MEM-AP:包括一大类调试组件的AP,特点是通过内存映射(Memory-mapped)的方式进行访问,覆盖了SoC的各种功能。

  • JTAG-AP:一个面向传统JTAG接口的AP,可以外接系统中已经存在的包含JTAG接口的非ARM组件。

MEM-AP的一个实现如下图所示。可以看到,MEM-AP可以通过ROM Table获取其它调试组件的定义情况,并且通过访问特定的调试组件以实现特定的调试功能。
mem-ap-connecting-the-dp-to-debug-components.svg
对调试架构感兴趣的同学,可以阅读ADIv5标准的Chapter A1部分;对各个AP和CoreSight各个调试组件感兴趣的同学,可以阅读ADIv5标准的Part C以及CoreSight的相关文档。在下文中,我们主要介绍DP,因为这与我们的调试器设计密切相关。

最近编辑记录 metro (2021-04-05 00:48:19)

离线

#9 2021-04-20 20:00:55

echo
会员
注册时间: 2020-04-16
已发帖子: 71
积分: 65

Re: 【重开旧坑】8051上的CMSIS-DAP调试器——TinyDAP开发过程记录

关注一下。要是以后gd32没有芯片用了,就做一版ch552版本的gdlink。这事情伤害不大,侮辱性比较强。

离线

#10 2021-04-21 09:33:10

演技担当黄晓明
会员
注册时间: 2017-10-17
已发帖子: 146
积分: 124

Re: 【重开旧坑】8051上的CMSIS-DAP调试器——TinyDAP开发过程记录

用wch的 USB3.0 能做一个么?那个速度会不会起飞

离线

楼主 #11 2021-04-21 18:03:32

metro
会员
注册时间: 2019-03-09
已发帖子: 341
积分: 321.5

Re: 【重开旧坑】8051上的CMSIS-DAP调试器——TinyDAP开发过程记录

演技担当黄晓明 说:

用wch的 USB3.0 能做一个么?那个速度会不会起飞

大概不会,因为JTAG/SWD都是串行协议,速度能到几十Mbps就不错了。USB 3.0应该更适合trace的用途。

离线

#13 2021-06-02 09:46:35

mini_uc
会员
注册时间: 2020-03-05
已发帖子: 11
积分: 4.5

Re: 【重开旧坑】8051上的CMSIS-DAP调试器——TinyDAP开发过程记录

关注一下,现在CH的芯片也缺货了.

离线

楼主 #14 2021-06-02 13:11:50

metro
会员
注册时间: 2019-03-09
已发帖子: 341
积分: 321.5

Re: 【重开旧坑】8051上的CMSIS-DAP调试器——TinyDAP开发过程记录

mini_uc 说:

关注一下,现在CH的芯片也缺货了.

是啊,又找到了一个拖更的理由(不是

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn