配置
配置文件说明
在build/device/horizon/j5series/下有gpt.conf配置文件
1:veeprom:none:34s:37s:1 1:reserved:none:38s:1023s:1 1:binfo1:none:1024s:2047s:1 1:binfo2:none:2048s:3071s:1 1:binfo3:none:3072s:4095s:1 1:sbl/${UBOOT_SPL_NAME}:none:4096s:4351s:1 1:sblbak0/${UBOOT_SPL_NAME}:none:4352s:4607s:1 1:sblbak1/${UBOOT_SPL_NAME}:none:4608s:4863s:1 1:sblbak2/${UBOOT_SPL_NAME}:none:4864s:5119s:1 1:ddrc_a/ddrc.img.bin:none:5120s:5631s:1 1:ddrc_b/ddrc.img.bin:none:5632s:6143s:1 1:ddrp_a/ddrp.img.bin:none:6144s:8447s:1 1:ddrp_b/ddrp.img.bin:none:8448s:10751s:1 1:uboot_a/${UBOOT_IMAGE_NAME}:none:10752s:14847s:1 1:uboot_b/${UBOOT_IMAGE_NAME}:none:14848s:18943s:1 1:bl31_a/${BL31_IMAGE_NAME}:none:18944s:20991s:1 1:bl31_b/${BL31_IMAGE_NAME}:none:20992s:23039s:1 1:mcore_a:none:23040s:23295s:1 1:mcore_b:none:23296s:23551s:1 1:misc:none:23552s:23807s:1 1:ubootenv:none:23808s:23815s:1 1:HB_APDP:none:23816s:24063s:1 1:veeprombak:none:24064s:25087s:1 1:vbmeta_a/${VBMETA_IMAGE_NAME}:none:25088s:25343s:1 1:vbmeta_b/${VBMETA_IMAGE_NAME}:none:25344s:25599s:1 1:boot_a/${BOOT_PART_IMAGE_NAME}:none:25600s:74751s:1 1:boot_b/${BOOT_PART_IMAGE_NAME}:none:74752s:123903s:1 1:system_a:ext4:123904s:1172479s:0 1:system_b:ext4:1172480s:2221055s:0 1:app_a:ext4:2221056s:8512511s:0 1:app_b:ext4:8512512s:14803967s:0 1:app_param:ext4:14803968s:15213567s:0 1:ota:ext4:15213568s:27796479s:0 1:log:ext4:27796480s:36185087s:0 1:backhaul:ext4:36185088s:46670847s:0 1:userdata:ext4:46670848s:61350911s:0 1:map:ext4:61350912s:122224606s:0
配置文件说明:
分区使能:分区名:分区文件系统格式:起始分区位置:结束分区位置
分区使能:表示这一行是否需要建立真正的分区表,1表示需要建立分区,0不需要建立。
分区名:分区表的名称,也是作为建立好后拷贝进分区的img名字。
分区文件系统格式:可以支持下面格式(ubuntu14.04)如果为none,则表示不需要建立文件系统,当前为仅支持ext4。
分区起始地址:分区起始地址一定要是512字节的整数倍,s代表的是emmc 的一个section 的缩写即512B。
分区结束地址:分区结束地址一定要是512字节的整数倍,s代表的是emmc 的一个section 的缩写即512B。
分区结束地址 - 分区起始地址 = 分区大小
禁止出现小数和负数
注意:起始位置和结束分区位置之间的大小计算方式为,结束分区位置-起始位置+1s。例如userdata这一行,61350911s - 46670848s + 1s = 14680064s。
分区表
序号 | 分区名 | 大小 | 文件系统 | 用途 |
1 | veeprom | 2K | none | 存储OTA标志 |
2 | reserved | 493K | none | 分区对齐使用 |
3 | binfo1 | 512K | none | 地平线启动标志 |
4 | binfo2 | 512K | none | 地平线启动标志 |
5 | binfo3 | 512K | none | 地平线启动标志 |
6 | sbl | 128K | none | 第二级bootloader |
7 | sblbak0 | 128K | none | 第二级bootloader |
8 | sblbak1 | 128K | none | 第二级bootloader |
9 | sblbak2 | 128K | none | 第二级bootloader |
10 | ddrc_a | 256K | none | ddr controller的配置代码 |
11 | ddrc_b | 256K | none | ddr controller的配置代码 |
12 | ddrp_a | 1152K | none | 是ddr controller的参数信息 |
13 | ddrp_b | 1152K | none | 是ddr controller的参数信息 |
14 | uboot_a | 2048K | none | uboot镜像 |
15 | uboot_b | 2048K | none | uboot镜像 |
16 | bl31_a | 1024K | none | Arm trusted environment firmware, 运行在EL3状态,处理security相关操作 |
17 | bl31_b | 1024K | none | Arm trusted environment firmware, 运行在EL3状态,处理security相关操作 |
18 | mcore_a | 128K | none | 签名后的mcore的镜像 |
19 | mcore_b | 128K | none | 签名后的mcore的镜像 |
20 | misc | 128K | none | 存储AB分区标志 |
21 | ubootenv | 4K | none | 存储uboot环境变量 |
22 | HB_APDP | 124K | none | 内部调试使用 |
23 | veeprombak | 512K | none | 存储IP和网关 |
24 | vbmeta_a | 128K | none | 用于系统AVB启动校验的签名镜像 |
25 | vbmeta_b | 128K | none | 用于系统AVB启动校验的签名镜像 |
26 | boot_a | 24M | none | kernel镜像(image+dtb)和rootfs |
27 | boot_b | 24M | none | kernel镜像(image+dtb)和rootfs |
28 | system_a | 512M | ext4 | 系统运行必要的库、命令等,rootfs 运行时被挂载到system目录,dm-verity 只读分区 |
29 | system_b | 512M | ext4 | 系统运行必要的库、 命令等,rootfs 运行时被挂载到system目录,dm-verity 只读分区 |
30 | app_a | 3072M | ext4 | app分区镜像,rootfs运行时被挂载到app目录,只读分区 |
31 | app_b | 3072M | ext4 | app分区镜像,rootfs运行时被挂载到app目录,只读分区 |
32 | app_param | 200M | ext4 | 存储app运行时的参数 |
33 | ota | 6144M | ext4 | 存储ota升级缓存包 |
34 | log | 4096M | ext4 | 存储日志文件 |
35 | backhaul | 5120M | ext4 | 数据回传功能分区,仅用于数据存放 |
36 | userdata | 7168M | ext4 | 存储用户数据 |
37 | map | other | ext4 | 存储地图相关数据,根据实际具体需求分配 |
文件系统配置表设置
文件系统配置表存放路径:
build/device/horizon/common/emmc.fstab
根据 建立Build环境 中build系统时自定义 fstab 文件可以设置你需要的文件系统配置,系统在启动的时候,会调用 mount –at 命令,完成对/etc/fstab 文件的解析,从而挂载设置的文件系统。
文件系统目录权限
序号 | 目录 | 权限 | 用途 |
1 | /system | 只读 | 系统system镜像 |
2 | /app | 只读 | 应用程序的镜像 |
3 | /map | 读写 | 存放地图相关数据 |
4 | /backhaul | 读写 | 存放回传相关数据 |
5 | /app_param | 读写 | 存放app运行参数 |
6 | /ota | 读写 | 存放ota升级包 |
7 | /log | 读写 | 存放日志文件 |
8 | /userdata | 读写 | 存放用户数据等 |
根文件系统内容修改
增减rootfs或system源文件
根文件系统路径:prebuilts/root_hijack/hobot/,想要增减根文件系统文件,需要两步操作:
user.name@hz-server-1:~/work/pull/platform_sdk$ ls prebuilts/root_hijack/hobot/ etc init.normal.rc init.rc init.recovery.rc lib sbin usr verity_key
1.在prebuilts/root_hijack/hobot/ 目录下增减相应的文件。
2.文件增加到rootfs,在build/device/horizon/j5/debug-rootfs.manifest中,增加-文件,在build/device/horizon/j5/debug-kernel-rootfs.manifest中,增加+文件。
文件增加到system,在build/device/horizon/j5/debug-rootfs.manifest中,不操作,在build/device/horizon/j5/debug-kernel-rootfs.manifest中,不操作。
示例:在rootfs中添加 /usr/bin/hdiffz 文件。首先确认在prebuilts/root_hijack/hobot/ 目录的usr/bin下已添加hdiffz 文件。在build/device/horizon/j5/debug-kernel-rootfs.manifest 中增加+/usr/bin/hdiffz,再在build/device/horizon/j5/debug-rootfs.manifest中增加-/usr/bin/hdiffz。最后重新编译。
Boardid与DTS映射关系
概述
board_id 是J5 dts中根节点下属性board_type 的值;board_type 属性顾名思义,它是为了区分不同J5板级差异的标记。当需要增加内核DTS与产品Boardid映射关系时,需要做后面小节的修改,以保证启动时能根据读取到的Boardid找到期望的DTB文件。
Boardid 的定义
程序中根据board_type决定使用哪一份dts 文件,各个dts 文件描述板级之间存在差异的J5 board。board_type 节点在J5 分为uboot 的部分与kernel 的部分。
uboot部分的board_type节点
文件:uboot/arch/arm/dts/hobot-j5.dtsi
board_type: board_type@adc1_5 { compatible = "hobot,adc-type"; adc_dev = &adc_sensor_0, &adc_sensor_1; adc_channel = <1 5>; board_type_array = <51 140 51 140 J5_MATRIXP1A_BOARD_ID 0 0 1 0 1 1 1 1 0>, <51 140 151 240 J5_MATRIXP1B_BOARD_ID 0 0 1 0 2 2 2 1 0>, <51 140 251 340 J5_MATRIXP1C_BOARD_ID 0 0 1 0 3 3 3 1 0>, <51 140 351 440 J5_MATRIXP1D_BOARD_ID 0 0 1 0 4 4 4 2 0>, <51 140 451 540 J5_MATRIXDUOA_BOARD_ID 1 0 3 1 1 1 1 0 1>, <51 140 551 640 J5_MATRIXDUOB_BOARD_ID 1 0 3 1 2 2 2 1 1>, <51 140 651 740 J5_V2_MATRIXDUOA_BOARD_ID 1 2 3 2 1 7 1 0 1>, <51 140 751 840 J5_V2_MATRIXDUOB_BOARD_ID 1 2 3 2 2 8 2 1 1>, <151 240 51 140 J5_MATRIXP2A_BOARD_ID 1 0 2 1 1 1 1 1 1>, <151 240 151 240 J5_MATRIXP2B_BOARD_ID 1 0 2 1 2 2 2 1 1>, <151 240 251 340 J5_MATRIXP2C_BOARD_ID 1 0 2 1 3 3 3 1 1>, <151 240 351 440 J5_MATRIXP2D_BOARD_ID 1 0 2 1 4 4 4 2 1>, <151 240 451 540 J5_MATRIXSOLO_BOARD_ID 1 2 4 1 1 7 1 0 1>, <151 240 551 640 J5_V2_MATRIXSOLO_BOARD_ID 1 2 4 2 1 7 1 0 1>, <151 240 651 740 J5_V3_MATRIXSOLO_BOARD_ID 1 2 4 3 1 7 1 0 1>, <251 340 51 140 J5_V2_MATRIXP2A_BOARD_ID 1 0 2 2 1 1 1 1 1>, <251 340 151 240 J5_V2_MATRIXP2B_BOARD_ID 1 0 2 2 2 2 2 1 1>, <251 340 251 340 J5_V2_MATRIXP2C_BOARD_ID 1 0 2 2 3 3 3 1 1>, <251 340 351 440 J5_V2_MATRIXP2D_BOARD_ID 1 0 2 2 4 4 4 2 1>, <251 340 651 740 J5_V3_MATRIXDUOA_BOARD_ID 1 2 3 3 1 7 1 0 1>, <251 340 751 840 J5_V3_MATRIXDUOB_BOARD_ID 1 2 3 3 2 8 2 1 1>, <551 640 51 140 J5_V2_DVBMAXA_BOARD_ID 0 2 0 2 1 1 1 2 0>, <551 640 151 240 J5_V2_DVBMAXB_BOARD_ID 0 2 0 2 2 2 2 1 0>, <551 640 251 340 J5_V2_DVBMAXC_BOARD_ID 0 2 0 2 3 3 3 1 0>, <551 640 351 440 J5_V2_DVBMAXD_BOARD_ID 0 2 0 2 4 4 4 1 0>, <551 640 0 0xffffffff J5_V2_DVBMAX_BOARD_ID 0 2 0 2 0 0 0 0 0>, <651 740 251 340 J5_EVM2_EP_BOARD_ID 0 0 0 0 0 6 6 1 3>, <651 740 451 540 J5_EVM2_RC_BOARD_ID 0 0 0 0 0 5 5 2 3>, <651 740 651 740 J5_EVM_EP_BOARD_ID 0 0 0 0 0 6 6 1 3>, <651 740 751 900 J5_EVM_RC_BOARD_ID 0 0 0 0 0 5 5 2 3>, <651 740 0 0xffffffff J5_EVM_BOARD_ID 0 0 0 0 0 0 0 0 3>, <751 840 51 140 J5_DVBMAXA_BOARD_ID 0 2 0 1 1 1 1 2 0>, <751 840 151 240 J5_DVBMAXB_BOARD_ID 0 2 0 1 2 2 2 0 0>, <751 840 251 340 J5_DVBMAXC_BOARD_ID 0 2 0 1 3 3 3 0 0>, <751 840 351 440 J5_DVBMAXD_BOARD_ID 0 2 0 1 4 4 4 0 0>, <751 840 0 0xffffffff J5_DVBMAX_BOARD_ID 0 2 0 1 0 0 0 0 0>, <0 0xffffffff 51 140 J5_DVBA_BOARD_ID 0 2 0 0 1 1 1 2 0>, <0 0xffffffff 151 240 J5_DVBB_BOARD_ID 0 2 0 0 2 2 2 1 0>, <0 0xffffffff 251 340 J5_DVBC_BOARD_ID 0 2 0 0 3 3 3 1 0>, <0 0xffffffff 351 440 J5_DVBD_BOARD_ID 0 2 0 0 4 4 4 1 0>, <0 0xffffffff 651 740 J5_CVB_EP_BOARD_ID 0 0 0 0 0 0 0 1 4>, <0 0xffffffff 751 900 J5_CVB_RC_BOARD_ID 0 0 0 0 0 0 0 2 4>, <0 0xffffffff 0 0xffffffff J5_BOARD_ID 0 2 0 0 0 0 0 0 0>; hardware_array = "j5dvb", "matrix5", "pac"; ethact_array = "default", "ethernet@59110000", "ethernet@59120000"; sub_board_name = "default", "p1", "p2", "duo", "solo"; sub_board_version = "default", "pre", "v2", "v3"; sub_board_j5 = "default", "j5a", "j5b", "j5c", "j5d"; net_eth0_ipaddr = "192.168.2.10", "192.168.2.11", "192.168.2.12", "192.168.2.13", "192.168.2.14", "192.168.2.15", "192.168.2.16", "192.168.6.11", "192.168.6.12"; net_eth1_ipaddr = "192.168.1.10", "192.168.1.11", "192.168.1.12", "192.168.1.13", "192.168.1.14", "192.168.1.15", "192.168.1.16"; pcie_mode = "default", "ep", "rc"; board_name_array = "j5dvb", "matrix5", "pac", "j5evm", "j5cvb"; };
adc_dev = &adc_sensor_0, &adc_sensor_1; adc_channel = <1 5>;
这两个属性的意思是:使用 adc_sensor_0 的通道1 与 adc_sensore_1 的通道5 获取电压值,单位mv。
board_type_array 数组的意思如下:
<51 140 51 140 0x601>
如果J5 从board的adc_senesor_0 读取到的电压值在 51mv ~ 140mv ,adc_sensor_1 读取到的电压值在 51mv ~ 140mv ,则赋值该板子的board id = 0x601;
<0 0xffffffff 51 140 0x501> 数组的意思是:利用线性数组的特性,依次match 匹配。
如果J5 从board的adc_senesor_0 读取到的电压值不在 51mv ~ 140mv ,adc_sensor_1 读取到的电压值在 51mv ~ 140mv ,则赋值该板子的board id = 0x501。
2.kernel部分的board_type 节点
文件:kernel/arch/arm64/boot/dts/hobot/hobot-j5-dvb.dts
修改流程
如果想自定义添加board id,根据board id 的定义修改以下两个地方:
-
需要根据新的定义,同步修改uboot下uboot/arch/arm/dts/hobot-j5.dtsi数组board_type_array;
-
kernel dts中的同步修改board id值。
增加dtb文件流程
增加dts文件及编译选项
涉及文件:
在下述路径增加对应dts文件,例如,增加hobot-j5-sample.dts:
kernel/arch/arm64/boot/dts/hobot/hobot-j5-sample.dts
添加完dts文件后,在下述文件中增加所需编译选项:
kernel/arch/arm64/boot/dts/hobot/Makefile
以hobot-j5-sample.dts为例,增加:
dtb-$(CONFIG_HOBOT_J5) += hobot-j5-sample.dtb
如何使用Build
J5-dvb板通用镜像(包含emmc和nor-flash镜像)
source build/envsetup.sh lunch 1 # horizon_j5series-debug_gcc9.64 ./build.sh -e all
结果如下:
J5-dvb板nor-flash镜像
source build/envsetup.sh lunch 1 # horizon_j5series-debug_gcc9.64 ./build.sh -e all –b j5dvb_nor
J5-dvb板hyper-flash镜像
source build/envsetup.sh lunch 1 # horizon_j5series-debug_gcc9.64 ./build.sh -e all –b j5dvb_hyper
J5-dvb板编译客户自定义app
需要客户在源码根目录下创建一个目录,存放已经编译好的程序,比如vendor目录,编译打包如下:
source build/envsetup.sh lunch 1 # horizon_j5series-debug_gcc9.64 ./build.sh -e all –a vendor
RT和非RT版本编译
platform_sdk支持rt和非rt编译,开关是ENABLE_RT_PATCH环境变量,设置为true表示开RT;设置为false表示关闭RT,默认RT打开(可以通过ENABLE_RT_PATCH环境变量的值进行确认),关RT编译如下:
source build/envsetup.sh lunch 1 # horizon_j5series-debug_gcc9.64 export ENABLE_RT_PATCH=false ./build.sh -e all –a vendor
编译时添加version
编译时,为了方便追述板子上的代码,可以指定version信息,如下编译:
source build/envsetup.sh lunch 1 # horizon_j5series-debug_gcc9.64 ./build.sh -e all –a vendor -v xx_20220815
可以在板子上执行,如下命令进行查看:
root@j5dvb:/# cat /etc/version xxx_20220815 debug
单独模块编译
模块单独编译产生的是未签名的镜像,还需要再进行镜像签名,才能烧录使用,否则启动会失败。
首先建立编译环境:
source build/envsetup.sh lunch 1 # horizon_j5series-debug_gcc9.64
Uboot
cd uboot/ ./build.sh -o emmc/nor/hyper
Kernel
cd kernel/ ./build.sh all
MCore
进入 repo根目录/mcore,执行build.sh,即可得到Mcore.bin与Mcore.elf。
编译成功会提示如下信息
VDSP
获取vdsp firmware代码后
cd vdsp source env.sh make cd sample make
镜像签名与加密
前提:之前所有镜像都已经编译完成,还需要经过镜像签名后才能生成可用的镜像文件。
直接执行build/目录下的Makefile,即可完成下面所有的镜像文件加密签名。
cd build/ make
Build输出
目前由build编译系统编译生成的系统镜像如下表所示:
镜像名字 | 对应分区 | 用途说明 | 镜像生成位置 |
veeprom | 存储OTA标志 | ||
gpt_main-secure.img | binfo1 binfo2 binfo3 | 地平线启动标志 ./build.sh –e all 命令才会生成 | out/target/product/packages |
binfo-nor-secure.img | binfo1 binfo2 binfo3 | 地平线启动标志 ./build.sh –e all –b j5dvb_nor 命令才会生成 | out/target/product/packages |
binfo-hyper-secure.img | binfo1 binfo2 binfo3 | 地平线启动标志 ./build.sh –e all –b j5dvb_hyper 命令才会生成 | out/target/product/packages |
spl.img0.bin | sbl sblbak0 sblbak1 sblbak2 | 第二级bootloader | out/target/product/packages |
ddrc.img.bin | ddrc_a ddrc_b | ddrc.img.bin是ddr controller的配置代码。 | out/target/product/packages |
ddrp.img.bin | ddrp_a ddrp_b | 是ddr controller的参数信息 | |
uboot.img.bin | uboot_a uboot_b | 运行在EL1状态的第3级bootloader, 下载boot.img或recovery.img到 DDR,启动kernel和ramdisk。 | out/target/product/packages |
bl31.img.bin | bl31_a bl31_b | Arm trust environment firmware, 运行在EL3状态,初始化arm,gic和sysc ounter,处理security相关操作,管理 power和clock等功能。 | out/target/product/packages |
mcore.img.bin | mcore_a mcore_b | 签名后的mcore的镜像 | out/target/product/packages |
misc | 存储AB分区标志 | ||
ubootenv | 存储uboot环境变量 | ||
HB_APDP | 内部调试使用 | ||
veeprombak | 存储IP和网关 | ||
vbmeta.img | vbmeta_a vbmeta_b | 用于系统AVB启动校验的签名镜像 | out/target/product/packages |
boot.img | boot_a boot_b | 用于系统正常模式下的kernel镜像(image +dtb)和ramdisk(最小rootfs) | out/target/product/packages |
bpu_image.bin | bpu_a bpu_b | BPU模型文件 | out/target/product/packages |
system.img | system_a system_b | 系统rootfs镜像,在boot.img中 的ramdisk运行时被mount。 | out/target/product/packages |
app.img | app_a app_b | app分区镜像,在系统启动 后会挂载到app分区中 | out/target/product/packages |
userdata | 存储用户数据 | ||
log | 存放日志文件 | ||
ota | 存放ota升级包 | ||
map | 存放地图相关数据 | ||
app_param | 存放app运行参数 |