[meta-xilinx] [PATCH] image_types_zynq.bbclass: introduce an SD/eMMC image creation class
Nathan Rossi
nathan at nathanrossi.com
Tue Mar 14 05:24:48 PDT 2017
On 14 March 2017 at 03:04, Jean-Francois Dagenais
<jeff.dagenais at gmail.com> wrote:
> 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
I am not sure if you were aware but there is a tool that is part of OE
called 'wic' that can be used for creating complete disk images like
you have done in this bbclass.
http://www.yoctoproject.org/docs/latest/dev-manual/dev-manual.html#creating-partitioned-images
There is an example which approximately resembles your sdcard layout
here: http://git.openembedded.org/openembedded-core/tree/scripts/lib/wic/canned-wks/sdimage-bootpart.wks.
The "bootimg-partition" populates from files defined by the
"IMAGE_BOOT_FILES" variable. e.g.
http://git.yoctoproject.org/cgit/cgit.cgi/meta-xilinx/tree/conf/machine/zc702-zynq7.conf#n27
Regards,
Nathan
>
> 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
>
> --
> _______________________________________________
> meta-xilinx mailing list
> meta-xilinx at yoctoproject.org
> https://lists.yoctoproject.org/listinfo/meta-xilinx
More information about the meta-xilinx
mailing list