#!/bin/sh
# Script for kernel from mmc partition on STB AX HD51
# (C) 2018 DboxOldie
# License: GPLv2 or later

magic_number="0x016f2818"
dtb_magic_number="0xd00dfeed"
save_path="/tmp/hd51"

# Root und Kernel Partition bestimmen
#
rootmtd=`readlink /dev/root`
rootnumber=`echo ${rootmtd:8:1}`
mmcprefix=`echo ${rootmtd:0:8}`
kernelnumber=$((rootnumber -1))
kernelmtd=$mmcprefix$kernelnumber

if [ $kernelnumber -lt 9 -a $kernelnumber -gt 1 ];then
	echo "Bootdevice   = $rootmtd"
	echo "Kerneldevice = $kernelmtd"
else
	echo "Kernel MTD nicht im Bereich ( 2,4,6,8 ) !! > $kernelnumber"
	exit 0
fi

# 16 Bytes ( 33 bis 49 ) aus Kernel Partition lesen
#
line=`dd if=/dev/$kernelmtd bs=1 skip=32 count=16 2> /dev/null | hexdump -C`

# Kernelmagic für zImage prüfen
#
kmagic="0x"
kmagic=$kmagic`echo $line | cut -d " " -f9`
kmagic=$kmagic`echo $line | cut -d " " -f8`
kmagic=$kmagic`echo $line | cut -d " " -f7`
kmagic=$kmagic`echo $line | cut -d " " -f6`

if [ "$kmagic" == "$magic_number" ];then
	echo
	echo "Magic für zImage gefunden > $kmagic == $magic_number"
else
	echo
	echo "Keine Magic für zImage gefunden > $kmagic != $magic_number"
	exit 0
fi
# zImage Länge bestimmen
#
zimage_len="0x"
zimage_len=$zimage_len`echo $line | cut -d " " -f17`
zimage_len=$zimage_len`echo $line | cut -d " " -f16`
zimage_len=$zimage_len`echo $line | cut -d " " -f15`
zimage_len=$zimage_len`echo $line | cut -d " " -f14`

echo
echo "zImage Länge = $((zimage_len)) Bytes"

# Prüfung auf DTB
#
# 16 Bytes ( ab zImage Länge ) aus Kernel Partition lesen
#
line=`dd if=/dev/$kernelmtd bs=1 skip=$((zimage_len)) count=16 2> /dev/null | hexdump -C`

dtb_magic="0x"
dtb_magic=$dtb_magic`echo $line | cut -d " " -f2`
dtb_magic=$dtb_magic`echo $line | cut -d " " -f3`
dtb_magic=$dtb_magic`echo $line | cut -d " " -f4`
dtb_magic=$dtb_magic`echo $line | cut -d " " -f5`

if [ "$dtb_magic" == "$dtb_magic_number" ];then
	echo
	echo "DTB Bereich vorhanden"
# DTB Länge bestimmen
#
	dtb_len="0x"
	dtb_len=$dtb_len`echo $line | cut -d " " -f6`
	dtb_len=$dtb_len`echo $line | cut -d " " -f7`
	dtb_len=$dtb_len`echo $line | cut -d " " -f8`
	dtb_len=$dtb_len`echo $line | cut -d " " -f9`
	echo "DTB Länge = $((dtb_len)) Bytes"
else
	echo
	echo "Kein DTB Bereich vorhanden"
	dtb_len=0
fi

# Endgültige Kernellänge
#
klen=$((zimage_len + dtb_len))

echo
echo "Gesamt Kernel Länge = $klen Bytes"

# Kernel aus Partition auslesen
#
count=`echo $((klen / 4096))`
len1=`echo $((count * 4096))`
rest=`echo $((klen - len1))`

mkdir -p $save_path

dd if=/dev/$kernelmtd of=$save_path/kernel_1.bin bs=4096 count=$count 2> /dev/null
dd if=/dev/$kernelmtd of=$save_path/kernel_2.bin bs=1 count=$rest skip=$len1 2> /dev/null

cat $save_path/kernel_*.bin > $save_path/kernel.bin

rm -f $save_path/kernel_*.bin

echo
echo "Kernel in $save_path gespeichert"
exit 0
