2. LubanCat-SDK

2.1. 板卡支持情况

2.1.1. sophon-image-build

支持LubanCat-sg200x系列鲁班猫板卡系统镜像构建

  • 鲁班猫-P1系列,使用sg2000芯片

2.2. sophon-image-build简介

sophon-image-build是基于算能通用Linux SDK工程的定制版本,适用于以sg200x处理器为主芯片的LubanCat-sg200x系列板卡。

整个SDK工程,目录包含有build、buildroot、freertos、opensbi、kernel、u-boot、ubuntu、middleware 等目录。 每个目录或其子目录会对应一个 git 工程,提交需要在各自的目录下进行。

  • build:存放编译配置、板级文件、打包工具等。

  • buildroot:基于 buildroot (2023.11.2) 开发的根文件系统。

  • freertos:存放freertos源码。

  • fsbl:存放fsbl源码,第一阶段引导程序。

  • host:存放使用docker编译预安装环境的配置文件和一些动态库。

  • host-tools:存放交叉编译工具链。

  • isp_tuning:存放isp固件。

  • linux_5.10:存放 kernel 源码,内核版本5.10.4。

  • middleware:存放一些初始化程序、测试程序源码。

  • opensbi:存放opensbi源码。

  • osdrv:存放算能官方或者用户添加的驱动源码。

  • oss:存放一些应用程序源码。

  • ramdisk:存放算能官方基础的文件系统以及一些工具和系统配置。

  • u-boot-2021.10:存放基于v2021.10版本进行开发的uboot代码。

  • ubuntu: 野火添加的Ubuntu根文件系统源码。

2.3. SDK 开发坏境搭建

LubanCat-SDK是基于Ubuntu LTS 系统开发测试的,在开发过程中,主要是用Ubuntu 20.04版本, 为了不必要的麻烦,我们推荐用户使用Ubuntu20.04及以上版本。

安装SDK依赖的软件包

1
2
3
4
5
6
# 安装SDK构建所需要的软件包
# 整体复制下面内容到终端中安装
sudo apt install pkg-config build-essential ninja-build automake autoconf libtool wget curl git gcc g++ \
libssl-dev bc slib squashfs-tools jq cmake python3-distutils zlib1g-dev aptitude  u-boot-tools traceroute \
tclsh scons parallel ssh-client tree python3-dev python3-pip device-tree-compiler libssl-dev ssh cpio dosfstools \
squashfs-tools fakeroot libncurses5 libncurses5-dev flex bison tar qemu-user-static vim p7zip-full rsync unzip mtools

cmake要求3.16+,确认当前系统cmake版本:

1
cmake --version

如果低于3.16版本需要编译源码安装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 注意先删除低版本cmake
sudo apt autoremove cmake

#获取源码并编译安装
wget https://cmake.org/files/v3.16/cmake-3.16.5.tar.gz
tar zxvf cmake-3.16.5.tar.gz
cd cmake-3.16.5/
./configure
make
sudo make install

2.4. SDK 源码获取

2.4.1. Git配置

设置自己的git信息,以确保后续拉取代码时正常进行,如果不需要提交代码的话可以随意设置用户名和邮箱地址。

1
2
git config --global user.name "your name"
git config --global user.email "your mail"

2.4.2. SDK在线下载

LubanCat-SDK可以适配不同的板卡。由于使用这种方式要从Github拉取大量的仓库, 体积很大,对于不能快速访问Github的用户不建议使用这种方式。

1
2
3
4
5
6
7
8
#只拉取最新一次提交,指定sg200x分支
git clone --depth=1 -b sg200x https://github.com/LubanCat/sophon-image-build.git

#进入sdk1目录
cd sophon-image-build

#拉取交叉编译器
git clone https://github.com/sophgo/host-tools --depth=1

–depth=1 可以在拉取时进行浅克隆,只拉取最新的一次提交,可以有效减少从网络拉取的内容。 如果想拉取完整的,带有所有Git提交信息的内容,可以删除此选项。

如果拉取失败需要检查访问Github是否正常,或者下载资料网盘/7-SDK源码压缩包,解压进行编译。

2.4.3. SDK离线安装下载

由于Github服务器在国外,拉取这么多的仓库需要很多时间,还可能因为网络不畅通而导致下载失败。 为此,我们将需要使用的仓库整体打包,使用网盘下载的方式,以减少连接Github导致的问题。

2.4.3.1. 下载地址

根据板卡的型号下载对应版本的最近日期的压缩包即可。

注解

由于源码压缩包体积很大,仅在有大量修改的稳定版本时更新,其发布日期可能和镜像发布日期无法对应。当我们在本地解压压缩包以后,只需要借助Github做少量更新,即可同步到最新版本。

2.4.3.2. 解压SDK源码

访问百度网盘资源介绍页面获取SDK源码压缩包: 资料网盘/7-SDK源码压缩包

以下过程以sophon-image-build.tar.gz 进行演示,实际文件名称以自己下载的SDK为准

1
2
3
4
5
6
7
8
#解压SDK压缩包
tar xvf sophon-image-build.tar.gz

#进入SDK源码目录
cd sophon-image-build

#更新
git pull

如果git pull执行时提示网络连接超时,请检查并能否通畅访问github。 确认可以正常访问github的话,可以重复多次执行git pull命令来进行同步。 若无法访问github,可以忽略同步源码仓库到最新版本这一步骤。

2.4.3.3. 解压交叉编译器

访问百度网盘资源介绍页面获取SDK源码压缩包: 资料网盘/7-SDK源码压缩包,其中host-tools.tar.gz即是交叉编译链压缩包,包含riscv版本和arm版本。

将host-tools.tar.gz传到SDK顶层目录并解压:

1
2
3
4
5
#进入SDK源码目录
cd sophon-image-build

#解压
tar xvf host-tools.tar.gz

2.5. LubanCat-SDK构建说明

2.5.1. 初始化编译环境

通过以下命令初始化环境,系统会列出目前SDK支持的IC以及板卡型号

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#初始化编译环境
source build/cvisetup.sh

#信息输出如下
-------------------------------------------------------------------------------------------------------
    Usage:
    (1) menuconfig - Use menu to configure your board.
        ex: $ menuconfig

    (2) defconfig $CHIP_ARCH - List EVB boards($BOARD) by CHIP_ARCH.
    ** sg200x ** -> ['sg2000', 'sg2002']
    ** cv181x ** -> ['cv1812cp', 'cv1812h', 'cv1813h']
    ** cv180x ** -> ['cv1800b']
        ex: $ defconfig cv181x

    (3) defconfig $BOARD - Choose EVB board settings.
        ex: $ defconfig cv1813h_wevb_0007a_spinor
        ex: $ defconfig cv1812cp_wevb_0006a_spinor
-------------------------------------------------------------------------------------------------------
Building rootfs stage requires root privileges, please enter your passowrd:

列出了SDK支持的IC以及设定板卡配置文件示例,最后提示构建文件系统时需要root权限,需要输入当前用户密码。

输入当前用户密码,然后按回车确认,会显示输入的密码是多少,如果不正确请重新运行source build/cvisetup.sh重新输入当前用户密码。

1
2
3
Building rootfs stage requires root privileges, please enter your passowrd:
123456
The password you entered is 123456

2.5.2. 加载板卡配置文件

2.5.2.1. defconfig选定

通过defconfig + 芯片型号查看指定的芯片可选的板级配置文件,以sg200x为例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#查看sg200x芯片可选板级文件
defconfig sg200x

#信息输出如下
* sg200x * the avaliable cvitek EVB boards
sg2000 - sg2000_duo_sd [C906B + EMMC 8192MB + DDR 512MB]
       sg2000_lubancat_arm_buildroot_emmc [CA53 + EMMC 8192MB + DDR 512MB]
       sg2000_lubancat_arm_buildroot_sd [CA53 + DDR 512MB]
       sg2000_lubancat_arm_ubuntu_emmc [CA53 + EMMC 8192MB + DDR 512MB]
       sg2000_lubancat_arm_ubuntu_sd [CA53 + DDR 512MB]
       sg2000_lubancat_riscv_buildroot_emmc [C906B + EMMC 8192MB + DDR 512MB]
       sg2000_lubancat_riscv_buildroot_sd [C906B + DDR 512MB]
       sg2000_lubancat_riscv_ubuntu_emmc [C906B + EMMC 8192MB + DDR 512MB]
       sg2000_lubancat_riscv_ubuntu_sd [C906B + DDR 512MB]
       sg2000_wevb_sd [CA53 + SPINOR 16MB + BGA SIP 128MB]
sg2002 - sg2002_duo_sd [C906B + EMMC 8192MB + DDR 256MB]

可以看到lubancat板卡可选择启动核心riscv核或者arm核,文件系统可选择ubuntu或者buildroot,存储介质可选择sd或者emmc。

以下以编译riscv核ubuntu根文件系统emmc镜像为例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#加载板级配置文件
defconfig sg2000_lubancat_riscv_ubuntu_emmc

#信息输出如下
Run defconfig function
Loaded configuration '/home/dev/hyw/sophon-image-build/build/boards/sg200x/sg2000_lubancat_riscv_ubuntu_emmc/sg2000_lubancat_riscv_ubuntu_emmc_defconfig'
Configuration saved to '.config'
Loaded configuration '.config'
Minimal configuration saved to '/home/dev/hyw/sophon-image-build/build/.defconfig'
~/hyw/sophon-image-build/build ~/hyw/sophon-image-build
~/hyw/sophon-image-build
BR2_DEFCONFIG:

====== Environment Variables =======

PROJECT: sg2000_lubancat_riscv_ubuntu_emmc, DDR_CFG=ddr3_1866_x16
CHIP_ARCH: SG200X, DEBUG=0
SDK VERSION: musl_riscv64, RPC=0
ATF options: ATF_KEY_SEL=default, BL32=1
Linux source folder:linux_5.10, Uboot source folder: u-boot-2021.10
CROSS_COMPILE_PREFIX: riscv64-unknown-linux-musl-
ENABLE_BOOTLOGO: 1
Flash layout xml: /home/dev/hyw/sophon-image-build/build/boards/sg200x/sg2000_lubancat_riscv_ubuntu_emmc/partition/partition_emmc.xml
Sensor tuning bin: ov_os04a10
Output path: /home/dev/hyw/sophon-image-build/install/soc_sg2000_lubancat_riscv_ubuntu_emmc

生成的临时配置文件在sophon-image-build/build/.config

2.5.4. 编译命令

初始化完编译环境和加载板级配置文件后,可进行编译,输入build然后按下tab键以及输入pack然后按下tab键可以查看编译命令,输入clean然后再按下tab键可以查看清除编译命令:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#输入build然后按下tab键
build

#信息输出如下
build/                          build_cvi_pipeline              build_opensbi_kernel
build_3rd_party                 build_fip_pre                   build_osdrv
build_access_guard_turnkey_app  build_fsbl                      build_ramboot
build_ai_sdk                    build_ipc_app                   build_rtos
build_all                       build_ive_sdk                   build_sdk
build_atf                       build_ivs_sdk                   build_tpu_sdk
build_bld                       build_kernel                    build_uboot
build_cnv_sdk                   build_middleware                build_uboot_env_tools

#输入pack然后按下tab键
pack

#信息输出如下
pack200           pack_burn_image   pack_data         pack_prog_img     pack_system       pack_usbdl_image
pack_boot         pack_cfg          pack_gpt          pack_rootfs       pack_upgrade

#输入clean然后按下tab键
clean

#信息输出如下
clean_3rd_party                 clean_fsbl                      clean_ramdisk
clean_access_guard_turnkey_app  clean_ipc_app                   clean_rootfs
clean_ai_sdk                    clean_ive_sdk                   clean_rtos
clean_all                       clean_ivs_sdk                   clean_sdk
clean_atf                       clean_kernel                    clean_tpu_sdk
clean_bld                       clean_middleware                clean_uboot
clean_cnv_sdk                   clean_opensbi
clean_cvi_pipeline              clean_osdrv

可以看到,配置好编译环境和加载板级文件后,提供了很多编译命令,比如build的build_all就是完全编译镜像,build_kernel就是单独编译内核,以上常用的命令说明如下:

命令

说明

build_all

一键构建完整镜像

build_kernel

单独构建内核

build_uboot

单独构建Uboot

build_osdrv

单独构建osdrv目录的驱动程序

build_middleware

单独构建middleware目录的初始化程序、测试程序

pack_upgrade

打包组件成完整emmc镜像

pack_rootfs

构建并打包文件系统

pack_burn_image

打包组件成完整sd镜像

clean_all

清除全部编译输出

clean_kernel

清除内核编译输出

clean_osdrv

清除osdrv目录编译输出

clean_middleware

清除middleware目录编译输出

2.5.5. 编译完整镜像

SDK的构建脚本可以实现自动构建,结合以上介绍的编译命令说明,以riscv核ubuntu系统emmc存储介质为例,具体操作方式如下,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#初始化编译环境,输入当前用户的密码
source build/cvisetup.sh

#加载板级配置文件
defconfig sg2000_lubancat_riscv_ubuntu_emmc

#清除之前编译输出
clean_all

#一键编译完整镜像
build_all

编译会生成install目录,存放板级对应编译的各种输出文件。

其中,sophon-image-build/install/soc_sg2000_lubancat_riscv_ubuntu_emmc/sg2000-riscv-xxx-ubuntu-emmc.zip 就是编译生成的emmc镜像压缩包,可用于usb或者sd刷入到emmc。

如果是编译sd镜像则是sophon-image-build/install/soc_sg2000_lubancat_riscv_ubuntu_sd/images/sg2000-riscv-xxx-ubuntu-sd.img 就是编译生成的sd镜像包,可用于balenaEtcher工具刷入sd卡启动系统。

2.5.6. 使用野火提供的根文件系统镜像构建Ubuntu系统镜像

  • 根据前面的操作配置编译环境并加载板卡对应的配置文件。

  • 将下载好的对应版本的根文件系统镜像压缩包解压到Ubuntu目录下。

  • 使用一键构建命令生成完整系统镜像。

以riscv核的ubuntu系统为例,下载资料网盘/7-SDK源码压缩包/根文件系统-用于编译镜像使用/riscv/ubuntu-rootfs.7z,放到sdk的ubuntu目录下。

提示

构建脚本会判断ubuntu目录下是否存在ubuntu-rootfs.ext4从而判断是否需要重新构建文件系统。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#初始化编译环境,输入当前用户的密码
source build/cvisetup.sh

#加载板级配置文件
defconfig sg2000_lubancat_riscv_ubuntu_emmc

#清除之前编译输出
clean_all

#进入ubuntu目录
cd ubuntu

#将网盘下载的ubuntu-rootfs.7z放到ubuntu,进行解压
7z x ubuntu-rootfs.7z

#返回sdk顶层目录
cd ..

#一键构建完整镜像
build_all
../../_images/lubancat_sdk_1.jpg

2.6. LubanCat-SDK单独构建模块

在进行固件开发时,一键构建就显得过于耗时了,每一个改动都清空全部编译重新编译打包的话, 这无疑是巨大的时间浪费。此时我们 编译一次系统镜像后 就可以使用SDK单个模块构建的功能,然后直接打包。

2.6.1. 初始化环境

首先,还是要选择SDK初始化编译环境以及加载板级配置文件,这里以riscv核ubuntu系统emmc存储介质为例

1
2
3
4
5
6
7
8
#初始化编译环境,输入当前用户的密码
source build/cvisetup.sh

#加载板级配置文件
defconfig sg2000_lubancat_riscv_ubuntu_emmc

#预先构建一次镜像
build_all

2.6.2. U-Boot构建

1
2
3
4
5
#清除uboot编译输出
clean_uboot

#构建uboot
build_uboot

构建生成的uboot在install/soc_sg200x_xxx/fw_payload_uboot.elf

2.6.3. Kernel构建

1
2
3
4
5
#清除kernel编译输出
clean_kernel

#构建kernel
build_kernel

构建生成的镜像包在install/soc_sg200x_xxx/boot.xx (kernel+dtb)

2.6.4. middleware构建

1
2
3
4
5
#清除编译输出
clean_middleware

#编译middleware
build_middleware

2.6.5. rootfs构建

LubanCat主要支持Ubuntu、buildroot两种rootfs, 不同rootfs的构建过程不同,这里分开说明。

2.6.5.1. Ubuntu

注意前面需要选择的是Ubuntu板级文件。

1
2
3
4
5
6
7
8
#删除之前编译的文件系统
rm ubuntu/ubuntu-rootfs.ext4

#清除编译输出
clean_rootfs

#编译并打包文件系统
pack_rootfs

构建生成的rootfs镜像为ubuntu/ubuntu-rootfs.ext4,同时被拷贝到install/soc_sg200x_xxx/rawimages/rootfs.emmc

注意

只有不存在ubuntu/ubuntu-rootfs.ext4时,才会重新构建Ubuntu根文件系统。如果我们要重新构建ubuntu-rootfs.ext4,需要先手动删除。

提示

由于构建不同版本的rootfs很容易遇到环境依赖问题,推荐不需要重新构建Ubuntu根文件系统的用户直接下载我们提供的定制根文件系统镜像或使用Docker构建,详情请查看ubuntu根文件系统构建独立章节

2.6.5.2. buildroot

注意前面需要选择的是buildroot板级文件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#进入buildroot目录
cd buildroot

#清除之前的编译输出
make clean

#返回SDK顶层目录
cd ..

#编译并打包文件系统
pack_rootfs

2.6.6. 镜像打包

镜像打包区分emmc镜像和sd镜像,两者的分区方式不一样,emmc使用内核的cmdline partition方式管理分区,而sd使用gpt分区表方式。

1
2
3
4
5
#如果是emmc镜像包
pack_upgrade

#如果是sd镜像包
pack_burn_image
  • emmc镜像包生成在install/soc_sg200x_lubancat_xxx_emmc/sg2000-xxx-xxx-xxx-emmc.zip

  • sd镜像包生成在install/soc_sg200x_lubancat_xxx_sd/images/sg2000-xxx-xxx-xxx-sd.img

2.7. SDK 配置文件说明

如果说build/cvisetup.sh脚本是肌肉,完成SDK各部分的构建工作,那SDK的配置文件则是大脑,控制着肌肉的运作方式。

虽然看起来SDK的配置文件条目繁多,但在使用中,需要我们去修改的并不多。

这里以sg2000_lubancat_riscv_ubuntu_sd配置文件为例,其他板卡的配置文件也类似

对应的板级文件目录为:sophon-image-build/build/boards/sg200x/sg2000_lubancat_riscv_ubuntu_sd

目录结构如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
sg2000_lubancat_riscv_ubuntu_sd
├── config.json     //描述芯片和板卡信息文件
├── dts_riscv
│   └── sg2000_lubancat_riscv_ubuntu_sd.dts   //uboot和内核的设备树
├── linux
│   └── sg2000_lubancat_riscv_ubuntu_sd_defconfig  //内核配置文件
├── memmap.py   //内存分配
├── partition
│   └── partition_sd.xml  //分区配置,名称、大小等
├── rootfs_script
│   └── clean_rootfs.sh  //文件系统需要清除的文件,只有原始的squashfs会使用
├── sg2000_lubancat_riscv_ubuntu_sd_defconfig   //板级配置文件
└── u-boot
    ├── cvi_board_init.c    //引脚复用配置
    ├── cvitek.h    //gpio控制器定义
    └── sg2000_lubancat_riscv_ubuntu_sd_defconfig   //uboot配置文件

2.7.1. 板级配置文件

以上面的sg2000_lubancat_riscv_ubuntu_sd/sg2000_lubancat_riscv_ubuntu_sd_defconfig文件为例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CONFIG_CHIP_sg2000=y  //指定使用sg2000芯片的配置。
CONFIG_BOARD_lubancat_riscv_ubuntu_sd=y  //指定使用lubancat_riscv_ubuntu_sd开发板的配置。
CONFIG_DDR_CFG_ddr3_1866_x16=y  //ddr内存配置
CONFIG_ARCH="riscv"    //指定使用RISC-V架构
CONFIG_CROSS_COMPILE="riscv64-unknown-linux-musl-"  //交叉编译工具链前缀。
CONFIG_CC_OPTIMIZE_FOR_SIZE=y   //指定编译器优化为大小优化。
CONFIG_KERNEL_ENTRY_HACK=y //启用内核入口地址的修改
CONFIG_KERNEL_ENTRY_HACK_ADDR="0x80200000"  //指定内核入口地址为0x80200000。
CONFIG_TOOLCHAIN_MUSL_RISCV64=y //指定使用musl工具链来编译RISC-V 64位程序
CONFIG_FLASH_SIZE_SHRINK=y  //启用闪存大小的缩减。
CONFIG_BOOT_IMAGE_SINGLE_DTB=y  //指定启动镜像使用单一的设备树二进制文件。
CONFIG_STORAGE_TYPE_sd=y    //指定存储类型为SD卡。
CONFIG_MIPI_PANEL_ZCT2133V1=y   //指定使用MIPI接口的ZCT2133V1屏幕。
CONFIG_SENSOR_GCORE_GC4653=y    //指定使用GC4653传感器。
CONFIG_UBOOT_2021_10=y  //指定使用2021年10月版本的U-Boot引导加载程序。
CONFIG_KERNEL_SRC_5.10=y    //指定内核源码版本为5.10。
CONFIG_KERNEL_UNCOMPRESSED=y    //指定内核未经压缩。
# CONFIG_SKIP_RAMDISK is not set
CONFIG_SENSOR_TUNING_PARAM_cv181x_src_gcore_gc4653=y
# CONFIG_ROOTFS_OVERLAYFS is not set
CONFIG_ENABLE_FREERTOS=y    //启用FreeRTOS实时操作系统。
# CONFIG_TARGET_PACKAGE_GATORD is not set
CONFIG_UBUNTU_FS=y  //指定使用ubuntu根文件系统
CONFIG_CP_EXT_WIRELESS=y    //启动wifi编译
CONFIG_CP_EXT_EBF_WIFI=y    //编译ebf wifi

相关配置可打开menuconfig图形化界面修改或者添加,其他配置文件将在后续对应章节讲解。