aboutsummaryrefslogtreecommitdiffstats
path: root/classes/rockchip-gpt-img.bbclass
blob: 123b56bb7d784a23c06be1c1194cfc8059ba3b0a (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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# Copyright (C) 2017 Fuzhou Rockchip Electronics Co., Ltd
# Copyright (C) 2017 Trevor Woerner <twoerner@gmail.com>
# Released under the MIT license (see COPYING.MIT for the terms)

inherit image_types

# Use an uncompressed ext4 by default as rootfs
IMG_ROOTFS_TYPE = "ext4"
IMG_ROOTFS = "${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${IMG_ROOTFS_TYPE}"

# This image depends on the rootfs image
IMAGE_TYPEDEP_rockchip-gpt-img = "${IMG_ROOTFS_TYPE}"

GPTIMG         = "${IMAGE_NAME}-gpt.img"
GPTIMG_SYMLK   = "${IMAGE_BASENAME}-${MACHINE}-gpt.img"
GPTIMG_SIZE   ?= "4096"
BOOT_IMG       = "boot.img"
BOOTIMG_SYMLK  = "${IMAGE_BASENAME}-${MACHINE}-${BOOT_IMG}"
MINILOADER     = "loader.bin"
UBOOT          = "u-boot.out"
TRUST          = "trust.out"
GPTIMG_APPEND ?= "console=tty1 console=ttyS2,115200n8 rw root=/dev/mmcblk2p7 rootfstype=ext4 init=/sbin/init"
GPTIMG_APPEND_tinker-rk3288 = "console=tty1 console=ttyS2,115200n8 rw root=/dev/mmcblk0p7 rootfstype=ext4 init=/sbin/init"

# default partitions [in Sectors]
# More info at http://rockchip.wikidot.com/partitions
LOADER1_SIZE = "8000"
RESERVED1_SIZE = "128"
RESERVED2_SIZE = "8192"
LOADER2_SIZE = "8192"
ATF_SIZE = "8192"
BOOT_SIZE = "229376"

do_image_rockchip_gpt_img[depends] = "parted-native:do_populate_sysroot \
	u-boot-mkimage-native:do_populate_sysroot \
	mtools-native:do_populate_sysroot \
	dosfstools-native:do_populate_sysroot \
	virtual/kernel:do_deploy \
	virtual/bootloader:do_deploy"

PER_CHIP_IMG_GENERATION_COMMAND_rk3288 = "generate_rk3288_loader1_image"

IMAGE_CMD_rockchip-gpt-img () {
	# Change to image directory
	cd ${DEPLOY_DIR_IMAGE}

	# Remove the existing image symlinks
	rm -f "${GPTIMG_SYMLK}"
	rm -f "${BOOTIMG_SYMLK}"

	create_rk_image

	${PER_CHIP_IMG_GENERATION_COMMAND}

	# create symlink to full GPT image
	cd ${DEPLOY_DIR_IMAGE}
	ln -s ${GPTIMG} ${GPTIMG_SYMLK}

	# create per-build boot.img with symlink
	cd ${DEPLOY_DIR_IMAGE}
	rm -f ${IMAGE_NAME}-boot.img
	if [ -f ${WORKDIR}/${BOOT_IMG} ]; then
		cp ${WORKDIR}/${BOOT_IMG} ${IMAGE_NAME}-boot.img
	fi
	ln -s ${IMAGE_NAME}-boot.img ${BOOTIMG_SYMLK}
}

create_rk_image () {

	# Initialize sdcard image file
	dd if=/dev/zero of=${GPTIMG} bs=1M count=0 seek=${GPTIMG_SIZE}

	# Create partition table
	parted -s ${GPTIMG} mklabel gpt

	# Create vendor defined partitions
	LOADER1_START=64
	RESERVED1_START=`expr ${LOADER1_START}  + ${LOADER1_SIZE}`
	RESERVED2_START=`expr ${RESERVED1_START}  + ${RESERVED1_SIZE}`
	LOADER2_START=`expr ${RESERVED2_START}  + ${RESERVED2_SIZE}`
	ATF_START=`expr ${LOADER2_START}  + ${LOADER2_SIZE}`
	BOOT_START=`expr ${ATF_START}  + ${ATF_SIZE}`
	ROOTFS_START=`expr ${BOOT_START}  + ${BOOT_SIZE}`

	parted -s ${GPTIMG} unit s mkpart loader1 ${LOADER1_START} `expr ${RESERVED1_START} - 1`
	parted -s ${GPTIMG} unit s mkpart reserved1 ${RESERVED1_START} `expr ${RESERVED2_START} - 1`
	parted -s ${GPTIMG} unit s mkpart reserved2 ${RESERVED2_START} `expr ${LOADER2_START} - 1`
	parted -s ${GPTIMG} unit s mkpart loader2 ${LOADER2_START} `expr ${ATF_START} - 1`
	parted -s ${GPTIMG} unit s mkpart atf ${ATF_START} `expr ${BOOT_START} - 1`

	# Create boot partition and mark it as bootable
	parted -s ${GPTIMG} unit s mkpart boot ${BOOT_START} `expr ${ROOTFS_START} - 1`
	parted -s ${GPTIMG} set 6 boot on

	# Create rootfs partition
	parted -s ${GPTIMG} unit s mkpart root ${ROOTFS_START} 100%

	parted ${GPTIMG} print

	# Delete the boot image to avoid trouble with the build cache
	rm -f ${WORKDIR}/${BOOT_IMG}

	# Create boot partition image
	BOOT_BLOCKS=$(LC_ALL=C parted -s ${GPTIMG} unit b print | awk '/ 6 / { print substr($4, 1, length($4 -1)) / 512 /2 }')
	BOOT_BLOCKS=`expr $BOOT_BLOCKS / 63 \* 63`

	mkfs.vfat -n "boot" -S 512 -C ${WORKDIR}/${BOOT_IMG} $BOOT_BLOCKS
	mcopy -i ${WORKDIR}/${BOOT_IMG} -s ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${MACHINE}.bin ::${KERNEL_IMAGETYPE}

	DEVICETREE_DEFAULT=""
	for DTS_FILE in ${KERNEL_DEVICETREE}; do
		[ -n "${DEVICETREE_DEFAULT}"] && DEVICETREE_DEFAULT="${DTS_FILE}"
		mcopy -i ${WORKDIR}/${BOOT_IMG} -s ${DEPLOY_DIR_IMAGE}/${DTS_FILE} ::${DTS_FILE}
	done

	# Create extlinux config file
	cat > ${WORKDIR}/extlinux.conf <<EOF
default yocto

label yocto
	kernel /${KERNEL_IMAGETYPE}
	devicetree /${DEVICETREE_DEFAULT}
	append ${GPTIMG_APPEND}
EOF

	mmd -i ${WORKDIR}/${BOOT_IMG} ::/extlinux
	mcopy -i ${WORKDIR}/${BOOT_IMG} -s ${WORKDIR}/extlinux.conf ::/extlinux/

	# Burn Boot Partition
	dd if=${WORKDIR}/${BOOT_IMG} of=${GPTIMG} conv=notrunc,fsync seek=${BOOT_START}

	# Burn Rootfs Partition
	dd if=${IMG_ROOTFS} of=${GPTIMG} seek=${ROOTFS_START}

}

generate_rk3288_loader1_image () {

	# Burn bootloader
	mkimage -n rk3288 -T rksd -d ${DEPLOY_DIR_IMAGE}/${SPL_BINARY} ${WORKDIR}/${UBOOT}
	cat ${DEPLOY_DIR_IMAGE}/u-boot-${MACHINE}.bin >>  ${WORKDIR}/${UBOOT}
	dd if=${WORKDIR}/${UBOOT} of=${GPTIMG} conv=notrunc,fsync seek=64

}