Skip to content

Latest commit

 

History

History
executable file
·
466 lines (343 loc) · 16.6 KB

README-zh.md

File metadata and controls

executable file
·
466 lines (343 loc) · 16.6 KB

English | 简体中文 | 日本語

项目简介

Milk-V Duo 是一个基于 CV1800B 芯片的超紧凑嵌入式开发平台。它可以运行 Linux 和RTOS,为专业人士、工业 ODM 厂商、AIoT 爱好者、DIY 爱好者和创作者提供了一个可靠、低成本和高性能的平台。

硬件参数

  • 处理器: CVITEK CV1800B (C906@1Ghz + C906@700MHz)
  • 内存: 64MB
  • 网口: 10/100Mbps 以太网 (需外接扩展板)

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 代码

快速开始

Tip

以下 SDK 的编译和使用方法,您也可以转到我们的 官方文档 中查看,会有更好的阅读体验。另外,我们的官方文档网站也是开源的,如果您有兴趣来丰富文档的内容或者翻译成其他语言,可以在 这个仓库 中提交您的 PR,我们会不定期为贡献者赠送精美的礼物。

准备编译环境,使用本地的 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 libconfuse2

获取 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
./build.sh              - Show this menu
./build.sh lunch        - Select a board to build
./build.sh [board]      - Build [board] directly, supported boards as follows:
milkv-duo
milkv-duo-spinand
milkv-duo-spinor
milkv-duo256m
milkv-duo256m-spinand
milkv-duo256m-spinor
milkv-duos-emmc
milkv-duos-sd

最下边列出的是当前支持的目标版本列表。带 spinor 或者 spinand 后缀的为基于 IOB 板载 NOR FLASH 或者 NAND FLASH 的版本。

如提示中所示,有两种方法来编译目录版本。

第一种方法是执行 ./build.sh lunch 调出交互菜单,选择要编译的版本序号,回车:

# ./build.sh lunch
Select a target to build:
1. milkv-duo
2. milkv-duo-spinand
3. milkv-duo-spinor
4. milkv-duo256m
5. milkv-duo256m-spinand
6. milkv-duo256m-spinor
7. milkv-duos-emmc
8. milkv-duos-sd

Which would you like:

第二种方法是脚本后面带上目标版本的名字,比如要编译 milkv-duo 的镜像:

# ./build.sh milkv-duo

编译成功后可以在 out 目录下看到生成的SD卡烧录镜像 milkv-duo-*-*.img,或者NOR FLASH/NAND FLASH 的烧录文件目录milkv-duo-*-*

注: 第一次编译会自动下载所需的工具链,大小为 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               cv1800b_milkv_duo_sd
milkv-duo-spinand       cv1800b_milkv_duo_spinand
milkv-duo-spinor        cv1800b_milkv_duo_spinor
milkv-duo256m           cv1812cp_milkv_duo256m_sd
milkv-duo256m-spinand   cv1812cp_milkv_duo256m_spinand
milkv-duo256m-spinor    cv1812cp_milkv_duo256m_spinor
source device/[board]/boardconfig.sh

source build/milkvsetup.sh
defconfig [config]
clean_all
build_all
pack_sd_image

比如需要编译 milkv-duo 的镜像,分步编译命令如下:

source device/milkv-duo/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
Duo(nor): 		install/soc_cv1800b_milkv_duo_sd/fip.bin、boot.spinor、rootfs.spinor
Duo(nand):		install/soc_cv1800b_milkv_duo_sd/fip.bin、boot.spinand、rootfs.spinand、system.spinand、cfg.spinand
Duo256M:  		install/soc_cv1812cp_milkv_duo256m_sd/[board].img
Duo256M(nor): 		install/soc_cv1800b_milkv_duo_sd/fip.bin、boot.spinor、rootfs.spinor
Duo256M(nand):		install/soc_cv1800b_milkv_duo_sd/fip.bin、boot.spinand、rootfs.spinand、system.spinand、cfg.spinand

二、使用 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 -itd --name duodocker -v $(pwd):/home/work milkvtech/milkv-duo:latest /bin/bash

命令中部分参数说明:

  • 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

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
milkv-duo-spinand
milkv-duo-spinor
milkv-duo256m
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 的镜像,编译命令如下:

docker exec -it duodocker /bin/bash -c "cd /home/work && cat /etc/issue && ./build.sh milkv-duo"

编译成功后可以在 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               cv1800b_milkv_duo_sd
milkv-duo-spinand       cv1800b_milkv_duo_spinand
milkv-duo-spinor        cv1800b_milkv_duo_spinor
milkv-duo256m           cv1812cp_milkv_duo256m_sd
milkv-duo256m-spinand   cv1812cp_milkv_duo256m_spinand
milkv-duo256m-spinor    cv1812cp_milkv_duo256m_spinor
source device/[board]/boardconfig.sh

source build/milkvsetup.sh
defconfig [config]
clean_all
build_all
pack_sd_image

比如需要编译 milkv-duo 的镜像,分步编译命令如下:

source device/milkv-duo/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
Duo(nor): 		install/soc_cv1800b_milkv_duo_sd/fip.bin、boot.spinor、rootfs.spinor
Duo(nand):		install/soc_cv1800b_milkv_duo_sd/fip.bin、boot.spinand、rootfs.spinand、system.spinand、cfg.spinand
Duo256M:  		install/soc_cv1812cp_milkv_duo256m_sd/[board].img
Duo256M(nor): 		install/soc_cv1800b_milkv_duo_sd/fip.bin、boot.spinor、rootfs.spinor
Duo256M(nand):		install/soc_cv1800b_milkv_duo_sd/fip.bin、boot.spinand、rootfs.spinand、system.spinand、cfg.spinand

编译完成后可以用 exit 命令退出 Docker 环境:

root@8edea33c2239:/home/work# exit

在主机代码目录中同样也可以看到生成的固件。

停用 Docker

编译完成后,如果不再需要以上的 Docker 运行环境,可先将其停止,再删除:

docker stop 8edea33c2239
docker rm 8edea33c2239

三、其他编译注意事项

如果您想尝试在以上两种环境之外的环境下编译本 SDK,下面是可能需要注意的事项,仅供参考。

cmake 版本号

注意:cmake 版本最低要求 3.16.5

查看系统中 cmake 的版本号

cmake --version

比如在Ubuntu 20.04中用 apt 安装的 cmake 版本号为

cmake version 3.16.3

不满足此SDK最低要求,需要手动安装目前最新的 3.27.6 版本

wget https://github.com/Kitware/CMake/releases/download/v3.27.6/cmake-3.27.6-linux-x86_64.sh
chmod +x cmake-3.27.6-linux-x86_64.sh
sudo sh cmake-3.27.6-linux-x86_64.sh --skip-license --prefix=/usr/local/

手动安装的 cmake/usr/local/bin 中,此时用 cmake --version 命令查看其版本号, 应为

cmake version 3.27.6

使用 Windows Linux 子系统 (WSL) 进行编译

如果您希望使用 WSL 执行编译,则构建镜像时会遇到一个小问题,WSL 中的 $PATH 具有 Windows 环境变量,其中路径之间包含一些空格。

要解决此问题,您需要更改 /etc/wsl.conf 文件并添加以下行:

[interop]
appendWindowsPath = false

然后需要使用 wsl.exe --reboot 重新启动 WSL。再运行 ./build.sh 脚本或分步编译命令。

要恢复 /etc/wsl.conf 文件中的此更改,请将 appendWindowsPath 设置为 true。 要重新启动 WSL,您可以使用 Windows PowerShell 命令 wsl.exe --shutdown,然后使用wsl.exe,之后 Windows 环境变量在 $PATH 中再次可用。

SD卡烧录

注意: 将镜像写入 TF 卡会擦除卡中原有数据,记得在烧录前备份重要的数据!!!

  • Window 下使用 balenaEtcher 或者 Rufus 或者 Win32 Disk Imager 等工具将生成的镜像写入 TF 卡中
  • Linux 下使用 dd 命令将生成的镜像写入 TF 卡中,请务必仔细确认 of 设备 /dev/sdX 为要烧录的 TF 卡
    sudo dd if=milkv-duo-XXX.img of=/dev/sdX

IOB板FLASH烧录

  • 需要IOB板FLASH位置处焊接上NOR或者NAND FLASH(需要用户后期自己动手)
  • 准备一张没有烧录SD镜像的SD卡,将out下milkv-duo-spinor-*-*或者milkv-duo-spinand-*-*目录下全部文件拷贝至内存卡根目录
  • 将拷贝好镜像的 TF 卡插入 Milk-V Duo 的 TF 卡槽中
  • 接好串口线,可观察刻录进度
  • 开机上电即开始刻录镜像到NOR或者NAND,等待uboot中自动刻录镜像完成
  • 拔掉Milk-V Duo 的 TF 卡槽中的 TF 卡,重新上电即可从NOR或者NAND启动

开机

  • 将烧录好镜像的 TF 卡插入 Milk-V Duo 的 TF 卡槽中
  • 接好串口线(可选)
  • 将平台上电,Duo 会正常开机进入系统
  • 如有接串口线,在串口工具(mobarXterm, Xshell 或者其他)中可以看到开机日志,进系统后可通过串口登入终端,执行 Linux 下的相关命令

登陆到 Duo 终端的方法

  • 通过串口线
  • 通过 USB 网卡 (CDC-NCM) 方式
  • 通过以太网接口(需要扩展板支持)

登陆 Duo 终端的用户名和密码分别为:

root
milkv

禁用LED闪烁

上电后 LED 会自动闪烁,这个是通过开机脚本实现的,如果需要禁用 LED 闪烁功能,在 Duo 的终端中执行:

mv /mnt/system/blink.sh /mnt/system/blink.sh_backup && sync

也就是将 LED 闪烁脚本改名,重启 Duo 后,LED 就不闪了。

如果需要恢复 LED 闪烁,再将其名字改回来,重启即可:

mv /mnt/system/blink.sh_backup /mnt/system/blink.sh && sync

使用 IO Board 底板

注意,使用 IO Board 底板时,USB 网卡 (CDC-NCM) 不可用,如需使用网络功能,请使用底板上的以太网接口。

使用底板上的 4 个 USB 口,需要修改一下配置,将默认固件中的 usb-ncm 功能修改为 usb-host

ln -sf /mnt/system/usb-host.sh /mnt/system/usb.sh
sync

修改完,重启或重新上电即可生效。

比如底板 USB 口接入 U 盘后,可以用 ls /dev/sd* 查看是否有检测到设备。

挂载到系统中查看U盘中的内容(以 /dev/sda1 为例):

mkdir /mnt/udisk
mount /dev/sda1 /mnt/udisk

查看 /mnt/udisk 目录中的内容是否符合预期:

ls /mnt/udisk

卸载U盘的命令:

umount /mnt/udisk

不使用底板时,恢复 USB 网卡 (CDC-NCM) 的方法:

ln -sf /mnt/system/usb-ncm.sh /mnt/system/usb.sh
sync

修改完,需要重启或重新上电生效。

常见问题解答

  1. 为什么只显示单核?

    CV1800B 芯片采用双核设计,当前 Linux 系统运行在其中的一个核上,另外一个核用来运行实时系统,该核的使用请查看官方文档

  2. 为什么查看 RAM 只显示 28M?

    因为有一部分RAM被分配绐了 ION,是在使用摄像头跑算法时需要占用的内存。如果不使用摄像头,您可以修改这个 ION_SIZE 的值为 0 然后重新编译生成固件(Duo 256M: ION_SIZE)。

芯片原厂一些资料的链接

关于 Milk-V

技术论坛