Skip to content

Commit

Permalink
artik-sdimage.bbclass: Generate bootable artik10 SDcard images
Browse files Browse the repository at this point in the history
To purpose is to create standalone image that can boot and run from uSDcard,
without touching eMMC, this can be very convenient for developers.

The image class is inspired from meta-amlogic or meta-rasberrypi.

While blackmagic uboot params' offsets are coming from this file :

  https://github.com/resin-os/resin-artik/blob/master/layers/meta-resin-artik/recipes-core/images/resin-image.inc

  0x00080e00: artik5 (1031*512)
  0x00099e00: artik10 (1231*512)

Change-Id: Ib40d7cd83c92c35e864a91d38e2f01b4a032b228
Credits-to: Florin Sarbu <florin@resin.io>
Bug: balena-os#9
Origin: http://github.com/TizenTeam/meta-artik
Signed-off-by: Philippe Coval <philippe.coval@osg.samsung.com>
  • Loading branch information
rzr committed Jun 6, 2016
1 parent 50a8887 commit 394c3d7
Show file tree
Hide file tree
Showing 4 changed files with 149 additions and 0 deletions.
142 changes: 142 additions & 0 deletions classes/artik-sdimg.bbclass
@@ -0,0 +1,142 @@
inherit image_types

#
# Create an image that can by written onto a SD card using dd.
#
# The disk layout used is:
#
# 0 -> IMAGE_ROOTFS_ALIGNMENT - reserved for other data
# IMAGE_ROOTFS_ALIGNMENT -> BOOT_SPACE - bootloader and kernel
# BOOT_SPACE -> SDIMG_SIZE - rootfs
#

# Default Free space = 1.3x
# Use IMAGE_OVERHEAD_FACTOR to add more space
# <--------->
# 4MiB 20MiB SDIMG_ROOTFS
# <-----------------------> <----------> <---------------------->
# ------------------------ ------------ ------------------------
# | IMAGE_ROOTFS_ALIGNMENT | BOOT_SPACE | ROOTFS_SIZE |
# ------------------------ ------------ ------------------------
# ^ ^ ^ ^
# | | | |
# 0 4MiB 4MiB + 20MiB 4MiB + 20Mib + SDIMG_ROOTFS

# This image depends on the rootfs image
IMAGE_TYPEDEP_artik-sdimg = "${SDIMG_ROOTFS_TYPE}"

# Set initramfs extension
KERNEL_INITRAMFS ?= ""

# Boot partition volume id
BOOTDD_VOLUME_ID ?= "BOOT"

# Boot partition size [in KiB] (will be rounded up to IMAGE_ROOTFS_ALIGNMENT)
BOOT_SPACE ?= "20480"

# Set alignment to 4MB [in KiB]
IMAGE_ROOTFS_ALIGNMENT = "4096"

# Use an uncompressed ext4 by default as rootfs
SDIMG_ROOTFS_TYPE ?= "ext4"
SDIMG_ROOTFS = "${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.${SDIMG_ROOTFS_TYPE}"

IMAGE_DEPENDS_artik-sdimg = " \
parted-native \
mtools-native \
dosfstools-native \
e2fsprogs-native \
virtual/kernel \
u-boot \
"
# Exynos Boot magic
BL1_SYMLINK ?= "bl1.bin"
BL2_SYMLINK ?= "bl2.bin"
TZSW_SYMLINK ?= "tzsw.bin"

# U-Boot
UBOOT_SUFFIX ?= "bin"
UBOOT_SYMLINK ?= "u-boot-${MACHINE}.${UBOOT_SUFFIX}"
BL1_OFFSET ?= "1"
BL2_OFFSET ?= "31"
UBOOT_OFFSET ?= "63"
TZSW_OFFSET ?= "719"
# To be adapted by machine, here artik10 is used as reference
UBOOT_PARAMS_OFFSET ?= "1231"
UBOOT_PARAMS="params_sd.${UBOOT_SUFFIX}"

# SD card image name
SDIMG = "${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.artik-sdimg"

IMAGE_CMD_artik-sdimg () {

# Align partitions
BOOT_SPACE_ALIGNED=$(expr ${BOOT_SPACE} + ${IMAGE_ROOTFS_ALIGNMENT} - 1)
BOOT_SPACE_ALIGNED=$(expr ${BOOT_SPACE_ALIGNED} - ${BOOT_SPACE_ALIGNED} % ${IMAGE_ROOTFS_ALIGNMENT})
ROOTFS_SIZE=`du -bks ${SDIMG_ROOTFS} | awk '{print $1}'`
# Round up RootFS size to the alignment size as well
ROOTFS_SIZE_ALIGNED=$(expr ${ROOTFS_SIZE} + ${IMAGE_ROOTFS_ALIGNMENT} - 1)
ROOTFS_SIZE_ALIGNED=$(expr ${ROOTFS_SIZE_ALIGNED} - ${ROOTFS_SIZE_ALIGNED} % ${IMAGE_ROOTFS_ALIGNMENT})
SDIMG_SIZE=$(expr ${IMAGE_ROOTFS_ALIGNMENT} + ${BOOT_SPACE_ALIGNED} + ${ROOTFS_SIZE_ALIGNED})

echo "Creating filesystem with Boot partition ${BOOT_SPACE_ALIGNED} KiB and RootFS ${ROOTFS_SIZE_ALIGNED} KiB"

# Initialize sdcard image file
dd if=/dev/zero of=${SDIMG} bs=1024 count=0 seek=${SDIMG_SIZE}

# Create partition table
parted -s ${SDIMG} mklabel msdos

# Create boot partition and mark it as bootable
parted -s ${SDIMG} unit KiB mkpart primary fat32 ${IMAGE_ROOTFS_ALIGNMENT} $(expr ${BOOT_SPACE_ALIGNED} \+ ${IMAGE_ROOTFS_ALIGNMENT})
parted -s ${SDIMG} set 1 boot on

# Create rootfs partition to the end of disk
parted -s ${SDIMG} -- unit KiB mkpart primary ext2 $(expr ${BOOT_SPACE_ALIGNED} \+ ${IMAGE_ROOTFS_ALIGNMENT}) -1s

# Set boot flag
parted -s ${SDIMG} set 1 boot on
parted ${SDIMG} print

# Create a vfat image with boot files
BOOT_BLOCKS=$(LC_ALL=C parted -s ${SDIMG} unit b print | awk '/ 1 / { print substr($4, 1, length($4 -1)) / 512 /2 }')
rm -f ${WORKDIR}/boot.img
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} ::${KERNEL_IMAGETYPE}
if test -n "${KERNEL_DEVICETREE}"; then
mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${KERNEL_DEVICETREE} ::${KERNEL_DEVICETREE}
fi

if [ -n ${FATPAYLOAD} ] ; then
echo "Copying payload into VFAT"
for entry in ${FATPAYLOAD} ; do
# add the || true to stop aborting on vfat issues like not supporting .~lock files
mcopy -i ${WORKDIR}/boot.img -s -v ${IMAGE_ROOTFS}$entry :: || true
done
fi

# Add stamp file
echo "${IMAGE_NAME}-${IMAGEDATESTAMP}" > ${WORKDIR}/image-version-info
mcopy -i ${WORKDIR}/boot.img -v ${WORKDIR}/image-version-info ::

# Burn exynos's intial bootloader BL1
dd if=${DEPLOY_DIR_IMAGE}/${BL1_SYMLINK} of=${SDIMG} bs=512 seek=${BL1_OFFSET} conv=notrunc
dd if=${DEPLOY_DIR_IMAGE}/${BL2_SYMLINK} of=${SDIMG} bs=512 seek=${BL2_OFFSET} conv=notrunc
dd if=${DEPLOY_DIR_IMAGE}/${TZSW_SYMLINK} of=${SDIMG} bs=512 seek=${TZSW_OFFSET} conv=notrunc
dd if=${DEPLOY_DIR_IMAGE}/${UBOOT_PARAMS} of=${SDIMG} bs=512 seek=${UBOOT_PARAMS_OFFSET} conv=notrunc

# Burn u-boot
dd if=${DEPLOY_DIR_IMAGE}/${UBOOT_SYMLINK} of=${SDIMG} bs=512 seek=${UBOOT_OFFSET} conv=notrunc

# Burn Partitions
dd if=${WORKDIR}/boot.img of=${SDIMG} conv=notrunc seek=1 bs=$(expr ${IMAGE_ROOTFS_ALIGNMENT} \* 1024) && sync && sync
# If SDIMG_ROOTFS_TYPE is a .xz file use xzcat
if echo "${SDIMG_ROOTFS_TYPE}" | egrep -q "*\.xz"
then
xzcat ${SDIMG_ROOTFS} | dd of=${SDIMG} conv=notrunc seek=1 bs=$(expr 1024 \* ${BOOT_SPACE_ALIGNED} + ${IMAGE_ROOTFS_ALIGNMENT} \* 1024) && sync && sync
else
dd if=${SDIMG_ROOTFS} of=${SDIMG} conv=notrunc seek=1 bs=$(expr 1024 \* ${BOOT_SPACE_ALIGNED} + ${IMAGE_ROOTFS_ALIGNMENT} \* 1024) && sync && sync
fi
}
2 changes: 2 additions & 0 deletions conf/machine/artik10.conf
Expand Up @@ -14,6 +14,8 @@ UBOOT_MACHINE ?= "artik10"

KBUILD_DEFCONFIG = "artik10_defconfig"

UBOOT_PARAMS_OFFSET ?= "1231"

SERIAL_CONSOLE = "115200 ttySAC3"

MACHINE_FEATURES += " usbhost"
2 changes: 2 additions & 0 deletions conf/machine/artik5.conf
Expand Up @@ -14,4 +14,6 @@ UBOOT_MACHINE ?= "artik5"

KBUILD_DEFCONFIG = "artik5_defconfig"

UBOOT_PARAMS_OFFSET ?= "1031"

SERIAL_CONSOLE = "115200 ttySAC2"
3 changes: 3 additions & 0 deletions conf/machine/include/artik.inc
@@ -1,13 +1,16 @@
# Common settings for Samsung Artik boards
IMAGE_CLASSES += "artik-sdimg"

PREFERRED_PROVIDER_u-boot ?= "u-boot-artik"
PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto-artik"

MACHINE_FEATURES += " bluetooth pci rtc ethernet serial usbgadget wifi"

KERNEL_IMAGETYPE = "zImage"
IMAGE_FSTYPES += "tar.bz2 ext4 artik-sdimg"

MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += "bcm4354-bt bcm4354-nvram-config"
MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += " kernel-modules"

KERNEL_MODULE_AUTOLOAD += "dhd"
KERNEL_MODULE_PROBECONF += "dhd"
Expand Down

0 comments on commit 394c3d7

Please sign in to comment.