简介
Duo 默认的 SDK 是基于 buildroot 构建的,用来生成 Duo 的固件,SDK 主要包含如下几个部分:
- u-boot: 2021.10
- linux kernel: 5.10.4
- buildroot: 2021.05
- opensbi: 89182b2
源码地址: github
SDK目录结构
├── build // 编译目录,存放编译脚本以及各board差异化配置
├── build.sh // Milk-V Duo 一键编译脚本
├── buildroot-2021.05 // buildroot 开源工具
├── freertos // freertos 系统
├── fsbl // fsbl启动固件,prebuilt 形式存在
├── install // 执行一次完整编译后,临时存放各 image 路径
├── isp_tuning // 图像效果调试参数存放路径
├── linux_5.10 // 开源 linux 内核
├── middleware // 自研多媒体框架,包含 so 与 ko
├── device // 存放 Milk-V Duo 相关配置及脚本文件的目录
├── opensbi // 开源 opensbi 库
├── out // Milk-V Duo 最终生成的 SD 卡烧录镜像所在目录
├── ramdisk // 存放最小文件系统的 prebuilt 目录
└── u-boot-2021.10 // 开源 uboot 代码
当前 SDK 不支持 Duo256M 和 DuoS 的 ARM 核,如果需要使用 ARM 核,可以暂时参考这个仓库:
duo-build: https://github.com/milkv-duo/duo-buildroot-sdk-v2
编译镜像
准备编译环境,使用本地的 Ubuntu 系统,官方支持的编译环境为 Ubuntu Jammy 22.04.x amd64
。
如果您使用的是其他的 Linux 发行版,我们强烈建议您使用 Docker 环境来编译,以降低编译出错的概率。
以下分别介绍两种环境下的编译方法。
一、使用 Ubuntu 22.04 编译
安装编译依赖的工具包
sudo apt install -y pkg-config build-essential ninja-build automake autoconf libtool wget curl git gcc libssl-dev bc slib squashfs-tools android-sdk-libsparse-utils jq python3-distutils scons parallel tree python3-dev python3-pip device-tree-compiler ssh cpio fakeroot libncurses5 flex bison libncurses5-dev genext2fs rsync unzip dosfstools mtools tcl openssh-client cmake expect python-is-python3
对于 duo-buildroot-sdk-v2,还需要安装以下工具包:
sudo pip install jinja2
获取 SDK
git clone https://github.com/milkv-duo/duo-buildroot-sdk.git --depth=1
1、一键编译
执行一键编译脚本 build.sh
:
cd duo-buildroot-sdk/
./build.sh
会看到编译脚本的使用方法提示:
# ./build.sh
Usage:
./build.sh - Show this menu
./build.sh lunch - Select a board to build
./build.sh [board] - Build [board] directly, supported boards asfollows:
milkv-duo-sd
milkv-duo-spinand
milkv-duo-spinor
milkv-duo256m-sd
milkv-duo256m-spinand
milkv-duo256m-spinor
milkv-duos-emmc
milkv-duos-sd
最下边列出的是当前支持的目标版本列表。
如提示中所示,有两种方法来编译目录版本。
第一种方法是执行 ./build.sh lunch
调出交互菜单,选择要编译的版本序号,回车:
# ./build.sh lunch
Select a target to build:
1. milkv-duo-sd
2. milkv-duo-spinand
3. milkv-duo-spinor
4. milkv-duo256m-sd
5. milkv-duo256m-spinand
6. milkv-duo256m-spinor
7. milkv-duos-emmc
8. milkv-duos-sd
Which would you like:
第二种方法是脚本后面带上目标版本的名字,比如要编译 milkv-duo-sd
的镜像:
# ./build.sh milkv-duo-sd
编译成功后可以在 out
目录下看到生成的SD卡烧录镜像 milkv-duo-sd-*-*.img
注: 第一次编译会自动下载所需的工具链,大小为 840M 左右,下载完会自动解压到 SDK 目录下的 host-tools
目录,下次编译时检测到已存在 host-tools
目录,就不会再次下载了
2、分步编译
如果未执行过一键编译脚本,需要先手动下载工具链 host-tools,并解压到 SDK 根目录:
tar -xf host-tools.tar.gz -C /your/sdk/path/
再依次输入如下命令完成分步编译,命令中的 [board]
和 [config]
替换为需要编译的版本,当前支持的 board
和对应的 config
如下:
milkv-duo-sd cv1800b_milkv_duo_sd
milkv-duo-spinand cv1800b_milkv_duo_spinand
milkv-duo-spinor cv1800b_milkv_duo_spinor
milkv-duo256m-sd cv1812cp_milkv_duo256m_sd
milkv-duo256m-spinand cv1812cp_milkv_duo256m_spinand
milkv-duo256m-spinor cv1812cp_milkv_duo256m_spinor
milkv-duos-emmc cv1813h_milkv_duos_emmc
milkv-duos-sd cv1813h_milkv_duos_sd
source device/[board]/boardconfig.sh
source build/milkvsetup.sh
defconfig [config]
clean_all
build_all
pack_sd_image
比如需要编译 milkv-duo-sd
的镜像,分步编译命令如下:
source device/milkv-duo-sd/boardconfig.sh
source build/milkvsetup.sh
defconfig cv1800b_milkv_duo_sd
clean_all
build_all
pack_sd_image
生成的固件位置:
Duo: install/soc_cv1800b_milkv_duo_sd/[board].img
Duo256M: install/soc_cv1812cp_milkv_duo256m_sd/[board].img
二、使用 Docker 编译
需要在运行 Linux 系统的主机上支持 Docker。 Docker 的使用方法请参考官方文档或其他教程。
我们将 SDK 代码放在 Linux 主机系统上,调用 Milk-V 提供的 Docker 镜像环境来编译。
在 Linux 主机上拉 SDK 代码
git clone https://github.com/milkv-duo/duo-buildroot-sdk.git --depth=1
进入 SDK 代码目录
cd duo-buildroot-sdk
拉取 Docker 镜像并运行
docker run --privileged -itd --name duodocker -v $(pwd):/home/work milkvtech/milkv-duo:latest /bin/bash
命令中部分参数说明:
--privileged
以特权模式启动容器。duodocker
docker 运行时名字,可以使用自己想用的名字。$(pwd)
当前目录,这里是上一步 cd 到的 duo-buildroot-sdk 目录。-v $(pwd):/home/work
将当前的代码目录绑定到 Docker 镜像里的 /home/work 目录。milkvtech/milkv-duo:latest
Milk-V 提供的 Docker 镜像,第一次会自动从 hub.docker.com 下载。
Docker 运行成功后,可以用 docker ps -a
命令查看运行状态:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8edea33c2239 milkvtech/milkv-duo:latest "/bin/bash" 2 hours ago Up 2 hours duodocker
如果 Docker 服务器上的镜像有更新,可以使用 docker pull milkvtech/milkv-duo:latest
命令来同步最新的镜像。
1. 使用 Docker 一键编译
docker exec -it duodocker /bin/bash -c "cd /home/work && cat /etc/issue && ./build.sh [board]"
注意命令最后的 ./build.sh [board]
和前面在 Ubuntu 22.04 中一键编译说明中的用法是一样的,直接 ./build.sh
可以查看命令的使用方法,用 ./build.sh lunch
可以调出交互选择菜单,用 ./build.sh [board]
可以直接编译目标版本,[board]
可以替换为:
milkv-duo-sd
milkv-duo-spinand
milkv-duo-spinor
milkv-duo256m-sd
milkv-duo256m-spinand
milkv-duo256m-spinor
milkv-duos-emmc
milkv-duos-sd
命令中部分参数说明:
duodocker
运行的 Docker 名字, 与上一步中设置的名字要保持一致"*"
双引号中是要在 Docker 镜像中运行的 Shell 命令cd /home/work
是切换到 /home/work 目录,由于运行时已经将该目录绑定到主机的代码目录,所以在 Docker 中 /home/work 目录就是该 SDK 的源码目录cat /etc/issue
显示 Docker 使用的镜像的版本号,目前是 Ubuntu 22.04.3 LTS,调试用./build.sh [board]
执行一键编译脚本
比如需要编译 milkv-duo-sd
的镜像,编译命令如下:
docker exec -it duodocker /bin/bash -c "cd /home/work && cat /etc/issue && ./build.sh milkv-duo-sd"
编译成功后可以在 out
目录下看到生成的SD卡烧录镜像 [board]-*-*.img
2. 使用 Docker 分步编译
如果未执行过一键编译脚本,需要先手动下载工具链 host-tools,并解压到 SDK 根目录:
tar -xf host-tools.tar.gz -C /your/sdk/path/
分步编译需要登 陆到 Docker 中进行操作,用命令 docker ps -a
查看并记录容器的 ID 号,比如 8edea33c2239。
登陆到 Docker 中:
docker exec -it 8edea33c2239 /bin/bash
进入 Docker 中绑定的代码目录:
root@8edea33c2239:/# cd /home/work/
再依次输入如下命令完成分步编译,命令中的 [board]
和 [config]
替换为需要编译的版本,当前支持的 board
和对应的 config
如下:
milkv-duo-sd cv1800b_milkv_duo_sd
milkv-duo-spinand cv1800b_milkv_duo_spinand
milkv-duo-spinor cv1800b_milkv_duo_spinor
milkv-duo256m-sd cv1812cp_milkv_duo256m_sd
milkv-duo256m-spinand cv1812cp_milkv_duo256m_spinand
milkv-duo256m-spinor cv1812cp_milkv_duo256m_spinor
milkv-duos-emmc cv1813h_milkv_duos_emmc
milkv-duos-sd cv1813h_milkv_duos_sd