Move the combine.sh to under cv18xx_aarch64, so we can run this script the same as scons and no need to change cwd. Rename the folder boot to prebuild just becuase all the files under boot are prebuild binaries. Move the prebuilt fip.bin to under prebuild/milkv-duo256m because it's only for 256. Update combine.sh accordingly and output fip.bin to the output folder where we create fip.bin/boot.sd as other bsp. Signed-off-by: Chen Wang <unicorn_wang@outlook.com>
1. 参考文档
- 【参考 1】CV1800B/CV1801B Datasheet(中文版):https://github.com/milkv-duo/duo-files/blob/main/duo/datasheet/CV1800B-CV1801B-Preliminary-Datasheet-full-zh.pdf
- 【参考 2】SG2002/SG2000 技术参考手册(中文版):https://github.com/sophgo/sophgo-doc/releases。官方定期发布 pdf 形式。可以下载下载最新版本的中文版本技术参考手册:
sg2002_trm_cn.pdf
或者sg2000_trm_cn.pdf
。
2. 概述
支持开发板以及集成 SoC 芯片信息如下
- Milk-V Duo: https://milkv.io/docs/duo/getting-started/duo,SoC 采用 CV1800B。
- Milk-V Duo 256m: https://milkv.io/docs/duo/getting-started/duo256m,SoC 采用 SG2002(原 CV181xC)。
- Milk-V Duo S: https://milkv.io/docs/duo/getting-started/duos,SoC 采用 SG2000(原 CV181xH)。
Duo 家族开发板采用 CV18xx 系列芯片。芯片的工作模式总结如下:
- CV1800B,支持一种工作模式:
- 大核(RISC-V C906@1GHz)+ 小核(RISC-V C906@700MHz)。
- SG2002(原 CV181xC),支持两种工作模式,通过管脚 GPIO_RTX 的外围电路控制进行切换:
- 大核(RISC-V C906@1GHz)+ 小核(RISC-V C906@700MHz)。
- 大核(ARM Cortex-A53@1GHz)+ 小核(RISC-V C906@700MHz)。
- SG2000(原 CV181xH),支持两种工作模式,通过管脚 GPIO_RTX 的外围电路控制进行切换:
- 大核(RISC-V C906@1GHz)+ 小核(RISC-V C906@700MHz)。
- 大核(ARM Cortex-A53@1GHz)+ 小核(RISC-V C906@700MHz)。
3. BSP 支持情况
由于大小核的存在,以及不同 SoC 下不同工作模式的存在,bsp/cvitek 提供了三种不同 BSP/OS,需要单独编译。
BSP 名称 | 大小核 | 芯片架构 | 默认串口控制台 | 备注 |
---|---|---|---|---|
cv18xx_risc-v | 大核 | RISC-V C906 | uart0 | 支持 MMU,支持 RT-Thread 标准版 和 RT-SMART 模式,默认运行 RT-SMART 版本 |
c906-little | 小核 | RISC-V C906 | uart1 | 无 MMU,运行 RT-Thread 标准版 |
cv18xx_aarch64 | 大核 | ARM Cortex A53 | uart0 | 支持 MMU, 支持 RT-Thread 标准版 和 RT-SMART 版,默认运行 RT-Thread 标准版本 |
由于开发板默认运行的大核为 "cv18xx_risc-v", 所以本文将主要介绍 "cv18xx_risc-v" 和 "c906-little" 的构建和使用。有关 "cv18xx_aarch64" 的介绍请参考 这里。
3.1. 驱动支持列表
驱动 | 支持情况 | 备注 |
---|---|---|
uart | 支持 | 默认波特率115200 |
gpio | 支持 | |
i2c | 支持 | |
adc | 支持 | |
spi | 支持 | 默认 CS 引脚,每个数据之间 CS 会拉高,请根据时序选择 GPIO 作为 CS。若读取数据,tx 需持续 dummy 数据。 |
pwm | 支持 | |
timer | 支持 | |
wdt | 支持 | |
sdio | 支持 | |
eth | 支持 |
3.2. 默认串口控制台管脚配置
不同开发板 uart 输出管脚不同,默认配置可能导致串口无法正常显示,请根据开发板 uart 通过 scons --menuconfig
配置对应 uart 的输出管脚。
$ scons --menuconfig
General Drivers Configuration --->
[*] Using UART --->
[*] Enable UART 1
(IIC0_SDA) uart1 rx pin name
(IIC0_SCL) uart1 tx pin name
开发板 | 大核 uart0 默认管脚 | 小核 uart1 默认管脚 |
---|---|---|
Duo | rx: UART0_RX tx: UART0_TX |
rx: IIC0_SDA tx: IIC0_SCL |
Duo 256M | rx: UART0_RX tx: UART0_TX |
rx: IIC0_SDA tx: IIC0_SCL |
Duo S | rx: UART0_RX tx: UART0_TX |
rx: JTAG_CPU_TCK tx: JTAG_CPU_TMS |
如需配置其他管脚可参考对应型号的开发板信息 https://milkv.io/docs/duo/overview。
4. 编译
注:当前 bsp 只支持 Linux 编译,推荐 ubuntu 22.04
4.1. Toolchain 下载
-
用于编译 RT-Thread 标准版的工具链是
riscv64-unknown-elf-gcc
下载地址 https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/resource//1705395512373/Xuantie-900-gcc-elf-newlib-x86_64-V2.8.1-20240115.tar.gz -
用于编译 RT-Thread Smart 版的工具链是
riscv64-unknown-linux-musl-gcc
下载地址 https://github.com/RT-Thread/toolchains-ci/releases/download/v1.7/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2
正确解压后(假设解压到 /opt
下, 也可以自己设定解压后的目录),导出如下环境变量,建议将这些 export 命令写入 ~/.bashrc
。并注意在使用不同工具链时确保导出正确的一组环境变量。
构建 RT-Thread 标准版时按照以下配置:
export RTT_CC="gcc"
export RTT_CC_PREFIX=riscv64-unknown-elf-
export RTT_EXEC_PATH=/opt/Xuantie-900-gcc-elf-newlib-x86_64-V2.8.1/bin
构建 RT-Thread Smart 版时按照以下配置:
export RTT_CC="gcc"
export RTT_CC_PREFIX=riscv64-unknown-linux-musl-
export RTT_EXEC_PATH=/opt/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin
4.2. 依赖安装
$ sudo apt install -y scons libncurses5-dev device-tree-compiler
4.3. 构建
异构芯片需单独编译每个核的 OS,在大/小核对应的目录下,依次执行:
4.3.1. 开发板选择
$ scons --menuconfig
选择当前需要编译的目标开发板类型,默认是 "milkv-duo256m"。
Board Type (milkv-duo) --->
( ) milkv-duo
( ) milkv-duo-spinor
(X) milkv-duo256m
( ) milkv-duo256m-spinor
( ) milkv-duos
4.3.2. 开启 RT-Smart
目前大核默认启用 RT-Smart,小核不支持 RT-Smart。
如果要对大核启用 RT-Smart,可以按如下方式设置。
RT-Thread Kernel --->
[*] Enable RT-Thread Smart (microkernel on kernel/userland)
注意检查内核虚拟起始地址的配置,确保为 0xFFFFFFC000200000
。
RT-Thread Kernel --->
(0xFFFFFFC000200000) The virtural address of kernel start
RT-Thread Components --->
4.3.3. 编译
$ scons
编译成功后,会在 bsp/cvitek/output
对应开发板型号目录下自动生成 fip.bin
和 boot.sd
文件。
fip.bin
:这是一个打包后生成的 bin 文件,包含了fsbl
、opensbi
、uboot
以及小核的内核镜像文件rtthread.bin
。boot.sd
:这也是一个打包后生成的 bin 文件,包含了大核的内核镜像文件rtthread.bin
。
5. 运行
-
将 SD 卡分为 2 个分区,第 1 个分区的分区格式为
FAT32
,用于存放fip.bin
和boot.sd
文件,第 2 个分区可选,如果有可用于作为数据存储分区或者存放文件系统。 -
将根目录下的
fip.bin
和boot.sd
复制到 SD 卡第一个分区中。两个固件文件可以独立修改更新,譬如后续只需要更新大核,只需要重新编译 "cv18xx_risc-v" 并替换 SD 卡第一个分区中的boot.sd
文件即可。 -
更新完固件文件后, 重新上电可以看到串口的输出信息。
6. 大核 RT-Smart 启动并自动挂载根文件系统
大核启用 RT-Smart 后可以在启动阶段挂载根文件系统。目前 Duo 支持 ext4, fat 文件格式,具体操作说明如下:
6.1. 内核构建配置
首先确保开启 RT-Smart,参考 4.3.2. 可按照以下方式开启 RT-Smart。
在开启 RT-Smart 基础上确保如下配置修改。
-
使能
BSP_USING_SDH
: Enable Secure Digital Host Controller, 因为使用 sd-card 存放文件系统。 -
使能
BSP_USING_RTC
: Enable RTC, 避免挂载文件系统后执行命令报错:[W/time] Cannot find a RTC device!
-
使能
BSP_ROOTFS_TYPE_DISKFS
: Disk FileSystems, e.g. ext4, fat ..., 该配置默认已打开。 -
内核默认支持 fat, 如果要挂载 ext4 的文件系统,则还需要额外安装 lwext4 软件包,即使能
PKG_USING_LWEXT4
(具体 menuconfig 路径是 (Top) -> RT-Thread online packages -> system packages -> lwext4: an excellent choice of ext2/3/4 filesystem for microcontrollers.)。如果在菜单中找不到该软件包,可以退出 menuconfig 并执行pkgs --upgrade
更新软件包索引后再尝试使能软件包。勾选该选项后还需要执行如下操作更新软件并安装源码到 bsp 的 packages 目录下:
source ~/.env/env.sh pkgs --update
保存后重新编译内核。
6.2. 构建文件系统
这里用 RT-Thread 官方的 userapps 工具制作文件系统。
userapps 仓库地址: https://github.com/RT-Thread/userapps。具体操作参考 《介绍与快速入门》。
制作根文件系统步骤如下,供参考:
cd $WS
git clone https://github.com/RT-Thread/userapps.git
cd $WS/userapps
source ./env.sh
cd apps
xmake f -a riscv64gc
xmake -j$(nproc)
xmake smart-rootfs
xmake smart-image -f fat
在 $WS/userapps/apps/build
路径下生成根文件系统镜像文件 fat.img
。
如果是制作 ext4 格式的文件系统 image,则最后一步换成:
xmake smart-image -f ext4
生成根文件系统镜像文件 ext4.img
。
6.3. 将文件系统写入 sd-card
将 SD 卡分为 2 个分区,第 1 个分区的分区格式为 FAT32
,用于存放 fip.bin
和 boot.sd
文件,第 2 个分区用于存放文件系统,分区格式需要和具体文件系统的格式一致。这里以 fat 为例介绍如何制作 sd-card 上的文件系统分区,ext4 的操作类似。
将 SD 卡插入 PC 主机系统,假设为 Ubuntu,识别为 /dev/sdb
,则第二个分区为 /dev/sdb2
。将第二个分区挂载,假设挂载到 ~/ws/u-disk
。
将上一步生成的 fat.img
文件也挂载到一个临时目录,假设是 /tmp
。
最后将 /tmp 下的文件全部拷贝到 ~/ws/u-disk
中,即完成对 SD 卡中文件系统分区的烧写。
最后不要忘记卸载 SD 卡的分区。
简单步骤示例如下,供参考:
sudo mount -o loop fat.img /tmp
sudo mount /dev/sdb2 ~/ws/u-disk
sudo cp -a /tmp/* ~/ws/u-disk
sudo umount ~/ws/u-disk
sudo umount /tmp
6.4. 上电启动
6.4.1. FAT 的例子
启动完成后, 会看到 [I/app.filesystem] device 'sd1' is mounted to '/' as FAT
的输出,说明文件系统挂载成功。此时 msh
被替换为 /bin/ash
。
\ | /
- RT - Thread Smart Operating System
/ | \ 5.2.0 build Nov 26 2024 09:55:38
2006 - 2024 Copyright by RT-Thread team
lwIP-2.1.2 initialized!
[I/sal.skt] Socket Abstraction Layer initialize success.
[I/drivers.serial] Using /dev/ttyS0 as default console
[I/SDIO] SD card capacity 30216192 KB.
[I/SDIO] sd: switch to High Speed / SDR25 mode
found part[0], begin: 1048576, size: 128.0MB
found part[1], begin: 135266304, size: 28.707GB
[I/app.filesystem] device 'sd1' is mounted to '/' as FAT
Hello RT-Smart!
msh />[E/sal.skt] not find network interface device by protocol family(1).
[E/sal.skt] SAL socket protocol family input failed, return error -3.
/ # ls
bin etc mnt root sbin tc usr
dev lib proc run services tmp var
6.4.2. EXT4 的例子
启动完成后, 会看到 [I/app.filesystem] device 'sd1' is mounted to '/' as EXT
的输出,说明文件系统挂载成功。此时 msh
被替换为 /bin/ash
。如果 ls /bin -l
,会看到大部分命令程序都是指向 busybox 的符号链接,符号链接是 EXT4 区别于 FAT 的重要特征。
\ | /
- RT - Thread Smart Operating System
/ | \ 5.2.0 build Dec 17 2024 14:04:27
2006 - 2024 Copyright by RT-Thread team
lwIP-2.1.2 initialized!
[I/sal.skt] Socket Abstraction Layer initialize success.
[I/drivers.serial] Using /dev/ttyS0 as default console
[I/SDIO] SD card capacity 30216192 KB.
[I/SDIO] sd: switch to High Speed / SDR25 mode
found part[0], begin: 1048576, size: 128.0MB
found part[1], begin: 135266304, size: 28.707GB
[I/app.filesystem] device 'sd1' is mounted to '/' as EXT
Hello RT-Smart!
msh />[E/sal.skt] not find network interface device by protocol family(1).
[E/sal.skt] SAL socket protocol family input failed, return error -3.
/ # ls
bin lib proc sbin tmp
dev lost+found root services usr
etc mnt run tc var
/ # ls /bin -l
lrwxrwxrwx 0 0 0 7 Dec 17 2024 arch -> busybox
lrwxrwxrwx 0 0 0 7 Dec 17 2024 ash -> busybox
lrwxrwxrwx 0 0 0 7 Dec 17 2024 base32 -> busybox
lrwxrwxrwx 0 0 0 7 Dec 17 2024 base64 -> busybox
lrwxrwxrwx 0 0 0 7 Dec 17 2024 bash -> busybox
lrwxrwxrwx 0 0 0 7 Dec 17 2024 bbconfig -> busybox
-rwxr-xr-x 0 0 0 1003000 Dec 17 2024 busybox
lrwxrwxrwx 0 0 0 7 Dec 17 2024 cat -> busybox
lrwxrwxrwx 0 0 0 7 Dec 17 2024 chattr -> busybox
lrwxrwxrwx 0 0 0 7 Dec 17 2024 chgrp -> busybox
lrwxrwxrwx 0 0 0 7 Dec 17 2024 chmod -> busybox
lrwxrwxrwx 0 0 0 7 Dec 17 2024 chown -> busybox
......
7. FAQ
-
如遇到不能正常编译,请先使用
scons --menuconfig
重新生成配置。 -
错误:./mkimage: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
可在 http://security.ubuntu.com/ubuntu/pool/main/o/openssl 下载 libssl1.1_1.1.1f-1ubuntu2_amd64.deb
文件后安装即可解决。
或使用以下命令下载安装:
$ wget http://security.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb
$ sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2_amd64.deb
- 如发现切换开发板编译正常,但无法正常打包,请切换至自动下载的
cvi_bootloader
目录,并手工运行git pull
更新,或删除该目录后重新自动下载。
8. 联系人信息
维护人:flyingcys
更多信息请参考 https://riscv-rtthread-programming-manual.readthedocs.io