mx8_install_debian.sh
6.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
#!/bin/bash -e
blue_underlined_bold_echo()
{
echo -e "\e[34m\e[4m\e[1m$@\e[0m"
}
blue_bold_echo()
{
echo -e "\e[34m\e[1m$@\e[0m"
}
red_bold_echo()
{
echo -e "\e[31m\e[1m$@\e[0m"
}
IMGS_PATH=/opt/images/Debian
UBOOT_IMAGE=imx-boot-sd.bin
UBOOT_IMAGE_MX8MQ_DP=imx-boot-sd-dp.bin
ROOTFS_IMAGE=rootfs.tar.gz
BOOTLOADER_RESERVED_SIZE=2
PART1_SIZE=48
BOOTLOADER_OFFSET=32
DISPLAY=lvds
PART=p
BOOTPART=1
ROOTFSPART=2
BOOTDIR=/boot
check_board()
{
if grep -q "i.MX8MQ" /sys/devices/soc0/soc_id; then
BOARD=smarc-imx8mq
DTB_PREFIX=imx8mq-smarc
BOOTLOADER_OFFSET=33
BLOCK=mmcblk0
if [[ $DISPLAY != "-lcdif-lvds" && $DISPLAY != "-hdmi" && \
$DISPLAY != "-dp" && $DISPLAY != "-dual-display" && \
$DISPLAY != "-dcss-lvds" && $DISPLAY != "" ]]; then
red_bold_echo "ERROR: invalid display, should be -lcdif-lvds, -dcss-lvds, -hdmi, -dp, -dual-display or empty"
exit 1
fi
else if
if grep -q "i.MX8MP" /sys/devices/soc0/soc_id; then
BOARD=smarc-imx8mp
DTB_PREFIX=imx8mp-smarc
BOOTLOADER_OFFSET=32
BLOCK=mmcblk2
if [[ $DISPLAY != "lvds" && $DISPLAY != "hdmi" && \
$DISPLAY != "m7" && $DISPLAY != "" ]]; then
red_bold_echo "ERROR: invalid display, should be lvds-hdmi, m7 or empty"
exit 1
fi
else
red_bold_echo "ERROR: Unsupported board"
exit 1
fi
if [[ ! -b /dev/${BLOCK} ]] ; then
red_bold_echo "ERROR: Can't find eMMC device (/dev/${BLOCK})."
red_bold_echo "Please verify you are using the correct options for your SOM."
exit 1
fi
}
check_images()
{
if [[ ! -f $IMGS_PATH/$UBOOT_IMAGE ]] ; then
red_bold_echo "ERROR: \"$IMGS_PATH/$UBOOT_IMAGE\" does not exist"
exit 1
fi
if [[ ! -f $IMGS_PATH/$KERNEL_IMAGE ]] ; then
red_bold_echo "ERROR: \"$IMGS_PATH/$KERNEL_IMAGE\" does not exist"
exit 1
fi
if [[ ! -f $IMGS_PATH/${DTB_PREFIX}-${DISPLAY}.dtb ]] ; then
red_bold_echo "ERROR: \"$IMGS_PATH/${DTB_PREFIX}-${DISPLAY}.dtb\" does not exist"
exit 1
fi
if [[ ! -f $IMGS_PATH/uEnv.txt ]] ; then
red_bold_echo "ERROR: \"$IMGS_PATH/uEnv.txt\" does not exist"
exit 1
fi
if [[ ! -f $IMGS_PATH/$ROOTFS_IMAGE ]] ; then
red_bold_echo "ERROR: \"$IMGS_PATH/$ROOTFS_IMAGE\" does not exist"
exit 1
fi
}
delete_emmc()
{
echo
blue_underlined_bold_echo "Deleting current partitions"
umount /dev/${BLOCK}${PART}* 2>/dev/null || true
for ((i=1; i<=16; i++)); do
if [[ -e /dev/${BLOCK}${PART}${i} ]]; then
dd if=/dev/zero of=/dev/${BLOCK}${PART}${i} bs=1M count=1 2>/dev/null || true
fi
done
sync
dd if=/dev/zero of=/dev/${BLOCK} bs=1M count=100
sync; sleep 1
}
create_emmc_parts()
{
echo
blue_underlined_bold_echo "Creating new partitions"
SECT_SIZE_BYTES=`cat /sys/block/${BLOCK}/queue/hw_sector_size`
PART1_FIRST_SECT=$(($BOOTLOADER_RESERVED_SIZE * 1024 * 1024 / $SECT_SIZE_BYTES))
PART1_END_SECT=$((($BOOTLOADER_RESERVED_SIZE + $PART1_SIZE) * 1024 * 1024 / $SECT_SIZE_BYTES))
PART2_FIRST_SECT=`expr ${PART1_END_SECT} + 1`
(echo n; echo p; echo $BOOTPART; echo $PART1_FIRST_SECT; \
echo $PART1_END_SECT; echo n; echo p; echo $ROOTFSPART; \
echo $PART2_FIRST_SECT; echo; \
echo p; echo w) | fdisk -u /dev/${BLOCK} > /dev/null
sync; sleep 1
fdisk -u -l /dev/${BLOCK}
}
format_emmc_parts()
{
echo
blue_underlined_bold_echo "Formatting partitions"
mkfs.vfat -F 16 /dev/${BLOCK}${PART}${BOOTPART} -n boot
mkfs.ext4 /dev/${BLOCK}${PART}${ROOTFSPART} -L rootfs
sync; sleep 1
}
install_bootloader_to_emmc()
{
echo
blue_underlined_bold_echo "Installing booloader"
if [[ ${BOARD} = "smarc-imx8mq" && ( ${DISPLAY} = "-dp" ) ]]; then
UBOOT_IMAGE=${UBOOT_IMAGE_MX8MQ_DP}
fi
dd if=${IMGS_PATH}/${UBOOT_IMAGE} of=/dev/${BLOCK} bs=1K seek=${BOOTLOADER_OFFSET}
sync
}
install_kernel_to_emmc()
{
echo
blue_underlined_bold_echo "Installing kernel"
MOUNTDIR=/run/media/${BLOCK}${PART}${BOOTPART}
mkdir -p ${MOUNTDIR}
mount /dev/${BLOCK}${PART}${BOOTPART} ${MOUNTDIR}
mkdir -p ${MOUNTDIR}/dtbs/
cp -v ${IMGS_PATH}/${KERNEL_IMAGE} ${MOUNTDIR}
if [ "${MACHINE}" = "smarcimx8mq2g" ] ||
[ "${MACHINE}" = "smarcimx8mq4g" ]; then
cp -v ${IMGS_PATH}/${DTB_PREFIX}-${DISPLAY}.dtb ${MOUNTDIR}/dtbs/imx8mq-smarc.dtb
cp -v ${IMGS_PATH}/uEnv_8mq.txt ${MOUNTDIR}/uEnv.txt
fi
if [ "${MACHINE}" = "smarcimx8mp4g" ] ||
[ "${MACHINE}" = "smarcimx8mp6g" ]; then
cp -v ${IMGS_PATH}/${DTB_PREFIX}-${DISPLAY}.dtb ${MOUNTDIR}/dtbs/imx8mq-smarc.dtb
cp -v ${IMGS_PATH}/uEnv_8mp.txt ${MOUNTDIR}/uEnv.txt
fi
echo
sync
umount ${MOUNTDIR}
}
install_rootfs_to_emmc()
{
echo
blue_underlined_bold_echo "Installing rootfs"
MOUNTDIR=/run/media/${BLOCK}${PART}${ROOTFSPART}
mkdir -p ${MOUNTDIR}
mount /dev/${BLOCK}${PART}${ROOTFSPART} ${MOUNTDIR}
printf "Extracting files"
tar --warning=no-timestamp -xpf ${IMGS_PATH}/${ROOTFS_IMAGE} -C ${MOUNTDIR} --checkpoint=.1200
if [[ ${BOARD} = "smarc-imx8mp" ]]; then
# Create DTB symlink
# Create DTB symlinks
(cd ${MOUNTDIR}/${BOOTDIR}; ln -fs ${DTB_PREFIX}-${DISPLAY}.dtb ${DTB_PREFIX}.dtb)
fi
echo
sync
umount ${MOUNTDIR}
}
stop_udev()
{
if [ -f /lib/systemd/system/systemd-udevd.service ]; then
systemctl -q mask --runtime systemd-udevd
systemctl -q stop systemd-udevd
fi
}
start_udev()
{
if [ -f /lib/systemd/system/systemd-udevd.service ]; then
systemctl -q unmask --runtime systemd-udevd
systemctl -q start systemd-udevd
fi
}
usage()
{
echo
echo "This script installs Debian on the SOM's internal storage device"
echo
echo " Usage: $(basename $0) <option>"
echo
echo " options:"
echo " -h show help message"
if grep -q "i.MX8MQ" /sys/devices/soc0/soc_id; then
echo " -d <dcss-lvds|lcdif-lvds|dual-display|hdmi|dp> set display type, default is lvds"
elif grep -q "i.MX8MP" /sys/devices/soc0/soc_id; then
echo " -d <lvds|hdmi|m7> set display type, default is lvds"
fi
echo
}
finish()
{
echo
blue_bold_echo "Debian installed successfully"
exit 0
}
#################################################
# Execution starts here #
#################################################
if [[ $EUID != 0 ]] ; then
red_bold_echo "This script must be run with super-user privileges"
exit 1
fi
blue_underlined_bold_echo "*** Embedian SMARC-iMX8MP Debian eMMC Recovery ***"
echo
while getopts d:h OPTION;
do
case $OPTION in
d)
DISPLAY=$OPTARG
;;
h)
usage
exit 0
;;
*)
usage
exit 1
;;
esac
done
printf "Board: "
blue_bold_echo $BOARD
printf "Installing to internal storage device: "
blue_bold_echo eMMC
check_board
check_images
stop_udev
delete_emmc
create_emmc_parts
format_emmc_parts
install_bootloader_to_emmc
install_kernel_to_emmc
install_rootfs_to_emmc
start_udev
finish