diff --git a/meta-digi-arm/classes/image_types_digi.bbclass b/meta-digi-arm/classes/image_types_digi.bbclass index 48b3c2590..e7d0aff88 100644 --- a/meta-digi-arm/classes/image_types_digi.bbclass +++ b/meta-digi-arm/classes/image_types_digi.bbclass @@ -57,3 +57,88 @@ IMAGE_CMD_rootfs.initramfs() { fi } IMAGE_TYPEDEP_rootfs.initramfs = "cpio.gz" + +SDCARD_GENERATION_COMMAND_ccardimx28js = "generate_ccardimx28js_sdcard" +# +# Create an image that can by written onto a SD card using dd for use with ccardimx28js +# +# External variables needed: +# ${SDCARD_ROOTFS} - the rootfs image to incorporate +# +# The disk layout used is: +# +# 1M -> IMAGE_ROOTFS_ALIGNMENT - u-boot bootstream +# IMAGE_ROOTFS_ALIGNMENT -> BOOT_SPACE - kernel + devide tree blob (VFAT partition) +# BOOT_SPACE -> SDIMG_SIZE - rootfs (EXT4 partition) +# +# Default Free space = 1.3x +# Use IMAGE_OVERHEAD_FACTOR to add more space +# <---------> +# 4MiB 8MiB SDIMG_ROOTFS 4MiB +# <-----------------------> <-------------> <----------------------> <------------------------------> +# ---------------------------------------- ------------------------ ------------------------------- +# | | | BOOT_SPACE | ROOTFS_SIZE | IMAGE_ROOTFS_ALIGNMENT | +# ---------------------------------------- ------------------------ ------------------------------- +# ^ ^ ^ ^ ^ ^ +# | | | | | | +# 0 1M 4M 4MiB + BOOTSPACE 4MiB + BOOTSPACE + SDIMG_ROOTFS 4MiB + BOOTSPACE + SDIMG_ROOTFS + 4MiB +# +generate_ccardimx28js_sdcard() { + # + # Bootstream header for u-boot at 1M offset + # + # The offset is coded in bytes 29-32 in little-endian. The + # value to set is the offset in 512 bytes blocks + 1. + # + # For 1M offset we can calculate the bytes: + # + # printf '%08x' 2049 | grep -o .. | tac | tr -d '\n' + # + BS_HDR="\x33\x22\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x08\x00\x00\x00\x00\x00\x00" + + # Use 'printf' command and not shell builtins because hexadecimal + # format does not work well with 'dash' shell + PRINTF="$(which printf)" + + parted -s ${SDCARD} mklabel msdos + parted -s ${SDCARD} unit KiB mkpart primary 1024 ${IMAGE_ROOTFS_ALIGNMENT} + 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) + + # Change partition type to 0x53 for mxs processor family + echo -n S | dd of=${SDCARD} bs=1 count=1 seek=450 conv=notrunc + + ${PRINTF} "${BS_HDR}" | dd of=${SDCARD} bs=512 seek=$(expr 1024 \* 2) conv=notrunc,sync + dd if=${DEPLOY_DIR_IMAGE}/u-boot-${MACHINE}.${UBOOT_SUFFIX} of=${SDCARD} bs=512 seek=$(expr 1024 \* 2 \+ 1) conv=notrunc,sync + + BOOT_BLOCKS=$(LC_ALL=C parted -s ${SDCARD} unit b print \ + | awk '/ 2 / { print substr($4, 1, length($4 -1)) / 1024 }') + + mkfs.vfat -n "${BOOTDD_VOLUME_ID}" -S 512 -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 kernel image and dtb's + 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 "${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb" ]; then + kernel_bin="`readlink ${KERNEL_IMAGETYPE}-${MACHINE}.bin`" + kernel_bin_for_dtb="`readlink ${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 + fi + done + fi + + # Burn partitions + dd if=${WORKDIR}/boot.img of=${SDCARD} conv=notrunc seek=1 bs=$(expr ${IMAGE_ROOTFS_ALIGNMENT} \* 1024) && sync && sync + dd if=${SDCARD_ROOTFS} of=${SDCARD} conv=notrunc seek=1 bs=$(expr ${BOOT_SPACE_ALIGNED} \* 1024 + ${IMAGE_ROOTFS_ALIGNMENT} \* 1024) && sync && sync +} diff --git a/meta-digi-arm/conf/machine/ccardimx28js.conf b/meta-digi-arm/conf/machine/ccardimx28js.conf index 1c0dcce4f..126c32c6d 100644 --- a/meta-digi-arm/conf/machine/ccardimx28js.conf +++ b/meta-digi-arm/conf/machine/ccardimx28js.conf @@ -16,6 +16,15 @@ SERIAL_CONSOLES_CHECK ?= "${SERIAL_CONSOLES}" # Bluetooth tty BT_TTY ?= "${@base_conditional('IS_KERNEL_2X', '1' , 'ttySP0', 'ttyAPP0', d)}" +# U-Boot script to be copied to the SD image +BOOT_SCRIPTS = "boot-sd.scr:boot.scr" + +# Rootfs image for rootfs partition in sdcard image +SDCARD_ROOTFS ?= "${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ext4" + +# Build sdcard image for ccardimx28js +IMAGE_FSTYPES += "sdcard" + # FLASH parameters MKUBIFS_ARGS ?= "-m 2048 -e 126976 -c 2047" EXTRA_IMAGECMD_jffs2 ?= "-l -e 128 -n" diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey-2013.01/ccardimx28/boot-sd.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey-2013.01/ccardimx28/boot-sd.txt new file mode 100644 index 000000000..88c1d4931 --- /dev/null +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey-2013.01/ccardimx28/boot-sd.txt @@ -0,0 +1,16 @@ +# +# U-Boot bootscript for SD images created by Yocto. +# +# Layout: +# * U-Boot (raw copied) +# * Boot partion (FAT) with kernel images and DTB +# * Rootfs partion (EXT4) +# +# +--------------+----------------------+-------------------------+ +# | U-BOOT (RAW) | BOOT_PARTITION (FAT) | ROOTFS_PARTITION (EXT4) | +# +--------------+----------------------+-------------------------+ +# +setenv fdtimg imx28-ccardimx28js.dtb +setenv kimg uimage +setenv mmc_rpart /dev/mmcblk0p3 +dboot linux mmc 0:2 diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2013.01.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2013.01.bb index dcdceb350..881dcaf63 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2013.01.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2013.01.bb @@ -9,15 +9,19 @@ PROVIDES += "u-boot" LICENSE = "GPLv2+" LIC_FILES_CHKSUM = "file://COPYING;md5=1707d6db1d42237583f50183a5651ecb" -PR = "r0" +SRC_URI += "file://boot-sd.txt" S = "${WORKDIR}/git" -DEPENDS_mxs += "elftosb-native" +DEPENDS_ccardimx28 += "elftosb-native" do_compile_prepend() { ${S}/tools/setlocalversion --save-scmversion ${S} } +do_deploy_append() { + mkimage -T script -n bootscript -C none -d ${WORKDIR}/boot-sd.txt ${DEPLOYDIR}/boot-sd.scr +} + PACKAGE_ARCH = "${MACHINE_ARCH}" -COMPATIBLE_MACHINE = "(mxs)" +COMPATIBLE_MACHINE = "(ccardimx28)"