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  <jo...@debian.org>
# Copyright (C) 2006, 2007, 2008, 2009  Martin Michlmayr <t...@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 via email to