blob: 86c54f5eb13fa04f4982ae13d441bbbded71f325 [file] [log] [blame]
Tim Leedd14a912022-07-29 16:42:15 +08001UBOOT_BINARY := "u-boot.${UBOOT_SUFFIX}"
Tim Leed52b0f62023-05-29 10:12:08 +08002BB_HEADER_BINARY := "BootBlockAndHeader.bin"
3BL31_HEADER_BINARY := "bl31AndHeader.bin"
4OPTEE_HEADER_BINARY := "teeAndHeader.bin"
Tim Leedd14a912022-07-29 16:42:15 +08005KMT_TIPFW_BINARY := "Kmt_TipFwL0_Skmt_TipFwL1.bin"
6KMT_TIPFW_BB_BINARY = "Kmt_TipFw_BootBlock.bin"
7KMT_TIPFW_BB_BL31_BINARY = "Kmt_TipFw_BootBlock_BL31.bin"
8KMT_TIPFW_BB_BL31_TEE_BINARY = "Kmt_TipFw_BootBlock_BL31_Tee.bin"
9KMT_TIPFW_BB_UBOOT_BINARY = "u-boot.bin.merged"
Tim Leed52b0f62023-05-29 10:12:08 +080010
11BB_BL31_BINARY = "BootBlock_BL31_no_tip.bin"
12BB_BL31_TEE_BINARY = "BootBlock_BL31_Tee_no_tip.bin"
13BB_BL31_TEE_UBOOT_BINARY = "u-boot.bin.merged"
14
Tim Leedd14a912022-07-29 16:42:15 +080015FULL_SUFFIX = "full"
16MERGED_SUFFIX = "merged"
Tim Lee3af4d262022-09-27 15:01:43 +080017UBOOT_SUFFIX:append = ".${MERGED_SUFFIX}"
Tim Leed52b0f62023-05-29 10:12:08 +080018UBOOT_HEADER_BINARY := "${UBOOT_BINARY}.${FULL_SUFFIX}"
Tim Leedd14a912022-07-29 16:42:15 +080019
20IGPS_DIR = "${STAGING_DIR_NATIVE}/${datadir}/npcm8xx-igps"
Tim Leedd14a912022-07-29 16:42:15 +080021
Tim Lee7f23e3a2022-11-30 13:53:50 +080022BB_BIN = "arbel_a35_bootblock.bin"
23BL31_BIN = "bl31.bin"
24OPTEE_BIN = "tee.bin"
25UBOOT_BIN = "u-boot.bin"
Tim Leed52b0f62023-05-29 10:12:08 +080026BB_NO_TIP_BIN = "arbel_a35_bootblock_no_tip.bin"
Tim Lee7f23e3a2022-11-30 13:53:50 +080027
28# Align images if needed
29python do_pad_binary() {
Tim Leed52b0f62023-05-29 10:12:08 +080030 TIP_IMAGE = d.getVar('TIP_IMAGE', True)
Tim Lee7f23e3a2022-11-30 13:53:50 +080031 def Pad_bin_file_inplace(inF, align):
32 padding_size = 0
33 padding_size_end = 0
34
35 F_size = os.path.getsize(inF)
36
37 padding_size = align - (F_size % align)
38
39 infile = open(inF, "ab")
40 infile.seek(0, 2)
41 infile.write(b'\x00' * padding_size)
42 infile.close()
43
Tim Leed52b0f62023-05-29 10:12:08 +080044 if TIP_IMAGE == "True":
45 Pad_bin_file_inplace(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
Tim Lee7f23e3a2022-11-30 13:53:50 +080046 '%s' % d.getVar('BB_BIN',True)), int(d.getVar('PAD_ALIGN', True)))
Tim Leed52b0f62023-05-29 10:12:08 +080047 else:
48 Pad_bin_file_inplace(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
49 '%s' % d.getVar('BB_NO_TIP_BIN',True)), int(d.getVar('PAD_ALIGN', True)))
Tim Lee7f23e3a2022-11-30 13:53:50 +080050
51 Pad_bin_file_inplace(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
Tim Leed52b0f62023-05-29 10:12:08 +080052 '%s' % d.getVar('BL31_BIN',True)), int(d.getVar('PAD_ALIGN', True)))
Tim Lee7f23e3a2022-11-30 13:53:50 +080053
54 Pad_bin_file_inplace(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
Tim Leed52b0f62023-05-29 10:12:08 +080055 '%s' % d.getVar('OPTEE_BIN',True)), int(d.getVar('PAD_ALIGN', True)))
Tim Lee7f23e3a2022-11-30 13:53:50 +080056
57 Pad_bin_file_inplace(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
58 '%s' % d.getVar('UBOOT_BIN',True)), int(d.getVar('PAD_ALIGN', True)))
59}
60
Tim Leedd14a912022-07-29 16:42:15 +080061# Prepare the Bootblock and U-Boot images using npcm8xx-bingo
62do_prepare_bootloaders() {
63 local olddir="$(pwd)"
64 cd ${DEPLOY_DIR_IMAGE}
65
66 bingo ${IGPS_DIR}/BL31_AndHeader.xml \
Tim Leed52b0f62023-05-29 10:12:08 +080067 -o ${BL31_HEADER_BINARY}
Tim Leedd14a912022-07-29 16:42:15 +080068
69 bingo ${IGPS_DIR}/OpTeeAndHeader.xml \
Tim Leed52b0f62023-05-29 10:12:08 +080070 -o ${OPTEE_HEADER_BINARY}
Tim Leedd14a912022-07-29 16:42:15 +080071
Tim Leed52b0f62023-05-29 10:12:08 +080072 if [ "${TIP_IMAGE}" = "True" ]; then
Tim Leedd14a912022-07-29 16:42:15 +080073 bingo ${IGPS_DIR}/BootBlockAndHeader_${DEVICE_GEN}_${IGPS_MACHINE}.xml \
Tim Leed52b0f62023-05-29 10:12:08 +080074 -o ${BB_HEADER_BINARY}
75 else
76 bingo ${IGPS_DIR}/BootBlockAndHeader_${DEVICE_GEN}_${IGPS_MACHINE}_NoTip.xml \
77 -o ${BB_HEADER_BINARY}
78 fi
Tim Leedd14a912022-07-29 16:42:15 +080079
80 bingo ${IGPS_DIR}/UbootHeader_${DEVICE_GEN}.xml \
Tim Leed52b0f62023-05-29 10:12:08 +080081 -o ${UBOOT_HEADER_BINARY}
Tim Leedd14a912022-07-29 16:42:15 +080082
83 cd "$olddir"
84}
85
Tim Leed52b0f62023-05-29 10:12:08 +080086check_keys() {
87 if [ -n "${KEY_FOLDER}" ]; then
88 echo "local"
89 else
90 echo "default"
91 fi
92}
Tim Leedd14a912022-07-29 16:42:15 +080093
Tim Leed4452592023-06-15 15:24:13 +080094# Sign images for secure os be enabled and TIP mode only
Tim Leed52b0f62023-05-29 10:12:08 +080095do_sign_binary() {
Tim Leed4452592023-06-15 15:24:13 +080096 if [ "${SECURED_IMAGE}" != "True" -o "${TIP_IMAGE}" != "True" ]; then
Tim Leed52b0f62023-05-29 10:12:08 +080097 return
98 fi
99 checked=`check_keys`
100 if [ "${checked}" = "local" ]; then
101 bbnote "Sign image with local keys"
102 key_bb=${KEY_FOLDER}/${KEY_BB}
103 key_bl31=${KEY_FOLDER}/${KEY_BL31}
104 key_optee=${KEY_FOLDER}/${KEY_OPTEE}
105 key_uboot=${KEY_FOLDER}/${KEY_UBOOT}
106 else
107 bbnote "Sign image with default keys"
108 key_bb=${KEY_FOLDER_DEFAULT}/${KEY_BB}
109 key_bl31=${KEY_FOLDER_DEFAULT}/${KEY_BL31}
110 key_optee=${KEY_FOLDER_DEFAULT}/${KEY_OPTEE}
111 key_uboot=${KEY_FOLDER_DEFAULT}/${KEY_UBOOT}
112 fi
113 bbnote "BB sign key from ${checked}: ${key_bb}"
114 bbnote "BL31 sign key from ${checked}: ${key_bl31}"
115 bbnote "OPTEE sign key from ${checked}: ${key_optee}"
116 bbnote "UBOOT sign key from ${checked}: ${key_uboot}"
117 # Used to embed the key index inside the image, usually at offset 0x140
118 python3 ${IGPS_DIR}/BinarySignatureGenerator.py Replace_binary_single_byte \
119 ${DEPLOY_DIR_IMAGE}/${BB_HEADER_BINARY} 140 ${KEY_BB_INDEX}
120
121 python3 ${IGPS_DIR}/BinarySignatureGenerator.py Replace_binary_single_byte \
122 ${DEPLOY_DIR_IMAGE}/${BL31_HEADER_BINARY} 140 ${SKMT_BL31_KEY_INDEX}
123
124 python3 ${IGPS_DIR}/BinarySignatureGenerator.py Replace_binary_single_byte \
125 ${DEPLOY_DIR_IMAGE}/${OPTEE_HEADER_BINARY} 140 ${SKMT_BL32_KEY_INDEX}
126
127 python3 ${IGPS_DIR}/BinarySignatureGenerator.py Replace_binary_single_byte \
128 ${DEPLOY_DIR_IMAGE}/${UBOOT_HEADER_BINARY} 140 ${SKMT_BL33_KEY_INDEX}
129
130 # Sign specific image with specific key
131 res=`python3 ${IGPS_DIR}/BinarySignatureGenerator.py Sign_binary \
132 ${DEPLOY_DIR_IMAGE}/${BB_HEADER_BINARY} 112 ${key_bb} 16 \
133 ${DEPLOY_DIR_IMAGE}/${BB_HEADER_BINARY} ${SIGN_TYPE} 0 ${KEY_BB_ID}
134
135 python3 ${IGPS_DIR}/BinarySignatureGenerator.py Sign_binary \
136 ${DEPLOY_DIR_IMAGE}/${BL31_HEADER_BINARY} 112 ${key_bl31} 16 \
137 ${DEPLOY_DIR_IMAGE}/${BL31_HEADER_BINARY} ${SIGN_TYPE} 0 ${KEY_BL31_ID}
138
139 python3 ${IGPS_DIR}/BinarySignatureGenerator.py Sign_binary \
140 ${DEPLOY_DIR_IMAGE}/${OPTEE_HEADER_BINARY} 112 ${key_optee} 16 \
141 ${DEPLOY_DIR_IMAGE}/${OPTEE_HEADER_BINARY} ${SIGN_TYPE} 0 ${KEY_OPTEE_ID}
142
143 python3 ${IGPS_DIR}/BinarySignatureGenerator.py Sign_binary \
144 ${DEPLOY_DIR_IMAGE}/${UBOOT_HEADER_BINARY} 112 ${key_uboot} 16 \
145 ${DEPLOY_DIR_IMAGE}/${UBOOT_HEADER_BINARY} ${SIGN_TYPE} 0 ${KEY_UBOOT_ID}`
146
147 # Stop full image build process when sign binary got failed
148 set +e
149 err=`echo $res | grep -E "missing|Invalid|failed"`
150 if [ -n "${err}" ]; then
151 bbfatal "Sign binary failed: keys are not found or invalid. Please check your KEY_FOLDER and KEY definition."
152 fi
153 set -e
154}
155
156python do_merge_bootloaders() {
157 TIP_IMAGE = d.getVar('TIP_IMAGE', True)
Tim Lee9d9d9e32022-10-28 16:57:26 +0800158 def Merge_bin_files_and_pad(inF1, inF2, outF, align, align_end):
Tim Leedd14a912022-07-29 16:42:15 +0800159 padding_size = 0
160 padding_size_end = 0
161 F1_size = os.path.getsize(inF1)
162 F2_size = os.path.getsize(inF2)
163
164 if ((F1_size % align) != 0):
165 padding_size = align - (F1_size % align)
166
Tim Lee9d9d9e32022-10-28 16:57:26 +0800167 if ((F2_size % align_end) != 0):
168 padding_size_end = align_end - (F2_size % align_end)
Tim Leedd14a912022-07-29 16:42:15 +0800169
170 with open(outF, "wb") as file3:
171 with open(inF1, "rb") as file1:
172 data = file1.read()
173 file3.write(data)
174
175 file3.write(b'\xFF' * padding_size)
176
177 with open(inF2, "rb") as file2:
178 data = file2.read()
179 file3.write(data)
180
181 file3.write(b'\xFF' * padding_size_end)
182
Tim Leed52b0f62023-05-29 10:12:08 +0800183 if TIP_IMAGE == "True":
184 Merge_bin_files_and_pad(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('KMT_TIPFW_BINARY',True)),
185 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_HEADER_BINARY',True)),
Tim Leedd14a912022-07-29 16:42:15 +0800186 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('KMT_TIPFW_BB_BINARY',True)),
Tim Lee9d9d9e32022-10-28 16:57:26 +0800187 int(d.getVar('BB_ALIGN', True)), int(d.getVar('ALIGN_END', True)))
Tim Leedd14a912022-07-29 16:42:15 +0800188
Tim Leed52b0f62023-05-29 10:12:08 +0800189 Merge_bin_files_and_pad(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('KMT_TIPFW_BB_BINARY',True)),
190 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BL31_HEADER_BINARY',True)),
Tim Leedd14a912022-07-29 16:42:15 +0800191 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('KMT_TIPFW_BB_BL31_BINARY',True)),
Tim Lee9d9d9e32022-10-28 16:57:26 +0800192 int(d.getVar('ATF_ALIGN', True)), int(d.getVar('ALIGN_END', True)))
Tim Leedd14a912022-07-29 16:42:15 +0800193
Tim Leed52b0f62023-05-29 10:12:08 +0800194 Merge_bin_files_and_pad(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('KMT_TIPFW_BB_BL31_BINARY',True)),
195 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('OPTEE_HEADER_BINARY',True)),
Tim Leedd14a912022-07-29 16:42:15 +0800196 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('KMT_TIPFW_BB_BL31_TEE_BINARY',True)),
Tim Lee9d9d9e32022-10-28 16:57:26 +0800197 int(d.getVar('OPTEE_ALIGN', True)), int(d.getVar('ALIGN_END', True)))
Tim Leedd14a912022-07-29 16:42:15 +0800198
Tim Leed52b0f62023-05-29 10:12:08 +0800199 Merge_bin_files_and_pad(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('KMT_TIPFW_BB_BL31_TEE_BINARY',True)),
200 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('UBOOT_HEADER_BINARY',True)),
Tim Leedd14a912022-07-29 16:42:15 +0800201 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('KMT_TIPFW_BB_UBOOT_BINARY',True)),
Tim Lee9d9d9e32022-10-28 16:57:26 +0800202 int(d.getVar('UBOOT_ALIGN', True)), int(d.getVar('ALIGN_END', True)))
Tim Leed52b0f62023-05-29 10:12:08 +0800203 else:
204 Merge_bin_files_and_pad(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_HEADER_BINARY',True)),
205 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BL31_HEADER_BINARY',True)),
206 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_BL31_BINARY',True)),
207 int(d.getVar('ATF_ALIGN', True)), int(d.getVar('ALIGN_END', True)))
208
209 Merge_bin_files_and_pad(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_BL31_BINARY',True)),
210 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('OPTEE_HEADER_BINARY',True)),
211 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_BL31_TEE_BINARY',True)),
212 int(d.getVar('OPTEE_ALIGN', True)), int(d.getVar('ALIGN_END', True)))
213
214 Merge_bin_files_and_pad(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_BL31_TEE_BINARY',True)),
215 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('UBOOT_HEADER_BINARY',True)),
216 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_BL31_TEE_UBOOT_BINARY',True)),
217 int(d.getVar('UBOOT_ALIGN', True)), int(d.getVar('ALIGN_END', True)))
Tim Leedd14a912022-07-29 16:42:15 +0800218}
219
Tim Lee30d2a112022-12-01 14:19:46 +0800220do_pad_binary[depends] += " \
Tim Leedd14a912022-07-29 16:42:15 +0800221 npcm8xx-tip-fw:do_deploy \
222 npcm8xx-bootblock:do_deploy \
Tim Lee3af4d262022-09-27 15:01:43 +0800223 u-boot-nuvoton:do_deploy \
Tim Leedd14a912022-07-29 16:42:15 +0800224 trusted-firmware-a:do_deploy \
225 optee-os:do_deploy \
226 npcm7xx-bingo-native:do_populate_sysroot \
227 npcm8xx-igps-native:do_populate_sysroot \
228 "
229
230# link images for we only need to flash partial image with idea name
231do_generate_ext4_tar:append() {
232 cd ${DEPLOY_DIR_IMAGE}
233 ln -sf ${UBOOT_BINARY}.${MERGED_SUFFIX} image-u-boot
234 ln -sf ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE} image-kernel
235 ln -sf ${S}/ext4/${IMAGE_LINK_NAME}.${FLASH_EXT4_BASETYPE}.zst image-rofs
236 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.rwfs.${FLASH_EXT4_OVERLAY_BASETYPE} image-rwfs
237 ln -sf ${IMAGE_NAME}.rootfs.wic.gz image-emmc.gz
238}
239
Tim Lee7f23e3a2022-11-30 13:53:50 +0800240addtask do_pad_binary before do_prepare_bootloaders
Tim Leed52b0f62023-05-29 10:12:08 +0800241addtask do_sign_binary before do_merge_bootloaders after do_prepare_bootloaders
Tim Leedd14a912022-07-29 16:42:15 +0800242addtask do_prepare_bootloaders before do_generate_static after do_generate_rwfs_static
Tim Leed52b0f62023-05-29 10:12:08 +0800243addtask do_merge_bootloaders before do_generate_static after do_sign_binary
Tim Leedd14a912022-07-29 16:42:15 +0800244addtask do_merge_bootloaders before do_generate_ext4_tar after do_prepare_bootloaders
245
246# Include the full bootblock and u-boot in the final static image
247python do_generate_static:append() {
248 _append_image(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
249 'u-boot.%s' % d.getVar('UBOOT_SUFFIX',True)),
250 int(d.getVar('FLASH_UBOOT_OFFSET', True)),
251 int(d.getVar('FLASH_KERNEL_OFFSET', True)))
252}
253
254do_make_ubi:append() {
255 # Concatenate the uboot and ubi partitions
256 dd bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET} \
257 if=${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} \
258 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd
259}
260
261do_make_ubi[depends] += "${PN}:do_prepare_bootloaders"
262do_generate_ubi_tar[depends] += "${PN}:do_prepare_bootloaders"
263do_generate_ubi_tar[depends] += "${PN}:do_merge_bootloaders"
264do_generate_static_tar[depends] += "${PN}:do_prepare_bootloaders"
265do_generate_static_tar[depends] += "${PN}:do_merge_bootloaders"
266do_generate_ext4_tar[depends] += "${PN}:do_prepare_bootloaders"
267do_generate_ext4_tar[depends] += "${PN}:do_merge_bootloaders"