[meta-xilinx] [PATCH] image_types_zynq.bbclass: introduce an SD/eMMC image creation class

Jean-Francois Dagenais jeff.dagenais at gmail.com
Mon Mar 13 10:04:02 PDT 2017


To use, from your machine conf or local.conf:
* Inherit this class
* define IMAGE_FSTYPES = "sdcard"     (or sdcard.gz)
* fix the u-boot uEnv in order to specify the roots on the /dev/mmcblk0p2

Signed-off-by: Jean-Francois Dagenais <jeff.dagenais at gmail.com>
---
 README.booting.md                |   4 ++
 classes/image_types_zynq.bbclass | 105 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 109 insertions(+)
 create mode 100644 classes/image_types_zynq.bbclass

diff --git a/README.booting.md b/README.booting.md
index a22ddb7..92c3674 100644
--- a/README.booting.md
+++ b/README.booting.md
@@ -133,6 +133,10 @@ Loading via SD
 **(Note: This section only applies to Zynq.)**
 
 ### Preparing SD/MMC
+
+Check out classes/image_types_zynq.bbclass to automatically generate an sdcard
+image. (It is untested on zynqmp at this moment.) Otherwise, proceed manually:
+
 Setup the card with the first partition formatted as FAT16. If you intend to
 boot with the root filesystem located on the SD card, also create a second
 partition formatted as EXT4.
diff --git a/classes/image_types_zynq.bbclass b/classes/image_types_zynq.bbclass
new file mode 100644
index 0000000..3ebc24b
--- /dev/null
+++ b/classes/image_types_zynq.bbclass
@@ -0,0 +1,105 @@
+# !!! UNLESS EXPLICITELY MENTIONNED, NUMBERS ARE IN BYTES
+# Mind alignments!
+
+inherit image_types
+
+IMAGE_BOOTLOADER ?= "u-boot-xlnx"
+
+# Boot partition volume id
+BOOTDD_VOLUME_ID = "ZBOOT"
+
+# Last byte of the boot partition (30M mark in bytes, MB aligned -1 byte)
+BOOT_PART_END = "31457279"
+
+# Skip the fist 4MB on the card
+BOOT_PART_BEGIN = "4194304"
+
+do_image_sdcard[depends] += "\
+    parted-native:do_populate_sysroot \
+    dosfstools-native:do_populate_sysroot \
+    mtools-native:do_populate_sysroot \
+    virtual/kernel:do_deploy \
+    ${@d.getVar('IMAGE_BOOTLOADER', True) and d.getVar('IMAGE_BOOTLOADER', True) + ':do_deploy' or ''} \
+    ${@d.getVar('INITRD_IMAGE', True) and d.getVar('INITRD_IMAGE', True) + ':do_image_complete' or ''} \
+"
+
+# The sdcard image file is no longer a ".rootfs", so override this suffix.
+# this line fixes symlinks source files:
+do_image_sdcard[imgsuffix] = "."
+# this line fixes the gz(or others) auto compression stuff
+IMAGE_NAME_SUFFIX_sdcard = ""
+
+# The sdcard requires the ext4 rootfs filesystem to be built before
+# using it so we must make this dependency explicit.
+IMAGE_TYPEDEP_sdcard += "ext4"
+
+create_partition_table() {
+    parted -s ${sdcardFile} mklabel msdos
+    parted -s --align none  ${sdcardFile} mkpart primary fat32 ${BOOT_PART_BEGIN}B ${BOOT_PART_END}B
+
+    local rootfsOffset=$(expr ${BOOT_PART_END} + 1)
+    parted -s --align none ${sdcardFile} mkpart primary ext2 ${rootfsOffset}B 100%
+}
+
+generate_temp_boot_image() {
+    # Create boot partition image
+    bootPartSize=$(expr ${BOOT_PART_END} - ${BOOT_PART_BEGIN} + 1)
+
+    truncate -s $bootPartSize $tempBootImage
+    echo "bootPartSize: $bootPartSize"
+    export MTOOLS_SKIP_CHECK=1
+
+    mkfs.vfat -n "${BOOTDD_VOLUME_ID}" -S 512 ${FATSIZE} $tempBootImage
+
+    # conditionnaly copy initrd image
+    if [ -n "${INITRD_IMAGE}" ]; then
+        mcopy -i $tempBootImage -s ${DEPLOY_DIR_IMAGE}/${INITRD_IMAGE}.cpio.gz.u-boot ::/image-initramfs-${MACHINE}.cpio.gz.u-boot
+    fi
+
+    # Copy boot files
+    for fileToWrite in ${IMAGE_BOOT_FILES}; do
+        if [ ! -e "${DEPLOY_DIR_IMAGE}/${fileToWrite}" ]; then
+            bbfatal "${DEPLOY_DIR_IMAGE}/${fileToWrite} does not exist."
+            exit 1
+        fi
+
+        mcopy -i $tempBootImage -s ${DEPLOY_DIR_IMAGE}/${fileToWrite} ::/${fileToWrite}
+    done
+}
+
+write_images_to_partitions() {
+    # dd in chunks of 1MB
+    blockSize=1048576
+
+    bootPartOffset=$(expr ${BOOT_PART_BEGIN} / $blockSize)
+
+    cat $tempBootImage $rootfsImage | dd of=${sdcardFile} conv=notrunc,fsync seek=$bootPartOffset bs=$blockSize
+}
+
+IMAGE_CMD_sdcard () {
+	# this fabricated rootfs.ext4 name depends on the definition we set in our layer.conf
+	# see IMAGE_LINK_NAME in there. We can use it since here *_sdcard overrides are in
+	# effect, so the ".rootfs" part is missing for .sdcard
+	rootfsImage="${IMGDEPLOYDIR}/${IMAGE_BASENAME}.ext4"
+	rootfsImage=$(readlink -f ${rootfsImage})
+
+	if [ ! -e "${rootfsImage}" ]; then
+		bberror "${rootfsImage} doesn't exist, cannot proceed."
+		exit 1
+	fi
+
+	local rootfsSize=$(du -b --apparent-size $rootfsImage | xargs |cut -d' ' -f1)
+	sdcardFile="${IMGDEPLOYDIR}/${IMAGE_NAME}.sdcard"
+
+	# Initialize a sparse file
+	# +1 because the BOOT_PART_END is the last byte occupied, not the size.
+	local sdCardFileSize=$(expr ${BOOT_PART_END} + 1 + $rootfsSize)
+	truncate -s $sdCardFileSize ${sdcardFile}
+
+	create_partition_table
+
+	tempBootImage="${WORKDIR}/boot.img"
+	generate_temp_boot_image
+
+	write_images_to_partitions
+}
-- 
2.1.4




More information about the meta-xilinx mailing list