2. 建构CVITEK软件编译环境

2.1. Linux 服务器

开发者可选择使用:

  • Ubuntu OS计算机

  • Windows OS计算机 + Virtualbox VM (上面运行Ubuntu)

两种方式,都请安装成Ubuntu 20.04 LTS版本。

Virtualbox VM 下载网址: https://www.virtualbox.org/wiki/Downloads

Ubuntu 20.04 LTS下载网址: https://releases.ubuntu.com/20.04/ubuntu-20.04.2.0-desktop-amd64.iso

2.1.1. 于VirtualBoxVM安装Ubuntu

  • 建立新的VM,并加以命名

_images/image1.png
  • 规划8GB记忆体供VM使用。

_images/image2.png
  • 预留200GB硬盘空间,供后续存放SDK用。

_images/image3.png

2.1.2. Ubuntu 开机设定

  • 第一次开机需要挂载安装光盘ISO挡案

_images/image4.png
  • 开始安装

_images/image5.png
  • 设定VirtualBox Host-only Ethernet Adapter以便Host与VirtualBox沟通(终端服务以及档案分享)

_images/image6.png

2.1.3. 安装SSH Server

SSH Server安装

sudo apt-get install ssh
sudo apt-get install openssh-server

安装后可以修改一些 ssh 的设定, 如port, 密码认证, root登入等

vim /etc/ssh/sshd_config

Port 22

PasswordAuthentication yes

PermitRootLogin yes -> 是否开放 root 登入

修改后要重启SSH

/etc/init.d/ssh restart

2.1.4. 安装Samba Server

Ubuntu VB需要安装Samba套件,方便后续Host PC与其做档案分享。

安装Samba前,先用ifconfig获取IP 资讯,第一次安装会发现没有net-tool支持,需要安装net-tool

sudo apt install net-tools
sudo apt-get install samba samba-common

建立账号的samba 密码

sudo smbpasswd -a cvitek

修改/etc/samba/smb.conf,增加以下的内容

[cvitek]
path = /home/cvitek
writable = yes
browseable= yes
valid users = cvitek

启动samba server

sudo service smbd restart

WINDOW PC端连接Samba server (<Server IP>)

_images/image7.png

参考 2.2. 安装CVITEK Build Environment即可进行编译。

2.2. 建构编译环境

在编译SDK之前,Ubuntu需要安装以下套件:

sudo apt-get update
sudo apt-get install -y build-essential
sudo apt-get install -y ninja-build
sudo apt-get install -y automake
sudo apt-get install -y autoconf
sudo apt-get install -y libtool
sudo apt-get install -y wget
sudo apt-get install -y curl
sudo apt-get install -y git
sudo apt-get install -y gcc
sudo apt-get install -y libssl-dev
sudo apt-get install -y bc
sudo apt-get install -y slib
sudo apt-get install -y squashfs-tools
sudo apt-get install -y android-sdk-libsparse-utils
sudo apt-get install -y android-sdk-ext4-utils
sudo apt-get install -y jq
sudo apt-get install -y cmake
sudo apt-get install -y python3-distutils
sudo apt-get install -y tclsh
sudo apt-get install -y scons
sudo apt-get install -y parallel
sudo apt-get install -y ssh-client
sudo apt-get install -y tree
sudo apt-get install -y python3-dev
sudo apt-get install -y python3-pip
sudo apt-get install -y device-tree-compiler
sudo apt-get install -y libssl-dev
sudo apt-get install -y ssh
sudo apt-get install -y cpio
sudo apt-get install -y squashfs-tools
sudo apt-get install -y fakeroot
sudo apt-get install -y libncurses5
sudo apt-get install -y flex
sudo apt-get install -y bison

2.3. 下载SDK

通常SDK会放置于客户专用FTP,/home/SDK/cv18xx_t(SDK_Version)底下,此处以SDK V 4.0.0为范例。

_images/image8.png

抓下t4.0.0_source.tar.gz后解开

$ tar zxvf t4.0.0 source.tar.gz

抓下host-tool.tar.gz后于SDK 工作目录解开

$ cd cv180x_t4.0.0_source
$ tar zxvf host-tools.tar.gz

2.4. 编译

2.4.1. 环境变量说明

编译前置动作最主要是为了设置两个环境变量:$CHIP, $BOARD,

$CHIP 变量是需要根据用户的 SOC 来做设置。

$BOARD 变数是针对每张 EVB, 有不同的驱动,必须要正确设置。

例如:

$BOARD=wevb_0008a_spinor: 是 SPINOR+DDR2 1333 64 MB 硬件组合

$BOARD=wevb_0009a_spinand: 是 SPINAND+DDR3 1866 128MB硬件组合

注:wevb_0008a / wevb_0009a 可以直接看 EVB 上雷射型号得知。

2.4.2. 编译整个软件包

设定环境变量前需要先透过下列命令初始化环境,系统会列出目前SDK支持的IC以及EVB版号.

$ 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.
     ** cv183x ** -> ['cv1829', 'cv1832', 'cv1835', 'cv1838', 'cv9520', 'cv7581']
    ** cv182x ** -> ['cv1820', 'cv1821', 'cv1822', 'cv1823', 'cv1825', 'cv1826', 'cv7327', 'cv7357']
    ** cv181x ** -> ['cv181x', 'cv1823a', 'cv1821a', 'cv1820a', 'cv1811h', 'cv1811c', 'cv1810c', 'cv1812h']
    ** cv180x ** -> ['cv180x', 'cv1800b', 'cv1800c', 'cv1801b', 'cv1801c']
     ex: $ defconfig cv183x    (3) defconfig $BOARD - Choose EVB board settings.
     ex: $ defconfig cv1835_wevb_0002a
     ex: $ defconfig cv1826_wevb_0005a_spinand
     ex: $ defconfig cv180x_fpga_c906
-----------------------------------------------------------------------

初始化之后,可以下列两种方式进行编译组态设定

2.4.2.1. 透过 defconfig设定

选取IC : 以cv180x为例,系统会打印出cv180x内建支持的EVB($CHIP_$BOARD)板。

$ defconfig cv180x
* cv180x * the avaliable cvitek EVB boards
  cv180x - cv180x_fpga [FPGA]
           cv180x_palladium [PALLADIUM]
  cv1800b - cv1800b_wdmb_0008a_spinor [C906B + SPINOR 8MB + QFN SIP 64MB]
            cv1800b_wevb_0008a_spinor [C906B + SPINOR 16MB + QFN SIP 64MB]
  cv1800c - cv1800c_wevb_0009a_spinor [C906B + SPINOR 16MB + QFN SIP 64MB]
  cv1801b - cv1801b_wevb_0008a_spinor [C906B + SPINOR 16MB + QFN SIP 128MB]
  cv1801c - cv1801c_wdmb_0009a_spinor [C906B + SPINOR 16MB + QFN SIP 128MB]
            cv1801c_wevb_0009a_spinand [C906B + SPINAND 256MB + QFN SIP 128MB]
            cv1801c_wevb_0009a_spinor [C906B + SPINOR 16MB + QFN SIP 128MB]
            cv1812h_wevb_0007a_spinor [C906B + SPINOR 16MB + BGA SIP 256MB]

选取EVB版号为cv1801c_wevb_0009a_spinor,此时系统会列出自动设定好的环境变数。(后续亦可用 cvi_print_env来打印目前使用的环境变数)

$ defconfig cv1801c_wevb_0009a_spinor

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

PROJECT: cv1801c_wevb_0009a_spinor, DDR_CFG=ddr3_1866_x16
CHIP_ARCH: CV180X, 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: 0
Flash layout xml: build/boards/cv180x/cv1801c_wevb_0009a_spinor/part
ition/partition_spinor.xml
Sensor tuning bin: gcore_gc4653
Output path: install/soc_cv1801c_wevb_0009a_spinor

2.4.3. 编译完整SDK文档

执行编译,会得到可用于烧录的images。

cvitek@cvitek-VirtualBox:~/working_dir$ build_all
. Run build_uboot () function
...
/work/install/cv1801c_wevb_0009a_spinor/upgrade.zip done!

编译出的挡案会放置于./install/soc_<EVB Name>/ 之下fip.bin

2.4.4. 编译部份SDK文档

2.4.4.1. 单独编译Uboot

每个EVB板会在特定位置定义进入U-Boot之前,EVB需要采取的初始化动作或是定义特定PINMUX。以cv1801c_wevb_0009a_spinor这张板子为例,会定义在:

build/boards/mars/$CHIP_$BOARD/u-boot/cvi_board_init.c

int cvi_board_init(void)
{
#if defined(CV180X_QFN_88_PIN)
    PINMUX_CONFIG(PAD_MIPI_TXP1, IIC2_SCL);
    PINMUX_CONFIG(PAD_MIPI_TXM1,IIC2_SDA);
    PINMUX_CONFIG(PAD_MIPI_TXP0, XGPIOC_13);
    PINMUX_CONFIG(PAD_MIPI_TXM0, CAM_MCLK1);
#elif defined(CV180X_QFN_88_PIN_38)
    return 0;
}

其对应的u-boot 组态,定义在:

./build/boards/mars/$CHIP_$BOARD/u-boot/$CHIP_$BOARD_defconfig

Partial cvitek_cv1801c_wevb_0009a_spinor_defconfig
CONFIG_RISCV=y
CONFIG_SYS_MALLOC_F_LEN=0x2000
CONFIG_NR_DRAM_BANKS=1
CONFIG_DEFAULT_DEVICE_TREE="cv180x_asic"
CONFIG_IDENT_STRING=" cvitek_cv180x"
...

以图形化接口修改Uboot Config

_images/image16.png

退出后会把设定储存在:

./u-boot/build/"$CHIP"_"$BOARD"/.config

执行编译

$ build_uboot

完成后会生成 fip.bin

Makefile中编译U-Boot的片段。

u-boot-build: ${UBOOT_PATH}/${UBOOT_OUTPUT_FOLDER} ${UBOOT_CVIPART_DEP}
${UBOOT_OUTPUT_CONFIG_PATH}
   $(call print_target)
   ${Q}rm -f ${UBOOT_CVI_BOARD_INIT_PATH}
   ${Q}ln -s ${BUILD_PATH}/boards/${PROJECT_FULLNAME}/u-boot/cvi_board_init.c
${UBOOT_CVI_BOARD_INIT_PATH}
   ${Q}$(MAKE) -j${NPROC} -C ${UBOOT_PATH} olddefconfig
   ${Q}$(MAKE) -j${NPROC} -C ${UBOOT_PATH} all
   $(call uboot_compress_action)

2.4.4.2. 单独编译kernel

修改 kernel (ex: *.dts, 内核), 重新编译 Linux kernel image。

每张EVB都有对应的dts档案来定义其device tree,以cv1801c_wevb_0009a_spinor为例,其DTS档案定义在 :

./build/boards/cv180x/"$CHIP"_"$BOARD"/dts_riscv/"$CHIP"_"$BOARD".dts

#/dts-v1/;
#include "cv180x_base_riscv.dtsi"
#include "cv180x_asic_qfn.dtsi"
#include "cv180x_asic_spinor.dtsi"
#include "cv180x_default_memmap.dtsi"
/ {
};

其相对应的linux 组态,定义在:

./build/boards/"$CHIP"_"$BOARD"/linux/"$CHIP"_"$BOARD"_defconfig

Partial cv1801c_wevb_0009a_spinor
CONFIG_SYSVIPC=y
CONFIG_POSIX_MQUEUE=y
CONFIG_NO_HZ_IDLE=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_PREEMPT=y
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_LOG_BUF_SHIFT=15
CONFIG_BLK_DEV_INITRD=y
...

以图形化接口修改Kernel Config

$ menuconfig_kernel
_images/image17.png

退出后会把设定储存在:

./linux/build/"$CHIP"_"$BOARD"/.config

$ build_kernel

完成后会生成 boot.spinor

Makefile中编译Kernel的片段。

kernel-build: ${KERNEL_OUTPUT_CONFIG_PATH}
   $(call print_target)
   ${Q}echo LOCALVERSION=${LOCALVERSION}
   ${Q}$(MAKE) -j${NPROC} -C ${KERNEL_PATH}O=${KERNEL_PATH}/${KERNEL_OUTPUT_FOLDER}
olddefconfig
   ${Q}$(MAKE) -j${NPROC} -C ${KERNEL_PATH}/${KERNEL_OUTPUT_FOLDER}Image modules
   ${Q}$(MAKE) -j${NPROC} -C ${KERNEL_PATH}/${KERNEL_OUTPUT_FOLDER}modules_install
headers_installINSTALL_HDR_PATH=${KERNEL_PATH}/${KERNEL_OUTPUT_FOLDER}/$(ARCH)/usr
   ${Q} ln -sf ${KERNEL_PATH}/${KERNEL_OUTPUT_FOLDER}/$(ARCH)/usr/include
${KERNEL_PATH}/${KERNEL_OUTPUT_FOLDER}/usr/include

2.4.4.3. 单独编译middleware

修改 middleware (cvi_test / sample_dsi), 重新编译 middleware 及 system

生成的 Install/PROJECT_NAME/system.* 包含最新的 middleware

$ build_middleware; pack_rootfs

编译Middleare的shell script 片段

pushd "$MW_PATH"/component/isp
make all
popd

pushd "$MW_PATH"/sample
make all

build_middleware 会针对Sensor driver(位于middleware/component/isp/ 下)以及sample application(位于middleware/sample/下)重新编译,末了pack_rootfs会将变更后的driver以及application包装成可烧录映像档。

2.5. 区间划分

Mars SDK 会生成以下的image file,每个挡案代表不同的分区, 分列如下:

  • FIP : Bootloader/U-Boot 分区

  • CV180X/ CV181X C906 采用FSBL+OPENSBI+UBOOT 架构,最后打包后也复用(FIP)檔名,方便后续使用。

  • 2nd(双系统) : Yun on Processor (YOC) 所在分区

  • BOOT : Partition for Linux Kernel 分区

  • MISC : Boot Logo 分区

  • ROOTFS : root file system 分区

  • SYSTEM: CVITEK libraries所在分区

  • DATA : 使用这资料分区

注:2nd分区为双系统特有分区,仅在双系统环境下存在

2.5.1. 分区挡案修改

相同的开发板可能会上不同的Flash,SDK会以不同的板号作区隔。比如说cv1811c_wdmb_0006a_spinand 与cv1811c_wdmb_0006a_spinor分别代表在开发板上的Flash各为SPINAND及SPINOR,分区档案分别置于

./build/boards/<CHIP>/<EVB_Name>/partition/partition_<physical_partition>.xml

Note:physical_partition 支持SPINAND/SPINOR。

例如cv1811c_wdmb_0006a_spinor的分区档案,陈列如下:

单系统环境下:

build/boards/cv181x/cv1811c_wdmb_0006a_spinor/partition/partition_spinor.xml
<physical_partition type="spinor">
   <partition label="fip" size_in_kb="800" readonly="false" file="fip.bin"/>
   <partition label="BOOT" size_in_kb="2600" readonly="false" file="boot.spinor"/>
   <partition label="ENV" size_in_kb="64" file="" />
   <partition label="ROOTFS" size_in_kb="4000" readonly="false" file="rootfs.spinor" />
   <partition label="DATA"  size_in_kb="512" readonly="false" file="data.spinor" mountpoint="/mnt/data" type="jffs2" />
</physical_partition>

双系统环境下:

build/boards/cv181x/cv1811c_wdmb_0006a_spinor/partition/partition_spinor.xml
<physical_partition type="spinor">
   <partition label="fip" size_in_kb="512" readonly="false" file="fip.bin"/>
   <partition label="2nd" size_in_kb="3072" readonly="false" file="yoc.bin"/>
   <partition label="BOOT" size_in_kb="5120" readonly="false" file="boot.spinor"/>
   <partition label="MISC" size_in_kb="128" readonly="false" file="logo.jpg"/>
   <partition label="PARAM" size_in_kb="64" file="" />
   <partition label="PARAM_BAK" size_in_kb="64" file="" />
   <partition label="ENV" size_in_kb="64" file="" />
   <partition label="ENV_BAK" size_in_kb="64" file="" />
   <partition label="ROOTFS" size_in_kb="3392" readonly="false" file="rootfs.spinor" />
   <partition label="DATA"  size_in_kb="1024" readonly="false" file="data.spinor" mountpoint="/mnt/data" type="jffs2" />
</physical_partition>
  • physical_partiti type:flash 种类。

  • partition label: 分区名称。

  • size_in_kb:分区大小(以KB为单位) 。

  • file:所指向的image file名称。

  • type:(在partition label栏位中) 文件系统格式。

  • mountpoint:分区挂载路径。

注:2nd分区为双系统特有分区,仅在双系统环境下存在