summaryrefslogtreecommitdiffstats
path: root/meta-sota/classes/image_types_ota.bbclass
blob: bb55e615112711c161d68e785fdc091a26ec805d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# Image to use with u-boot as BIOS and OSTree deployment system

#inherit image_types

# Boot filesystem size in MiB
# OSTree updates may require some space on boot file system for
# boot scripts, kernel and initramfs images
#
BOOTFS_EXTRA_SIZE ?= "512"
export BOOTFS_EXTRA_SIZE

do_otaimg[depends] += "e2fsprogs-native:do_populate_sysroot \
		       parted-native:do_populate_sysroot \
		       virtual/kernel:do_deploy \
		       virtual/bootloader:do_deploy \
		       ${INITRD_IMAGE}:do_image_cpio \
		       ${PN}:do_image_ext4"

ROOTFS ?= "${DEPLOY_DIR_IMAGE}/${IMAGE_BASENAME}-${MACHINE}.ext4"
INITRD_IMAGE ?= "core-image-minimal-initramfs"
INITRD ?= "${DEPLOY_DIR_IMAGE}/${INITRD_IMAGE}-${MACHINE}.cpio.gz"

build_bootfs () {
	KERNEL_FILE=${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE} 
	KERNEL_SIZE=`du -Lbs ${KERNEL_FILE} | cut -f 1`

	RAMDISK_FILE=${DEPLOY_DIR_IMAGE}/${INITRD_IMAGE}-${MACHINE}.cpio.gz 
	RAMDISK_SIZE=`du -Lbs ${RAMDISK_FILE} | cut -f 1`

	EXTRA_BYTES=$(expr $BOOTFS_EXTRA_SIZE \* 1024 \* 1024)

	TOTAL_SIZE=$(expr ${KERNEL_SIZE} \+ ${RAMDISK_SIZE} \+ ${EXTRA_BYTES})
	TOTAL_BLOCKS=$(expr 1 \+ $TOTAL_SIZE / 1024)

	dd if=/dev/zero of=$1 bs=1024 count=${TOTAL_BLOCKS}
	BOOTTMP=$(mktemp -d mkotaboot-XXX) 
	cp ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE} ${BOOTTMP}
	cp ${DEPLOY_DIR_IMAGE}/${INITRD_IMAGE}-${MACHINE}.cpio.gz ${BOOTTMP}
	mkfs.ext4 $1 -d ${BOOTTMP}
	rm -rf $BOOTTMP
}

do_otaimg () {
	BOOTIMG=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.otaboot.ext4
	rm -f $BOOTIMG
	build_bootfs $BOOTIMG

	ROOTIMG=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ext4

	BOOTFSBLOCKS=`du -bks ${BOOTIMG} | cut -f 1`

	ROOTFSBLOCKS=`du -bks ${ROOTIMG} | cut -f 1`
	TOTALSIZE=`expr $BOOTFSBLOCKS \+ $ROOTFSBLOCKS`
	END1=`expr $BOOTFSBLOCKS \* 1024`
	END2=`expr $END1 + 512`
	END3=`expr \( $ROOTFSBLOCKS \* 1024 \) + $END1`

	FULLIMG=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.otaimg
	rm -rf ${FULLIMG}

	dd if=/dev/zero of=${FULLIMG} bs=1024 seek=${TOTALSIZE} count=1
	parted ${FULLIMG} mklabel msdos 
	parted ${FULLIMG} mkpart primary ext4 0 ${END1}B
	parted ${FULLIMG} unit B mkpart primary ext4 ${END2}B ${END3}B

	OFFSET=`expr $END2 / 512`

	dd if=${BOOTIMG} of=${FULLIMG} conv=notrunc seek=1 bs=512
	dd if=${ROOTIMG} of=${FULLIMG} conv=notrunc seek=$OFFSET bs=512

	cd ${DEPLOY_DIR_IMAGE}
	rm -f ${IMAGE_LINK_NAME}.otaimg
	ln -s ${IMAGE_NAME}.otaimg ${IMAGE_LINK_NAME}.otaimg
}

addtask otaimg before do_build

IMAGE_TYPES += " otaimg"
IMAGE_TYPES_MASKED += "otaimg"
IMAGE_TYPEDEP_otaimg = "ext4"