开发环境搭建
修订记录¶
版本 | 描述 |
日期 |
---|---|---|
1.0 | 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