diff options
author | David Woodhouse <dwmw2@infradead.org> | 2020-06-12 11:06:38 +0100 |
---|---|---|
committer | Petr Štetiar <ynezz@true.cz> | 2020-07-08 23:22:30 +0200 |
commit | 7adc29f59ede5112b94b3df4688b47a88f84f544 (patch) | |
tree | 04bf1592a3841a2af8a900603d64d164528be1f3 /target/linux/mediatek/image/gen_banana_pi_img.sh | |
parent | 0c7bce7efd4ac675d154a3c3372d19e0340cea9c (diff) | |
download | upstream-7adc29f59ede5112b94b3df4688b47a88f84f544.tar.gz upstream-7adc29f59ede5112b94b3df4688b47a88f84f544.tar.bz2 upstream-7adc29f59ede5112b94b3df4688b47a88f84f544.zip |
mediatek: add SD card image creation for Banana Pi R2
Based on work by Alexey Loukianov <lx2@lexa2.ru> and others.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Diffstat (limited to 'target/linux/mediatek/image/gen_banana_pi_img.sh')
-rwxr-xr-x | target/linux/mediatek/image/gen_banana_pi_img.sh | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/target/linux/mediatek/image/gen_banana_pi_img.sh b/target/linux/mediatek/image/gen_banana_pi_img.sh new file mode 100755 index 0000000000..26fbca1388 --- /dev/null +++ b/target/linux/mediatek/image/gen_banana_pi_img.sh @@ -0,0 +1,145 @@ +#!/bin/sh +# +# Copyright © 2019 Alexey Loukianov <lx2@lexa2.ru> +# Copyright © 2020 David Woodhouse <dwmw2@infradead.org> +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +# Generates a bootable SD card image for Banana Pi R2 (and probably +# other similar boards) as documented at +# http://www.fw-web.de/dokuwiki/doku.php?id=en:bpi-r2:storage +# +# The first sector must contain the SDMMC_BOOT header shown +# below, and also contains the MBR partition table in the end +# of the sector. The partition table must contain no active +# partitions. +# +# The second sector must contain the BRLYT header, and the +# special preloader image goes in sector 4; 2KiB into the image. +# +# The preloader loads U-Boot from sector 640; 320KiB into the image. +# The location and the size (512KiB) are fixed and not read from +# the partition table. We set up a partition for it merely for +# our own convenience for upgrades, etc. +# +# The second partition is a FAT file system containing the kernel +# image and a uboot.env file, which is provided to this script as +# $4 (bootfs image). Its size is configurable with the +# CONFIG_BANANA_PI_BOOT_PARTSIZE option; by default 32MiB. +# +# The root filesystem comes next in the third partition. +# +# +# ------------------------ Sector Offset +# | MBR + SDMMC_BOOT | 0 0x0 +# |----------------------| +# | BRLYT header | 1 0x200 +# |----------------------| +# . . +# . . +# |----------------------| +# | | 4 0x800 +# | | +# | Preloader | +# . . +# . . +# | | 639 +# |----------------------| +# | MBR partition #1 | 640 0x50000 +# | | +# | U-Boot | +# . . +# . . +# | | 1663 +# |----------------------| +# | MBR partition #2 | +# | | +# | FAT partition | ( BANANA_PI_BOOT_PARTSIZE +# . . default 32MiB ) +# . (kernel, uEnv) . +# | | +# |----------------------| +# | MBR partition #3 | +# | | +# | Root partition | +# | | ( TARGET_ROOTFS_PARTSIZE +# | (squashfs+overlay | default 104MiB ) +# . or ext4, etc.) . +# . . +# | | +# ------------------------ +# +# For eMMC boot, everything up to and including the preloader must be +# written to /dev/mmcblk0boot0, with the SDMMC_BOOT header changed to +# read EMMC_BOOT\0 instead. +# +# The contents of the main eMMC are identical to the SD card layout, +# with the preloader loading 512KiB of U-Boot starting at 0x50000. + +function usage() { + echo "SYNTAX: $0 sd <file> <preloader image> <u-boot image> <bootfs image> <rootfs image> <bootfs size> <rootfs size>" + echo " OR: $0 emmc <file> <preloader image>" + exit 1 +} + +set -e + +PRELOADER_OFFSET=2 # 2KiB + +SDMMC_BOOT="SDMMC_BOOT\x00\x00\x01\x00\x00\x00\x00\x02\x00\x00" +EMMC_BOOT="EMMC_BOOT\x00\x00\x00\x01\x00\x00\x00\x00\x02\x00\x00" +BRLYT="BRLYT\x00\x00\x00\x01\x00\x00\x00\x00\x08\x00\x00\ +\x00\x08\x00\x00\x42\x42\x42\x42\x08\x00\x01\x00\x00\x08\x00\x00\ +\x00\x08\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + +case $1 in + sd) + [ $# -eq 8 ] || usage + OUTPUT="$2" + PRELOADER="$3" + UBOOT="$4" + BOOTFS="$5" + ROOTFS="$6" + BOOTFSSIZE="$7" + ROOTFSSIZE="$8" + + head=4 + sect=63 + + set $(ptgen -o $OUTPUT -h $head -s $sect -a 0 -l 1024 \ + -t 41 -p 512k@320k \ + -t c -p ${BOOTFSSIZE}M \ + -t 83 -p ${ROOTFSSIZE}M ) + + UBOOT_OFFSET="$(($1 / 512))" + UBOOT_SIZE="$(($2 / 512))" + BOOTFS_OFFSET="$(($3 / 512))" + BOOTFS_SIZE="$(($4 / 512))" + ROOTFS_OFFSET="$(($5 / 512))" + ROOTFS_SIZE="$(($6 / 512))" + + echo -en "${SDMMC_BOOT}" | dd bs=1 of="${OUTPUT}" seek=0 conv=notrunc + echo -en "${BRLYT}" | dd bs=1 of="${OUTPUT}" seek=512 conv=notrunc + + dd bs=1024 if="${PRELOADER}" of="${OUTPUT}" seek="${PRELOADER_OFFSET}" conv=notrunc + dd bs=512 if="${UBOOT}" of="${OUTPUT}" seek="${UBOOT_OFFSET}" conv=notrunc + dd bs=512 if="${BOOTFS}" of="${OUTPUT}" seek="${BOOTFS_OFFSET}" conv=notrunc + dd bs=512 if="${ROOTFS}" of="${OUTPUT}" seek="${ROOTFS_OFFSET}" conv=notrunc + dd bs=128k if=/dev/zero of="${OUTPUT}" count=1 oflag=append conv=notrunc + ;; + emmc) + [ $# -eq 3 ] || usage + OUTPUT="$2" + PRELOADER="$3" + + echo -en "${EMMC_BOOT}" | dd bs=1 of="${OUTPUT}" seek=0 + echo -en "${BRLYT}" | dd bs=1 of="${OUTPUT}" seek=512 conv=notrunc + + dd bs=1024 if="${PRELOADER}" of="${OUTPUT}" seek="${PRELOADER_OFFSET}" conv=notrunc + ;; + *) + usage + ;; +esac |