#!/bin/busybox sh
# Aurora RAM boot EMMC1 — USB1 + internal eMMC READ-ONLY verification.
# NEVER mounts, fsck's, formats, trims or writes any mmcblk* device.
# No block devices, no firmware, no radios. Never exits (failures leave the UART shell).
/bin/busybox mkdir -p /proc /sys /dev /tmp /usr/bin /usr/sbin /sbin
/bin/busybox --install -s
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t devtmpfs devtmpfs /dev 2>/dev/null
mount -t configfs configfs /sys/kernel/config
log() { echo "[init] $*"; echo "[init] $*" > /dev/kmsg 2>/dev/null; }
echo
echo "=== AURORA RAM BOOT EMMC1 ==="
uname -a
echo "--- model";   cat /proc/device-tree/model; echo
echo "--- cmdline"; cat /proc/cmdline

emmc_ro() {
	for i in $(seq 1 100); do [ -b /dev/mmcblk0 ] && break; sleep 0.1; done
	if [ ! -b /dev/mmcblk0 ]; then log "EMMC: /dev/mmcblk0 did not appear"; return 1; fi
	sleep 0.5	# let partition nodes settle
	for d in /dev/mmcblk0 /dev/mmcblk0p* /dev/mmcblk0boot*; do [ -b "$d" ] && blockdev --setro "$d"; done
	bad=0; n=0
	for d in /dev/mmcblk0 /dev/mmcblk0p* /dev/mmcblk0boot*; do
		[ -b "$d" ] || continue; n=$((n+1)); r=$(blockdev --getro "$d")
		[ "$r" = "1" ] || { bad=1; log "EMMC-RO FAIL $d getro=$r"; }
	done
	echo "EMMC-RO-SUMMARY devices=$n all_ro=$([ $bad = 0 ] && echo YES || echo NO)"
	[ $bad = 0 ] || return 2
	log "EMMC: all $n block devices read-only (getro=1)"
}
emmc_report() {
	echo "=== EMMC-INFO-BEGIN"
	C=/sys/class/block/mmcblk0/device
	for f in name manfid oemid cid date serial type; do echo "$f=$(cat $C/$f 2>/dev/null)"; done
	echo "size_512=$(cat /sys/class/block/mmcblk0/size) logical_block=$(cat /sys/class/block/mmcblk0/queue/logical_block_size) bytes=$(blockdev --getsize64 /dev/mmcblk0)"
	cat /proc/partitions
	echo "=== EMMC-GPT-BEGIN (pN name start_512 size_512 ro)"
	for p in /sys/class/block/mmcblk0p*; do
		b=$(basename $p); nm=$(sed -n 's/^PARTNAME=//p' $p/uevent)
		echo "$b $nm $(cat $p/start) $(cat $p/size) $(cat $p/ro)"
	done
	echo "=== EMMC-GPT-END"
	echo "=== EMMC-SHA-BEGIN"
	for want in sbl1 rpm DDR sec aboot hyp tz tzbak; do
		for p in /sys/class/block/mmcblk0p*; do
			nm=$(sed -n 's/^PARTNAME=//p' $p/uevent)
			[ "$nm" = "$want" ] && echo "$nm $(basename $p) $(sha256sum /dev/$(basename $p) | cut -d' ' -f1)"
		done
	done
	echo "=== EMMC-SHA-END"
	echo "=== EMMC-INFO-END"
}
emmc_ro && EMMC_RO_OK=1	# RO FIRST, before anything else touches the disk

usb_up() {
	for i in $(seq 1 50); do
		udc=$(ls /sys/class/udc 2>/dev/null | head -1)
		[ -n "$udc" ] && break
		sleep 0.2
	done
	echo "--- /sys/class/udc:"; ls -l /sys/class/udc 2>&1
	if [ -z "$udc" ]; then log "NO UDC found - USB gadget skipped"; return 1; fi
	# DEVELOPMENT-ONLY IDs (same dev setup as JZ02: Google 18d1:d001) - not for production
	G=/sys/kernel/config/usb_gadget/aurora
	mkdir -p $G || return 1
	echo 0x18d1 > $G/idVendor
	echo 0xd001 > $G/idProduct
	mkdir -p $G/strings/0x409
	echo "Aurora" > $G/strings/0x409/manufacturer
	echo "Aurora RAM Boot" > $G/strings/0x409/product
	echo "<EMMC_SERIAL>" > $G/strings/0x409/serialnumber
	mkdir -p $G/functions/ncm.usb0 || { log "ncm function create FAILED"; return 1; }
	mkdir -p $G/configs/c.1/strings/0x409
	echo "NCM" > $G/configs/c.1/strings/0x409/configuration
	ln -s $G/functions/ncm.usb0 $G/configs/c.1/
	echo "$udc" > $G/UDC || { log "bind to UDC '$udc' FAILED"; return 1; }
	log "usb gadget bound to UDC '$udc'"
	ifc=$(cat $G/functions/ncm.usb0/ifname 2>/dev/null)
	log "ncm ifname='$ifc' dev_addr=$(cat $G/functions/ncm.usb0/dev_addr) host_addr=$(cat $G/functions/ncm.usb0/host_addr)"
	[ -n "$ifc" ] || return 1
	ip link set lo up
	ip addr add 172.16.42.1/24 dev "$ifc"
	ip link set "$ifc" up
	ip addr show "$ifc"
	log "network: $ifc 172.16.42.1/24 up (static, no DHCP)"
}
usb_up || log "USB/NCM setup incomplete - staying on UART shell"

if [ "$EMMC_RO_OK" = 1 ]; then emmc_report; else log "EMMC: RO not confirmed or device missing - NO further disk access"; fi
echo "=== entering shell (exit restarts it) ==="
while true; do
	setsid cttyhack sh
	echo "shell exited, restarting"; sleep 1
done
