在RISCV工具链开发中挣扎。。。
前言
OpenOCD将人群分为三类
- 用户:仅仅使用二进制分发镜像,调用.cfg直接烧录调试
- 维护者:针对新的芯片/系统 发布.cfg而不更改二进制镜像
- 开发者:需要修改OpenOCD源码重新编译以支持自家的芯片
本文是写给开发者看的。不是为了讲述工具链的安装,本文的目标是为了向OpenOCD添加一个新的芯片.
概述
工具链总览:
GUI | –>CMD | –>Telnet | –>(Jim)TCL | –>TTL |
---|---|---|---|---|
eclipse-CDT | GDB | openocd | dongle | Chip |
其中,dongle表示DAP_link,jlink,stlink等一众硬件仿真器。
调试器千千万,调试界面无非jtag/swd,这部分要做的就是连线连对而已。也可以自己开发,反正就拿dap-link的源码往上套。
在OpenOCD面前,众生平等,因为所有的调试器都是通过Jim-TCL抽象成同一种设备。
例如Jlink,正常的用法是安装SEGGER的官方驱动,然后jlink.exe会帮你处理剩下的事情。
而OpenOCD要想使用Jlink,需要使用Zadig安装libUSB库,覆盖Segger的驱动。
也因此,Segger不会提供任何支持,相反,Segger自己搞了个开源计划。
另一个典型的例子是ARC架构,使用Meteware工具链的时候要求安装Digilent adept,但在使用GNU工具链时,要求将设备驱动更换为WinUSB
openocd,最好的情况是已有cfg,例如st家的芯片,直接带参-f调用类似STM32F10x.cfg 之类就够了
比较糟糕的情况,例如芯片自有flash操作方法,那就需要修改flash操作部分,这个cfg是没有的,需要自己改源码编译。
对于芯片没有内置FLASH的,需要根据实际情况提供SPI驱动,XIP驱动之类的,总体来说,你需要提供一个让CPU可以加载代码的地方
具体要改动的文件如下:
此部分日后详细说明
1.在./tcl/target中,添加自己设备的.cfg文件
此文件用于编译后传递到scripts中供用户调用
2.在./src/flash/nor中,添加自己设备的.c文件
此文件用于告知openocd你文件的flash烧录流程
3. 在 /src/flash/drivers.c中,添加自己设备的设备名
此处让openocd知晓你的设备.
4. 在flash/nor中,更改makefile.am
令openocd的编译过程可以引用到你刚刚添加的文件.
这其中最重要的问题在于交叉编译,可能是我脸黑,抓了很多版本的openocd源码都编译过不了,哪怕拿着sifive现场写的教程也make fail for win64.
目前能够成功的环境只有那个docker。
openocd源码搞定以后,其他的就不是问题了,cfg写对,基本上可以开始第一轮对内核的debug了
因为都是内核相关,ld里配一下flash和ram地址就完事。
在arm环境下,工具链的移植可以说随便填填空就够了。
在riscv中,总是会遇到各种问题,可以说,非常的不尽兴
此部分日后详细说明
ARM ram转写flash功能不支持,需要自己进行开发
路线图
目前的移植工作,大致上按照以下步骤进行:
- openocd修改cfg连接mcu内核调试部分
- openocd修改源码编译操作mcu的flash
- eclipse 修改ld文件,通过gcc编译出elf
- gdb联调openocd,测试cmd工作情况
- 各组件交叉编译统一到一个平台
- eclipse中整合cmd,开始debug
目前进度
卡在gdb无法启动openocd中
已解决,在启动前,需要变更gdb指令格式,指令为:
set archtecture riscv:rv32
flash烧写时间过长(0.038KB/s)
尚未解决,由于riscv内核不支持arm的algorithm特性,使用了单字节烧录和强制延时等待的办法.
下一轮开发再解决此问题
2021/8/4 通过调试器直写flash,会导致flash操作时间被叠加到上位机,因此需要一个ISP引导,让上位机将代码送到SRAM,ISP循环将数据搬到flash,这样也可以解耦合
额外的话
如果你是个第三方厂商,在适配之前应该首先向原厂提出要求,国内的MCU厂商似乎都不太愿意把自己的芯片细节写清楚.
如果你自己就是原厂,那么你应该首先确认,designer给你总线图了吗?他有告诉你cbus sbus怎么连接的吗?
你已经清晰的了解到startup是如何工作的了吗?
芯片是一个典型的自顶向下的开发流程,RTL对于software来说是一个黑盒子.试图用software去试探芯片运行规则是"越权行为",如果designer自己都不清楚memory的限制,我的建议是你应该心平气和的端一把椅子坐他旁边,花一个下午的时间好好审查一下自己的RTL CODE.
以上纯属个人意见,如果不同意,就当是我的牢骚话吧