From bfdb9464380d36330ded10a10ac8339d818d43b5 Mon Sep 17 00:00:00 2001 From: Dalon Westergreen Date: Mon, 18 Apr 2016 20:37:49 -0700 Subject: Add support for sdcard generation for C5/A5 --- classes/image_types_socfpga.bbclass | 123 ++++++++++++++++++++++++++++++++++++ conf/machine/arria5.conf | 5 +- conf/machine/cyclone5.conf | 8 ++- 3 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 classes/image_types_socfpga.bbclass diff --git a/classes/image_types_socfpga.bbclass b/classes/image_types_socfpga.bbclass new file mode 100644 index 0000000..579bc5a --- /dev/null +++ b/classes/image_types_socfpga.bbclass @@ -0,0 +1,123 @@ +inherit image_types + +IMAGE_BOOTLOADER ?= "u-boot-socfpga" +SDCARD_ROOTFS ?= "${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ext3" + +# Boot partition size [in KiB] +IMAGE_ROOTFS_ALIGNMENT_cyclone5 ?= "2048" +IMAGE_ROOTFS_ALIGNMENT_arria5 ?= "2048" +IMAGE_ROOTFS_ALIGNMENT_arria10 ?= "10240" + +BOOT_SPACE ?= "102400" + +IMAGE_DEPENDS_sdcard = "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 ''}" + +SDCARD_GENERATION_COMMAND_cyclone5 = "generate_28nm_sdcard" +SDCARD_GENERATION_COMMAND_arria5 = "generate_28nm_sdcard" + +# +# Generate the boot image with the boot scripts and required Device Tree +# files +_generate_boot_image() { + local boot_part=$1 + + # Create boot partition image + BOOT_BLOCKS=$(LC_ALL=C parted -s ${SDCARD} unit b print \ + | awk "/ $boot_part / { print substr(\$4, 1, length(\$4 -1)) / 1024 }") + + # mkdosfs will sometimes use FAT16 when it is not appropriate, + # resulting in a boot failure from SYSLINUX. Use FAT32 for + # images larger than 512MB, otherwise let mkdosfs decide. + if [ $(expr $BOOT_BLOCKS / 1024) -gt 512 ]; then + FATSIZE="-F 32" + fi + + rm -f ${WORKDIR}/boot.img + mkfs.vfat -n "${BOOTDD_VOLUME_ID}" -S 512 ${FATSIZE} -C ${WORKDIR}/boot.img $BOOT_BLOCKS + + mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${MACHINE}.bin ::/${KERNEL_IMAGETYPE} + + # Copy boot scripts + for item in ${BOOT_SCRIPTS}; do + src=`echo $item | awk -F':' '{ print $1 }'` + dst=`echo $item | awk -F':' '{ print $2 }'` + + mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/$src ::/$dst + done + + # Copy device tree file + if test -n "${KERNEL_DEVICETREE}"; then + for DTS_FILE in ${KERNEL_DEVICETREE}; do + DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." '{print $1}'` + if [ -e "${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb" ]; then + kernel_bin="`readlink ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${MACHINE}.bin`" + kernel_bin_for_dtb="`readlink ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb | sed "s,$DTS_BASE_NAME,${MACHINE},g;s,\.dtb$,.bin,g"`" + if [ $kernel_bin = $kernel_bin_for_dtb ]; then + mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb ::/${DTS_BASE_NAME}.dtb + fi + else + bbfatal "${DTS_FILE} does not exist." + fi + done + fi +} + +generate_28nm_sdcard () { + # Create partition table + parted -s ${SDCARD} mklabel msdos + parted -s ${SDCARD} unit KiB mkpart primary fat32 ${IMAGE_ROOTFS_ALIGNMENT} $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED}) + parted -s ${SDCARD} unit KiB mkpart primary $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED}) $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED} \+ $ROOTFS_SIZE) + parted -s ${SDCARD} unit KiB mkpart primary 1024 2048 + + #set part 3 to type a2 for spl / uboot image + echo -ne "\xa2" | dd of=${SDCARD} bs=1 count=1 seek=482 conv=notrunc + + + if [ -e "${DEPLOY_DIR_IMAGE}/${SPL_BINARY}-${UBOOT_CONFIG}" ] + then + dd if=${DEPLOY_DIR_IMAGE}/${SPL_BINARY}-${UBOOT_CONFIG} of=${SDCARD} conv=notrunc seek=1 bs=$(expr 1024 \* 1024) + elsif [ -e "${DEPLOY_DIR_IMAGE}/${SPL_BINARY}-${UBOOT_CONFIG}" ] + then + dd if=${DEPLOY_DIR_IMAGE}/${SPL_BINARY} of=${SDCARD} conv=notrunc seek=1 bs=$(expr 1024 \* 1024) + else + bbfatal "${SPL_BINARY} does not exist." + fi + + parted ${SDCARD} print + + _generate_boot_image 1 + # Burn Partition + dd if=${WORKDIR}/boot.img of=${SDCARD} conv=notrunc,fsync seek=1 bs=$(expr ${IMAGE_ROOTFS_ALIGNMENT} \* 1024) + dd if=${SDCARD_ROOTFS} of=${SDCARD} conv=notrunc,fsync seek=1 bs=$(expr ${BOOT_SPACE_ALIGNED} \* 1024 + ${IMAGE_ROOTFS_ALIGNMENT} \* 1024) +} + +IMAGE_CMD_sdcard () { + if [ -z "${SDCARD_ROOTFS}" ]; then + bberror "SDCARD_ROOTFS is undefined. To use sdcard image from Freescale's BSP it needs to be defined." + exit 1 + fi + + # Align boot partition and calculate total SD card image size + BOOT_SPACE_ALIGNED=$(expr ${BOOT_SPACE} + ${IMAGE_ROOTFS_ALIGNMENT} - 1) + BOOT_SPACE_ALIGNED=$(expr ${BOOT_SPACE_ALIGNED} - ${BOOT_SPACE_ALIGNED} % ${IMAGE_ROOTFS_ALIGNMENT}) + SDCARD_SIZE=$(expr ${IMAGE_ROOTFS_ALIGNMENT} + ${BOOT_SPACE_ALIGNED} + $ROOTFS_SIZE + ${IMAGE_ROOTFS_ALIGNMENT}) + + # Initialize a sparse file + if [ "x${UBOOT_CONFIG}" != "x" ] + then + SDCARD="${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}-${UBOOT_CONFIG}.rootfs.sdcard" + else + SDCARD="${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.sdcard" + fi + dd if=/dev/zero of=${SDCARD} bs=1 count=0 seek=$(expr 1024 \* ${SDCARD_SIZE}) + + ${SDCARD_GENERATION_COMMAND} +} + +# The sdcard requires the rootfs filesystem to be built before using +# it so we must make this dependency explicit. +IMAGE_TYPEDEP_sdcard = "${@d.getVar('SDCARD_ROOTFS', 1).split('.')[-1]}" \ No newline at end of file diff --git a/conf/machine/arria5.conf b/conf/machine/arria5.conf index 1cd460d..f3a0a34 100644 --- a/conf/machine/arria5.conf +++ b/conf/machine/arria5.conf @@ -6,7 +6,7 @@ require conf/machine/include/socfpga.inc PREFERRED_VERSION_u-boot-socfpga ?= "2016.03%" -UBOOT_CONFIG ?= "arria5-socdk" +UBOOT_CONFIG ??= "arria5-socdk" UBOOT_CONFIG[arria5-socdk] = "socfpga_arria5_defconfig,sdcard" @@ -14,3 +14,6 @@ KMACHINE = "arria5" # Default kernel devicetrees KERNEL_DEVICETREE_arria5 ?= "socfpga_arria5_socdk.dtb" + +# Add support for SDCARD creation +IMAGE_CLASSES += "image_types_socfpga diff --git a/conf/machine/cyclone5.conf b/conf/machine/cyclone5.conf index 7f39d39..941005b 100644 --- a/conf/machine/cyclone5.conf +++ b/conf/machine/cyclone5.conf @@ -8,8 +8,8 @@ PREFERRED_VERSION_u-boot-socfpga ?= "2016.03%" UBOOT_CONFIG ??= "cyclone5-socdk" -UBOOT_CONFIG[cyclone5-socdk] = "socfpga_cyclone5_defconfig" -UBOOT_CONFIG[de0-nano-soc] = "socfpga_de0_nano_soc_defconfig" +UBOOT_CONFIG[cyclone5-socdk] = "socfpga_cyclone5_defconfig,sdcard" +UBOOT_CONFIG[de0-nano-soc] = "socfpga_de0_nano_soc_defconfig,sdcard" UBOOT_CONFIG[mcvevk] = "socfpga_mcvevk_defconfig" UBOOT_CONFIG[sockit] = "socfpga_sockit_defconfig" UBOOT_CONFIG[socrates] = "socfpga_socrates_defconfig" @@ -19,3 +19,7 @@ KMACHINE = "cyclone5" # Default kernel devicetrees KERNEL_DEVICETREE ?= "socfpga_cyclone5_socdk.dtb socfpga_cyclone5_sockit.dtb socfpga_cyclone5_socrates.dtb socfpga_cyclone5_de0_sockit.dtb" + +# Add support for SDCARD creation +IMAGE_CLASSES += "image_types_socfpga" + -- cgit v1.2.3-54-g00ecf