diff options
Diffstat (limited to 'meta-ti-bsp/classes/kernel-fitimage-deprecated.bbclass')
-rw-r--r-- | meta-ti-bsp/classes/kernel-fitimage-deprecated.bbclass | 839 |
1 files changed, 0 insertions, 839 deletions
diff --git a/meta-ti-bsp/classes/kernel-fitimage-deprecated.bbclass b/meta-ti-bsp/classes/kernel-fitimage-deprecated.bbclass deleted file mode 100644 index b1705818..00000000 --- a/meta-ti-bsp/classes/kernel-fitimage-deprecated.bbclass +++ /dev/null | |||
@@ -1,839 +0,0 @@ | |||
1 | # | ||
2 | # Copyright OpenEmbedded Contributors | ||
3 | # | ||
4 | # SPDX-License-Identifier: MIT | ||
5 | # | ||
6 | |||
7 | inherit kernel-uboot-deprecated kernel-artifact-names uboot-config | ||
8 | require conf/image-fitimage.conf | ||
9 | |||
10 | def get_fit_replacement_type(d): | ||
11 | kerneltypes = d.getVar('KERNEL_IMAGETYPES') or "" | ||
12 | replacementtype = "" | ||
13 | if 'fitImage' in kerneltypes.split(): | ||
14 | uarch = d.getVar("UBOOT_ARCH") | ||
15 | if uarch == "arm64": | ||
16 | replacementtype = "Image" | ||
17 | elif uarch == "riscv": | ||
18 | replacementtype = "Image" | ||
19 | elif uarch == "mips": | ||
20 | replacementtype = "vmlinuz.bin" | ||
21 | elif uarch == "x86": | ||
22 | replacementtype = "bzImage" | ||
23 | elif uarch == "microblaze": | ||
24 | replacementtype = "linux.bin" | ||
25 | else: | ||
26 | replacementtype = "zImage" | ||
27 | return replacementtype | ||
28 | |||
29 | KERNEL_IMAGETYPE_REPLACEMENT ?= "${@get_fit_replacement_type(d)}" | ||
30 | DEPENDS:append = " ${@'u-boot-tools-native dtc-native' if 'fitImage' in (d.getVar('KERNEL_IMAGETYPES') or '').split() else ''}" | ||
31 | |||
32 | python __anonymous () { | ||
33 | # Override KERNEL_IMAGETYPE_FOR_MAKE variable, which is internal | ||
34 | # to kernel.bbclass . We have to override it, since we pack zImage | ||
35 | # (at least for now) into the fitImage . | ||
36 | typeformake = d.getVar("KERNEL_IMAGETYPE_FOR_MAKE") or "" | ||
37 | if 'fitImage' in typeformake.split(): | ||
38 | d.setVar('KERNEL_IMAGETYPE_FOR_MAKE', typeformake.replace('fitImage', d.getVar('KERNEL_IMAGETYPE_REPLACEMENT'))) | ||
39 | |||
40 | image = d.getVar('INITRAMFS_IMAGE') | ||
41 | if image and not bb.utils.to_boolean(d.getVar('INITRAMFS_IMAGE_BUNDLE')): | ||
42 | if d.getVar('INITRAMFS_MULTICONFIG'): | ||
43 | mc = d.getVar('BB_CURRENT_MC') | ||
44 | d.appendVarFlag('do_assemble_fitimage_initramfs', 'mcdepends', ' mc:' + mc + ':${INITRAMFS_MULTICONFIG}:${INITRAMFS_IMAGE}:do_image_complete') | ||
45 | else: | ||
46 | d.appendVarFlag('do_assemble_fitimage_initramfs', 'depends', ' ${INITRAMFS_IMAGE}:do_image_complete') | ||
47 | |||
48 | #check if there are any dtb providers | ||
49 | providerdtb = d.getVar("PREFERRED_PROVIDER_virtual/dtb") | ||
50 | if providerdtb: | ||
51 | d.appendVarFlag('do_assemble_fitimage', 'depends', ' virtual/dtb:do_populate_sysroot') | ||
52 | d.appendVarFlag('do_assemble_fitimage_initramfs', 'depends', ' virtual/dtb:do_populate_sysroot') | ||
53 | d.setVar('EXTERNAL_KERNEL_DEVICETREE', "${RECIPE_SYSROOT}/boot/devicetree") | ||
54 | } | ||
55 | |||
56 | # | ||
57 | # Emit the fitImage ITS header | ||
58 | # | ||
59 | # $1 ... .its filename | ||
60 | fitimage_emit_fit_header() { | ||
61 | cat << EOF >> $1 | ||
62 | /dts-v1/; | ||
63 | |||
64 | / { | ||
65 | description = "${FIT_DESC}"; | ||
66 | #address-cells = <${FIT_ADDRESS_CELLS}>; | ||
67 | EOF | ||
68 | } | ||
69 | |||
70 | # | ||
71 | # Emit the fitImage section bits | ||
72 | # | ||
73 | # $1 ... .its filename | ||
74 | # $2 ... Section bit type: imagestart - image section start | ||
75 | # confstart - configuration section start | ||
76 | # sectend - section end | ||
77 | # fitend - fitimage end | ||
78 | # | ||
79 | fitimage_emit_section_maint() { | ||
80 | case $2 in | ||
81 | imagestart) | ||
82 | cat << EOF >> $1 | ||
83 | |||
84 | images { | ||
85 | EOF | ||
86 | ;; | ||
87 | confstart) | ||
88 | cat << EOF >> $1 | ||
89 | |||
90 | configurations { | ||
91 | EOF | ||
92 | ;; | ||
93 | sectend) | ||
94 | cat << EOF >> $1 | ||
95 | }; | ||
96 | EOF | ||
97 | ;; | ||
98 | fitend) | ||
99 | cat << EOF >> $1 | ||
100 | }; | ||
101 | EOF | ||
102 | ;; | ||
103 | esac | ||
104 | } | ||
105 | |||
106 | # | ||
107 | # Emit the fitImage ITS kernel section | ||
108 | # | ||
109 | # $1 ... .its filename | ||
110 | # $2 ... Image counter | ||
111 | # $3 ... Path to kernel image | ||
112 | # $4 ... Compression type | ||
113 | fitimage_emit_section_kernel() { | ||
114 | |||
115 | kernel_csum="${FIT_HASH_ALG}" | ||
116 | kernel_sign_algo="${FIT_SIGN_ALG}" | ||
117 | kernel_sign_keyname="${UBOOT_SIGN_IMG_KEYNAME}" | ||
118 | |||
119 | ENTRYPOINT="${UBOOT_ENTRYPOINT}" | ||
120 | if [ -n "${UBOOT_ENTRYSYMBOL}" ]; then | ||
121 | ENTRYPOINT=`${HOST_PREFIX}nm vmlinux | \ | ||
122 | awk '$3=="${UBOOT_ENTRYSYMBOL}" {print "0x"$1;exit}'` | ||
123 | fi | ||
124 | |||
125 | cat << EOF >> $1 | ||
126 | kernel-$2 { | ||
127 | description = "Linux kernel"; | ||
128 | data = /incbin/("$3"); | ||
129 | type = "${UBOOT_MKIMAGE_KERNEL_TYPE}"; | ||
130 | arch = "${UBOOT_ARCH}"; | ||
131 | os = "linux"; | ||
132 | compression = "$4"; | ||
133 | load = <${UBOOT_LOADADDRESS}>; | ||
134 | entry = <$ENTRYPOINT>; | ||
135 | hash-1 { | ||
136 | algo = "$kernel_csum"; | ||
137 | }; | ||
138 | }; | ||
139 | EOF | ||
140 | |||
141 | if [ "${UBOOT_SIGN_ENABLE}" = "1" -a "${FIT_SIGN_INDIVIDUAL}" = "1" -a -n "$kernel_sign_keyname" ] ; then | ||
142 | sed -i '$ d' $1 | ||
143 | cat << EOF >> $1 | ||
144 | signature-1 { | ||
145 | algo = "$kernel_csum,$kernel_sign_algo"; | ||
146 | key-name-hint = "$kernel_sign_keyname"; | ||
147 | }; | ||
148 | }; | ||
149 | EOF | ||
150 | fi | ||
151 | } | ||
152 | |||
153 | # | ||
154 | # Emit the fitImage ITS DTB section | ||
155 | # | ||
156 | # $1 ... .its filename | ||
157 | # $2 ... Image counter | ||
158 | # $3 ... Path to DTB image | ||
159 | fitimage_emit_section_dtb() { | ||
160 | |||
161 | dtb_csum="${FIT_HASH_ALG}" | ||
162 | dtb_sign_algo="${FIT_SIGN_ALG}" | ||
163 | dtb_sign_keyname="${UBOOT_SIGN_IMG_KEYNAME}" | ||
164 | |||
165 | dtb_loadline="" | ||
166 | dtb_ext=${DTB##*.} | ||
167 | if [ "${dtb_ext}" = "dtbo" ]; then | ||
168 | if [ -n "${UBOOT_DTBO_LOADADDRESS}" ]; then | ||
169 | dtb_loadline="load = <${UBOOT_DTBO_LOADADDRESS}>;" | ||
170 | fi | ||
171 | elif [ -n "${UBOOT_DTB_LOADADDRESS}" ]; then | ||
172 | dtb_loadline="load = <${UBOOT_DTB_LOADADDRESS}>;" | ||
173 | fi | ||
174 | cat << EOF >> $1 | ||
175 | fdt-$2 { | ||
176 | description = "Flattened Device Tree blob"; | ||
177 | data = /incbin/("$3"); | ||
178 | type = "flat_dt"; | ||
179 | arch = "${UBOOT_ARCH}"; | ||
180 | compression = "none"; | ||
181 | $dtb_loadline | ||
182 | hash-1 { | ||
183 | algo = "$dtb_csum"; | ||
184 | }; | ||
185 | }; | ||
186 | EOF | ||
187 | |||
188 | if [ "${UBOOT_SIGN_ENABLE}" = "1" -a "${FIT_SIGN_INDIVIDUAL}" = "1" -a -n "$dtb_sign_keyname" ] ; then | ||
189 | sed -i '$ d' $1 | ||
190 | cat << EOF >> $1 | ||
191 | signature-1 { | ||
192 | algo = "$dtb_csum,$dtb_sign_algo"; | ||
193 | key-name-hint = "$dtb_sign_keyname"; | ||
194 | }; | ||
195 | }; | ||
196 | EOF | ||
197 | fi | ||
198 | } | ||
199 | |||
200 | # | ||
201 | # Emit the fitImage ITS u-boot script section | ||
202 | # | ||
203 | # $1 ... .its filename | ||
204 | # $2 ... Image counter | ||
205 | # $3 ... Path to boot script image | ||
206 | fitimage_emit_section_boot_script() { | ||
207 | |||
208 | bootscr_csum="${FIT_HASH_ALG}" | ||
209 | bootscr_sign_algo="${FIT_SIGN_ALG}" | ||
210 | bootscr_sign_keyname="${UBOOT_SIGN_IMG_KEYNAME}" | ||
211 | |||
212 | cat << EOF >> $1 | ||
213 | bootscr-$2 { | ||
214 | description = "U-boot script"; | ||
215 | data = /incbin/("$3"); | ||
216 | type = "script"; | ||
217 | arch = "${UBOOT_ARCH}"; | ||
218 | compression = "none"; | ||
219 | hash-1 { | ||
220 | algo = "$bootscr_csum"; | ||
221 | }; | ||
222 | }; | ||
223 | EOF | ||
224 | |||
225 | if [ "${UBOOT_SIGN_ENABLE}" = "1" -a "${FIT_SIGN_INDIVIDUAL}" = "1" -a -n "$bootscr_sign_keyname" ] ; then | ||
226 | sed -i '$ d' $1 | ||
227 | cat << EOF >> $1 | ||
228 | signature-1 { | ||
229 | algo = "$bootscr_csum,$bootscr_sign_algo"; | ||
230 | key-name-hint = "$bootscr_sign_keyname"; | ||
231 | }; | ||
232 | }; | ||
233 | EOF | ||
234 | fi | ||
235 | } | ||
236 | |||
237 | # | ||
238 | # Emit the fitImage ITS setup section | ||
239 | # | ||
240 | # $1 ... .its filename | ||
241 | # $2 ... Image counter | ||
242 | # $3 ... Path to setup image | ||
243 | fitimage_emit_section_setup() { | ||
244 | |||
245 | setup_csum="${FIT_HASH_ALG}" | ||
246 | setup_sign_algo="${FIT_SIGN_ALG}" | ||
247 | setup_sign_keyname="${UBOOT_SIGN_IMG_KEYNAME}" | ||
248 | |||
249 | cat << EOF >> $1 | ||
250 | setup-$2 { | ||
251 | description = "Linux setup.bin"; | ||
252 | data = /incbin/("$3"); | ||
253 | type = "x86_setup"; | ||
254 | arch = "${UBOOT_ARCH}"; | ||
255 | os = "linux"; | ||
256 | compression = "none"; | ||
257 | load = <0x00090000>; | ||
258 | entry = <0x00090000>; | ||
259 | hash-1 { | ||
260 | algo = "$setup_csum"; | ||
261 | }; | ||
262 | }; | ||
263 | EOF | ||
264 | |||
265 | if [ "${UBOOT_SIGN_ENABLE}" = "1" -a "${FIT_SIGN_INDIVIDUAL}" = "1" -a -n "$setup_sign_keyname" ] ; then | ||
266 | sed -i '$ d' $1 | ||
267 | cat << EOF >> $1 | ||
268 | signature-1 { | ||
269 | algo = "$setup_csum,$setup_sign_algo"; | ||
270 | key-name-hint = "$setup_sign_keyname"; | ||
271 | }; | ||
272 | }; | ||
273 | EOF | ||
274 | fi | ||
275 | } | ||
276 | |||
277 | # | ||
278 | # Emit the fitImage ITS ramdisk section | ||
279 | # | ||
280 | # $1 ... .its filename | ||
281 | # $2 ... Image counter | ||
282 | # $3 ... Path to ramdisk image | ||
283 | fitimage_emit_section_ramdisk() { | ||
284 | |||
285 | ramdisk_csum="${FIT_HASH_ALG}" | ||
286 | ramdisk_sign_algo="${FIT_SIGN_ALG}" | ||
287 | ramdisk_sign_keyname="${UBOOT_SIGN_IMG_KEYNAME}" | ||
288 | ramdisk_loadline="" | ||
289 | ramdisk_entryline="" | ||
290 | |||
291 | if [ -n "${UBOOT_RD_LOADADDRESS}" ]; then | ||
292 | ramdisk_loadline="load = <${UBOOT_RD_LOADADDRESS}>;" | ||
293 | fi | ||
294 | if [ -n "${UBOOT_RD_ENTRYPOINT}" ]; then | ||
295 | ramdisk_entryline="entry = <${UBOOT_RD_ENTRYPOINT}>;" | ||
296 | fi | ||
297 | |||
298 | cat << EOF >> $1 | ||
299 | ramdisk-$2 { | ||
300 | description = "${INITRAMFS_IMAGE}"; | ||
301 | data = /incbin/("$3"); | ||
302 | type = "ramdisk"; | ||
303 | arch = "${UBOOT_ARCH}"; | ||
304 | os = "linux"; | ||
305 | compression = "none"; | ||
306 | $ramdisk_loadline | ||
307 | $ramdisk_entryline | ||
308 | hash-1 { | ||
309 | algo = "$ramdisk_csum"; | ||
310 | }; | ||
311 | }; | ||
312 | EOF | ||
313 | |||
314 | if [ "${UBOOT_SIGN_ENABLE}" = "1" -a "${FIT_SIGN_INDIVIDUAL}" = "1" -a -n "$ramdisk_sign_keyname" ] ; then | ||
315 | sed -i '$ d' $1 | ||
316 | cat << EOF >> $1 | ||
317 | signature-1 { | ||
318 | algo = "$ramdisk_csum,$ramdisk_sign_algo"; | ||
319 | key-name-hint = "$ramdisk_sign_keyname"; | ||
320 | }; | ||
321 | }; | ||
322 | EOF | ||
323 | fi | ||
324 | } | ||
325 | |||
326 | # | ||
327 | # echoes symlink destination if it points below directory | ||
328 | # | ||
329 | # $1 ... file that's a potential symlink | ||
330 | # $2 ... expected parent directory | ||
331 | symlink_points_below() { | ||
332 | file="$2/$1" | ||
333 | dir=$2 | ||
334 | |||
335 | if ! [ -L "$file" ]; then | ||
336 | return | ||
337 | fi | ||
338 | |||
339 | realpath="$(realpath --relative-to=$dir $file)" | ||
340 | if [ -z "${realpath%%../*}" ]; then | ||
341 | return | ||
342 | fi | ||
343 | |||
344 | echo "$realpath" | ||
345 | } | ||
346 | |||
347 | # | ||
348 | # Emit the fitImage ITS configuration section | ||
349 | # | ||
350 | # $1 ... .its filename | ||
351 | # $2 ... Linux kernel ID | ||
352 | # $3 ... DTB image name | ||
353 | # $4 ... ramdisk ID | ||
354 | # $5 ... u-boot script ID | ||
355 | # $6 ... config ID | ||
356 | # $7 ... default flag | ||
357 | # $8 ... default DTB image name | ||
358 | fitimage_emit_section_config() { | ||
359 | |||
360 | conf_csum="${FIT_HASH_ALG}" | ||
361 | conf_sign_algo="${FIT_SIGN_ALG}" | ||
362 | conf_padding_algo="${FIT_PAD_ALG}" | ||
363 | if [ "${UBOOT_SIGN_ENABLE}" = "1" ] ; then | ||
364 | conf_sign_keyname="${UBOOT_SIGN_KEYNAME}" | ||
365 | fi | ||
366 | |||
367 | its_file="$1" | ||
368 | kernel_id="$2" | ||
369 | dtb_image="$3" | ||
370 | ramdisk_id="$4" | ||
371 | bootscr_id="$5" | ||
372 | config_id="$6" | ||
373 | default_flag="$7" | ||
374 | default_dtb_image="$8" | ||
375 | |||
376 | # Test if we have any DTBs at all | ||
377 | sep="" | ||
378 | conf_desc="" | ||
379 | conf_node="${FIT_CONF_PREFIX}" | ||
380 | kernel_line="" | ||
381 | fdt_line="" | ||
382 | ramdisk_line="" | ||
383 | bootscr_line="" | ||
384 | setup_line="" | ||
385 | default_line="" | ||
386 | compatible_line="" | ||
387 | |||
388 | dtb_image_sect=$(symlink_points_below $dtb_image "${EXTERNAL_KERNEL_DEVICETREE}") | ||
389 | if [ -z "$dtb_image_sect" ]; then | ||
390 | dtb_image_sect=$dtb_image | ||
391 | fi | ||
392 | |||
393 | dtb_path="${EXTERNAL_KERNEL_DEVICETREE}/${dtb_image_sect}" | ||
394 | if [ -f "$dtb_path" ] || [ -L "$dtb_path" ]; then | ||
395 | compat=$(fdtget -t s "$dtb_path" / compatible | sed 's/ /", "/g') | ||
396 | if [ -n "$compat" ]; then | ||
397 | compatible_line="compatible = \"$compat\";" | ||
398 | fi | ||
399 | fi | ||
400 | |||
401 | dtb_image=$(echo $dtb_image | tr '/' '_') | ||
402 | dtb_image_sect=$(echo "${dtb_image_sect}" | tr '/' '_') | ||
403 | |||
404 | # conf node name is selected based on dtb ID if it is present, | ||
405 | # otherwise its selected based on kernel ID | ||
406 | if [ -n "$dtb_image" ]; then | ||
407 | conf_node=$conf_node$dtb_image | ||
408 | else | ||
409 | conf_node=$conf_node$kernel_id | ||
410 | fi | ||
411 | |||
412 | if [ -n "$kernel_id" ]; then | ||
413 | conf_desc="Linux kernel" | ||
414 | sep=", " | ||
415 | kernel_line="kernel = \"kernel-$kernel_id\";" | ||
416 | fi | ||
417 | |||
418 | if [ -n "$dtb_image" ]; then | ||
419 | conf_desc="$conf_desc${sep}FDT blob" | ||
420 | sep=", " | ||
421 | fdt_line="fdt = \"fdt-$dtb_image_sect\";" | ||
422 | fi | ||
423 | |||
424 | if [ -n "$ramdisk_id" ]; then | ||
425 | conf_desc="$conf_desc${sep}ramdisk" | ||
426 | sep=", " | ||
427 | ramdisk_line="ramdisk = \"ramdisk-$ramdisk_id\";" | ||
428 | fi | ||
429 | |||
430 | if [ -n "$bootscr_id" ]; then | ||
431 | conf_desc="$conf_desc${sep}u-boot script" | ||
432 | sep=", " | ||
433 | bootscr_line="bootscr = \"bootscr-$bootscr_id\";" | ||
434 | fi | ||
435 | |||
436 | if [ -n "$config_id" ]; then | ||
437 | conf_desc="$conf_desc${sep}setup" | ||
438 | setup_line="setup = \"setup-$config_id\";" | ||
439 | fi | ||
440 | |||
441 | if [ "$default_flag" = "1" ]; then | ||
442 | # default node is selected based on dtb ID if it is present, | ||
443 | # otherwise its selected based on kernel ID | ||
444 | if [ -n "$dtb_image" ]; then | ||
445 | # Select default node as user specified dtb when | ||
446 | # multiple dtb exists. | ||
447 | if [ -n "$default_dtb_image" ]; then | ||
448 | default_line="default = \"${FIT_CONF_PREFIX}$default_dtb_image\";" | ||
449 | else | ||
450 | default_line="default = \"${FIT_CONF_PREFIX}$dtb_image\";" | ||
451 | fi | ||
452 | else | ||
453 | default_line="default = \"${FIT_CONF_PREFIX}$kernel_id\";" | ||
454 | fi | ||
455 | fi | ||
456 | |||
457 | cat << EOF >> $its_file | ||
458 | $default_line | ||
459 | $conf_node { | ||
460 | description = "$default_flag $conf_desc"; | ||
461 | $compatible_line | ||
462 | $kernel_line | ||
463 | $fdt_line | ||
464 | $ramdisk_line | ||
465 | $bootscr_line | ||
466 | $setup_line | ||
467 | hash-1 { | ||
468 | algo = "$conf_csum"; | ||
469 | }; | ||
470 | EOF | ||
471 | |||
472 | if [ -n "$conf_sign_keyname" ] ; then | ||
473 | |||
474 | sign_line="sign-images = " | ||
475 | sep="" | ||
476 | |||
477 | if [ -n "$kernel_id" ]; then | ||
478 | sign_line="$sign_line${sep}\"kernel\"" | ||
479 | sep=", " | ||
480 | fi | ||
481 | |||
482 | if [ -n "$dtb_image" ]; then | ||
483 | sign_line="$sign_line${sep}\"fdt\"" | ||
484 | sep=", " | ||
485 | fi | ||
486 | |||
487 | if [ -n "$ramdisk_id" ]; then | ||
488 | sign_line="$sign_line${sep}\"ramdisk\"" | ||
489 | sep=", " | ||
490 | fi | ||
491 | |||
492 | if [ -n "$bootscr_id" ]; then | ||
493 | sign_line="$sign_line${sep}\"bootscr\"" | ||
494 | sep=", " | ||
495 | fi | ||
496 | |||
497 | if [ -n "$config_id" ]; then | ||
498 | sign_line="$sign_line${sep}\"setup\"" | ||
499 | fi | ||
500 | |||
501 | sign_line="$sign_line;" | ||
502 | |||
503 | cat << EOF >> $its_file | ||
504 | signature-1 { | ||
505 | algo = "$conf_csum,$conf_sign_algo"; | ||
506 | key-name-hint = "$conf_sign_keyname"; | ||
507 | padding = "$conf_padding_algo"; | ||
508 | $sign_line | ||
509 | }; | ||
510 | EOF | ||
511 | fi | ||
512 | |||
513 | cat << EOF >> $its_file | ||
514 | }; | ||
515 | EOF | ||
516 | } | ||
517 | |||
518 | # | ||
519 | # Assemble fitImage | ||
520 | # | ||
521 | # $1 ... .its filename | ||
522 | # $2 ... fitImage name | ||
523 | # $3 ... include ramdisk | ||
524 | fitimage_assemble() { | ||
525 | kernelcount=1 | ||
526 | dtbcount="" | ||
527 | DTBS="" | ||
528 | ramdiskcount=$3 | ||
529 | setupcount="" | ||
530 | bootscr_id="" | ||
531 | default_dtb_image="" | ||
532 | rm -f $1 arch/${ARCH}/boot/$2 | ||
533 | |||
534 | if [ -n "${UBOOT_SIGN_IMG_KEYNAME}" -a "${UBOOT_SIGN_KEYNAME}" = "${UBOOT_SIGN_IMG_KEYNAME}" ]; then | ||
535 | bbfatal "Keys used to sign images and configuration nodes must be different." | ||
536 | fi | ||
537 | |||
538 | fitimage_emit_fit_header $1 | ||
539 | |||
540 | # | ||
541 | # Step 1: Prepare a kernel image section. | ||
542 | # | ||
543 | fitimage_emit_section_maint $1 imagestart | ||
544 | |||
545 | uboot_prep_kimage | ||
546 | fitimage_emit_section_kernel $1 $kernelcount linux.bin "$linux_comp" | ||
547 | |||
548 | # | ||
549 | # Step 2: Prepare a DTB image section | ||
550 | # | ||
551 | |||
552 | if [ -n "${KERNEL_DEVICETREE}" ]; then | ||
553 | dtbcount=1 | ||
554 | for DTB in ${KERNEL_DEVICETREE}; do | ||
555 | if echo $DTB | grep -q '/dts/'; then | ||
556 | bbwarn "$DTB contains the full path to the the dts file, but only the dtb name should be used." | ||
557 | DTB=`basename $DTB | sed 's,\.dts$,.dtb,g'` | ||
558 | fi | ||
559 | |||
560 | # Skip ${DTB} if it's also provided in ${EXTERNAL_KERNEL_DEVICETREE} | ||
561 | if [ -n "${EXTERNAL_KERNEL_DEVICETREE}" ] && [ -s ${EXTERNAL_KERNEL_DEVICETREE}/${DTB} ]; then | ||
562 | continue | ||
563 | fi | ||
564 | |||
565 | DTB_PATH="${KERNEL_OUTPUT_DIR}/dts/$DTB" | ||
566 | if [ ! -e "$DTB_PATH" ]; then | ||
567 | DTB_PATH="${KERNEL_OUTPUT_DIR}/$DTB" | ||
568 | fi | ||
569 | |||
570 | # Strip off the path component from the filename | ||
571 | if "${@'false' if oe.types.boolean(d.getVar('KERNEL_DTBVENDORED')) else 'true'}"; then | ||
572 | DTB=`basename $DTB` | ||
573 | fi | ||
574 | |||
575 | # Set the default dtb image if it exists in the devicetree. | ||
576 | if [ "${FIT_CONF_DEFAULT_DTB}" = "$DTB" ];then | ||
577 | default_dtb_image=$(echo "$DTB" | tr '/' '_') | ||
578 | fi | ||
579 | |||
580 | DTB=$(echo "$DTB" | tr '/' '_') | ||
581 | |||
582 | # Skip DTB if we've picked it up previously | ||
583 | echo "$DTBS" | tr ' ' '\n' | grep -xq "$DTB" && continue | ||
584 | |||
585 | DTBS="$DTBS $DTB" | ||
586 | DTB=$(echo $DTB | tr '/' '_') | ||
587 | fitimage_emit_section_dtb $1 $DTB $DTB_PATH | ||
588 | done | ||
589 | fi | ||
590 | |||
591 | if [ -n "${EXTERNAL_KERNEL_DEVICETREE}" ]; then | ||
592 | dtbcount=1 | ||
593 | for DTB in $(find "${EXTERNAL_KERNEL_DEVICETREE}" -name '*.dtb' -printf '%P\n' | sort) \ | ||
594 | $(find "${EXTERNAL_KERNEL_DEVICETREE}" -name '*.dtbo' -printf '%P\n' | sort); do | ||
595 | # Set the default dtb image if it exists in the devicetree. | ||
596 | if [ ${FIT_CONF_DEFAULT_DTB} = $DTB ];then | ||
597 | default_dtb_image=$(echo "$DTB" | tr '/' '_') | ||
598 | fi | ||
599 | |||
600 | DTB=$(echo "$DTB" | tr '/' '_') | ||
601 | |||
602 | # Skip DTB/DTBO if we've picked it up previously | ||
603 | echo "$DTBS" | tr ' ' '\n' | grep -xq "$DTB" && continue | ||
604 | |||
605 | DTBS="$DTBS $DTB" | ||
606 | |||
607 | # Also skip if a symlink. We'll later have each config section point at it | ||
608 | [ $(symlink_points_below $DTB "${EXTERNAL_KERNEL_DEVICETREE}") ] && continue | ||
609 | |||
610 | DTB=$(echo $DTB | tr '/' '_') | ||
611 | fitimage_emit_section_dtb $1 $DTB "${EXTERNAL_KERNEL_DEVICETREE}/$DTB" | ||
612 | done | ||
613 | fi | ||
614 | |||
615 | if [ -n "${FIT_CONF_DEFAULT_DTB}" ] && [ -z $default_dtb_image ]; then | ||
616 | bbwarn "${FIT_CONF_DEFAULT_DTB} is not available in the list of device trees." | ||
617 | fi | ||
618 | |||
619 | # | ||
620 | # Step 3: Prepare a u-boot script section | ||
621 | # | ||
622 | |||
623 | if [ -n "${FIT_UBOOT_ENV}" ]; then | ||
624 | cp ${UNPACKDIR}/${FIT_UBOOT_ENV} ${B} | ||
625 | bootscr_id="${FIT_UBOOT_ENV}" | ||
626 | fitimage_emit_section_boot_script $1 "$bootscr_id" ${FIT_UBOOT_ENV} | ||
627 | fi | ||
628 | |||
629 | # | ||
630 | # Step 4: Prepare a setup section. (For x86) | ||
631 | # | ||
632 | if [ -e ${KERNEL_OUTPUT_DIR}/setup.bin ]; then | ||
633 | setupcount=1 | ||
634 | fitimage_emit_section_setup $1 $setupcount ${KERNEL_OUTPUT_DIR}/setup.bin | ||
635 | fi | ||
636 | |||
637 | # | ||
638 | # Step 5: Prepare a ramdisk section. | ||
639 | # | ||
640 | if [ "x${ramdiskcount}" = "x1" ] && [ "${INITRAMFS_IMAGE_BUNDLE}" != "1" ]; then | ||
641 | # Find and use the first initramfs image archive type we find | ||
642 | found= | ||
643 | for img in ${FIT_SUPPORTED_INITRAMFS_FSTYPES}; do | ||
644 | initramfs_path="${INITRAMFS_DEPLOY_DIR_IMAGE}/${INITRAMFS_IMAGE_NAME}.$img" | ||
645 | if [ -e "$initramfs_path" ]; then | ||
646 | bbnote "Found initramfs image: $initramfs_path" | ||
647 | found=true | ||
648 | fitimage_emit_section_ramdisk $1 "$ramdiskcount" "$initramfs_path" | ||
649 | break | ||
650 | else | ||
651 | bbnote "Did not find initramfs image: $initramfs_path" | ||
652 | fi | ||
653 | done | ||
654 | |||
655 | if [ -z "$found" ]; then | ||
656 | bbfatal "Could not find a valid initramfs type for ${INITRAMFS_IMAGE_NAME}, the supported types are: ${FIT_SUPPORTED_INITRAMFS_FSTYPES}" | ||
657 | fi | ||
658 | fi | ||
659 | |||
660 | fitimage_emit_section_maint $1 sectend | ||
661 | |||
662 | # Force the first Kernel and DTB in the default config | ||
663 | kernelcount=1 | ||
664 | if [ -n "$dtbcount" ]; then | ||
665 | dtbcount=1 | ||
666 | fi | ||
667 | |||
668 | # | ||
669 | # Step 6: Prepare a configurations section | ||
670 | # | ||
671 | fitimage_emit_section_maint $1 confstart | ||
672 | |||
673 | # kernel-fitimage.bbclass currently only supports a single kernel (no less or | ||
674 | # more) to be added to the FIT image along with 0 or more device trees and | ||
675 | # 0 or 1 ramdisk. | ||
676 | # It is also possible to include an initramfs bundle (kernel and rootfs in one binary) | ||
677 | # When the initramfs bundle is used ramdisk is disabled. | ||
678 | # If a device tree is to be part of the FIT image, then select | ||
679 | # the default configuration to be used is based on the dtbcount. If there is | ||
680 | # no dtb present than select the default configuation to be based on | ||
681 | # the kernelcount. | ||
682 | if [ -n "$DTBS" ]; then | ||
683 | i=1 | ||
684 | for DTB in ${DTBS}; do | ||
685 | dtb_ext=${DTB##*.} | ||
686 | if [ "$dtb_ext" = "dtbo" ]; then | ||
687 | fitimage_emit_section_config $1 "" "$DTB" "" "$bootscr_id" "" "`expr $i = $dtbcount`" "$default_dtb_image" | ||
688 | else | ||
689 | fitimage_emit_section_config $1 $kernelcount "$DTB" "$ramdiskcount" "$bootscr_id" "$setupcount" "`expr $i = $dtbcount`" "$default_dtb_image" | ||
690 | fi | ||
691 | i=`expr $i + 1` | ||
692 | done | ||
693 | else | ||
694 | defaultconfigcount=1 | ||
695 | fitimage_emit_section_config $1 $kernelcount "" "$ramdiskcount" "$bootscr_id" "$setupcount" $defaultconfigcount "$default_dtb_image" | ||
696 | fi | ||
697 | |||
698 | fitimage_emit_section_maint $1 sectend | ||
699 | |||
700 | fitimage_emit_section_maint $1 fitend | ||
701 | |||
702 | # | ||
703 | # Step 7: Assemble the image | ||
704 | # | ||
705 | ${UBOOT_MKIMAGE} \ | ||
706 | ${@'-D "${UBOOT_MKIMAGE_DTCOPTS}"' if len('${UBOOT_MKIMAGE_DTCOPTS}') else ''} \ | ||
707 | -f $1 \ | ||
708 | ${KERNEL_OUTPUT_DIR}/$2 | ||
709 | |||
710 | # | ||
711 | # Step 8: Sign the image | ||
712 | # | ||
713 | if [ "x${UBOOT_SIGN_ENABLE}" = "x1" ] ; then | ||
714 | ${UBOOT_MKIMAGE_SIGN} \ | ||
715 | ${@'-D "${UBOOT_MKIMAGE_DTCOPTS}"' if len('${UBOOT_MKIMAGE_DTCOPTS}') else ''} \ | ||
716 | -F -k "${UBOOT_SIGN_KEYDIR}" \ | ||
717 | -r ${KERNEL_OUTPUT_DIR}/$2 \ | ||
718 | ${UBOOT_MKIMAGE_SIGN_ARGS} | ||
719 | fi | ||
720 | } | ||
721 | |||
722 | do_assemble_fitimage() { | ||
723 | if echo ${KERNEL_IMAGETYPES} | grep -wq "fitImage"; then | ||
724 | cd ${B} | ||
725 | fitimage_assemble fit-image.its fitImage-none "" | ||
726 | if [ "${INITRAMFS_IMAGE_BUNDLE}" != "1" ]; then | ||
727 | ln -sf fitImage-none ${B}/${KERNEL_OUTPUT_DIR}/fitImage | ||
728 | fi | ||
729 | fi | ||
730 | } | ||
731 | |||
732 | addtask assemble_fitimage before do_install after do_compile | ||
733 | |||
734 | SYSROOT_DIRS:append = " /sysroot-only" | ||
735 | do_install:append() { | ||
736 | if echo ${KERNEL_IMAGETYPES} | grep -wq "fitImage" && \ | ||
737 | [ "${UBOOT_SIGN_ENABLE}" = "1" ]; then | ||
738 | install -D ${B}/${KERNEL_OUTPUT_DIR}/fitImage-none ${D}/sysroot-only/fitImage | ||
739 | fi | ||
740 | } | ||
741 | |||
742 | do_assemble_fitimage_initramfs() { | ||
743 | if echo ${KERNEL_IMAGETYPES} | grep -wq "fitImage" && \ | ||
744 | test -n "${INITRAMFS_IMAGE}" ; then | ||
745 | cd ${B} | ||
746 | if [ "${INITRAMFS_IMAGE_BUNDLE}" = "1" ]; then | ||
747 | fitimage_assemble fit-image-${INITRAMFS_IMAGE}.its fitImage-bundle "" | ||
748 | ln -sf fitImage-bundle ${B}/${KERNEL_OUTPUT_DIR}/fitImage | ||
749 | else | ||
750 | fitimage_assemble fit-image-${INITRAMFS_IMAGE}.its fitImage-${INITRAMFS_IMAGE} 1 | ||
751 | fi | ||
752 | fi | ||
753 | } | ||
754 | |||
755 | addtask assemble_fitimage_initramfs before do_deploy after do_bundle_initramfs | ||
756 | |||
757 | do_kernel_generate_rsa_keys() { | ||
758 | if [ "${UBOOT_SIGN_ENABLE}" = "0" ] && [ "${FIT_GENERATE_KEYS}" = "1" ]; then | ||
759 | bbwarn "FIT_GENERATE_KEYS is set to 1 even though UBOOT_SIGN_ENABLE is set to 0. The keys will not be generated as they won't be used." | ||
760 | fi | ||
761 | |||
762 | if [ "${UBOOT_SIGN_ENABLE}" = "1" ] && [ "${FIT_GENERATE_KEYS}" = "1" ]; then | ||
763 | |||
764 | # Generate keys to sign configuration nodes, only if they don't already exist | ||
765 | if [ ! -f "${UBOOT_SIGN_KEYDIR}/${UBOOT_SIGN_KEYNAME}".key ] || \ | ||
766 | [ ! -f "${UBOOT_SIGN_KEYDIR}/${UBOOT_SIGN_KEYNAME}".crt ]; then | ||
767 | |||
768 | # make directory if it does not already exist | ||
769 | mkdir -p "${UBOOT_SIGN_KEYDIR}" | ||
770 | |||
771 | bbnote "Generating RSA private key for signing fitImage" | ||
772 | openssl genrsa ${FIT_KEY_GENRSA_ARGS} -out \ | ||
773 | "${UBOOT_SIGN_KEYDIR}/${UBOOT_SIGN_KEYNAME}".key \ | ||
774 | "${FIT_SIGN_NUMBITS}" | ||
775 | |||
776 | bbnote "Generating certificate for signing fitImage" | ||
777 | openssl req ${FIT_KEY_REQ_ARGS} "${FIT_KEY_SIGN_PKCS}" \ | ||
778 | -key "${UBOOT_SIGN_KEYDIR}/${UBOOT_SIGN_KEYNAME}".key \ | ||
779 | -out "${UBOOT_SIGN_KEYDIR}/${UBOOT_SIGN_KEYNAME}".crt | ||
780 | fi | ||
781 | |||
782 | # Generate keys to sign image nodes, only if they don't already exist | ||
783 | if [ ! -f "${UBOOT_SIGN_KEYDIR}/${UBOOT_SIGN_IMG_KEYNAME}".key ] || \ | ||
784 | [ ! -f "${UBOOT_SIGN_KEYDIR}/${UBOOT_SIGN_IMG_KEYNAME}".crt ]; then | ||
785 | |||
786 | # make directory if it does not already exist | ||
787 | mkdir -p "${UBOOT_SIGN_KEYDIR}" | ||
788 | |||
789 | bbnote "Generating RSA private key for signing fitImage" | ||
790 | openssl genrsa ${FIT_KEY_GENRSA_ARGS} -out \ | ||
791 | "${UBOOT_SIGN_KEYDIR}/${UBOOT_SIGN_IMG_KEYNAME}".key \ | ||
792 | "${FIT_SIGN_NUMBITS}" | ||
793 | |||
794 | bbnote "Generating certificate for signing fitImage" | ||
795 | openssl req ${FIT_KEY_REQ_ARGS} "${FIT_KEY_SIGN_PKCS}" \ | ||
796 | -key "${UBOOT_SIGN_KEYDIR}/${UBOOT_SIGN_IMG_KEYNAME}".key \ | ||
797 | -out "${UBOOT_SIGN_KEYDIR}/${UBOOT_SIGN_IMG_KEYNAME}".crt | ||
798 | fi | ||
799 | fi | ||
800 | } | ||
801 | |||
802 | addtask kernel_generate_rsa_keys before do_assemble_fitimage after do_compile | ||
803 | |||
804 | kernel_deprecated_do_deploy[vardepsexclude] = "DATETIME" | ||
805 | kernel_deprecated_do_deploy:append() { | ||
806 | # Update deploy directory | ||
807 | if echo ${KERNEL_IMAGETYPES} | grep -wq "fitImage"; then | ||
808 | |||
809 | if [ "${INITRAMFS_IMAGE_BUNDLE}" != "1" ]; then | ||
810 | bbnote "Copying fit-image.its source file..." | ||
811 | install -m 0644 ${B}/fit-image.its "$deployDir/fitImage-its-${KERNEL_FIT_NAME}.its" | ||
812 | if [ -n "${KERNEL_FIT_LINK_NAME}" ] ; then | ||
813 | ln -snf fitImage-its-${KERNEL_FIT_NAME}.its "$deployDir/fitImage-its-${KERNEL_FIT_LINK_NAME}" | ||
814 | fi | ||
815 | |||
816 | bbnote "Copying linux.bin file..." | ||
817 | install -m 0644 ${B}/linux.bin $deployDir/fitImage-linux.bin-${KERNEL_FIT_NAME}${KERNEL_FIT_BIN_EXT} | ||
818 | if [ -n "${KERNEL_FIT_LINK_NAME}" ] ; then | ||
819 | ln -snf fitImage-linux.bin-${KERNEL_FIT_NAME}${KERNEL_FIT_BIN_EXT} "$deployDir/fitImage-linux.bin-${KERNEL_FIT_LINK_NAME}" | ||
820 | fi | ||
821 | fi | ||
822 | |||
823 | if [ -n "${INITRAMFS_IMAGE}" ]; then | ||
824 | bbnote "Copying fit-image-${INITRAMFS_IMAGE}.its source file..." | ||
825 | install -m 0644 ${B}/fit-image-${INITRAMFS_IMAGE}.its "$deployDir/fitImage-its-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_NAME}.its" | ||
826 | if [ -n "${KERNEL_FIT_LINK_NAME}" ] ; then | ||
827 | ln -snf fitImage-its-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_NAME}.its "$deployDir/fitImage-its-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_LINK_NAME}" | ||
828 | fi | ||
829 | |||
830 | if [ "${INITRAMFS_IMAGE_BUNDLE}" != "1" ]; then | ||
831 | bbnote "Copying fitImage-${INITRAMFS_IMAGE} file..." | ||
832 | install -m 0644 ${B}/${KERNEL_OUTPUT_DIR}/fitImage-${INITRAMFS_IMAGE} "$deployDir/fitImage-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_NAME}${KERNEL_FIT_BIN_EXT}" | ||
833 | if [ -n "${KERNEL_FIT_LINK_NAME}" ] ; then | ||
834 | ln -snf fitImage-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_NAME}${KERNEL_FIT_BIN_EXT} "$deployDir/fitImage-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_LINK_NAME}" | ||
835 | fi | ||
836 | fi | ||
837 | fi | ||
838 | fi | ||
839 | } | ||