build-sdcard.sh 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. #!/bin/sh
  2. # This file used for build a sdcard file to programming files to NAND storage
  3. # This file feference the meta-fsl-arm/classes/image_types_fsl.bbclass.
  4. FLASH_TYPE=""
  5. while getopts "p:d:s:enc:t:h" arg
  6. do
  7. case $arg in
  8. p)
  9. MACHINE="$OPTARG"
  10. ;;
  11. d)
  12. UPDATE_DIR="$OPTARG"
  13. ;;
  14. s)
  15. DDR_SIZE="$OPTARG"
  16. ;;
  17. e)
  18. FLASH_TYPE="emmc"
  19. ;;
  20. n)
  21. FLASH_TYPE="nand"
  22. ;;
  23. t)
  24. FILE_TAG="$OPTARG"
  25. ;;
  26. h)
  27. echo "-p <mys6ull | mys6ul | myd-y6ull | myd-y6ul> you need choose an platform"
  28. echo "-d < target image dir > target image dir path"
  29. echo "-e < eMMC Flash >"
  30. echo "-n < NAND Flash >"
  31. echo "-t < tagname > append name as tag on output filename"
  32. exit 1
  33. ;;
  34. ?)
  35. echo "unkonw argument"
  36. exit 1
  37. ;;
  38. esac
  39. done
  40. if [ -z "$MACHINE" ];
  41. then
  42. echo "The machine need specifi"
  43. exit 1
  44. fi
  45. if [ -z "$FLASH_TYPE" ];
  46. then
  47. echo "The flash type need specifi"
  48. echo "-e for eMMC, -n for NAND"
  49. exit 1
  50. fi
  51. if [ -z "$DDR_SIZE" ];
  52. then
  53. echo "The DDR size not choose"
  54. exit 1
  55. fi
  56. if [ -z "$UPDATE_DIR" ];
  57. then
  58. echo "The update directory need specifi"
  59. exit 1
  60. fi
  61. if [ -f "firmware/Manifest" ]
  62. then
  63. echo "Load Firmware Manifest"
  64. . firmware/Manifest
  65. else
  66. echo "The directory firmware or file firmware/Manifest does not exist!!!"
  67. exit 1
  68. fi
  69. IMAGE_BOOTLOADER="u-boot"
  70. FIRMWARE_DIR="firmware"
  71. WORKDIR="."
  72. echo ${MACHINE}
  73. # update system firmware
  74. if [ ${MACHINE} = "mys6ull" ]
  75. then
  76. if [ ${FLASH_TYPE} = "nand" ]
  77. then
  78. BOOT_SCRIPTS="${FW_MYS6ULL_BOOT_SCRIPT_NAND}:boot.scr"
  79. KERNEL_DEVICETREE="${FW_MYS6ULL_DEVICETREE_NAND}"
  80. elif [ ${FLASH_TYPE} = "emmc" ]
  81. then
  82. KERNEL_DEVICETREE="${FW_MYS6ULL_DEVICETREE_EMMC}"
  83. BOOT_SCRIPTS="${FW_MYS6ULL_BOOT_SCRIPT_EMMC}:boot.scr"
  84. fi
  85. elif [ ${MACHINE} = "mys6ul" ]
  86. then
  87. if [ ${FLASH_TYPE} = "nand" ]
  88. then
  89. BOOT_SCRIPTS="${FW_MYS6UL_BOOT_SCRIPT_NAND}:boot.scr"
  90. KERNEL_DEVICETREE="${FW_MYS6UL_DEVICETREE_NAND}"
  91. elif [ ${FLASH_TYPE} = "emmc" ]
  92. then
  93. BOOT_SCRIPTS="${FW_MYS6UL_BOOT_SCRIPT_EMMC}:boot.scr"
  94. KERNEL_DEVICETREE="${FW_MYS6UL_DEVICETREE_EMMC}"
  95. fi
  96. elif [ ${MACHINE} = "myd-y6uly2" ]
  97. then
  98. if [ ${FLASH_TYPE} = "nand" ]
  99. then
  100. BOOT_SCRIPTS="${FW_MYD_Y6ULL_BOOT_SCRIPT_NAND}:boot.scr"
  101. KERNEL_DEVICETREE="${FW_MYD_Y6ULL_DEVICETREE_NAND}"
  102. elif [ ${FLASH_TYPE} = "emmc" ]
  103. then
  104. BOOT_SCRIPTS="${FW_MYD_Y6ULL_BOOT_SCRIPT_EMMC}:boot.scr"
  105. KERNEL_DEVICETREE="${FW_MYD_Y6ULL_DEVICETREE_EMMC}"
  106. fi
  107. elif [ ${MACHINE} = "myt-y6uly2" ]
  108. then
  109. if [ ${FLASH_TYPE} = "nand" ]
  110. then
  111. BOOT_SCRIPTS="${FW_MYT_Y6ULL_BOOT_SCRIPT_NAND}:boot.scr"
  112. KERNEL_DEVICETREE="${FW_MYT_Y6ULL_DEVICETREE_NAND}"
  113. elif [ ${FLASH_TYPE} = "emmc" ]
  114. then
  115. BOOT_SCRIPTS="${FW_MYT_Y6ULL_BOOT_SCRIPT_EMMC}:boot.scr"
  116. KERNEL_DEVICETREE="${FW_MYT_Y6ULL_DEVICETREE_EMMC}"
  117. fi
  118. elif [ ${MACHINE} = "myd-y6ulg2" ]
  119. then
  120. if [ ${FLASH_TYPE} = "nand" ]
  121. then
  122. BOOT_SCRIPTS="${FW_MYD_Y6UL_BOOT_SCRIPT_NAND}:boot.scr"
  123. KERNEL_DEVICETREE="${FW_MYD_Y6UL_DEVICETREE_NAND}"
  124. elif [ ${FLASH_TYPE} = "emmc" ]
  125. then
  126. BOOT_SCRIPTS="${FW_MYD_Y6UL_BOOT_SCRIPT_EMMC}:boot.scr"
  127. KERNEL_DEVICETREE="${FW_MYD_Y6UL_DEVICETREE_EMMC}"
  128. fi
  129. elif [ ${MACHINE} = "myt-y6ulg2" ]
  130. then
  131. if [ ${FLASH_TYPE} = "nand" ]
  132. then
  133. BOOT_SCRIPTS="${FW_MYT_Y6UL_BOOT_SCRIPT_NAND}:boot.scr"
  134. KERNEL_DEVICETREE="${FW_MYT_Y6UL_DEVICETREE_NAND}"
  135. elif [ ${FLASH_TYPE} = "emmc" ]
  136. then
  137. BOOT_SCRIPTS="${FW_MYT_Y6UL_BOOT_SCRIPT_EMMC}:boot.scr"
  138. KERNEL_DEVICETREE="${FW_MYT_Y6UL_DEVICETREE_EMMC}"
  139. fi
  140. fi
  141. KERNEL_IMAGETYPE="${FW_KERNEL_IMAGE}"
  142. #SDCARD_ROOTFS="myir-image-update-mys6ull14x14-20170501014430.rootfs.ext4"
  143. #SDCARD_ROOTFS="myir-image-update-mys6ull14x14-20170719014828.rootfs.ext4"
  144. UBOOT_SUFFIX="imx"
  145. UBOOT_SUFFIX_SDCARD="${UBOOT_SUFFIX}"
  146. # Boot partition volume id
  147. BOOTDD_VOLUME_ID="Boot${MACHINE}"
  148. # Boot partition size [in KiB]
  149. # set 500MB, because MYS6ULx board default has 256MB nand
  150. BOOT_SPACE="512000"
  151. TIMESTAMP=`date +%Y%m%d%H%m%S`
  152. # Set alignment to 4MB [in KiB]
  153. IMAGE_ROOTFS_ALIGNMENT="4096"
  154. IMAGE_NAME="update"
  155. if [ -z "${FILE_TAG}" ]
  156. then
  157. SDCARD="${MACHINE}-${IMAGE_NAME}-${FLASH_TYPE}-${TIMESTAMP}.rootfs.sdcard"
  158. else
  159. SDCARD="${MACHINE}-${IMAGE_NAME}-${FLASH_TYPE}-${FILE_TAG}-${TIMESTAMP}.rootfs.sdcard"
  160. fi
  161. # Set update system rootfs size [in KB]
  162. # set 100MB
  163. ROOTFS_SIZE="102400"
  164. echo "----- Build Info"
  165. if [ ${MACHINE} = "mys6ull" ]
  166. then
  167. echo "MACHINE is MYS-6ULX-IOT"
  168. elif [ ${MACHINE} = "mys6ul" ]
  169. then
  170. echo "MACHINE is MYS-6ULX-IND"
  171. fi
  172. echo "Flash type is $FLASH_TYPE"
  173. echo "DDR size is $DDR_SIZE"
  174. echo "Output file is ${SDCARD}"
  175. echo "Target file update dir is $UPDATE_DIR"
  176. echo "-----"
  177. # Programming directory
  178. # you need put need programming files to this directory,
  179. # include u-boot, dtb, zImage and ext4 format of rootfs file
  180. SDCARD_GENERATION_COMMAND="generate_imx_sdcard"
  181. #
  182. # Generate the boot image with the boot scripts and required Device Tree
  183. # files
  184. _generate_boot_image() {
  185. local boot_part=$1
  186. # Create boot partition image
  187. BOOT_BLOCKS=$(LC_ALL=C parted -s ${SDCARD} unit b print \
  188. | awk "/ $boot_part / { print substr(\$4, 1, length(\$4 -1)) / 1024 }")
  189. # mkdosfs will sometimes use FAT16 when it is not appropriate,
  190. # resulting in a boot failure from SYSLINUX. Use FAT32 for
  191. # images larger than 512MB, otherwise let mkdosfs decide.
  192. if [ $(expr $BOOT_BLOCKS / 1024) -gt 512 ]; then
  193. FATSIZE="-F 32"
  194. fi
  195. rm -f ${WORKDIR}/boot.img
  196. mkfs.vfat -n "${BOOTDD_VOLUME_ID}" -S 512 ${FATSIZE} -C ${WORKDIR}/boot.img $BOOT_BLOCKS
  197. mcopy -i ${WORKDIR}/boot.img -s ${FIRMWARE_DIR}/${KERNEL_IMAGETYPE} ::/${KERNEL_IMAGETYPE}
  198. mcopy -i ${WORKDIR}/boot.img -s ${FIRMWARE_DIR}/${FW_SYSTEM} ::/${FW_SYSTEM}
  199. # Copy boot scripts
  200. for item in ${BOOT_SCRIPTS}; do
  201. src=`echo $item | awk -F':' '{ print $1 }'`
  202. dst=`echo $item | awk -F':' '{ print $2 }'`
  203. mcopy -i ${WORKDIR}/boot.img -s ${FIRMWARE_DIR}/$src ::/$dst
  204. done
  205. # Copy device tree file
  206. if test -n "${KERNEL_DEVICETREE}"; then
  207. for DTS_FILE in ${KERNEL_DEVICETREE}; do
  208. if [ -e "${FIRMWARE_DIR}/${DTS_FILE}" ]; then
  209. mcopy -i ${WORKDIR}/boot.img -s ${FIRMWARE_DIR}/${DTS_FILE} ::/${DTS_FILE}
  210. else
  211. echo "${DTS_FILE} does not exist."
  212. fi
  213. done
  214. fi
  215. # Copy target programming files to 'mfg-tools' directory
  216. if test -n "${UPDATE_DIR}"; then
  217. mcopy -i ${WORKDIR}/boot.img -s ${UPDATE_DIR} ::/mfg-images
  218. fi
  219. }
  220. #
  221. # Create an image that can by written onto a SD card using dd for use
  222. # with i.MX SoC family
  223. #
  224. # External variables needed:
  225. # ${SDCARD_ROOTFS} - the rootfs image to incorporate
  226. # ${IMAGE_BOOTLOADER} - bootloader to use {u-boot, barebox}
  227. #
  228. # The disk layout used is:
  229. #
  230. # 0 -> IMAGE_ROOTFS_ALIGNMENT - reserved to bootloader (not partitioned)
  231. # IMAGE_ROOTFS_ALIGNMENT -> BOOT_SPACE - kernel and other data
  232. # BOOT_SPACE -> SDIMG_SIZE - rootfs
  233. #
  234. # Default Free space = 1.3x
  235. # Use IMAGE_OVERHEAD_FACTOR to add more space
  236. # <--------->
  237. # 4MiB 8MiB SDIMG_ROOTFS 4MiB
  238. # <-----------------------> <----------> <----------------------> <------------------------------>
  239. # ------------------------ ------------ ------------------------ -------------------------------
  240. # | IMAGE_ROOTFS_ALIGNMENT | BOOT_SPACE | ROOTFS_SIZE | IMAGE_ROOTFS_ALIGNMENT |
  241. # ------------------------ ------------ ------------------------ -------------------------------
  242. # ^ ^ ^ ^ ^
  243. # | | | | |
  244. # 0 4096 4MiB + 8MiB 4MiB + 8Mib + SDIMG_ROOTFS 4MiB + 8MiB + SDIMG_ROOTFS + 4MiB
  245. generate_imx_sdcard () {
  246. # Create partition table
  247. parted -s ${SDCARD} mklabel msdos
  248. parted -s ${SDCARD} unit KiB mkpart primary fat32 ${IMAGE_ROOTFS_ALIGNMENT} $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED})
  249. #parted -s ${SDCARD} unit KiB mkpart primary $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED}) $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED} \+ $ROOTFS_SIZE)
  250. parted ${SDCARD} print
  251. dd if=${FIRMWARE_DIR}/u-boot-${MACHINE}-${FLASH_TYPE}-ddr${DDR_SIZE}.${UBOOT_SUFFIX_SDCARD} of=${SDCARD} conv=notrunc seek=2 bs=512
  252. _generate_boot_image 1
  253. # Burn Partition
  254. dd if=${WORKDIR}/boot.img of=${SDCARD} conv=notrunc,fsync seek=1 bs=$(expr ${IMAGE_ROOTFS_ALIGNMENT} \* 1024)
  255. #dd if=${FIRMWARE_DIR}/${SDCARD_ROOTFS} of=${SDCARD} conv=notrunc,fsync seek=1 bs=$(expr ${BOOT_SPACE_ALIGNED} \* 1024 + ${IMAGE_ROOTFS_ALIGNMENT} \* 1024)
  256. }
  257. IMAGE_CMD_sdcard () {
  258. # Align boot partition and calculate total SD card image size
  259. BOOT_SPACE_ALIGNED=$(expr ${BOOT_SPACE} + ${IMAGE_ROOTFS_ALIGNMENT} - 1)
  260. BOOT_SPACE_ALIGNED=$(expr ${BOOT_SPACE_ALIGNED} - ${BOOT_SPACE_ALIGNED} % ${IMAGE_ROOTFS_ALIGNMENT})
  261. SDCARD_SIZE=$(expr ${IMAGE_ROOTFS_ALIGNMENT} + ${BOOT_SPACE_ALIGNED} + $ROOTFS_SIZE + ${IMAGE_ROOTFS_ALIGNMENT})
  262. # Initialize a sparse file
  263. dd if=/dev/zero of=${SDCARD} bs=1 count=0 seek=$(expr 1024 \* ${SDCARD_SIZE})
  264. ${SDCARD_GENERATION_COMMAND}
  265. gzip ${SDCARD}
  266. }
  267. IMAGE_CMD_sdcard