开发环境搭建


修订记录

版本
描述
日期
1.0
  • Initial release
  • 04/16/2024

    1. 开发环境

    1.1. 开发环境说明

    由于嵌入式单板的资源有限,不能在单板上运行开发和调试工具,通常需要交叉编译调试的方式进行开发和调试,即“宿主机+目标板”的形式。一般情况下宿主机和目标板的处理器架构不相同。宿主机需要建立适合于目标板的交叉编译环境。程序在宿主机上经过“编译-连接-定位”得到可执行文件。将可执行文件烧写到目标板中,然后在目标板上运行,下面以一种典型的开发环境为例进行说明。

    开发环境通常包括 Linux服务器、Windows工作台和EVB(目标板),三者处于同一个网络中,如图1-1所示

    目标板上的Bootloader(IPL+uboot)启动后,目标板中的操作信息通过串口输出到宿主机上显示。在宿主机上的控制台中输入命令,可以控制目标机。

    在Linux服务器上建立交叉编译环境,Windows 工作台通过串口与EVB 单板连接,开发人员可以在Windows工作台中进行程序开发或者远程登录到Linux服务器进行程序开发。各部分具体软件介绍如表1-1所示

    图1-1 嵌入式开发图示

    表1-1 开发环境部分软件描述

    操作平台 操作系统 软件描述
    Windows工作台 Windows XP/7/10 putty(或Xshell/SecureCRT等)、tftp服务器(tftpd32)、SStar ISP工具(Flash_Tool_xxx.exe)
    Linux服务器 Ubuntu或CentOS。建议使用Ubuntu 18.04及以上版本的完全安装。 NFS、telnetd、samba、vim、arm 交叉编译环境(Gcc 版本11.1.0)等。其他应用软件根据具体开发需要而定,通常系统都已默认安装,只要适当配置即可。
    EVB SStar Linux Linux内核基于Linux标准内核5.10.117版包移植开发,跟文件系统基于busybox 1.20.2版本制作而成。含telnetd等Linux常用命令。

    1.2. 搭建开发环境

    推荐用户使用64 位Linux 服务器,本开发包在32 位Linux 服务器、较老版本的Linux服务器、偏冷门的Linux 服务器上可能存在未知的兼容性问题。 推荐的硬件配置如下:

    • CPU Intel(R) Xeon(R) CPU E5-2450 0 @ 2.10GHz 或更好CPU
    • DDR: >= 16GB
    • Hard disk >= 600GB
    • Gigabit Ethernet
    • OS: Ubuntu 18.04 64bit

    或者 使用相同配置的虚拟机。

    1.2.1 发布包使用的Linux Server 版本

    cat /proc/version

    Linux version 4.15.0-112-generic (buildd@lcy01-amd64-027) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #113-Ubuntu SMP Thu Jul 9 23:41:39 UTC 2020
    

    lsb_release -a

    LSB Version: core-9.20170808ubuntu1-noarch:printing-9.20170808ubuntu1-noarch:security-9.20170808ubuntu1-noarch
    Distributor ID: Ubuntu
    Description: Ubuntu 18.04.5 LTS
    Release: 18.04
    Codename: bionic
    

    1.2.2. 网络环境搭建

    请用户自行配置,并安装nfs、samba、ssh等网络组件。

    1.2.3. 软件包安装

    sudo apt-get install libc6-dev-i386 lib32z1 lib32ncurses5 libuuid1 cmake libncurses5-dev libncursesw5-dev bc xz-utils automake libtool libevdev-dev pkg-config mtd-utils android-tools-fsutils bison flex libssl-dev libmpc-dev squashfs-tools gawk

    1.2.4. 安装交叉编译工具链

    发布包提供了工具链:

    gcc-10.2.1-20250126-linaro-glibc-x86_64_aarch64-linux-gnu.tar.xz

    gcc-10.2.1-20250126-linaro-glibc-x86_64_arm-linux-gnueabihf.tar.xz

    arm-unknown-linux-gcc-12.4.0-uclibc-1.0.46-gnueabihf.tar.xz

    aarch64-unknown-linux-gcc-12.4.0-glibc-2.37-gnu.tar.xz

    arm-unknown-linux-gcc-12.4.0-glibc-2.37-gnueabihf.tar.xz

    安装步骤如下:

    step1. 新建工具目录:

    sudo mkdir -p /tools/toolchain 或者 sudo mkdir -p /opt/sstar(本文以/tools/toolchain为例)
    

    step2. 解压安装:

    sudo tar -xvf ./gcc-10.2.1-20250126-linaro-glibc-x86_64_aarch64-linux-gnu.tar.xz -C /tools/toolchain
    sudo tar -xvf ./gcc-10.2.1-20250126-linaro-glibc-x86_64_arm-linux-gnueabihf.tar.xz -C /tools/toolchain
    sudo tar -xvf ./arm-unknown-linux-gcc-12.4.0-uclibc-1.0.46-gnueabihf.tar.xz -C /tools/toolchain
    sudo tar -xvf ./aarch64-unknown-linux-gcc-12.4.0-glibc-2.37-gnu.tar.xz -C /tools/toolchain
    sudo tar -xvf ./arm-unknown-linux-gcc-12.4.0-glibc-2.37-gnueabihf.tar.xz -C /tools/toolchain
    

    step3. 可直接在每次编译时export 或 直接添加到/etc/profile~/.bashrc等启动脚本位置

    例:export PATH=${PATH}:/tools/toolchain/gcc-10.2.1-20250126-linaro-glibc-x86_64_aarch64-linux-gnu/bin

    1.3. 其他配置

    1.3.1. 默认shell配置

    编译脚本默认使用的是bash,要求系统的默认shell为bash,可通过ls -la /bin/sh命令来确认。以最常用的Ubuntu为例,高版本的Ubuntu默认shell为dash,修改方式如下:

    # ls -la /bin/sh
    lrwxrwxrwx 1 root root 4 Jun 15 08:49 /bin/sh -> dash
    
    # sudo dpkg-reconfigure dash
    #在弹出的界面选择<NO>
    
    # ls -la /bin/sh
    lrwxrwxrwx 1 root root 4 Jun 15 08:49 /bin/sh -> bash
    

    1.3.2. 设置默认python版本为python2.x

    python2与python3的语义有差别,SDK编译脚本使用的是python2的语义,因此需要将系统默认python版本设置为python2.x,修改方式请参考网络上的相关文档,比如使用update-alternatives工具来配置。

    注意:mksquashfs ubuntu自带有,若没有,再根据提示安装即可。

    如果使用低版本的Ubuntu,如在Ubuntu 16.04上建议进行更新源的操作,具体操作请参考网络上的相关文档,若不更新可能会导致后续的编译错误。


    2. 编译

    以本芯片支持的SPI NAND/NOR/EMMC启动方式为例。各种启动方式在SDK中通过不同的配置文件来实现,并且脚本打包成可烧录的image。

    2.1. glibc Toolchain配置

    如果有开riscv linux编译,需要配置riscv的toolchain

    ARM32(Kernel5.1):
    export PATH=/tools/toolchain/riscv_gcc/bin/:/tools/toolchain/gcc-10.2.1-20250126-linaro-glibc-x86_64_arm-linux-gnueabihf/bin:$PATH
    export CROSS_COMPILE=arm-linux-gnueabihf-
    export ARCH=arm
    
    ARM64(Kernel5.1):
    export PATH=/tools/toolchain/riscv_gcc/bin/:/tools/toolchain/gcc-10.2.1-20250126-linaro-glibc-x86_64_aarch64-linux-gnu/bin:$PATH
    export CROSS_COMPILE=aarch64-linux-gnu-
    export ARCH=arm64
    
    ARM32(Kernel6.1):
    export PATH=/tools/toolchain/riscv_gcc/bin/:/tools/toolchain/arm-unknown-linux-gcc-12.4.0-uclibc-1.0.46-gnueabihf/bin:$PATH
    export CROSS_COMPILE=arm-unknown-linux-uclibcgnueabihf-12.4.0-
    export ARCH=arm
    
    ARM32(Kernel6.1):
    export PATH=/tools/toolchain/riscv_gcc/bin/:/tools/toolchain/arm-unknown-linux-gcc-12.4.0-glibc-2.37-gnueabihf/bin:$PATH
    export CROSS_COMPILE=arm-unknown-linux-gnueabihf-12.4.0-
    export ARCH=arm
    
    ARM64(Kernel6.1):
    export PATH=/tools/toolchain/riscv_gcc/bin/:/tools/toolchain/aarch64-unknown-linux-gcc-12.4.0-glibc-2.37-gnu/bin:$PATH
    export CROSS_COMPILE=aarch64-unknown-linux-gnu-12.4.0-
    export ARCH=arm64
    

    2.2. 解压SDK

    tar zxvf project-xxx.tar.gz
    tar zxvf boot-xxx.tar.gz
    tar zxvf kernel-xxx.tar.gz
    tar zxvf sdk-xxx.tar.gz
    tar zxvf optee-xxx.tar.gz
    

    boot-xxx.tar.gz: Uboot源码

    kernel-xxx.tar.gz: kernel源码

    project-xxx.tar.gz:编译制作image的部分,包含非开源部分的lib/ko,以及对外api头文件参考

    sdk-xxx.tar.gz:测试Demo/应用打包框架部分

    optee-xxx.tar.gz:optee源码(并非每个项目都有,视实际项目支持情况)

    2.3. project编译

    2.3.1 Deconfig重要字段说明

    公版deconfig是针对公版的EVB board (SSM) / Demo board (SSZ) 硬件,客户端实际的板子请根据实际差异做好适配

    2.3.2 编译选项说明

    进入前面解压出来的project目录:cd project/

    a、根据Boot_Type选择对应的config

    其中glibc-10.2.1-arm/glibc-12.4.0-arm/uclibc-12.4.0-arm为32bit Linux toolchain,glibc-10.2.1/glibc-12.4.0为64bit Linux toolchain

    Kernel 5.1的project参考Defconfig:

    Chip Packaging_Flash_Mem Defconfig
    SSU9383CM/SSD2353 BGA14_EMMC_ExDDR_ARM64 dispcam_pcupid.emmc.glibc-10.2.1-squashfs.ssz001a.1024.dual_sensor.bga_ddr4_riscv_defconfig
    SSU9383CM/SSD2353 BGA14_NAND_ExDDR_ARM64 dispcam_pcupid.emmc.glibc-10.2.1-squashfs.ssm001a.1024.dual_sensor.ab.bga_ddr4_riscv_defconfig
    SSU9383CM/SSD2353 BGA14_NAND_ExDDR_ARM64 dispcam_pcupid.spinand.glibc-10.2.1-squashfs.ssm001a.1024.bga_ddr4_riscv_defconfig
    SSU9383CM/SSD2353 BGA14_NAND_ExDDR_ARM32 dispcam_pcupid.spinand.glibc-10.2.1-arm-squashfs.ssm001a.1024.bga_ddr4_optee_defconfig
    SSU9353Q BGA12_EMMC_InDDR_ARM64 dispcam_pcupid.emmc.glibc-10.2.1-squashfs.ssm001b.256.bga_ddr3_riscv_defconfig
    SSU9353Q BGA12_NAND_InDDR_ARM64 dispcam_pcupid.spinand.glibc-10.2.1-squashfs.ssm001b.256.dual_sensor.bga_ddr3_riscv_defconfig
    SSU9353Q BGA12_NAND_InDDR_ARM32 dispcam_pcupid.spinand.glibc-10.2.1-arm-squashfs.ssm001b.256.dual_sensor.bga_ddr3_riscv_defconfig

    Kernel 6.1的project参考Defconfig:

    Chip Packaging_Flash_Mem Defconfig
    SSU9383CM/SSD2353 BGA14_NAND_ExDDR_ARM64 dispcam_pcupid.emmc.glibc-12.4.0-squashfs.ssz001a.1024.dual_sensor.bga_ddr4_riscv_defconfig
    SSU9383CM/SSD2353 BGA14_EMMC_ExDDR_ARM32 dispcam_pcupid.emmc.glibc-12.4.0-arm-squashfs.ssz001a.1024.dual_sensor.bga_ddr4_riscv_defconfig
    SSD2351D QFN128_NAND_InDDR_ARM32 dispcam_pcupid.emmc.glibc-12.4.0-arm-squashfs.ssm001c.128.qfn128_ddr3_defconfig
    SSD2351D QFN128_NAND_InDDR_ARM32 dispcam_pcupid.spinand.uclibc-12.4.0-arm-squashfs.ssm001c.128.voip.qfn128_ddr3_defconfig
    SSD2351D QFN128_NAND_InDDR_ARM32 dispcam_pcupid.spinand.glibc-12.4.0-arm-squashfs.ssm001c.128.voip.qfn128_ddr3_defconfig
    SSD2351D QFN128_NAND_InDDR_ARM32 dispcam_pcupid.spinand.glibc-12.4.0-arm-squashfs.ssm001c.128.voip.qfn128_ddr3_optee_defconfig
    SSD2351D QFN128_NAND_InDDR_ARM32 dispcam_pcupid.spinand.glibc-12.4.0-arm-squashfs.ssz001c.128.voip.qfn128_ddr3_defconfig

    b、clean并编译

    make clean;make image -j8
    

    c、例如:选择Emmc Flash的情况下则执行以下命令全编即可

    make dispcam_pcupid.emmc.glibc-10.2.1-squashfs.ssm001a.1024.dual_sensor.bga_ddr4_riscv_defconfig
    make clean;make image -j8;
    

    编译完成后生成的images在project/image/output/images,默认生成的images是用于TFTP烧录,烧录方法请参考《软件烧录说明》第2.3. Tftp烧录(网口烧录)章节。

    若要生成USB升级档,继续在当前目录执行以下命令

    ./image/makefiletools/script/make_usb_factory_sigmastar.sh -f
    

    命令执行完会在project/image/output/images生成SstarUsbImage_xxxx(date).bin,烧录方式请参考《软件烧录说明》第2.1. USB Device烧录章节。

    注意:

    • 首次编译请务必在project下执行make clean;make image -j8命令完整编译(包含整编boot/kernel)

    • 为增加调试效率,除首次编译外,后续debug可以直接在project下编译对应修改模块然后重新快速打包即可,例如:

      仅编译kernel:make linux-kernel_clean;make linux-kernel -j8

      仅编译boot: make boot_clean;make boot -j8

      仅快速打包sdk image:make image-fast-nocheck -j8


    2.4. boot编译

    project下SDK编译已经添加boot编译选项,因此建议boot修改之后,直接在project下编译使用make boot编译boot,编译后不需要手动release到project下的路径,直接重新打包project即可。

    2.5. kernel编译

    project下SDK编译已经添加kernel编译选项,因此建议kernel修改之后,直接在project下编译使用make linux-kernel编译kernel,编译后不需要手动release到project下的路径,直接重新打包project即可。

    3. FAQ

    3.1. boot单独编译

    解压boot-xxx.tar.gz后进入boot目录:cd boot/

    a、根据Flash_Type选择对应的config

    Boot Type Other System Defconfig
    SPI_NAND BGA14 64bit pcupid_ssm001a_s01a_spinand_arm64_defconfig
    EMMC BGA14 64bit pcupid_ssm001a_s01a_emmc_arm64_defconfig
    SPI_NOR BGA14 64bit pcupid_ssm001a_s01a_arm64_defconfig
    SPI_NAND BGA12 64bit pcupid_ssm001b_s01a_spinand_arm64_defconfig
    SPI_NOR BGA12 64bit pcupid_ssm001b_s01a_arm64_defconfig
    EMMC BGA12 64bit pcupid_ssm001b_s01a_emmc_arm64_defconfig
    SPI_NAND QFN128 64bit pcupid_ssm001c_s01a_spinand_arm64_defconfig
    EMMC QFN128 64bit pcupid_ssm001c_s01a_emmc_arm64_defconfig
    SPI_NOR QFN128 64bit pcupid_ssm001c_s01a_arm64_defconfig
    SPI_NAND QFN128 32bit pcupid_ssm001c_s01a_spinand_defconfig
    EMMC QFN128 32bit pcupid_ssm001c_s01a_emmc_defconfig
    SPI_NOR QFN128 32bit pcupid_ssm001c_s01a_defconfig

    b、clean并编译 make clean;make -j8

    c、例如:选择Nand Flash的情况下则执行以下命令编译boot即可

    make pcupid_ssm001a_s01a_spinand_arm64_defconfig;
    make clean;make -j8;
    

    编译生成的文件在/boot当前目录下。

    注意:在boot目录下单独编译需要先将生成image手动release到project对应目录之后打包才行

    Nand Flash Nor Flash Emmc
    u-boot_spinand.xz.img.bin u-boot.xz.img.bin u-boot_emmc.xz.img.bin
    project/board/uboot/u-boot.xz.img.bin project/board/uboot/u-boot.xz.img.bin project/board/uboot/u-boot.xz.img.bin

    3.2. kernel单独编译

    解压kernel-xxx.tar.gz后进入kernel目录:cd kernel/

    a、根据Flash_Type选择对应的config

    Chip Packaging Memory Flash Type Toolchain System Defconfig
    SSU9383CM/SSD2353 BGA14 External SPI_NAND glibc 64bit pcupid_ssm001a_s01a_spinand_defconfig
    SSU9383CM/SSD2353 BGA14 External SPI_NOR glibc 64bit pcupid_ssm001a_s01a_defconfig
    SSU9383CM/SSD2353 BGA14 External EMMC glibc 64bit pcupid_ssm001a_s01a_emmc_dual_sensor_defconfig
    SSU9353Q BGA12 Internal SPI_NAND glibc 64bit pcupid_ssm001b_s01a_spinand_defconfig/pcupid_ssm001b_s01a_spinand_dual_sensor_defconfig
    SSU9353Q BGA12 Internal SPI_NOR glibc 64bit pcupid_ssm001b_s01a_emmc_defconfig
    SSU9353Q BGA12 Internal EMMC glibc 64bit pcupid_ssm001b_s01a_defconfig
    SSD2351D QFN128 Internal SPI_NAND glibc 64bit pcupid_ssm001c_s01a_spinand_voip_defconfig
    SSD2351D QFN128 Internal SPI_NOR glibc 64bit pcupid_ssm001c_s01a_defconfig
    SSD2351D QFN128 Internal EMMC glibc 64bit pcupid_ssm001c_s01a_emmc_defconfig
    SSD2351D QFN128 Internal SPI_NAND glibc 32bit pcupid_ssm001c_s01a_spinand_voip_defconfig
    SSD2351D QFN128 Internal SPI_NOR glibc 32bit pcupid_ssm001c_s01a_defconfig
    SSD2351D QFN128 Internal EMMC glibc 32bit pcupid_ssm001c_s01a_emmc_defconfig

    b、clean并编译

    make clean;make -j8
    

    c、例如:选择Emmc Flash的情况下则执行以下命令编译kernel即可

    make pcupid_ssm001a_s01a_emmc_dual_sensor_defconfig;
    make clean;make image -j8;
    

    注意:project中打包是直接软链接指向的kernel目录,所以kernel不需要再手动release,直接做project打包动作即可

    如果kernel 有新增kernel modules需要将相应的module添加到kernel_mod_list/kernel_mod_list_late(kernel_mod_list_late里的ko会在mi module之后装载)

    修改路径:project/kbuild/customize/$(KERNEL_VERSION)/$(CHIP)/dispcam/kernel_mod_list