0
0
mirror of https://github.com/libretro/Lakka-LibreELEC.git synced 2025-03-01 01:01:24 +00:00
2021-01-13 10:44:24 +00:00

234 lines
6.4 KiB
Bash
Executable File

#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
# ** !!! WARNING !!! WARNING !!! WARNING !!! WARNING !!! WARNING !!! **
# This script is not supported on generic box devices. If you choose to
# modify it to run on other hardware and you brick your device you will
# receive no support to restore your device. You have been warned!
do_backup(){
do_umount
echo "info: compressing ${EMMC} to ${2}, this will take time"
dd if="${EMMC}" | gzip > of="${2}"
echo "info: compressing completed"
}
do_detect(){
# used on LibreComputer LePotato/LaFrite where pre-formatted modules
# must be attached after boot (LibreComputer supports this) else the
# device always boots to the pre-formatted OS on the module.
echo "info: rebinding d0074000.mmc"
echo -n d0074000.mmc > /sys/bus/platform/drivers/meson-gx-mmc/unbind
echo -n d0074000.mmc > /sys/bus/platform/drivers/meson-gx-mmc/bind
sleep 1
parted -s "${EMMC}" print
}
do_info(){
BOOTINFO=$(dd if="${BOOT}" count=2048 2>/dev/null | strings | grep -e '^U-Boot ' | awk '{print $2}')
EMMCINFO=$(dd if="${EMMC}" count=2048 2>/dev/null | strings | grep -e '^U-Boot ' | awk '{print $2}')
echo ""
if [ -n "${BOOTINFO}" ]; then
echo "info: boot device is $BOOT, U-boot version is ${BOOTINFO}"
else
echo "info: boot device is $BOOT"
fi
if [ -n "${EMMCINFO}" ]; then
echo "info: emmc device is $EMMC, U-boot version is ${EMMCINFO}"
else
echo "info: emmc device is $EMMC"
fi
echo ""
parted -s "${EMMC}" print
echo ""
}
do_labels(){
if [ -n "${2}" ] && [ -n "${3}" ]; then
BOOTLABEL=$(echo "${2}" | awk 'BEGIN { getline; print toupper($0) }')
DISKLABEL=$(echo "${3}" | awk 'BEGIN { getline; print toupper($0) }')
else
BOOTLABEL="EMMC_BOOT"
DISKLABEL="EMMC_DISK"
fi
echo "info: using boot=LABEL=${BOOTLABEL} and disk=LABEL=${DISKLABEL}"
do_umount
echo "info: changing label values on partitions"
fatlabel "${EMMC}p1" "${BOOTLABEL}"
e2label "${EMMC}p2" "${DISKLABEL}"
sleep 1
echo "info: remounting ${EMMC}p1 to /var/media/${BOOTLABEL}"
mkdir -p "/var/media/${BOOTLABEL}"
mount "${EMMC}p1" "/var/media/${BOOTLABEL}"
echo "info: remounting ${EMMC}p2 to /var/media/${DISKLABEL}"
mkdir -p "/var/media/${DISKLABEL}"
mount "${EMMC}p2" "/var/media/${DISKLABEL}"
sleep 1
echo "info: changing label values in extlinux.conf"
sed -i "s/boot=LABEL=\w*/boot=LABEL=${BOOTLABEL}/g" "/var/media/${BOOTLABEL}/extlinux/extlinux.conf"
sed -i "s/disk=LABEL=\w*/disk=LABEL=${DISKLABEL}/g" "/var/media/${BOOTLABEL}/extlinux/extlinux.conf"
sleep 1
echo ""
blkid | grep "${EMMC}p"
echo ""
cat "/var/media/${BOOTLABEL}/extlinux/extlinux.conf"
echo ""
}
do_resize(){
if [ -z "${DISKLABEL}" ]; then
DISKLABEL=$(blkid | grep "${EMMC}"p2 | awk -F'"' '{print $2}')
fi
do_umount
echo "info: resizing partition ${EMMC}p2 to 100%"
parted -s -m "${EMMC}" resizepart 2 100% || parted -s -m "${EMMC}" resizepart 2 yes 100%
sleep 5
do_umount
echo "info: checking filesystem"
e2fsck -f "${EMMC}p2"
sleep 1
echo "info: resizing filesystem"
resize2fs "${EMMC}p2"
sync
sleep 1
echo "info: remounting ${EMMC}p2 to /var/media/${DISKLABEL}"
mkdir -p "/var/media/${DISKLABEL}"
mount "${EMMC}p2" "/var/media/${DISKLABEL}"
sleep 1
if [ -f "/var/media/${DISKLABEL}/.please_resize_me" ]; then
rm "/var/media/${DISKLABEL}/.please_resize_me"
fi
parted -s "${EMMC}" print
}
do_storage(){
if [ -n "${2}" ]; then
DISKLABEL=$(echo "${2}" | awk 'BEGIN { getline; print toupper($0) }')
else
DISKLABEL="EMMC_DISK"
fi
do_umount
echo "info: converting emmc for /storage use"
parted -s "${EMMC}" mklabel gpt
parted -s "${EMMC}" -a min unit s mkpart EMMC_STORAGE ext4 34 100%
sleep 1
mkfs.ext4 "${EMMC}p1"
sleep 1
e2label "${EMMC}p1" EMMC_STORAGE
echo "info: changing label values in extlinux.conf"
mount -o remount,rw /flash
sleep 1
sed -i "s/disk=LABEL=\w*/disk=LABEL=${DISKLABEL}/g" "/flash/extlinux/extlinux.conf"
mount -o remount,ro /flash
sleep 1
echo ""
blkid | grep "${EMMC}p"
echo ""
cat "/flash/extlinux/extlinux.conf"
echo ""
}
do_umount(){
for mount in $(grep "${EMMC}" /proc/mounts | awk '{print $1}'); do
echo "info: unmounting $mount"
umount -f "$mount"
sleep 1
done
}
do_write(){
do_umount
if [ "${2: -7}" == ".img.gz" ]; then
echo "info: writing ${2} to ${EMMC}"
gunzip -c "${2}" | dd of="${EMMC}" bs=1M
elif [ "${2: -4}" == ".img" ]; then
echo "info: writing ${2} to ${EMMC}"
dd if="${2}" of="${EMMC}" bs=1M
else
echo "error: ${2} is not a valid image file!"
exit 1
fi
}
do_zero(){
do_umount
echo "info: zeroing ${EMMC}, be patient, this will take time"
dd if="/dev/zero" of="${EMMC}" bs=1M
echo "info: zeroing complete"
}
do_help(){
echo ""
echo "usage: emmctool (w)rite <filename> : write <filename>.img/.img.gz to the eMMC module"
echo " (b)backup <filename> : dump the emmc partition to an .img.gz file"
echo " (d)etect : detect an eMMC module attached after boot"
echo " (i)nfo : show info about the eMMC module"
echo " (l)abels : change eMMC disk labels to ${BOOTLABEL}/${DISKLABEL}"
echo " (r)esize : resize the storage partition to 100%"
echo " (s)storage : convert emmc for use as /storage (boot from sdcard)"
echo " (z)ero : zero (erase/wipe) the eMMC module"
echo " (h)elp : displays this help message"
echo ""
}
BOOT=$(grep /flash /proc/mounts | awk '{print $1}' | sed 's/p[012]//g')
EMMC=$(find /dev -name "mmcblk*rpmb" | sed 's/rpmb//g' | head -n 1)
if [ -z "${EMMC}" ]; then
echo "error: no emmc module detected!"
exit 1
fi
case $(dtname) in
friendlyarm*|hardkernel*|khadas*|libretech*|wetek*)
if [ "${BOOT}" = "${EMMC}" ]; then
do_info
echo "Your device is booted from the eMMC module!"
echo ""
exit 1
fi
;;
*)
echo "Your device is not supported!"
echo ""
exit 1
;;
esac
case "${1}" in
backup)
do_backup "$@"
;;
detect|d)
do_detect
;;
info|i)
do_info
;;
labels|l)
do_labels "$@"
;;
resize|r)
do_resize
;;
storage|s)
do_storage "$@"
;;
write|w)
do_write "$@"
do_resize
do_labels
;;
zero|z)
do_zero
;;
*)
do_info
do_help
;;
esac
exit