SG200x SDK开发环境准备

1. SG200x SDK软件包

1.1 概述

SG200x SDK支持Linux、FreeRTOs两个系统,适用于SG200x系列芯片及搭载了此芯片的所有开发板产品。软件包及相关代码将全部开源在官方GitHub平台上,具体获取及使用方法,请参考后续章节。

1.2 SDK工程目录介绍

  • build: 编译目录,存放编译脚本和板级配置
  • buildroot-2021.05: buildroot 开源工具
  • host-tools: 工具链
  • freertos: freertos 系统
  • fsbl: fsbl 启动固件
  • isp_tuning: 图像效果调试参数存放路径
  • linux_5.10: 开源 Linux 内核
  • middleware: 自研多媒体框架,包含 so 与 ko
  • opensbi: 开源 opensbi 库
  • osdrv: 驱动程序
  • oss: 第三方库
  • ramdisk: 存放最小文件系统的预编译目录
  • u-boot-2021.10: 开源 uboot 代码
  • install: 执行一次完整编译后,镜像的存放路径

2. SDK开发环境搭建

本节主要介绍如何在本地搭建SG200x软件所需编译环境。当前SDK只支持在Linux环境下编译,并提供Linux下的编译工具链。

2.1 Linux服务器

开发者可选择使用:

  • Ubuntu OS计算机
  • Windows OS计算机 + 准备Ubuntu环境

以上两种方式,推荐安装Ubuntu 22.04 LTS以上系统版本进行编译。

2.1.1.1 安装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 sophgo

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

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

启动samba server sudo service smbd restart

WINDOW PC端连接到Samba server,然后参考2.2 安装编译依赖即可进行编译。

2.1.2 于docker安装Ubuntu

  • 安装好docker后,在命令行中输入docker pull ubuntu:22.04,即可拉取ubuntu22.04的镜像
  • 使用docker images,查看拉取到的镜像
  • 输入docker run -it ubuntu:22.04 /bin/bash,即可创建并运行一个容器,当终端中出现root@<string>:/#时,则表示容器创建完成且已经进入容器,其中,string是容器的id,即containerId;

若需要退出在容器内退出容器,输入exit即可,若需要在容器外再次进入容器,则在终端中依次输入docker start <containerId>docker attach <containerId>即可。(更多指令可参考docker官方教程)

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.2 安装编译依赖

在准备好的Linux环境下,编译 SDK 环境搭建所依赖的软件包安装命令如下:

sudo apt update
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
  • 注意:cmake 最低版本要求为 3.16.5,请检查您的版本,若不满足 SDK 的最低版本要求,请手动安装最新版本。若编译遇到报错,可以视报错信息,安装对应的软件包。
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 命令可查看其版本号。

3. SDK安装准备工作

3.1 Git配置

在拉取仓库前,请配置自己的Git信息,以防碰到hook检查的报错:

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

设置git的全局postBuffer为一个足够大的值,以免在拉取仓库时出现EOF错误。

git config --global http.postBuffer 2147483648

3.2 SDK获取

3.2.1 自动化脚本拉取

  • 本 SDK 仓库采用自动化脚本的方式管理子仓库,在拉取 SDK 时请使用如下的命令:
git clone https://github.com/sophgo/sophpi.git -b sg200x-evb
cd sophpi
./scripts/repo_clone.sh --gitclone scripts/subtree.xml

脚本默认使用SSH拉取子仓库,请确保您已经添加密钥到您的Github账户中,否则将碰到SSH认证失败的报错。 相关方法请参考文档:新增 SSH 密钥到 GitHub 帐户

或者,您可以使用HTTPS URL来克隆仓库,将scritps/repo_clone.sh脚本中SSH部分 REMOTE_URL=$(grep -o '<remote.*/>' ${dir} | sed 's/.*fetch="\([^"]*\)".*/\1/' | sed "s/ssh:\/\/\(.*\)/ssh:\/\/$USERNAME@\1/") 修改为 REMOTE_URL=$(grep -o '<remote.*/>' ${dir} | sed 's/.*fetch="\([^"]*\)".*/\1/' | sed "s/git@\(.*\):/https:\/\/\1\//") 即可。

在修改脚本后,请对照SDK工程目录章节,确保是否成功克隆了所有的子仓库。如果您的GitHub账户启用了2FA,可能需要额外使用Personal Access Token来代替密码进行认。在这种情况下,Git 会提示你输入用户名和密码,你的用户名就是你的 GitHub 用户名,密码则是你的 PAT。

3.2.2 分别拉取子仓库

如果您无法使用自动化脚本的方式拉取代码,也可以使用如下命令分别拉取各个子仓库:

mkdir sophpi -p && cd sophpi
git clone https://github.com/sophgo/host-tools.git
git clone https://github.com/sophgo/build -b sg200x-dev
git clone https://github.com/sophgo/freertos -b sg200x-dev
git clone https://github.com/sophgo/FreeRTOS-Kernel -b sg200x-dev freertos/Source
git clone https://github.com/sophgo/Lab-Project-FreeRTOS-POSIX -b sg200x-dev freertos/Source/FreeRTOS-Plus-POSIX
git clone https://github.com/sophgo/fsbl -b sg200x-dev
git clone https://github.com/sophgo/isp_tuning -b sg200x-dev
git clone https://github.com/sophgo/linux_5.10 -b sg200x-dev
git clone https://github.com/sophgo/middleware -b sg200x-dev
git clone https://github.com/sophgo/SensorSupportList middleware/v2/component/isp
git clone https://github.com/sophgo/opensbi -b sg200x-dev
git clone https://github.com/sophgo/osdrv -b sg200x-dev
git clone https://github.com/sophgo/oss
git clone https://github.com/sophgo/ramdisk -b sg200x-dev
git clone https://github.com/sophgo/u-boot-2021.10 -b sg200x-dev
git clone https://github.com/sophgo/buildroot-2021.05.git

之后按照即可按照正常程序获取 SDK 并编译。

3.3 SDK更新

  1. 如果您按照自动化脚本的方式获取sophpi SDK, 可以通过命令: ./scripts/repo_clone.sh --gitpull scripts/subtree.xml 来统一对子仓库进行更新。
  2. 如果您分别拉取的子仓库,可以通过以下示例脚本来对所有仓库进行管理更新:

#!/bin/bash repos_dir=“./” for dir in “$repos_dir”/*; do if [ -d “$dir” ]; then cd “$dir” || exit if [ -d “.git” ]; then echo “Updating $(basename “$dir”)” git pull else echo “$(basename “$dir”) is not a Git repository, skipping…” fi cd - > /dev/null || exit fi done

并通过以下命令来给予此脚本执行权限: chmod +x yourscript.sh

3.4 SDK问题反馈

如果您对仓库有任何的疑问或者反馈,请通过邮箱联系:

4. SDK编译

SDK基于操作系统可分为ARM和RISC-V两种版本。用户可以根据需求对应选择配置进行编译使用。

4.1 环境变量说明

编译前置动作最主要是为了设置两个环境变量:$CHIP, $BOARD, $CHIP 变量是需要根据用户的 SOC 来做设置。 $BOARD 变数是针对每张 EVB, 有不同的驱动,必须要正确设置。 注:BOARD可以直接看 EVB 上镭射型号得知。

4.2 配置软件包

  • 首先切换到 SDK 的根目录
  • 设定环境变量前需要先透过下列命令初始化环境,系统会列出目前SDK支持的IC以及EVB版号:
source build/envsetup_soc.sh
  • 会出现以下的提示:
  -------------------------------------------------------------------------------------------------------
    Usage:
    (1) menuconfig - Use menu to configure your board.
        ex: $ menuconfig

    (2) defconfig $CHIP_ARCH - List EVB boards($BOARD) by CHIP_ARCH.
       ** cv181x ** -> ['cv181x', 'cv1811h', 'cv1811c', 'cv1810c', 'cv1810h', 'cv1812cp', 'cv1812h', 'cv1813h', 'sg2000', 'sg2002']
       ** cv180x ** -> ['cv180x', 'cv1800b', 'cv1800c', 'cv1801b', 'cv1801c', 'cv180zb']
        ex: $ defconfig cv181x

    (3) defconfig $BOARD - Choose EVB board settings.
        ex: $ defconfig cv1813h_wevb_0007a_spinor
        ex: $ defconfig cv1812cp_wevb_0006a_spinor
  -------------------------------------------------------------------------------------------------------

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

4.2.1 通过defconfig设定(一键选定)

  • 根据以上的提示,输入 defconfig cv181x,就会列出当前支持的开发板列表:
* cv181x * the avaliable cvitek EVB boards
 cv1811h - cv1811h_wevb_0007a_emmc [C906B + EMMC 512MB + BGA SIP 128MB]
           cv1811h_wevb_0007a_spinand [C906B + SPINAND 256MB + BGA SIP 128MB]
           cv1811h_wevb_0007a_spinor [C906B + SPINOR 16MB + BGA SIP 128MB]
 cv1811c - cv1811c_wdmb_0006a_spinor [C906B + SPINOR 16MB + BGA SIP 128MB]
           cv1811c_wevb_0006a_emmc [C906B + EMMC 8192MB + BGA SIP 128MB]
           cv1811c_wevb_0006a_spinand [C906B + SPINAND 256MB + BGA SIP 128MB]
           cv1811c_wevb_0006a_spinor [C906B + SPINOR 16MB + BGA SIP 128MB]
 cv1810c - cv1810c_wdmb_0006a_spinor [C906B + SPINOR 8MB + QFN SIP 64MB]
           cv1810c_wevb_0006a_spinand [C906B + SPINAND 256MB + BGA SIP 128MB]
           cv1810c_wevb_0006a_spinor [C906B + SPINOR 16MB + QFN SIP 64MB]
 cv1810h - cv1810h_wevb_0007a_spinor [C906B + SPINOR 8MB + BGA SIP 64MB]
cv1812cp - cv1812cp_sophpi_duo_sd [C906B + EMMC 8192MB + BGA SIP 256MB]
           cv1812cp_wevb_0006a_emmc [C906B + EMMC 8192MB + BGA SIP 256MB]
           cv1812cp_wevb_0006a_spinand [C906B + SPINAND 256MB + BGA SIP 256MB]
           cv1812cp_wevb_0006a_spinor [C906B + SPINOR 16MB + QFN SIP 256MB]
 cv1812h - cv1812h_wevb_0007a_emmc [C906B + EMMC 512MB + BGA SIP 256MB]
           cv1812h_wevb_0007a_emmc_huashan [C906B + EMMC 512MB + BGA SIP 256MB]
           cv1812h_wevb_0007a_spinand [C906B + SPINAND 256MB + BGA SIP 128MB]
           cv1812h_wevb_0007a_spinand_huashan [C906B + SPINAND 256MB + BGA SIP 128MB]
           cv1812h_wevb_0007a_spinor [C906B + SPINOR 16MB + BGA SIP 256MB]
           cv1812h_wevb_0007a_spinor_huashan [C906B + SPINOR 16MB + BGA SIP 256MB]
 cv1813h - cv1813h_wevb_0007a_emmc [C906B + EMMC 512MB + BGA SIP 256MB]
           cv1813h_wevb_0007a_spinand [C906B + SPINAND 256MB + BGA SIP 128MB]
           cv1813h_wevb_0007a_spinor [C906B + SPINOR 16MB + BGA SIP 256MB]
  sg2000 - sg2000_wevb_arm64_sd [CA53 + SPINOR 16MB + BGA SIP 128MB]
           sg2000_wevb_riscv64_sd [C906B + EMMC 8192MB + DDR 512MB]
  sg2002 - sg2002_wevb_arm64_sd [CA53 + SPINOR 16MB + BGA SIP 128MB]
           sg2002_wevb_riscv64_sd [C906B + EMMC 8192MB + DDR 256MB]

再次输入对应的开发板型号及所需的架构即可完成SDK编译组态的一键选定,如defconfig sg2000_wevb_riscv64_sd

4.2.2 通过menuconfig设定 (单独配置)

  • 输入menuconfig进入以下页面,即可选择各种SDK内部设定,包含CHIP,EVB板号等。
(Top)
                          CViTek MediaSDK Configuration
(generic) Customer define
    Chip selection (sg2002)  --->
    Board selection (duo_sd (C906B + EMMC 512MB + BGA SIP 256MB))  --->
    DDR configuration selection (ddr3_1866_x16)  --->
(riscv) Arch define
    Compile-time checks and compiler options  --->
    SDK options  --->
    FIP setting  --->
    Storage settings  --->
    Sensor settings  --->
    Panel settings  --->
    uboot options  --->
    Kernel options  --->
    ROOTFS options  --->
    Turnkey options  --->
    RTOS options  --->
    Rootfs packages  --->


[Space/Enter] Toggle/enter  [ESC] Leave menu           [S] Save
[O] Load                    [?] Symbol info            [/] Jump to symbol
[F] Toggle show-help mode   [C] Toggle show-name mode  [A] Toggle show-all mode
[Q] Quit (prompts for save) [D] Save minimal config (advanced)

按照下方提示,配置过程可以通过[Enter] [Space] [ESC] 等进行进入/设置/返回的动作 配置完毕后, 按下[S]储存配置文件, 接着按下[Q]离开图形化接口 (或者按下 ESC, 会自动弹出是否需要储存的图形)

  • 选择芯片:进入Chip selection,对应选择芯片型号
  • 切换架构:进入Arch define, 输入对应架构riscv或者arm即可切换
  • RNDIS设置:进入Rtoofs packages, 勾选rndis script库,则可以通过RNDIS驱动连接电脑

4.3 编译完整SDK文档

完成以上编译组态的设定后,输入 clean_all && build_all 开始自动编译,编译成功后即可在install目录下看到可用于烧录的upgrade.zip压缩包。 若继续执行pack_burn_image即可直接生成镜像sophpi-duo-XXX.img。若编译出现问题,请检查是否有文件缺失,重新拉取相应仓库,并重新按步骤编译。

clean_all && build_all
pack_burn_image

4.4 编译部分SDK文档

4.4.1 U-boot单独编译

每个EVB板会在特定位置定义进入U-Boot之前,EVB需要采取的初始化动作或是定义特定PINMUX,路径在 ./build/boards/sg200x/$CHIP_$BOARD/u-boot/cvi_board_init.c, 其对应的u-boot组态,路径在: ./build/boards/sg200x/$CHIP_$BOARD/u-boot/$CHIP_$BOARD _defconfig

以图形化接口修改Uboot Config $ menuconfig_uboot, 退出后会把设定储存在: ./u-boot-2021.10/build/"$CHIP"_"$BOARD"/.config

进入工程根目录,执行编译 $ build_uboot 完成后会在instal路径下生成flip.bin

4.4.2 Kernel单独编译

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

每张EVB都有对应的dts档案来定义其device tree,路径在: ./build/boards/sg200x/"$CHIP"_"$BOARD"/dts_riscv/"$CHIP"_"$BOARD".dts

其相对应的linux组态,路径在: ./build/boards/sg200x/"$CHIP"_"$BOARD"/linux/"$CHIP"_"$BOARD"_defconfig

以图形化接口修改Kernel Config $ menuconfig_kernel,退出后会把设定储存在: ./linux/build/"$CHIP"_"$BOARD"/.config

进入工程根目录,执行编译 $ build_kernel 完成后会在instal路径下生成boot.sd

4.4.3 Middleware单独编译

进入工程根目录,执行编译: $ build_middleware; pack_rootfs

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

4.5.分区档案修改

分区档案放置于build/boards/<CHIP>/<EVB_Name>/partition/partion_<physical_partition>.xml 例如,sg2002_duo_sd的分区档案,陈列如下:

<physical_partition type=“sd”> </physical_partition>

  • physical_partition type:flash 种类。
  • partition label: 分区名称。
  • size_in_kb:分区大小。
  • file:所指向的image file名称。
  • type:(在partition label栏位中) 文件系统格式。
  • mountpoint:分区挂载路径。