2. LubanCat-SDK¶
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
|
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图形化界面修改或者添加,其他配置文件将在后续对应章节讲解。