#!/usr/bin/env bash # Прошивка eMMC на X96Q — запускать на приставке под root # Usage: sudo ./flash-emmc.sh [образ.img.xz] set -euo pipefail DIR="$(cd "$(dirname "$0")" && pwd)" UBOOT="${UBOOT:-${DIR}/../output/u-boot-custom.bin}" IMG_XZ="${1:-}" if [[ $EUID -ne 0 ]]; then echo "Запустите: sudo $0 [образ.img.xz]" exit 1 fi if [[ -z "$IMG_XZ" ]]; then shopt -s nullglob imgs=( "$DIR"/*.img.xz ) if [[ ${#imgs[@]} -eq 0 ]]; then echo "Нет .img.xz в $DIR" exit 1 elif [[ ${#imgs[@]} -eq 1 ]]; then IMG_XZ="${imgs[0]}" else echo "Несколько образов — укажите явно:" ls -lh "${imgs[@]}" exit 1 fi fi [[ -f "$IMG_XZ" ]] || { echo "Нет файла: $IMG_XZ"; exit 1; } [[ -f "$UBOOT" ]] || { echo "Нет $UBOOT"; exit 1; } EMMC=/dev/mmcblk2 BOOT0=/dev/mmcblk2boot0 BOOT1=/dev/mmcblk2boot1 [[ -b "$EMMC" ]] || { echo "eMMC не найден: $EMMC"; exit 1; } unlock_boot() { local ro for part in boot0 boot1; do ro="/sys/block/mmcblk2${part}/force_ro" [[ -w "$ro" ]] || continue echo 0 >"$ro" echo "mmcblk2${part}: force_ro=$(cat "$ro")" done } echo "=== eMMC flash (X96Q) ===" echo "Образ: $IMG_XZ ($(du -h "$IMG_XZ" | cut -f1))" echo "U-Boot: $UBOOT" echo "Цель: $EMMC + $BOOT0 + $BOOT1" lsblk -o NAME,SIZE,TYPE,MOUNTPOINT 2>/dev/null | grep -E 'mmcblk|NAME' || lsblk echo "[1/4] Запись образа на $EMMC ..." xz -dc "$IMG_XZ" | dd of="$EMMC" bs=4M status=progress conv=fsync sync echo "[2/4] U-Boot → user area @ 8 KiB ..." dd if="$UBOOT" of="$EMMC" bs=1024 seek=8 conv=fsync echo "Разблокировка boot0/boot1 (force_ro) ..." unlock_boot echo "[3/4] U-Boot → boot0 ..." dd if="$UBOOT" of="$BOOT0" bs=1024 conv=fsync echo "[4/4] U-Boot → boot1 ..." dd if="$UBOOT" of="$BOOT1" bs=1024 conv=fsync sync # Armbian DTB: в образе sun50i-h313-x96q-lpddr3.dtb, не v1.3 MNT="/tmp/emmc-fix" mkdir -p "$MNT" if mount "${EMMC}p1" "$MNT"; then ENV="${MNT}/boot/armbianEnv.txt" DTB="${MNT}/boot/dtb/allwinner" if [[ -f "$ENV" ]]; then if grep -q '^fdtfile=' "$ENV"; then sed -i 's/^fdtfile=.*/fdtfile=sun50i-h313-x96q-lpddr3.dtb/' "$ENV" else echo 'fdtfile=sun50i-h313-x96q-lpddr3.dtb' >>"$ENV" fi fi if [[ -d "$DTB" && -f "${DTB}/sun50i-h313-x96q-lpddr3.dtb" ]]; then ln -sf sun50i-h313-x96q-lpddr3.dtb "${DTB}/sun50i-h313-x96q-lpddr3-v1.3.dtb" fi sync umount "$MNT" fi rmdir "$MNT" 2>/dev/null || true echo "Готово. Выключите, выньте SD, включите — загрузка с eMMC."