SSU_编译打包介绍
1. 工程目录介绍¶
1.1. 关键词¶
(1) MI:Sigmastar SDK middle interface缩写,泛指SDK整个模块;
(2) MI_XXX:指MI下对应得xxx模块,如MI_SYS对应MI下sys模块;
(3) KERNEL VERSION:kernel使用版本,SSU9383使用的是5.10.61版本;
(4) TOOLCHAIN_VERSION:编译工具链使用的版本号,这里使用的是6.4.0;
(5) PRODUCT:ipc / nvr / xvr / cardv / dispcam / usbcam / ipc-rtos /usbcam-rtos;
(6) RAMFS:linux系统下基于ram的文件系统,会额外占用内存资源,优点是加载速度很快。
(7) FWFS:一种单线程文件系统,可用于uboot和kernel下配置PQ及Panel参数
1.2. 目录结构¶
2. 编译¶
2.1. toolchain¶
toolchain版本为6.4.0,安装好toolchain后,输入在终端服务器上输入以下环境变量:
export PATH=/tools/toolchain/gcc-6.4.0-20220722-sigmastar-glibc-x86_64_arm-linux-gnueabihf/bin:$PATH
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm
2.2. 工程编译¶
2.2.1. 编译目录和config介绍¶
编译目录为project,编译脚本为project下的Makefile,编译配置脚本在/project/configs/defconfigs,编译配置脚本目录如下:
红框为该平台的两个编译配置脚本,以dispcam_p5.spinand.glibc-6.4.0-squashfs.028A.512bga_demo_defconfig为例;
dispcam代表产品线;
spinand代表spinand flash启动;
glibc代表c库使用的是glibc;
6.4.0代表toolchain版本号;
squashfs代表rootfs的文件系统类型;
2.2.2. 编译执行命令¶
(1)cd procject; make dispcam_p5.spinand.glibc-6.4.0-squashfs.028A.512bga_demo_defconfig;
执行完之后会在/project/configs目录下会重新生成current.configs;current.configs里能找到uboot,kernel编译的config文件和编译文件信息,sdk编译脚本,rootfs制作脚本等参数信息;
(2)工程编译分为整包编译,单独编译kernel,单独编译sdk,单独编译打包三种方式;具体执行指令如下所示:
(3)编译打包完成在/project/image/output/images会生成相应bin文件,各文件介绍如下图所示:
3. 分区介绍¶
3.1. 分区基本介绍¶
编译完成后系统分区表保存在/project/image/output/images/partition文件中;
以Nand flash分区为例,编译分区制作完成后如下:
BOOT0: 0x140000(CIS),0x60000(IPL),0x60000(IPL_CUST),0x100000(UBOOT) BOOT1: 0x60000(IPL),0x60000(IPL_CUST),0x100000(UBOOT) BOOT MERGE: IPL IPL_CUST UBOOT SYS: 0x40000(ENV),0x500000(KERNEL),0x500000(RECOVERY),0x600000(rootfs),0x100000(MISC),-(ubia) FLASH HAS USED 0x8000000KB ChkSum : 7136 Magic : SSTARSEMICIS0001 Checksum ok!! IDX: StartBlk: BlkCnt: Trunk/BkTrunk: Group: Active: BBM: Name: 0: 0,(0000000000) 10,(0X00140000) 0/1 0 1 OFF CIS 1: 10,(0X00140000) 3,(0X00060000) 0/1 1 1 OFF IPL 2: 13,(0X001A0000) 3,(0X00060000) 0/1 1 1 OFF IPL_CUST 3: 16,(0X00200000) 8,(0X00100000) 0/1 1 1 OFF UBOOT 4: 24,(0X00300000) 3,(0X00060000) 1/0 2 0 OFF IPL 5: 27,(0X00360000) 3,(0X00060000) 1/0 2 0 OFF IPL_CUST 6: 30,(0X003C0000) 8,(0X00100000) 1/0 2 0 OFF UBOOT 7: 38,(0X004C0000) 2,(0X00040000) 0/0 0 1 OFF ENV 8: 40,(0X00500000) 40,(0X00500000) 0/0 0 1 OFF KERNEL 9: 80,(0X00A00000) 40,(0X00500000) 0/0 0 1 OFF RECOVERY 10: 120,(0X00F00000) 48,(0X00600000) 0/0 0 1 OFF rootfs 11: 168,(0X01500000) 8,(0X00100000) 0/0 0 1 OFF MISC 12: 176,(0X01600000) 848,(0X06A00000) 0/0 0 1 OFF ubia
以Nor flash分区为例,编译分区制作完成后如下:
BOOT0: 0x8000(IPL),0x6000(CIS),0xe000(IPL_CUST),0x40000(UBOOT),0x1000@0x5F000(ENV) BOOT MERGE: IPL CIS IPL_CUST UBOOT SYS: 0x2E0000(KERNEL),0x2F0000(rootfs),0x50000(MISC),0x3D0000(miservice),0x5B0000(customer) FLASH HAS USED 0x1000000KB ChkSum : 7011 Magic : SSTARSEMICIS0001 Checksum ok!! IDX: StartBlk: BlkCnt: Trunk/BkTrunk: Group: Active: BBM: Name: 0: 0,(0000000000) 0,(0X00008000) 0/0 1 1 OFF IPL 1: 0,(0X00008000) 0,(0X00006000) 0/0 1 1 OFF CIS 2: 0,(0X0000E000) 0,(0X0000E000) 0/0 1 1 OFF IPL_CUST 3: 1,(0X0001C000) 4,(0X00040000) 0/0 1 1 OFF UBOOT 4: 5,(0X0005F000) 0,(0X00001000) 0/0 0 1 OFF ENV 5: 6,(0X00060000) 46,(0X002E0000) 0/0 0 1 OFF KERNEL 6: 52,(0X00340000) 47,(0X002F0000) 0/0 0 1 OFF rootfs 7: 99,(0X00630000) 5,(0X00050000) 0/0 0 1 OFF MISC 8: 104,(0X00680000) 61,(0X003D0000) 0/0 0 1 OFF miservice 9: 165,(0X00A50000) 91,(0X005B0000) 0/0 0 1 OFF customer
(1)CIS:
spinand flash保存在flash 0地址的位置,一部分是spinand info,保存spinand的基本信息,例如block page count、block count等,简称SNI,这些信息会根据flash的种类而改变; 另一部分是partinifo,保存分区信息,简称PNI,这些信息都是给rom code读取的,rom code通过读取正确的spinand参数和分区信息, 获取IPL的位置从而运行整个系统。
(2)IPL:
CPU上电后首先运行的是rom code,顾名思义代码保存在特殊的ROM中,且只读。ROM code运行完后会找到IPL的位置,然后开始解析IPL,IPL主要功能是做一些基础的硬件初始化,例如设定 当前DDR参数,以及GPIO/IIC相关等。
(3)IPL_CUST:
IPL初始化共有的硬件模块,IPL_CUST中会根据当前板子的实际情况初始化客制化板子硬件的可执行的二进制文件,例如客制化的GPIO管脚,IIC配置。
(4)UBOOT:
UBOOT的二进制文件存放分区;
(5)ENV:
UBOOT的环境变量存放分区;
(6)KERNEL:
KERNEL的二进制文件存放分区;
(7)rootfs:
根目录文件系统存在分区;
(8)MISC:
存放一些系统配置脚本的分区,一般为littlefs的文件系统,其中包含bootlogo、屏参等相关init配置文件和一些资源文件;
(9)ubia:
UBI的内容在上图分区表中不会显示出来,UBI中会创建多个ubifs格式的子分区,如MISERVICE分区,Customer分区,用户可以根据需要自行创建,能做一些客制化的应用;
3.1. 分区制作流程¶
3.1.1. 分区变更前注意事项¶
无论是spi-nor flash上的分区,还是spi-nand flash上的分区。都可归为两类:
(1)不建议改动的boot;
(2)可以变动的sys;
本章介绍的分区变更都是在sys部分上,包括如何配置脚本变更分区顺序,如何打包分区,如何生成烧录脚本,若用户有一套打包和烧录的流程,请忽略本章。
3.1.2. 脚本配置介绍¶
分区变更分为分区制作、打包和分区烧录脚本制作这两部分。如下图所示:
(1)xxx.partition.config:
脚本所在位置:project/image/configs/general/
分区配置信息的总脚本,所有与分区调整相关的代码都在这个config文件中实现,这个config文件会有很多份,每个不同的chip、spinand分区还是spinor分区都会有各自的分区config文件。
(2)分区打包脚本:
脚本所在位置:project/image/configs/general/
rootfs.mk:根文件系统打包脚本;
misc.mk:misc分区打包脚本;
miservice.mk:miservice分区打包脚本;
customer.mk:customer分区打包脚本;
(3)特殊分区:
KERNEL、uboot、IPL、logo、cis等分区属于特殊分区,这些分区没有特别的文件系统,所以无法在Makefile脚本中做集中处理,必须by case去处理。因此添加一个特殊的分区要了解以下步骤。 以kernel分区为例:
image.mk中需要写上分区打包的脚本命令
kernel_nofsimage: @echo [[$@]] cp -rvf $($(patsubst %_nofsimage,%,$@)$(RESOUCE)) (IMAGEDIR)/$(patsubst %_nofsimage,%,$@)
script.mk中写上分区烧录脚本生成的命令:
kernel_$(FLASH_TYPE)__script: @echo "# <- this is for comment / total file size must be less than 4KB" > $(SCRIPTDIR)/[[kernel.es @echo tftp $(TFTPDOWNLOADADDR) kernel >> $(SCRIPTDIR)/[[kernel.es @echo $(FLASH_PROBE) >> $(SCRIPTDIR)/[[kernel.es @echo $(FLASH_ERASE_PART) KERNEL >> $(SCRIPTDIR)/[[kernel.es @echo $(FLASH_WRITE_PART) $(TFTPDOWNLOADADDR) KERNEL \$${filesize} >> $(SCRIPTDIR)/[[kernel.es @echo "% <- this is end of file symbol" >> $(SCRIPTDIR)/[[kernel.es @echo kernel-image done!!!
3.1.3. 增加修改删除分区举例¶
(1)customer分区举例说明:
customer$(RESOURCE) = $(OUTPUTDIR)/customer customer$(FSTYPE) = ubifs customer$(UBIVOLID) = 1 customer$(PATSIZE) = 0x35C0000 customer$(MOUNTTG) = /customer customer$(MOUNTPT) = ubi0:customer customer$(OPTIONS) = ubia customer$(OTABLK) = /dev/ubi0_1
customer$(RESOURCE):
需要打包的源文件所在文件夹,这个文件夹中的内容由customer.mk脚本填充。
customer$(FSTYPE):
打包的文件系统类型。
customer$(PATSIZE):
分区大小。
customer(MOUNTTG)、customer(MOUNTPT)、customer$(OPTIONS):
分区在板子起来后需要mount的路径以及参数。rootfs.mk中会处理这些参数。
customer$(OTABLK):
用于OTA升级打包所需的升级设备节点的路径。
(2)修改:
若要修改分区,一般是修改文件系统和分区大小。
当修改文件大小后,要认真核对所有分区的大小累加起来有没有超过flash的size。可以partition_layout.txt中查看分是否有溢出。
(3)增加分区:
aaa$(RESOUCE) = $(OUTPUTDIR)/aaa aaa$(FSTYPE) = jffs2 aaa$(PATSIZE) = 0x6B0000 aaa$(MOUNTTG) = /aaa aaa$(MOUNTPT) = mtd:aaa aaa$(OPTIONS) = rw aaa$(OTABLK) = /dev/mtdblockX
1.假设增加一个分区名为aaa,然后配置其大小等信息:
2.分区相关的变量配置完成之后,在cis$(SYSTAB) = ”xxx”中指定其放置的位置。
3.在变量“IMAGE_LIST”后追加“aaa”。
4.在表示需要mount的节点的变量“USR_MOUNT_BLOCKS”后追加“aaa”。
5.在分区打包前需要在脚本中添加往$(OUTPUT)/aaa拷贝文件的逻辑
(4)删除分区:
按照增加分区的操作,反过来执行。
(5)烧录脚本:
系统在script.mk中会根据分区的配置自动生成。
(6)增加修改删除squashfs分区:
Squashfs的分区变更与jiffs2分区变更大同小异,主要在xxx$(FSTYPE)上有不同,除去rootfs这个比较特别的分区之外,miservice分区制作成squashfs:
miservice$(RESOUCE) = $(OUTPUTDIR)/tvconfig/config miservice$(FSTYPE) = squashfs miservice$(PATSIZE) = 0x180000 miservice$(MOUNTTG) = /config miservice$(MOUNTPT) = /dev/mtdblock3 miservice$(OPTIONS) = ro
与jiffs2分区一样,系统在script.mk中会根据分区的配置自动生成烧录脚本。
(7)增加修改删除ubifs分区:
UBIFS分区一般应用在spinand上作为可读写的分区文件系统。
UBIFS的所有的分区都属于UBI的mtd block中的一个子分区。一个普通的UBI分区变量设置如下:
miservice$(RESOUCE) = $(OUTPUTDIR)/miservice/config miservice$(FSTYPE) = ubifs miservice$(PATSIZE) = 0xA00000 miservice$(MOUNTTG) = /config miservice$(MOUNTPT) = ubi0:miservice miservice$(OPTIONS) = rw
与jiffs2分区变更方法不同的是,ubifs分区不需要添加mtdpart讯息,也就是无需在cis$(SYSTAB) = xxx中添加分区位置。