Bug#612376: flash-kernel: please include efikamx support
Package: flash-kernel
Version: 2.37
The attached file is part of the flash-kernel 2.28ubuntu10genesi1
distributed by Genesi.
Please incorporate the efikamx_flash_kernel function.
I would change the boot.scr generation to include
console=${console} as part of bootargs.
#!/bin/sh
# Copyright (C) 2006 Joey Hess <joeyh@debian.org>
# Copyright (C) 2006, 2007, 2008, 2009 Martin Michlmayr <tbm@cyrius.com>
# Copyright (C) 2009, 2010 Canonical Ltd
# Copyright (C) 2010 Genesi USA, Inc.
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,
# USA.
set -e
error() {
echo "$@" >&2
exit 1
}
check_mtd() {
if [ ! -e /proc/mtd ]; then
error "/proc/mtd doesn't exist"
fi
}
mtdblock() {
grep "\"$1\"" /proc/mtd | cut -d: -f 1 | sed 's/mtd/\/dev\/mtdblock/'
}
check_dev_mtdblock() {
if [ ! -b "$1" ]; then
error "$1 is not a block device"
fi
}
mtdsize() {
size=$(grep "\"$1\"" /proc/mtd | cut -d " " -f 2)
printf "%d" 0x$size
}
check_subarch() {
if [ -n "$subarch" ] && [ "$subarch" != "$1" ]; then
echo "Kernel $kfile does not match your subarchitecture" >&2
echo "$1, therefore not writing it to flash." >&2
exit 0
fi
}
check_size() {
if [ $2 -gt $3 ]; then
error "The $1 doesn't fit in flash."
fi
}
check_fis() {
if ! fis -d "$1" -o "$2" -s "$3" list >/dev/null; then
error "fis list failed on device $1 at offset $2 with size $3"
fi
}
# returns addr, size, and entry in hex, space separated; e.g. for the kernel
# partition, when fis list would return:
# kernel: addr = 0x00060000, size = 0x00400000, entry = 0x00100000, \
# length = 0x002144c0, cksum = 0xe9909335
# this function outputs:
# 00060000 00400000 00100000
fis_info() {
LC_ALL=C fis -d "$1" -o "$2" -s "$3" list | sed -rn "s/^[[:space:]]*$4: addr = 0x([0-9a-f]{8}), size = 0x([0-9a-f]{8}), entry = 0x([0-9a-f]{8}), length = 0x[0-9a-f]{8}, cksum = 0x[0-9a-f]{8}\$/\1 \2 \3/p"
}
# pass fis_info output in args and outputs the decimal offset
fis_offset() {
printf %d 0x$1
}
# pass fis_info output in args and outputs the decimal size
fis_size() {
printf %d 0x$2
}
# pass fis_info output in args and outputs the decimal entry point
fis_entry() {
printf %d 0x$3
}
# See http://www.nslu2-linux.org/wiki/Info/BootFlash -- the NSLU2 uses a
# 16 byte MTD header, the first four bytes (big endian) give the length of
# the remainder of the image, and the remaining bytes are zero. Generate
# this header.
sercomm_header() {
perl -e 'print pack("N4", shift)' "$1"
}
nslu2_swap() {
if [ "$little_endian" ]; then
devio "<<$1" "xp $,4"
else
cat "$1"
fi
}
# list of functions to call on cleanup
cleanup_funcs=""
cleanup() {
for f in $cleanup_funcs; do
$f
done
}
# generic flash-kernel routines for specific subarchs
omap_flash_kernel() {
if [ -n "${UBOOT_PART}" ]; then
echo "Using u-boot partition: ${UBOOT_PART}" >&2
TMPMOUNT=$(mktemp -d)
mount $UBOOT_PART $TMPMOUNT
printf "Creating backups of uImage and uInitrd... " >&2
if [ -e $TMPMOUNT/uImage ]; then
cp $TMPMOUNT/uImage $TMPMOUNT/uImage.bak
fi
if [ -e $TMPMOUNT/uInitrd ]; then
cp $TMPMOUNT/uInitrd $TMPMOUNT/uInitrd.bak
fi
echo "done." >&2
printf "Generating kernel u-boot image... " >&2
mkimage -A arm -O linux -T kernel -C none -a 0x80008000 \
-e 0x80008000 -n "Ubuntu Kernel" -d $kfile $TMPMOUNT/uImage >&2 1>/dev/null
echo "done." >&2
printf "Generating Initramfs u-boot image... " >&2
mkimage -A arm -O linux -T ramdisk -C none -a 0x0 -e 0x0 \
-n "Ubuntu Initrd" -d $ifile $TMPMOUNT/uInitrd >&2 1>/dev/null
echo "done." >&2
if [ -e /boot/boot.script ];then
printf "Generating u-boot configuration from /boot/boot.script... " >&2
cp $TMPMOUNT/boot.scr $TMPMOUNT/boot.scr.bak
mkimage -A arm -T script -C none -n "Ubuntu boot script" -d /boot/boot.script \
$TMPMOUNT/boot.scr >&2 1>/dev/null
echo "done." >&2
fi
umount $TMPMOUNT
rm -rf $TMPMOUNT
else
initrd_nand_size="16777216"
check_mtd
kmtd=$(mtdblock "Kernel")
if [ -z "$kmtd" ]; then
error "Cannot find mtd partition 'Kernel'"
fi
check_dev_mtdblock "$kmtd"
kmtdsize=$(mtdsize "Kernel")
check_size "Kernel" $(($kfilesize + 8 + 64)) $kmtdsize
printf "Generating kernel u-boot image... " >&2
tmp=$(tempfile)
cat $kfile >> $tmp
mkimage -A arm -O linux -T kernel -C none -a 0x80008000 \
-e 0x80008000 -n "Ubuntu Kernel" -d $tmp $tmp.uboot >&2 1>/dev/null
echo "done." >&2
printf "Erasing Kernel NAND space... " >&2
dd if=/dev/zero of=$kmtd bs=$kmtdsize count=1 2>/dev/null
echo "done." >&2
printf "Flashing kernel... " >&2
cat $tmp.uboot > $kmtd || error "failed."
echo "done." >&2
rm -f $tmp.uboot $tmp
imtd=$(mtdblock "File System")
if [ -z "$imtd" ]; then
error "Cannot find mtd partition for Initramfs"
fi
check_dev_mtdblock "$imtd"
check_size "Initramfs" $ifilesize $initrd_nand_size
printf "Generating Initramfs u-boot image... " >&2
tmp=$(tempfile)
cat $ifile >> $tmp
mkimage -A arm -O linux -T ramdisk -C none -a 0x0 -e 0x0 \
-n "Ubuntu Initrd" -d $tmp $tmp.uboot >&2 1>/dev/null
echo "done." >&2
printf "Erasing Initramfs NAND space... " >&2
dd if=/dev/zero of=$imtd bs=$initrd_nand_size count=1 2>/dev/null
echo "done." >&2
printf "Flashing Initramfs... " >&2
cat $tmp.uboot > $imtd || error "failed."
echo "done." >&2
rm -f $tmp.uboot $tmp
fi
}
dove_flash_kernel() {
tmp=$(tempfile)
uboot_kernel_load_addr=0x00200000
uboot_initramfs_load_addr=0x01100000
script_load_addr=0x1000
printf "Generating kernel u-boot image... " >&2
cat $kfile >> $tmp
mkimage -A arm -O linux -T kernel -C none -n "$desc" -a 0x00008000 \
-e 0x00008000 -d $tmp $tmp.uboot >&2 1>/dev/null
echo "done." >&2
if [ -e /boot/uImage ]; then
echo "Creating backup of /boot/uImage." >&2
mv /boot/uImage /boot/uImage.bak
fi
echo "Creating new /boot/uImage." >&2
mv $tmp.uboot /boot/uImage
rm -f $tmp
printf "Generating initrd u-boot image... " >&2
mkimage -A arm -O linux -T ramdisk -C gzip -a 0x0 \
-e 0x0 -n "$idesc" -d "$ifile" "$tmp.uboot" >&2 1>/dev/null
echo "done." >&2
if [ -e /boot/uInitrd ]; then
echo "Creating backup of /boot/uInitrd." >&2
mv /boot/uInitrd /boot/uInitrd.bak
fi
echo "Creating new /boot/uInitrd." >&2
mv "$tmp.uboot" /boot/uInitrd
rm -f "$tmp.uboot"
printf "Generating new u-boot boot script..." >&2
# The UUID will come from the flash-kernel config file
cat >"$tmp.boot.script" <<EOF
echo Starting Ubuntu...
if test -n \${fs} && test -n \${interface} && test -n \${device} && test -n \${prefix}; then
\${fs}load \${interface} \${device} $uboot_kernel_load_addr \${prefix}uImage
\${fs}load \${interface} \${device} $uboot_initramfs_load_addr \${prefix}uInitrd
setenv bootargs $rootfs ro quiet splash
bootm $uboot_kernel_load_addr $uboot_initramfs_load_addr
fi
echo boot information not recieved from u-boot, scanning for startup device
if test -e \${reinitalize_devices}; then
usb start;
ide reset;
fi
for i in usb ide; do
for j in 0 1; do
for l in / /boot/; do
for m in fat ext2; do
setenv interface \$i;
setenv device \$j;
setenv prefix \$l;
setenv fs \$m;
echo Scanning \${fs} \${interface} \${device} on prefix \${prefix} ...;
# This "if" avoids loading an old image but
# doesn't work in stock u-boot 1.3.4 and is
# only fixed in Canonical u-boot from October
# 1st or later
if \${fs}load \${interface} \${device} $script_load_addr \${prefix}boot.scr; then
if imi $script_load_addr; then
echo boot.scr found! Executing ...;
autoscr $script_load_addr;
fi;
fi
done;
done;
done;
done
echo No boot device found.;
EOF
mkimage -A arm -T script -C none -n "Ubuntu boot script" -d "$tmp.boot.script" \
"$tmp.boot.scr" >&2 1>/dev/null
echo "done." >&2
if [ -e /boot/boot.scr ]; then
echo "Creating backup of /boot/boot.scr." >&2
mv /boot/boot.scr /boot/boot.scr.bak
fi
echo "Creating new /boot/boot.scr." >&2
mv "$tmp.boot.scr" /boot/boot.scr
rm -f "$tmp.boot.script" "$tmp.boot.scr"
}
efikamx_flash_kernel() {
root=$(readlink -f /dev/root)
echo "Root filesystem is $root" >&2
loadaddr=0x90008000
tmp=$(tempfile)
printf "Generating kernel u-boot image... " >&2
cat $kfile >> $tmp
mkimage -A arm -O linux -T kernel -C none -n "$desc" -a $loadaddr \
-e $loadaddr -d $tmp $tmp.uboot >&2 1>/dev/null
echo "done." >&2
if [ -e /boot/uImage-$kvers ]; then
echo "Creating backup of /boot/uImage-$kvers." >&2
mv /boot/uImage-$kvers /boot/uImage-$kvers.bak
fi
echo "Creating new /boot/uImage." >&2
mv $tmp.uboot /boot/uImage-$kvers
rm -f $tmp.uboot
printf "Generating initrd u-boot image... " >&2
mkimage -A arm -O linux -T ramdisk -C gzip -a 0x0 \
-e 0x0 -n "$idesc" -d "$ifile" "$tmp.uboot" >&2 1>/dev/null
echo "done." >&2
if [ -e /boot/uInitrd-$kvers ]; then
echo "Creating backup of /boot/uInitrd." >&2
mv /boot/uInitrd-$kvers /boot/uInitrd-$kvers.bak
fi
echo "Creating new /boot/uInitrd." >&2
mv "$tmp.uboot" /boot/uInitrd-$kvers
rm -f "$tmp.uboot"
printf "Generating new u-boot boot script..." >&2
# The UUID will come from the flash-kernel config file
# if [ -f /boot/boot.cmdline ]; then
# echo -n "Loading extra commandline arguments... "
# cmdline=`head -n1 -q /boot/boot.cmdline`
# # check for root= arg here or custom args will break boot
# echo "'${cmdline}'"
# else
# cmdline="console=tty1 root=$root rootwait rw"
# fi
printf "Generating boot.scr... " >&2
cat >$tmp.boot.script <<EOF
setenv ramdisk uInitrd-$kvers;
setenv kernel uImage-$kvers;
setenv bootargs console=tty1 root=$root rootwait rw quiet splash;
\${loadcmd} \${ramdiskaddr} \${ramdisk};
if imi \${ramdiskaddr}; then; else
setenv bootargs \${bootargs} noinitrd;
setenv ramdiskaddr "";
fi;
\${loadcmd} \${kerneladdr} \${kernel}
if imi \${kerneladdr}; then
bootm \${kerneladdr} \${ramdiskaddr}
fi;
EOF
mkimage -A arm -T script -C none -n "Ubuntu boot script" -d "$tmp.boot.script" \
"$tmp.boot.scr" >&2 1>/dev/null
echo "done." >&2
if [ -e /boot/boot.scr ]; then
echo "Creating backup of /boot/boot.scr." >&2
mv /boot/boot.scr /boot/boot.scr.bak
fi
echo "Creating new /boot/boot.scr." >&2
mv "$tmp.boot.scr" /boot/boot.scr
rm -f "$tmp.boot.script" "$tmp.boot.scr"
rm -f $tmp*
}
trap "cleanup" 0 HUP INT QUIT KILL SEGV PIPE TERM
config="/etc/flash-kernel.conf"
if [ -r "$config" ]; then
. "$config"
fi
if [ "x$1" = "x--machine" ]; then
machine=$2
shift 2
else
machine=$(grep "^Hardware" /proc/cpuinfo | sed 's/Hardware\s*:\s*//')
fi
running_subarch=$(uname -r | sed -e 's/.*-//')
if [ "x$1" = "x--supported" ]; then
# if FLASH_KERNEL_SKIP is set, its always unsupported
if [ -n "$FLASH_KERNEL_SKIP" ]; then
exit 1
fi
case "$machine" in
"ARM-Versatile Express CA9x4") exit 0 ;;
"Buffalo Linkstation Pro/Live") exit 0 ;;
"Buffalo/Revogear Kurobox Pro") exit 0 ;;
"D-Link DNS-323") exit 0 ;;
"Freescale MX51 Babbage Board") exit 0 ;;
"GLAN Tank") exit 0 ;;
"HP Media Vault mv2120") exit 0 ;;
"IGEP v2 board") exit 0 ;;
"Marvell DB-MV88F6781-BP Development Board") exit 0 ;;
"Linksys NSLU2") exit 0 ;;
"OMAP3 Beagle Board") exit 0 ;;
"OMAP4430 Panda Board") exit 0 ;;
"OMAP4430 4430SDP board") exit 0 ;;
"Marvell OpenRD Base Board") exit 0 ;;
"Marvell OpenRD Client Board") exit 0 ;;
"Marvell SheevaPlug Reference Board") exit 0 ;;
"Marvell eSATA SheevaPlug Reference Board") exit 0 ;;
"QNAP TS-109/TS-209" | "QNAP TS-409") exit 0 ;;
"QNAP TS-119/TS-219") exit 0 ;;
"QNAP TS-41x") exit 0 ;;
"Thecus N2100") exit 0 ;;
"Lanner EM7210") exit 0 ;;
"Genesi Efika MX (Smartbook)") exit 0 ;;
"Genesi Efika MX (Smarttop)") exit 0 ;;
*)
# we're supported if we have a generic fallback
case "$running_subarch" in
"dove" | "omap" | "omap4" | "efikamx" | "efikasb" ) exit 0 ;;
esac
exit 1
;;
esac
fi
if [ -n "$FLASH_KERNEL_SKIP" ]; then
exit 0
fi
if [ -n "$1" ]; then
kvers="$1"
kfile=/boot/vmlinuz-$kvers
ifile=/boot/initrd.img-$kvers
desc="Ubuntu kernel $1"
idesc="Ubuntu ramdisk $1"
else
if [ -e /vmlinuz ]; then
kfile=/vmlinuz
ifile=/initrd.img
elif [ -e /boot/vmlinuz ]; then
kfile=/boot/vmlinuz
ifile=/boot/initrd.img
else
error "Cannot find a default kernel in /vmlinuz or /boot/vmlinuz"
fi
desc="Debian kernel"
idesc="Debian ramdisk"
fi
if [ ! -e $kfile ] || [ ! -e $ifile ]; then
error "Can't find $kfile and $ifile"
fi
kfilesize=$(wc -c "$kfile" | awk '{print $1}')
ifilesize=$(wc -c "$ifile" | awk '{print $1}')
# Extract the subarchitecture from the kernel name
if [ -L "$kfile" ]; then
kfile=$(readlink -e "$kfile")
fi
subarch=$(echo "$kfile" | sed -e 's/.*-//')
case "$machine" in
"ARM-Versatile Express CA9x4")
check_subarch "vexpress"
check_mtd
kmtd=$(mtdblock "kernel")
if [ -z "$kmtd" ]; then
error "Cannot find mtd partition 'kernel'"
fi
check_dev_mtdblock "$kmtd"
kmtdsize=$(mtdsize "kernel")
check_size "kernel" $(($kfilesize + 64)) $kmtdsize
printf "Generating a u-boot compatible kernel image... " >&2
mkimage -A arm -O linux -T kernel -C none -a 0x60008000 \
-e 0x60008000 -n "$desc" -d $kfile $kfile.uboot \
>&2 1>/dev/null
printf "Writing kernel to flash... " >&2
cat $kfile.uboot > $kmtd || error "failed."
echo "done." >&2
rm -f $kfile.uboot
imtd=$(mtdblock "initrd")
if [ -z "$imtd" ]; then
error "Cannot find mtd partition for initrd"
fi
check_dev_mtdblock "$imtd"
imtdsize=$(mtdsize "initrd")
check_size "initrd" $ifilesize $imtdsize
printf "Generating u-boot compatible initrd image... " >&2
mkimage -A arm -O linux -T ramdisk -C none -a 0x81000000 \
-e 0x81000000 -n "$idesc" -d $ifile $ifile.uboot \
>&2 1>/dev/null
printf "Writing initrd to flash... " >&2
cat $ifile.uboot > $imtd || error "failed."
echo "done." >&2
rm -f $ifile.uboot
;;
"Buffalo Linkstation Pro/Live" | "Buffalo/Revogear Kurobox Pro")
check_subarch "orion5x"
tmp="$(tempfile)"
printf "Generating kernel u-boot image... " >&2
case "$machine" in
"Buffalo Linkstation Pro/Live")
# Set machine id 1585 (0x0631)
devio > "$tmp" 'wl 0xe3a01c06,4' 'wl 0xe3811031,4'
;;
"Buffalo/Revogear Kurobox Pro")
# Set machine id 1509 (0x05e5)
devio > "$tmp" 'wl 0xe3a01c05,4' 'wl 0xe38110e5,4'
;;
esac
cat "$kfile" >> "$tmp"
mkimage -A arm -O linux -T kernel -C none -a 0x00008000 \
-e 0x00008000 -n "$desc" -d "$tmp" "$tmp.uboot" >&2 1>/dev/null
echo "done." >&2
if [ -e /boot/uImage.buffalo ]; then
echo "Creating backup of /boot/uImage.buffalo." >&2
mv /boot/uImage.buffalo /boot/uImage.buffalo.bak
fi
echo "Creating new /boot/uImage.buffalo." >&2
mv "$tmp.uboot" /boot/uImage.buffalo
rm -f "$tmp"
printf "Generating initrd u-boot image... " >&2
mkimage -A arm -O linux -T ramdisk -C gzip -a 0x0 \
-e 0x0 -n "$idesc" -d "$ifile" "$tmp.uboot" >&2 1>/dev/null
echo "done." >&2
if [ -e /boot/initrd.buffalo ]; then
echo "Creating backup of /boot/initrd.buffalo." >&2
mv /boot/initrd.buffalo /boot/initrd.buffalo.bak
fi
echo "Creating new /boot/initrd.buffalo." >&2
mv "$tmp.uboot" /boot/initrd.buffalo
;;
"D-Link DNS-323")
check_subarch "orion5x"
check_mtd
imtd=$(mtdblock "File System")
if [ -z "$imtd" ]; then
error "Cannot find mtd partition 'File System'"
fi
check_dev_mtdblock "$imtd"
imtdsize=$(mtdsize "File System")
check_size "File System" $((ifilesize + 64)) $imtdsize
kmtd=$(mtdblock "Linux Kernel")
if [ -z "$kmtd" ]; then
error "Cannot find mtd partition 'Linux Kernel'"
fi
check_dev_mtdblock "$kmtd"
kmtdsize=$(mtdsize "Linux Kernel")
check_size "Linux Kernel" $(($kfilesize + 8 + 64)) $kmtdsize
printf "Generating kernel u-boot image... " >&2
tmp="$(tempfile)"
# Set machine id 1542 (0x0606)
devio > "$tmp" 'wl 0xe3a01c06,4' 'wl 0xe3811006,4'
cat "$kfile" >> "$tmp"
mkimage -A arm -O linux -T kernel -C none -a 0x00008000 \
-e 0x00008000 -n "$desc" -d "$tmp" "$tmp.uboot" >&2 1>/dev/null
echo "done." >&2
printf "Flashing kernel... " >&2
cat "$tmp.uboot" > "$kmtd" || error "failed."
echo "done." >&2
rm -f "$tmp.uboot" "$tmp"
printf "Generating initramfs u-boot image... " >&2
mkimage -A arm -O linux -T ramdisk -C gzip -a 0x00800000 \
-e 0x00800000 -n "$idesc" -d "$ifile" "$tmp.uboot" >&2 1>/dev/null
echo "done." >&2
printf "Flashing initramfs... " >&2
cat "$tmp.uboot" > "$imtd" || error "failed."
echo "done." >&2
rm -f "$tmp.uboot"
;;
"Freescale MX51 Babbage Board")
check_subarch "imx51"
for c in fis_dev fis_offset_hex fis_size_hex; do
if [ -z "`eval echo \$$c`" ]; then
error "$c not set in $config"
fi
done
check_dev_mtdblock "$fis_dev"
check_fis "$fis_dev" "$fis_offset_hex" "$fis_size_hex"
# check for an "initrd" entry
initrd="initrd"
ifisinfo=$(fis_info "$fis_dev" "$fis_offset_hex" "$fis_size_hex" "initrd")
# fallback on "initramfs"
if [ -z "$ifisinfo" ]; then
initrd="initramfs"
ifisinfo=$(fis_info "$fis_dev" "$fis_offset_hex" "$fis_size_hex" "$initrd")
if [ -z "$ifisinfo" ]; then
error "Cannot find FIS partition '$initrd'"
fi
fi
ifissize=$(fis_size $ifisinfo)
check_size "$initrd" $ifilesize $ifissize
kfisinfo=$(fis_info "$fis_dev" "$fis_offset_hex" "$fis_size_hex" "kernel")
if [ -z "$kfisinfo" ]; then
error "Cannot find FIS partition 'kernel'"
fi
kfissize=$(fis_size $kfisinfo)
check_size "kernel" $kfilesize $kfissize
kfisoffset=$(fis_offset $kfisinfo)
kfisentry=$(fis_entry $kfisinfo)
# the kernel is started at its load address so kfisram ==
# kfisentry
kfisram="$kfisentry"
ifisoffset=$(fis_offset $ifisinfo)
# not used
ifisentry=$(printf %d 0xffffffff)
# XXX hardcoded, should be read from RedBoot; but fis command
# currently doesn't return that info
ifisram=$(printf %d 0x1000000)
printf "Flashing kernel... " >&2
fis -d "$fis_dev" -o "$fis_offset_hex" -s "$fis_size_hex" create "kernel" -f $kfisoffset -l $kfissize -e $kfisentry -r $kfisram -c "$kfile" || error "FIS create failed."
dd if="$kfile" of="$fis_dev" bs=$kfisoffset seek=1 2>/dev/null || error "update failed."
echo "done." >&2
printf "Generating padded initramfs... " >&2
# padded initramfs; we need to use a temp file because of the
# fis command which needs to see a padded datalength
ipadded=""
# cleanup handler which removes the generated temp file when
# this script finished
cleanup_ipadded() {
if [ -n "$ipadded" ]; then
rm -f "$ipadded"
fi
}
cleanup_funcs="cleanup_ipadded $cleanup_funcs"
ipadded=$(mktemp -t flash-kernel.XXXXXXXXXX)
pad=$(expr $ifissize - $ifilesize)
(
cat $ifile
# pad with zeroes; this uses $pad mem, not very elegant
dd if=/dev/zero bs=$pad count=1 2>/dev/null
) | dd of="$ipadded" bs=4k 2>/dev/null || error "failed."
echo "done." >&2
printf "Flashing initramfs... " >&2
fis -d "$fis_dev" -o "$fis_offset_hex" -s "$fis_size_hex" create "$initrd" -f $ifisoffset -l $ifissize -e $ifisentry -r $ifisram -c "$ipadded" || error "FIS create failed."
dd if="$ipadded" of="$fis_dev" bs=$ifisoffset seek=1 2>/dev/null || error "failed."
echo "done." >&2
;;
"GLAN Tank")
rm -f /boot/initrd /boot/zImage
ln -s "$(basename "$ifile")" /boot/initrd
(
# Set machine id 1100 (0x044c)
devio 'wl 0xe3a01c04,4' 'wl 0xe381104c,4'
cat "$kfile"
) > /boot/zImage
;;
"HP Media Vault mv2120")
check_subarch "orion5x"
tmp="$(tempfile)"
printf "Generating kernel u-boot image... " >&2
# Set machine id 1693 (0x069d)
devio > "$tmp" 'wl 0xe3a01c06,4' 'wl 0xe381109d,4'
cat "$kfile" >> "$tmp"
mkimage -A arm -O linux -T multi -C none -n "$desc" -a 0x01000000 \
-e 0x01000000 -d "$tmp:$ifile" "$tmp.uboot" >&2 1>/dev/null
echo "done." >&2
if [ -e /boot/uImage ]; then
echo "Creating backup of /boot/uImage." >&2
mv /boot/uImage /boot/uImage.bak
fi
echo "Creating new /boot/uImage." >&2
mv "$tmp.uboot" /boot/uImage
rm -f "$tmp"
;;
"Linksys NSLU2")
check_subarch "ixp4xx"
case "$(dpkg --print-architecture)" in
arm|armel)
little_endian=1
;;
armeb)
little_endian=0
;;
esac
check_mtd
fismtd=$(mtdblock "FIS directory")
if [ -z "$fismtd" ]; then
error "Cannot find mtd FIS directory"
fi
kmtd=$(mtdblock Kernel)
if [ -z "$kmtd" ]; then
error "Cannot find mtd partition 'Kernel'"
fi
check_dev_mtdblock "$kmtd"
kmtdsize=$(mtdsize "Kernel")
check_size "kernel" $(($kfilesize + 16 + 16)) $kmtdsize
imtd=$(mtdblock Ramdisk)
if [ -z "$imtd" ]; then
error "Cannot find mtd partition 'Ramdisk'"
fi
check_dev_mtdblock "$imtd"
imtdsize=$(mtdsize "Ramdisk")
check_size "ramdisk" $(($ifilesize + 16)) $imtdsize
# The following devio magic parses the FIS directory to
# obtain the size, offset and name of each partition. This
# used used to obtain the offset of the Kernel partition.
offset=$(echo "$(devio "<<$fismtd" '
<= $ 0x20000 -
L= 0x1000
$( 1
# 0xff byte in name[0] ends the partition table
$? @ 255 =
# output size base name
<= f15+
.= b 0xfffffff &
<= f4+
.= b
pf "%lu %lu "
<= f28-
cp 16
pn
<= f240+
L= L256-
$) L255>')" |
while read a b c; do
if [ "$c" = "Kernel" ]; then
echo $b
fi
done)
# The Kernel partition, starting at $offset, is divided into
# two areas at $boundary. We therefore need to split the
# kernel into two and write them to flash with two Sercomm
# headers.
boundary=1441792 # 0x00160000
ksize1=$(expr $boundary - $offset - 16)
tmp="$(tempfile)"
printf "Flashing kernel: " >&2
(
sercomm_header $(expr $kfilesize + 16)
dd if="$kfile" of="$tmp" bs=$ksize1 count=1 2>/dev/null
nslu2_swap "$tmp"
sercomm_header 131072
dd if="$kfile" of="$tmp" ibs=$ksize1 skip=1 2>/dev/null
nslu2_swap "$tmp"
rm -f "$tmp"
) > "$kmtd" || error "failed."
echo "done." >&2
printf "Flashing initramfs: " >&2
dd if="$ifile" of="$tmp" ibs=$(($imtdsize - 16)) conv=sync 2>/dev/null
(
sercomm_header $ifilesize
nslu2_swap "$tmp"
rm -f "$tmp"
) > "$imtd" || error "failed."
echo "done." >&2
;;
"Marvell OpenRD Base Board" | "Marvell OpenRD Client Board" | "Marvell SheevaPlug Reference Board" | "Marvell eSATA SheevaPlug Reference Board")
check_subarch "kirkwood"
tmp="$(tempfile)"
printf "Generating kernel u-boot image... " >&2
mkimage -A arm -O linux -T kernel -C none -a 0x00008000 \
-e 0x00008000 -n "$desc" -d "$kfile" "$tmp.uboot" >&2 1>/dev/null
echo "done." >&2
if [ -e /boot/uImage ]; then
echo "Creating backup of /boot/uImage." >&2
mv /boot/uImage /boot/uImage.bak
fi
echo "Creating new /boot/uImage." >&2
mv "$tmp.uboot" /boot/uImage
printf "Generating initrd u-boot image... " >&2
mkimage -A arm -O linux -T ramdisk -C gzip -a 0x0 \
-e 0x0 -n "$idesc" -d "$ifile" "$tmp.uboot" >&2 1>/dev/null
echo "done." >&2
if [ -e /boot/uInitrd ]; then
echo "Creating backup of /boot/uInitrd." >&2
mv /boot/uInitrd /boot/uInitrd.bak
fi
echo "Creating new /boot/uInitrd." >&2
mv "$tmp.uboot" /boot/uInitrd
rm -f "$tmp"
;;
"Marvell DB-MV88F6781-BP Development Board")
check_subarch "dove"
dove_flash_kernel
;;
"IGEP v2 board" | "OMAP3 Beagle Board" | "OMAP4430 4430SDP board" | "OMAP4430 Panda Board")
case "$machine" in
"IGEP v2 board"|"OMAP3 Beagle Board")
check_subarch "omap"
;;
"OMAP4430 4430SDP board" | "OMAP4430 Panda Board")
check_subarch "omap4"
;;
esac
omap_flash_kernel
;;
"QNAP TS-109/TS-209" | "QNAP TS-119/TS-219" | "QNAP TS-409" | "QNAP TS-41x")
case "$machine" in
"QNAP TS-109/TS-209" | "QNAP TS-409")
check_subarch "orion5x"
;;
"QNAP TS-119/TS-219" | "QNAP TS-41x")
check_subarch "kirkwood"
;;
esac
check_mtd
imtd=$(mtdblock "RootFS1")
if [ -z "$imtd" ]; then
error "Cannot find mtd partition 'RootFS1'"
fi
check_dev_mtdblock "$imtd"
imtdsize=$(mtdsize "RootFS1")
check_size "RootFS1" $ifilesize $imtdsize
kmtd=$(mtdblock Kernel)
if [ -z "$kmtd" ]; then
error "Cannot find mtd partition 'Kernel'"
fi
check_dev_mtdblock "$kmtd"
kmtdsize=$(mtdsize "Kernel")
check_size "Kernel" $(($kfilesize + 8 + 64)) $kmtdsize
printf "Generating kernel u-boot image... " >&2
tmp="$(tempfile)"
case "$machine" in
"QNAP TS-109/TS-209")
# Set machine id 1565 (0x061d)
devio > "$tmp" 'wl 0xe3a01c06,4' 'wl 0xe381101d,4'
;;
"QNAP TS-119/TS-219")
# Set machine id 2139 (0x085b)
devio > "$tmp" 'wl 0xe3a01c08,4' 'wl 0xe381105b,4'
;;
"QNAP TS-409")
# Set machine id 1601 (0x0641)
devio > "$tmp" 'wl 0xe3a01c06,4' 'wl 0xe3811041,4'
;;
"QNAP TS-41x")
# Set machine id 2502 (0x09c6)
devio > "$tmp" 'wl 0xe3a01c09,4' 'wl 0xe38110c6,4'
;;
esac
cat "$kfile" >> "$tmp"
mkimage -A arm -O linux -T kernel -C none -a 0x00008000 \
-e 0x00008000 -n "$desc" -d "$tmp" "$tmp.uboot" >&2 1>/dev/null
echo "done." >&2
printf "Flashing kernel... " >&2
cat "$tmp.uboot" > "$kmtd" || error "failed."
echo "done." >&2
rm -f "$tmp.uboot" "$tmp"
printf "Flashing initramfs... " >&2
pad=$(expr $imtdsize - $ifilesize)
(
cat "$ifile"
dd if=/dev/zero bs=$pad count=1 2>/dev/null
) > "$imtd" || error "failed."
echo "done." >&2
;;
"Thecus N2100")
check_subarch "iop32x"
check_mtd
imtd=$(mtdblock ramdisk)
if [ -z "$imtd" ]; then
error "Cannot find mtd partition 'ramdisk'"
fi
check_dev_mtdblock "$imtd"
imtdsize=$(mtdsize "ramdisk")
check_size "ramdisk" $ifilesize $imtdsize
kmtd=$(mtdblock kernel)
if [ -z "$kmtd" ]; then
error "Cannot find mtd partition 'kernel'"
fi
check_dev_mtdblock "$kmtd"
kmtdsize=$(mtdsize "kernel")
check_size "kernel" $(($kfilesize + 8)) $kmtdsize
printf "Flashing kernel... " >&2
(
# Set machine id 1101 (0x044d)
devio 'wl 0xe3a01c04,4' 'wl 0xe381104d,4'
cat "$kfile"
) > "$kmtd" || error "failed."
echo "done." >&2
printf "Flashing initramfs... " >&2
pad=$(expr $imtdsize - $ifilesize)
(
cat "$ifile"
dd if=/dev/zero bs=$pad count=1 2>/dev/null
) > "$imtd" || error "failed."
echo "done." >&2
;;
"Lanner EM7210")
# Really: Intel SS4000-e and compatibles
check_subarch "iop32x"
check_mtd
imtd=$(mtdblock "ramdisk.gz")
if [ -z "$imtd" ]; then
error "Cannot find mtd partition 'ramdisk.gz'"
fi
check_dev_mtdblock "$imtd"
imtdsize=$(mtdsize "ramdisk.gz")
check_size "ramdisk" $ifilesize $imtdsize
kmtd=$(mtdblock zImage)
if [ -z "$kmtd" ]; then
error "Cannot find mtd partition 'zImage'"
fi
kmtdsize=$(mtdsize "zImage")
check_size "zImage" $(($kfilesize + 8)) $kmtdsize
printf "Flashing kernel..." >&2
(
# Set machine ID 1212 (0x04bc)
devio 'wl 0xe3a01c04,4' 'wl 0xe38110bc,4'
cat "$kfile"
) > "$kmtd" || error "failed."
echo "done." >&2
printf "Flashing initramfs... " >&2
pad=$(expr $imtdsize - $ifilesize)
(
cat "$ifile"
dd if=/dev/zero bs=$pad count=1 2>/dev/null
) > "$imtd" || error "failed."
echo "done." >&2
;;
"Genesi Efika MX (Smartbook)" | "Genesi Efika MX (Smarttop)")
#check_subarch $running_subarch
efikamx_flash_kernel
;;
*)
case "$running_subarch" in
"dove" | "omap" | "omap4")
echo "warning: using generic subarchitecture fallback for $running_subarch"
check_subarch $running_subarch
case "$subarch" in
"dove")
dove_flash_kernel
;;
"omap" | "omap4")
omap_flash_kernel
;;
esac
;;
*)
error "Unsupported platform."
;;
esac
;;
esac
Reply to: