支持状态
BASIC
最后更新
2025-05-28
NuttX Pine64 Oz64 测试报告
测试环境
操作系统信息
- Debian Linux 镜像 + U-Boot: https://github.com/scpcom/sophgo-sg200x-debian/releases
- 预编译 NuttX 镜像: https://github.com/lupyuen2/wip-nuttx/releases/tag/sg2000c-1
- 工具链:xPack https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases
- dtb 文件:https://github.com/lupyuen2/wip-nuttx/releases/download/sg2000-1/cv181x_milkv_duos_sd.dtb
- 参考安装文档: https://nuttx.apache.org/docs/latest/quickstart/install.html
硬件信息
- Pine64 Oz64
- 5V3A DC 圆口电源适配器一个
- microSD 卡一张
- USB 读卡器一个
- USB to UART 调试器一个
- 杜邦线
开发板引脚图:
安装步骤
使用预编译镜像
下载 Debian 镜像和 NuttX 内核, 并参照如下步骤进行内核替换:
wget https://github.com/scpcom/sophgo-sg200x-debian/releases/download/v1.6.10/duos-e_sd.img.lz4
wget https://github.com/lupyuen2/wip-nuttx/releases/download/sg2000c-1/Image
lz4 -dk duos-e_sd.img.lz4
sudo losetup /dev/loop14 duos-e_sd.img
sudo kpartx -av /dev/loop14
sudo mount /dev/mapper/loop14p1 /mnt
sudo mv Image /mnt/vmlinuz-*+duos
sudo umount /mnt
sudo kpartx -d /dev/loop14
sudo losetup -d /dev/loop14
sudo dd if=duos-e_sd.img of=/dev/sdX bs=1M status=progress
手动编译
构建依赖安装
Debian based:
sudo apt install \
bison flex gettext texinfo libncurses5-dev libncursesw5-dev xxd \
gperf automake libtool pkg-config build-essential gperf genromfs \
libgmp-dev libmpc-dev libmpfr-dev libisl-dev binutils-dev libelf-dev \
libexpat-dev gcc-multilib g++-multilib picocom u-boot-tools util-linux
sudo apt install kconfig-frontends
# pip install kconfiglib
Fedora / RPM based:
sudo dnf install \
bison flex gettext texinfo ncurses-devel ncurses ncurses-compat-libs \
gperf automake libtool pkgconfig @development-tools gperf genromfs \
gmp-devel mpfr-devel libmpc-devel isl-devel binutils-devel elfutils-libelf-devel \
expat-devel gcc-c++ g++ picocom uboot-tools util-linux
pip install kconfiglib
# Or install from source:
# git clone https://bitbucket.org/nuttx/tools.git
# cd tools/kconfig-frontends
# ./configure --enable-mconf --disable-nconf --disable-gconf --disable-qconf
# aclocal
# automake
# make
# sudo make install
Arch / pacman based:
sudo pacman -S --needed base-devel ncurses5-compat-libs gperf pkg-config gmp libmpc mpfr libelf expat picocom uboot-tools util-linux git wget libisl
# AUR packages only, use any AUR helper as you wish
paru -S kconfig-frontends genromfs
# yay -S kconfig-frontends genromfs
获取源码
mkdir nuttxspace
cd nuttxspace
git clone https://github.com/apache/nuttx.git nuttx
git clone https://github.com/apache/nuttx-apps apps
配置工具链并构建 NuttX
Nuttx 需要使用 xPack 工具链进行编译,首先获取工具链,从 Github 下载,自行改变版本以匹配你的系统:
wget https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v14.2.0-2/xpack-riscv-none-elf-gcc-14.2.0-2-linux-x64.tar.gz
tar -xvzf xpack-riscv-none-elf-gcc-14.2.0-2-linux-x64.tar.gz
建议将tar解压到/opt 并将其添加到你的 PATH 中:
export PATH=/path/to/toolchain/you/untar:$PATH
接下来构建 Nuttx:
cd nuttx
tools/configure.sh milkv_duos:nsh
make -j$(nproc)
构建过程中如果遇到文件丢失,可以通过 menuconfig 配置选项
- 在 (Top) → Library Routines → Select math library 选择是否使用数学库,及其路径
- 在 (Top) → Library Routines → Builtin libclang_rt.profile 选择是否启用llvm
接下来构建文件系统:
make export
pushd ../apps
tools/mkimport.sh -z -x ../nuttx/nuttx-export-*.tar.gz
make import
popd
genromfs -f initrd -d ../apps/bin -V "NuttXBootVol"
最后打包镜像:
head -c 65536 /dev/zero >/tmp/nuttx.pad
cat nuttx.bin /tmp/nuttx.pad initrd >Image-sg2000
启动系统
从 SD 卡启动
参见上文 “安装步骤/使用预编译镜像” 一节。
从 TFTP Server 启动 NuttX RTOS
首先,烧录 Debian 镜像到存储卡。
wget https://github.com/Fishwaldo/sophgo-sg200x-debian/releases/download/v1.4.0/duos_sd.img.lz4
lz4 -d duos_sd.img.lz4
sudo dd if=duos_sd.img of=/dev/sdX bs=1M status=progress
至此,存储卡准备完成。将存储卡插入开发板。
在计算机上开启一个 TFTP Server。确保先前编译生成的 Image(位于 NuttX 源码目录下)和 dtb 均可被 TFTP Server 访问。
TFTP Server 配置请参考:Arch Wiki/TFTP。一般而言,可直接使用 tftpd:
systemctl start tftpd
若您是在 Windows 下,可考虑使用 Tftpd64。
将镜像文件和 dtb 下载到 tftp 文件夹,若使用 tftpd,其一般在 /srv/tftp
下:
wget https://github.com/lupyuen2/wip-nuttx/releases/download/sg2000-1/cv181x_milkv_duos_sd.dtb
cp Image-sg2000 /path/to/tftp/folder
cp cv181x_milkv_duos_sd.dtb /path/to/tftp/folder
接上 UART 调试线,给开发板上电,同时需要为开发板提供网络,在提示 Hit any key to stop autoboot
时按任意键打断 U-Boot,并手动配置 U-Boot 以从 TFTP 启动 NuttX:
若是 dhcp 方式获取 ip,需要先运行dhcp
而后打断。
setenv tftp_server your_tftp_server_ip
dhcp ${kernel_addr_r} ${tftp_server}:Image-sg2000
tftpboot ${fdt_addr_r} ${tftp_server}:cv181x_milkv_duos_sd.dtb
fdt addr ${fdt_addr_r}
booti ${kernel_addr_r} - ${fdt_addr_r}
预期结果
系统正常启动,通过串口连接时能成功进入 NuttX Shell。
实际结果
系统正常启动,通过串口连接时能成功进入 NuttX Shell。
启动信息
Boot log:
Starting kernel ...
ABC
NuttShell (NSH) NuttX-12.5.1
nsh> uname -a
NuttX 12.5.1 84e91fd52c Jun 17 2024 15:40:03 risc-v milkv_duos
nsh> ls
/:
dev/
proc/
system/
nsh>
测试判定标准
测试成功:实际结果与预期结果相符。
测试失败:实际结果与预期结果不符。
测试结论
测试通过。
来源: 支持矩阵