ea8a9c63a18de9139b3947eae890e7b4c0280fcd
[openwrt/staging/yousong.git] / target / linux / mediatek / image / gen_mtk_mmc_img.sh
1 #!/bin/sh
2 #
3 # Copyright © 2019 Alexey Loukianov <lx2@lexa2.ru>
4 # Copyright © 2020 David Woodhouse <dwmw2@infradead.org>
5 #
6 # This is free software, licensed under the GNU General Public License v2.
7 # See /LICENSE for more information.
8 #
9
10 # Generates a bootable SD card image for Banana Pi R2 (and probably
11 # other similar boards) as documented at
12 # http://www.fw-web.de/dokuwiki/doku.php?id=en:bpi-r2:storage
13 #
14 # The first sector must contain the SDMMC_BOOT header shown
15 # below, and also contains the MBR partition table in the end
16 # of the sector. The partition table must contain no active
17 # partitions.
18 #
19 # The second sector must contain the BRLYT header, and the
20 # special preloader image goes in sector 4; 2KiB into the image.
21 #
22 # The preloader loads U-Boot from sector 640; 320KiB into the image.
23 # The location and the size (512KiB) are fixed and not read from
24 # the partition table. We set up a partition for it merely for
25 # our own convenience for upgrades, etc.
26 #
27 # The second partition is a FAT file system containing the kernel
28 # image and a uboot.env file, which is provided to this script as
29 # $4 (bootfs image). Its size is configurable with the
30 # CONFIG_MTK_BOOT_PARTSIZE option; by default 32MiB.
31 #
32 # The root filesystem comes next in the third partition.
33 #
34 #
35 # ------------------------ Sector Offset
36 # | MBR + SDMMC_BOOT | 0 0x0
37 # |----------------------|
38 # | BRLYT header | 1 0x200
39 # |----------------------|
40 # . .
41 # . .
42 # |----------------------|
43 # | | 4 0x800
44 # | |
45 # | Preloader |
46 # . .
47 # . .
48 # | | 639
49 # |----------------------|
50 # | MBR partition #1 | 640 0x50000
51 # | |
52 # | U-Boot |
53 # . .
54 # . .
55 # | | 1663
56 # |----------------------|
57 # | MBR partition #2 |
58 # | |
59 # | FAT partition | ( MTK_BOOT_PARTSIZE
60 # . . default 32MiB )
61 # . (kernel, uEnv) .
62 # | |
63 # |----------------------|
64 # | MBR partition #3 |
65 # | |
66 # | Root partition |
67 # | | ( TARGET_ROOTFS_PARTSIZE
68 # | (squashfs+overlay | default 104MiB )
69 # . or ext4, etc.) .
70 # . .
71 # | |
72 # ------------------------
73 #
74 # For eMMC boot, everything up to and including the preloader must be
75 # written to /dev/mmcblk0boot0, with the SDMMC_BOOT header changed to
76 # read EMMC_BOOT\0 instead.
77 #
78 # The contents of the main eMMC are identical to the SD card layout,
79 # with the preloader loading 512KiB of U-Boot starting at 0x50000.
80
81 usage() {
82 echo "SYNTAX: $0 sd <file> <preloader image> <u-boot image> <u-boot offset> <bootfs image> <rootfs image> <bootfs size> <rootfs size>"
83 echo " OR: $0 emmc <file> <preloader image>"
84 exit 1
85 }
86
87 set -e
88
89 PRELOADER_OFFSET=2 # 2KiB
90
91 SDMMC_BOOT="SDMMC_BOOT\x00\x00\x01\x00\x00\x00\x00\x02\x00\x00"
92 EMMC_BOOT="EMMC_BOOT\x00\x00\x00\x01\x00\x00\x00\x00\x02\x00\x00"
93 BRLYT="BRLYT\x00\x00\x00\x01\x00\x00\x00\x00\x08\x00\x00\
94 \x00\x08\x00\x00\x42\x42\x42\x42\x08\x00\x01\x00\x00\x08\x00\x00\
95 \x00\x08\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
96
97 case $1 in
98 sd)
99 [ $# -eq 9 ] || usage
100 OUTPUT="$2"
101 PRELOADER="$3"
102 UBOOT="$4"
103 UBOOTOFS="$5"
104 BOOTFS="$6"
105 ROOTFS="$7"
106 BOOTFSSIZE="$8"
107 ROOTFSSIZE="$9"
108
109 head=4
110 sect=63
111
112 set $(ptgen -o $OUTPUT -h $head -s $sect -a 0 -l 1024 \
113 -t 41 -p 512k@${UBOOTOFS} \
114 -t c -p ${BOOTFSSIZE}M \
115 -t 83 -p ${ROOTFSSIZE}M )
116
117 UBOOT_OFFSET="$(($1 / 512))"
118 UBOOT_SIZE="$(($2 / 512))"
119 BOOTFS_OFFSET="$(($3 / 512))"
120 BOOTFS_SIZE="$(($4 / 512))"
121 ROOTFS_OFFSET="$(($5 / 512))"
122 ROOTFS_SIZE="$(($6 / 512))"
123
124 echo -en "${SDMMC_BOOT}" | dd bs=1 of="${OUTPUT}" seek=0 conv=notrunc
125 echo -en "${BRLYT}" | dd bs=1 of="${OUTPUT}" seek=512 conv=notrunc
126
127 # For eMMC-only boards like U7623 the preloader doesn't need to be included in the
128 # main image as it's only ever needed in the eMMC boot partition.
129 if [ -r ${PRELOADER} ]; then
130 dd bs=1024 if="${PRELOADER}" of="${OUTPUT}" seek="${PRELOADER_OFFSET}" conv=notrunc
131 fi
132 dd bs=512 if="${UBOOT}" of="${OUTPUT}" seek="${UBOOT_OFFSET}" conv=notrunc
133 dd bs=512 if="${BOOTFS}" of="${OUTPUT}" seek="${BOOTFS_OFFSET}" conv=notrunc
134 dd bs=512 if="${ROOTFS}" of="${OUTPUT}" seek="${ROOTFS_OFFSET}" conv=notrunc
135 dd bs=128k if=/dev/zero of="${OUTPUT}" count=1 oflag=append conv=notrunc
136 ;;
137 emmc)
138 [ $# -eq 3 ] || usage
139 OUTPUT="$2"
140 PRELOADER="$3"
141
142 echo -en "${EMMC_BOOT}" | dd bs=1 of="${OUTPUT}" seek=0
143 echo -en "${BRLYT}" | dd bs=1 of="${OUTPUT}" seek=512 conv=notrunc
144
145 dd bs=1024 if="${PRELOADER}" of="${OUTPUT}" seek="${PRELOADER_OFFSET}" conv=notrunc
146 ;;
147 *)
148 usage
149 ;;
150 esac