zynq-image.bbclass 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. # Create an image that can by written onto a SD card using dd
  2. #
  3. # Copyright (C) 2015-2016 ilbers GmbH
  4. #
  5. # The disk layout used is:
  6. #
  7. # 0K - 8K Reserved
  8. # 8K - 32K Reserved
  9. # 32K - 2048K Reserved
  10. # 2048K - BOOT_SPACE Boot loader and kernel
  11. # This image depends on the rootfs image
  12. IMAGE_TYPEDEP_zynq-sdimg = "${SDIMG_ROOTFS_TYPE}"
  13. # Boot partition volume id
  14. BOOTDD_VOLUME_ID ?= "${MACHINE}"
  15. # Boot partition size [in KiB]
  16. BOOT_SPACE ?= "20480"
  17. # First partition begin at sector 2048 : 2048*1024 = 2097152
  18. IMAGE_ROOTFS_ALIGNMENT = "2048"
  19. # Use an uncompressed ext4 by default as rootfs
  20. SDIMG_ROOTFS_TYPE ?= "ext4"
  21. SDIMG_ROOTFS = "${TMPDIR}/work/core-image-base-1.0-r0/deb_rootfs.ext4"
  22. PKG_DIR = "${DEPLOY_DIR}/packages/"
  23. ROOTFS_DIR = "${TMPDIR}/work/core-image-base-1.0-r0/rootfs"
  24. # SD card image name
  25. SDIMG = "${DEPLOY_DIR_IMAGE}/core-image-base-zynq.sdimg"
  26. IMAGEDATESTAMP = "${@time.strftime('%Y.%m.%d',time.gmtime())}"
  27. do_image () {
  28. # Align partitions
  29. BOOT_SPACE_ALIGNED=$(expr ${BOOT_SPACE} + ${IMAGE_ROOTFS_ALIGNMENT} - 1)
  30. BOOT_SPACE_ALIGNED=$(expr ${BOOT_SPACE_ALIGNED} - \
  31. ${BOOT_SPACE_ALIGNED} % ${IMAGE_ROOTFS_ALIGNMENT})
  32. SDIMG_SIZE=$(expr ${IMAGE_ROOTFS_ALIGNMENT} + ${BOOT_SPACE_ALIGNED} + \
  33. 900000 + ${IMAGE_ROOTFS_ALIGNMENT})
  34. mkdir -p ${DEPLOY_DIR_IMAGE}
  35. # Initialize sdcard image file
  36. dd if=/dev/zero of=${SDIMG} bs=1 count=0 seek=$(expr 1024 \* ${SDIMG_SIZE})
  37. # Create partition table
  38. /sbin/parted -s ${SDIMG} mklabel msdos
  39. # Create boot partition and mark it as bootable
  40. /sbin/parted -s ${SDIMG} unit KiB mkpart primary fat32 \
  41. ${IMAGE_ROOTFS_ALIGNMENT} $(expr ${BOOT_SPACE_ALIGNED} \+ \
  42. ${IMAGE_ROOTFS_ALIGNMENT})
  43. /sbin/parted -s ${SDIMG} set 1 boot on
  44. # Create rootfs partition
  45. /sbin/parted -s ${SDIMG} unit KiB mkpart primary ext4 \
  46. $(expr ${BOOT_SPACE_ALIGNED} \+ ${IMAGE_ROOTFS_ALIGNMENT}) \
  47. $(expr ${BOOT_SPACE_ALIGNED} \+ ${IMAGE_ROOTFS_ALIGNMENT} \+ 900000)
  48. sudo parted ${SDIMG} print
  49. # Create a vfat image with boot files
  50. BOOT_BLOCKS=$(LC_ALL=C sudo parted -s ${SDIMG} unit b print \
  51. |awk '/ 1 / { print substr($4, 1, length($4 -1)) / 512 /2 }')
  52. rm -f ${WORKDIR}/boot.img
  53. /sbin/mkfs.vfat -n "${BOOTDD_VOLUME_ID}" -S 512 -C ${WORKDIR}/boot.img \
  54. $BOOT_BLOCKS
  55. # Burn Partitions
  56. # If SDIMG_ROOTFS_TYPE is a .xz file use xzcat
  57. if echo "${SDIMG_ROOTFS_TYPE}" | egrep -q "*\.xz"; then
  58. xzcat ${SDIMG_ROOTFS} | dd of=${SDIMG} conv=notrunc seek=1 bs=$(expr 1024 \* ${BOOT_SPACE_ALIGNED} + ${IMAGE_ROOTFS_ALIGNMENT} \* 1024) && sync && sync
  59. else
  60. dd if=${SDIMG_ROOTFS} of=${SDIMG} conv=notrunc seek=1 \
  61. bs=$(expr 1024 \* ${BOOT_SPACE_ALIGNED} + \
  62. ${IMAGE_ROOTFS_ALIGNMENT} \* 1024) && sync && sync
  63. fi
  64. }