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,并加以命名
规划8GB记忆体供VM使用。
预留200GB硬盘空间,供后续存放SDK用。
2.1.2. Ubuntu 开机设定¶
第一次开机需要挂载安装光盘ISO挡案
开始安装
设定VirtualBox Host-only Ethernet Adapter以便Host与VirtualBox沟通(终端服务以及档案分享)
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>)
参考 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为范例。
抓下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
退出后会把设定储存在:
./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
退出后会把设定储存在:
./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分区为双系统特有分区,仅在双系统环境下存在