Skip to content
Huaqi Fang edited this page Jul 5, 2024 · 19 revisions

Nuclei OpenOCD编译开发流程

版本记录

OpenOCD代码和编译工具

openocd日常开发和编译会用到如下代码和工具:

一般情况下,我们会告诉你们我们当前使用的分支,例如:

  • riscv-openocd: nuclei/2024
  • openocd-xpack: nuclei_xpack

注意: 这里代码可能会被强制覆盖更新(forced push), 拉取使用时请务必仔细check

基本环境依赖

首先确保当前环境为Linux 64位,最好为Ubuntu 20.04 LTS,并且安装好docker等依赖

详细请参考 Prerequisites for building xPack binaries - GNU/Linux

下面是参考命令:

# Install docker dependencies
sudo apt update
sudo apt install -y curl wget git docker.io
sudo usermod -aG docker `whoami`
# To use openocd + HBird Debugger, you need to setup udev rules
# It is also documented in https://www.nucleisys.com/upload/files/doc/nucleistudio/Nuclei_Studio_User_Guide.202402.pdf
wget https://github.com/riscv-mcu/ses_nuclei_sdk_projects/raw/master/misc/99-openocd.rules
sudo cp -f 99-openocd.rules /etc/udev/rules.d/
sudo usermod -a -G plugdev `whoami`
sudo usermod -a -G dialout `whoami`

执行上面的安装动作以后,需要重启系统,确保用户组生效。

编译开发一般步骤

这里先git下载好openocd-xpack的代码(里面包含submodule,请确保submodule代码也一并下载),然后切换到对应的分支,假设编译工具代码位于 ~/openocd-xpack目录,并且进入到了这个目录下。

## 确保所有的环境依赖都已装好
# 进入HOME目录
cd ~
# git clone xpack的代码, 可能失败,没有执行成功就多试几次
git clone https://github.com/riscv-mcu/openocd-xpack.git openocd-xpack
cd openocd-xpack
# 这里切换到 nuclei_xpack 分支,并获取最新代码
# 注意 这里 切换的分支 请务必和你预期切换的一致,这里的nuclei_xpack只是示意
git switch nuclei_xpack
git submodule init
# 可能失败,没有执行成功就多试几次
git submodule update --recursive
# 显示基本帮助信息
bash scripts/build.sh --help
# 先运行一次,创建好基本的环境, 这里可能会失败,不影响
# 基于模板scripts/common-source-template.sh创建openocd代码配置文件 scripts/common-source.sh
cp scripts/common-source-template.sh scripts/common-source.sh
# modify this scripts/common-source.sh to match your environment

# 下载依赖的docker环境,需要联网,可能失败多次,没有执行成功就多试几次
# 实在拉取不下来只能用镜像方案了,参见最下面的FAQ
bash ./scripts/build.sh preload-images

# 下面开始准备 openocd的代码 和 需要的第三方库 https://drive.weixin.qq.com/s?k=ABcAKgdSAFcJkeGEEl
mkdir -p ~/Work/cache

# 下载 这里的openocd构建需要的第三方库 https://drive.weixin.qq.com/s?k=ABcAKgdSAFcJkeGEEl
# 解压到 ~/Work/cache目录下,应该是如下文件
# ftd2xx.zip  hidapi-0.8.0-rc1.zip  libftdi1-1.4.tar.bz2  libiconv-1.15.tar.gz  libusb-1.0.22.tar.bz2  libusb-compat-0.1.5.tar.bz2  libusb-win32-src-1.2.6.0.zip

mkdir -p ~/Work/openocd-build/
# 运行完毕后,会在$HOME目录下创建 Work/openocd-build/ 的文件夹
# 我当前使用的这个nuclei_xpack分支,会创建这个目录 ~/Work/openocd-build/openocd.git
# 采用nuclei_xpack分支的编译代码,后面统一会变成~/Work/openocd-build目录方便管理
# 进入到这个目录, 并先重命名已存在的openocd.git目录
cd ~/Work/openocd-build
# git 克隆最新的代码到 openocd.git
# 这里只用下载一次,后续的代码维护可以直接在这个目录下进行,构建的源码也是从这里出来的
# 可能失败,需要多重试几次,取决于github访问情况
git clone https://github.com/riscv-mcu/riscv-openocd.git openocd.git
cd openocd.git
# 这里假设checkout到 nuclei/2024 分支, 并保证submodule代码下载下来
# 注意 这里 切换的分支 请务必和你预期切换的一致,这里的nuclei-develop只是示意
git switch nuclei/2024
git submodule init
git submodule update --recursive
# 这里就可以修改openocd的代码满足你的需求
## 在这个目录下~/Work/openocd-build/openocd.git就可以进行你的开发工作了
## 如果出现问题,建议先备份好你的代码,然后reset成一个干净的版本,然后运行 git clean -fdx .

# 注意构建openocd的时候需要在 openocd-xpack目录下进行构建,建议新开一个终端
# 切回到openocd-xpack后,进行编译
cd ~/openocd-xpack
# 这里构建第一次的时候,需要联网下载一些第三方依赖的库,请注意确保网络通畅,后续再构建的时候一般情况下不需要再联网
bash scripts/build.sh --all

上面编译完毕的工具将会放在 ~/Work/openocd-build/deploy目录下

# 目录结构类似于下面这样,这里的 2021.09 会是你自己 openocd-xpack/scripts/VERSION中的定义
$ ls -l ~/Work/openocd-build/deploy
total 14428
-rw-r--r-- 1 hqfang nucleisys 3824635 Sep 22 14:56 nuclei-openocd-2021.09-linux-x32.tgz
-rw-r--r-- 1 hqfang nucleisys     103 Sep 22 14:56 nuclei-openocd-2021.09-linux-x32.tgz.sha
-rw-r--r-- 1 hqfang nucleisys 3739862 Sep 22 14:48 nuclei-openocd-2021.09-linux-x64.tgz
-rw-r--r-- 1 hqfang nucleisys     103 Sep 22 14:48 nuclei-openocd-2021.09-linux-x64.tgz.sha
-rw-r--r-- 1 hqfang nucleisys 3588350 Sep 22 15:02 nuclei-openocd-2021.09-win32-x32.zip
-rw-r--r-- 1 hqfang nucleisys     103 Sep 22 15:02 nuclei-openocd-2021.09-win32-x32.zip.sha
-rw-r--r-- 1 hqfang nucleisys 3594359 Sep 22 14:55 nuclei-openocd-2021.09-win32-x64.zip
-rw-r--r-- 1 hqfang nucleisys     103 Sep 22 14:55 nuclei-openocd-2021.09-win32-x64.zip.sha

常见问题

如何开发自己的Flash Loader

请参考 riscv-openocd代码目录下的contrib/loaders/flash/nuspi

这个是 gd32vw55x的flash loader开发的commit , 可以参考 https://github.com/riscv-mcu/riscv-openocd/commit/f042794abdc219b9e75b1b7a6005726c095be73a

不想重新构建openocd,但是想增加自己的flash支持

这个功能可以通过我们的openocd flashloader实现,详细参见 https://github.com/riscv-mcu/openflashloader

如何添加自己的SPI驱动支持

请参考 riscv-openocd代码目录下的src/flash/nor/nuspi.c

如何查看当前支持的Flash型号

请参考 riscv-openocd代码目录下的src/flash/nor/spi.c

注意: 由于并非所有的Flash型号都做过测试,不能保证代码中列举的Flash均可以正常工作。

如何添加一个新的Flash支持

请参考 riscv-openocd这个commit https://github.com/riscv-mcu/riscv-openocd/commit/67c247cb2218b6c5e0a482b0c91cd8d8de789791

OpenOCD如何使用

请参见编译好的openocd目录下的 doc/pdf/openocd.pdf, 一些常见的使用说明参见 https://doc.nucleisys.com/nuclei_tools/openocd/index.html

常见问题搜索渠道

代码pre-commit check报错推送不上去

push时带上--no-verify,例如git push --no-verify mcu nuclei/2024

如何进行flash下载的校验工作

可以使用openocd提供的program filename [preverify] [verify] [reset] [exit] [offset]功能进行校验, 参见 https://openocd.org/doc/html/Flash-Commands.html#flashprogrammingcommands

假设目前在gdb窗口下,需要下载和校验一个名为helloworld.hex的文件,则可以使用如下命令:

(gdb) monitor program helloworld.hex verify

如下下载校验失败,可以检查一下是否flash被写保护了,这个一般查看对应的Flash的Status Register可以查到。

curl: (60) SSL certificate problem: certificate has expired issue

Modify ./scripts/helper/common-functions-source.sh in openocd-xpack: change curl --fail -L -o to curl --fail -k -L -o

fatal: unable to access 'https://github.com/riscv-mcu/openocd-xpack.git/': gnutls_handshake() failed: The TLS connection was non-properly terminated.

重试 git clone的命令,这个一般是网络不好原因,因为需要访问github网站

docker: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create": dial unix /var/run/docker.sock: connect: permission denied.

安装完毕docker.io软件和设置用户组以后,需要重启下系统才可以。

编译openocd过程中依赖的第三方的库一直下载不下来

可以看是什么库下载不下来,下载卡住的位置都会有提示下载的连接,可以自行下载后,放在 ~/Work/cache 目录下

这里是我们构建某个版本后,下载的 ~/Work/cache 目录的压缩包 https://drive.weixin.qq.com/s?k=ABcAKgdSAFc2ZzdPZR

可以下载以后解压放在这个 目录下

rvlab@rvlab-vm:~/Work/cache$ ls
ftd2xx.zip  hidapi-0.8.0-rc1.zip  libftdi1-1.4.tar.bz2  libiconv-1.15.tar.gz  libusb-1.0.22.tar.bz2  libusb-compat-0.1.5.tar.bz2  libusb-win32-src-1.2.6.0.zip

docker镜像一直拉取不下来

2024.07.04 测试可用 https://dockerhub.icu/

为了加速镜像拉取,你可以使用以下命令设置 registry mirror:

sudo tee /etc/docker/daemon.json <<EOF
{
    "registry-mirrors": ["https://dockerhub.icu"]
}
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker

可以关注这个 Docker Hub 镜像加速器