summaryrefslogtreecommitdiffstats
path: root/classes/image_types_fsl.bbclass
diff options
context:
space:
mode:
Diffstat (limited to 'classes/image_types_fsl.bbclass')
-rw-r--r--classes/image_types_fsl.bbclass312
1 files changed, 312 insertions, 0 deletions
diff --git a/classes/image_types_fsl.bbclass b/classes/image_types_fsl.bbclass
new file mode 100644
index 0000000..dfa55e4
--- /dev/null
+++ b/classes/image_types_fsl.bbclass
@@ -0,0 +1,312 @@
1inherit image_types
2
3IMAGE_BOOTLOADER ?= "u-boot"
4
5# Handle u-boot suffixes
6UBOOT_SUFFIX ?= "bin"
7UBOOT_PADDING ?= "0"
8UBOOT_SUFFIX_SDCARD ?= "${UBOOT_SUFFIX}"
9
10#
11# Handles i.MX mxs bootstream generation
12#
13
14# IMX Bootlets Linux bootstream
15IMAGE_DEPENDS_linux.sb = "elftosb-native:do_populate_sysroot \
16 imx-bootlets:do_deploy \
17 virtual/kernel:do_deploy"
18IMAGE_LINK_NAME_linux.sb = ""
19IMAGE_CMD_linux.sb () {
20 kernel_bin="`readlink ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${MACHINE}.bin`"
21 kernel_dtb="`readlink ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${MACHINE}.dtb || true`"
22 linux_bd_file=imx-bootlets-linux.bd-${MACHINE}
23 if [ `basename $kernel_bin .bin` = `basename $kernel_dtb .dtb` ]; then
24 # When using device tree we build a zImage with the dtb
25 # appended on the end of the image
26 linux_bd_file=imx-bootlets-linux.bd-dtb-${MACHINE}
27 cat $kernel_bin $kernel_dtb \
28 > $kernel_bin-dtb
29 rm -f ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${MACHINE}.bin-dtb
30 ln -s $kernel_bin-dtb ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${MACHINE}.bin-dtb
31 fi
32
33 # Ensure the file is generated
34 rm -f ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.linux.sb
35 (cd ${DEPLOY_DIR_IMAGE}; elftosb -z -c $linux_bd_file -o ${IMAGE_NAME}.linux.sb)
36
37 # Remove the appended file as it is only used here
38 rm -f ${DEPLOY_DIR_IMAGE}/$kernel_bin-dtb
39}
40
41# IMX Bootlets barebox bootstream
42IMAGE_DEPENDS_barebox.mxsboot-sdcard = "elftosb-native:do_populate_sysroot \
43 u-boot-mxsboot-native:do_populate_sysroot \
44 imx-bootlets:do_deploy \
45 barebox:do_deploy"
46IMAGE_CMD_barebox.mxsboot-sdcard () {
47 barebox_bd_file=imx-bootlets-barebox_ivt.bd-${MACHINE}
48
49 # Ensure the files are generated
50 (cd ${DEPLOY_DIR_IMAGE}; rm -f ${IMAGE_NAME}.barebox.sb ${IMAGE_NAME}.barebox.mxsboot-sdcard; \
51 elftosb -f mx28 -z -c $barebox_bd_file -o ${IMAGE_NAME}.barebox.sb; \
52 mxsboot sd ${IMAGE_NAME}.barebox.sb ${IMAGE_NAME}.barebox.mxsboot-sdcard)
53}
54
55# U-Boot mxsboot generation to SD-Card
56UBOOT_SUFFIX_SDCARD_mxs ?= "mxsboot-sdcard"
57IMAGE_DEPENDS_uboot.mxsboot-sdcard = "u-boot-mxsboot-native:do_populate_sysroot \
58 u-boot:do_deploy"
59IMAGE_CMD_uboot.mxsboot-sdcard = "mxsboot sd ${DEPLOY_DIR_IMAGE}/u-boot-${MACHINE}.${UBOOT_SUFFIX} \
60 ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.uboot.mxsboot-sdcard"
61
62# Boot partition volume id
63BOOTDD_VOLUME_ID ?= "Boot ${MACHINE}"
64
65# Boot partition size [in KiB]
66BOOT_SPACE ?= "8192"
67
68# Barebox environment size [in KiB]
69BAREBOX_ENV_SPACE ?= "512"
70
71# Set alignment to 4MB [in KiB]
72IMAGE_ROOTFS_ALIGNMENT = "4096"
73
74IMAGE_DEPENDS_sdcard = "parted-native:do_populate_sysroot \
75 dosfstools-native:do_populate_sysroot \
76 mtools-native:do_populate_sysroot \
77 virtual/kernel:do_deploy \
78 ${@d.getVar('IMAGE_BOOTLOADER', True) and d.getVar('IMAGE_BOOTLOADER', True) + ':do_deploy' or ''}"
79
80SDCARD = "${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.sdcard"
81
82SDCARD_GENERATION_COMMAND_mxs = "generate_mxs_sdcard"
83SDCARD_GENERATION_COMMAND_mx25 = "generate_imx_sdcard"
84SDCARD_GENERATION_COMMAND_mx5 = "generate_imx_sdcard"
85SDCARD_GENERATION_COMMAND_mx6 = "generate_imx_sdcard"
86SDCARD_GENERATION_COMMAND_vf60 = "generate_imx_sdcard"
87
88#
89# Create an image that can by written onto a SD card using dd for use
90# with i.MX SoC family
91#
92# External variables needed:
93# ${SDCARD_ROOTFS} - the rootfs image to incorporate
94# ${IMAGE_BOOTLOADER} - bootloader to use {u-boot, barebox}
95#
96# The disk layout used is:
97#
98# 0 -> IMAGE_ROOTFS_ALIGNMENT - reserved to bootloader (not partitioned)
99# IMAGE_ROOTFS_ALIGNMENT -> BOOT_SPACE - kernel and other data
100# BOOT_SPACE -> SDIMG_SIZE - rootfs
101#
102# Default Free space = 1.3x
103# Use IMAGE_OVERHEAD_FACTOR to add more space
104# <--------->
105# 4MiB 8MiB SDIMG_ROOTFS 4MiB
106# <-----------------------> <----------> <----------------------> <------------------------------>
107# ------------------------ ------------ ------------------------ -------------------------------
108# | IMAGE_ROOTFS_ALIGNMENT | BOOT_SPACE | ROOTFS_SIZE | IMAGE_ROOTFS_ALIGNMENT |
109# ------------------------ ------------ ------------------------ -------------------------------
110# ^ ^ ^ ^ ^
111# | | | | |
112# 0 4096 4MiB + 8MiB 4MiB + 8Mib + SDIMG_ROOTFS 4MiB + 8MiB + SDIMG_ROOTFS + 4MiB
113generate_imx_sdcard () {
114 # Create partition table
115 parted -s ${SDCARD} mklabel msdos
116 parted -s ${SDCARD} unit KiB mkpart primary fat32 ${IMAGE_ROOTFS_ALIGNMENT} $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED})
117 parted -s ${SDCARD} unit KiB mkpart primary $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED}) $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED} \+ $ROOTFS_SIZE)
118 parted ${SDCARD} print
119
120 # Burn bootloader
121 case "${IMAGE_BOOTLOADER}" in
122 imx-bootlets)
123 bberror "The imx-bootlets is not supported for i.MX based machines"
124 exit 1
125 ;;
126 u-boot)
127 if [ -n "${SPL_BINARY}" ]; then
128 dd if=${DEPLOY_DIR_IMAGE}/${SPL_BINARY} of=${SDCARD} conv=notrunc seek=2 bs=512
129 dd if=${DEPLOY_DIR_IMAGE}/u-boot-${MACHINE}.${UBOOT_SUFFIX_SDCARD} of=${SDCARD} conv=notrunc seek=42 bs=1K
130 else
131 dd if=${DEPLOY_DIR_IMAGE}/u-boot-${MACHINE}.${UBOOT_SUFFIX_SDCARD} of=${SDCARD} conv=notrunc seek=2 skip=${UBOOT_PADDING} bs=512
132 fi
133 ;;
134 barebox)
135 dd if=${DEPLOY_DIR_IMAGE}/barebox-${MACHINE}.bin of=${SDCARD} conv=notrunc seek=1 skip=1 bs=512
136 dd if=${DEPLOY_DIR_IMAGE}/bareboxenv-${MACHINE}.bin of=${SDCARD} conv=notrunc seek=1 bs=512k
137 ;;
138 "")
139 ;;
140 *)
141 bberror "Unkown IMAGE_BOOTLOADER value"
142 exit 1
143 ;;
144 esac
145
146 # Create boot partition image
147 BOOT_BLOCKS=$(LC_ALL=C parted -s ${SDCARD} unit b print \
148 | awk '/ 1 / { print substr($4, 1, length($4 -1)) / 1024 }')
149 mkfs.vfat -n "${BOOTDD_VOLUME_ID}" -S 512 -C ${WORKDIR}/boot.img $BOOT_BLOCKS
150 mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${MACHINE}.bin ::/${KERNEL_IMAGETYPE}
151
152 # Copy boot scripts
153 for item in ${BOOT_SCRIPTS}; do
154 src=`echo $item | awk -F':' '{ print $1 }'`
155 dst=`echo $item | awk -F':' '{ print $2 }'`
156
157 mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/$src ::/$dst
158 done
159
160 # Copy device tree file
161 if test -n "${KERNEL_DEVICETREE}"; then
162 for DTS_FILE in ${KERNEL_DEVICETREE}; do
163 DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." '{print $1}'`
164 if [ -e "${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb" ]; then
165 kernel_bin="`readlink ${KERNEL_IMAGETYPE}-${MACHINE}.bin`"
166 kernel_bin_for_dtb="`readlink ${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb | sed "s,$DTS_BASE_NAME,${MACHINE},g;s,\.dtb$,.bin,g"`"
167 if [ $kernel_bin = $kernel_bin_for_dtb ]; then
168 mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb ::/${DTS_BASE_NAME}.dtb
169 fi
170 fi
171 done
172 fi
173
174 # Burn Partition
175 dd if=${WORKDIR}/boot.img of=${SDCARD} conv=notrunc seek=1 bs=$(expr ${IMAGE_ROOTFS_ALIGNMENT} \* 1024) && sync && sync
176 dd if=${SDCARD_ROOTFS} of=${SDCARD} conv=notrunc seek=1 bs=$(expr ${BOOT_SPACE_ALIGNED} \* 1024 + ${IMAGE_ROOTFS_ALIGNMENT} \* 1024) && sync && sync
177}
178
179#
180# Create an image that can by written onto a SD card using dd for use
181# with i.MXS SoC family
182#
183# External variables needed:
184# ${SDCARD_ROOTFS} - the rootfs image to incorporate
185# ${IMAGE_BOOTLOADER} - bootloader to use {imx-bootlets, u-boot}
186#
187generate_mxs_sdcard () {
188 # Create partition table
189 parted -s ${SDCARD} mklabel msdos
190
191 case "${IMAGE_BOOTLOADER}" in
192 imx-bootlets)
193 # The disk layout used is:
194 #
195 # 0 -> 1024 - Unused (not partitioned)
196 # 1024 -> BOOT_SPACE - kernel and other data (bootstream)
197 # BOOT_SPACE -> SDIMG_SIZE - rootfs
198 #
199 # Default Free space = 1.3x
200 # Use IMAGE_OVERHEAD_FACTOR to add more space
201 # <--------->
202 # 1024 8MiB SDIMG_ROOTFS 4MiB
203 # <-------> <----------> <----------------------> <------------------------------>
204 # --------------------- ------------------------ -------------------------------
205 # | Unused | BOOT_SPACE | ROOTFS_SIZE | IMAGE_ROOTFS_ALIGNMENT |
206 # --------------------- ------------------------ -------------------------------
207 # ^ ^ ^ ^ ^
208 # | | | | |
209 # 0 1024 1024 + 8MiB 1024 + 8Mib + SDIMG_ROOTFS 1024 + 8MiB + SDIMG_ROOTFS + 4MiB
210 parted -s ${SDCARD} unit KiB mkpart primary 1024 $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED})
211 parted -s ${SDCARD} unit KiB mkpart primary $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED}) $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED} \+ $ROOTFS_SIZE)
212
213 # Empty 4 bytes from boot partition
214 dd if=/dev/zero of=${SDCARD} conv=notrunc seek=2048 count=4
215
216 # Write the bootstream in (2048 + 4) bytes
217 dd if=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.linux.sb of=${SDCARD} conv=notrunc seek=1 seek=2052
218 ;;
219 u-boot)
220 # The disk layout used is:
221 #
222 # 1M - 2M - reserved to bootloader and other data
223 # 2M - BOOT_SPACE - kernel
224 # BOOT_SPACE - SDCARD_SIZE - rootfs
225 #
226 # The disk layout used is:
227 #
228 # 1M -> 2M - reserved to bootloader and other data
229 # 2M -> BOOT_SPACE - kernel and other data
230 # BOOT_SPACE -> SDIMG_SIZE - rootfs
231 #
232 # Default Free space = 1.3x
233 # Use IMAGE_OVERHEAD_FACTOR to add more space
234 # <--------->
235 # 4MiB 8MiB SDIMG_ROOTFS 4MiB
236 # <-----------------------> <-------------> <----------------------> <------------------------------>
237 # ---------------------------------------- ------------------------ -------------------------------
238 # | | | |ROOTFS_SIZE | IMAGE_ROOTFS_ALIGNMENT |
239 # ---------------------------------------- ------------------------ -------------------------------
240 # ^ ^ ^ ^ ^ ^ ^
241 # | | | | | | |
242 # 0 1M 2M 4M 4MiB + BOOTSPACE 4MiB + BOOTSPACE + SDIMG_ROOTFS 4MiB + BOOTSPACE + SDIMG_ROOTFS + 4MiB
243 #
244 parted -s ${SDCARD} unit KiB mkpart primary 1024 2048
245 parted -s ${SDCARD} unit KiB mkpart primary 2048 $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED})
246 parted -s ${SDCARD} unit KiB mkpart primary $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED}) $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED} \+ $ROOTFS_SIZE)
247
248 dd if=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.uboot.mxsboot-sdcard of=${SDCARD} conv=notrunc seek=1 skip=${UBOOT_PADDING} bs=$(expr 1024 \* 1024)
249 BOOT_BLOCKS=$(LC_ALL=C parted -s ${SDCARD} unit b print \
250 | awk '/ 2 / { print substr($4, 1, length($4 -1)) / 1024 }')
251
252 mkfs.vfat -n "${BOOTDD_VOLUME_ID}" -S 512 -C ${WORKDIR}/boot.img $BOOT_BLOCKS
253 mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${MACHINE}.bin ::/${KERNEL_IMAGETYPE}
254 if test -n "${KERNEL_DEVICETREE}"; then
255 for DTS_FILE in ${KERNEL_DEVICETREE}; do
256 DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." '{print $1}'`
257 if [ -e "${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb" ]; then
258 kernel_bin="`readlink ${KERNEL_IMAGETYPE}-${MACHINE}.bin`"
259 kernel_bin_for_dtb="`readlink ${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb | sed "s,$DTS_BASE_NAME,${MACHINE},g;s,\.dtb$,.bin,g"`"
260 if [ $kernel_bin = $kernel_bin_for_dtb ]; then
261 mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb ::/${DTS_BASE_NAME}.dtb
262 fi
263 fi
264 done
265 fi
266
267 dd if=${WORKDIR}/boot.img of=${SDCARD} conv=notrunc seek=2 bs=$(expr 1024 \* 1024)
268 ;;
269 barebox)
270 # BAREBOX_ENV_SPACE is taken on BOOT_SPACE_ALIGNED but it doesn't really matter as long as the rootfs is aligned
271 parted -s ${SDCARD} unit KiB mkpart primary 1024 $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED} - ${BAREBOX_ENV_SPACE})
272 parted -s ${SDCARD} unit KiB mkpart primary $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED} - ${BAREBOX_ENV_SPACE}) $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED})
273 parted -s ${SDCARD} unit KiB mkpart primary $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED}) $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED} \+ $ROOTFS_SIZE)
274
275 dd if=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.barebox.mxsboot-sdcard of=${SDCARD} conv=notrunc seek=1 bs=$(expr 1024 \* 1024)
276 dd if=${DEPLOY_DIR_IMAGE}/bareboxenv-${MACHINE}.bin of=${SDCARD} conv=notrunc seek=$(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED} - ${BAREBOX_ENV_SPACE}) bs=1024
277 ;;
278 *)
279 bberror "Unkown IMAGE_BOOTLOADER value"
280 exit 1
281 ;;
282 esac
283
284 # Change partition type for mxs processor family
285 bbnote "Setting partition type to 0x53 as required for mxs' SoC family."
286 echo -n S | dd of=${SDCARD} bs=1 count=1 seek=450 conv=notrunc
287
288 parted ${SDCARD} print
289
290 dd if=${SDCARD_ROOTFS} of=${SDCARD} conv=notrunc seek=1 bs=$(expr ${BOOT_SPACE_ALIGNED} \* 1024 + ${IMAGE_ROOTFS_ALIGNMENT} \* 1024) && sync && sync
291}
292
293IMAGE_CMD_sdcard () {
294 if [ -z "${SDCARD_ROOTFS}" ]; then
295 bberror "SDCARD_ROOTFS is undefined. To use sdcard image from Freescale's BSP it needs to be defined."
296 exit 1
297 fi
298
299 # Align boot partition and calculate total SD card image size
300 BOOT_SPACE_ALIGNED=$(expr ${BOOT_SPACE} + ${IMAGE_ROOTFS_ALIGNMENT} - 1)
301 BOOT_SPACE_ALIGNED=$(expr ${BOOT_SPACE_ALIGNED} - ${BOOT_SPACE_ALIGNED} % ${IMAGE_ROOTFS_ALIGNMENT})
302 SDCARD_SIZE=$(expr ${IMAGE_ROOTFS_ALIGNMENT} + ${BOOT_SPACE_ALIGNED} + $ROOTFS_SIZE + ${IMAGE_ROOTFS_ALIGNMENT})
303
304 # Initialize a sparse file
305 dd if=/dev/zero of=${SDCARD} bs=1 count=0 seek=$(expr 1024 \* ${SDCARD_SIZE})
306
307 ${SDCARD_GENERATION_COMMAND}
308}
309
310# The sdcard requires the rootfs filesystem to be built before using
311# it so we must make this dependency explicit.
312IMAGE_TYPEDEP_sdcard = "${@d.getVar('SDCARD_ROOTFS', 1).split('.')[-1]}"