summaryrefslogtreecommitdiff
path: root/nuttx/tools/mkimage.sh
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-02-18 23:46:29 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-02-18 23:46:29 +0000
commit9de7429aec0c1f6bafcd03824f8b70cff7ee6461 (patch)
tree486ae069c9a068358f6ce8ab03248e400e1c30b7 /nuttx/tools/mkimage.sh
parent0c684df0cd3faf6f6f538454fcbc4cf0e980adc2 (diff)
downloadnuttx-9de7429aec0c1f6bafcd03824f8b70cff7ee6461.tar.gz
nuttx-9de7429aec0c1f6bafcd03824f8b70cff7ee6461.tar.bz2
nuttx-9de7429aec0c1f6bafcd03824f8b70cff7ee6461.zip
Preparing to test on the C5471
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@7 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/tools/mkimage.sh')
-rwxr-xr-xnuttx/tools/mkimage.sh305
1 files changed, 305 insertions, 0 deletions
diff --git a/nuttx/tools/mkimage.sh b/nuttx/tools/mkimage.sh
new file mode 100755
index 000000000..8a32cc030
--- /dev/null
+++ b/nuttx/tools/mkimage.sh
@@ -0,0 +1,305 @@
+#!/bin/sh
+#
+# File: mkimage.sh
+#
+# Copyright (C) 2002 RidgeRun, Inc.
+# Author: RidgeRun, Inc <skranz@@ridgerun.com>
+# - Adapted for the Cadenux environment, 9-6-02, Gregory Nutt
+# - Added --EAddr option, 6-18-03, Gregory Nutt
+#
+# 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 SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+# NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# 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.,
+# 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+########################################################
+# Description:
+# -----------
+# Scenario #1
+# -----------
+# This utility was developed by RidgeRun for the
+# purpose of converting a standard binary executable
+# image (such as ELF) into a special format (RR
+# format) suitable for quick downloads to the target
+# TI925 RidgeRun Bootloader (rrload). The image is
+# produced by constructing a special header which is
+# then tacked onto the front of the supplied binary
+# image. The resulting binary image is smaller than
+# what would normally be encountered with traditional
+# download formats (such as SREC or uuencoded; both
+# ascii based). The special header at the front of the
+# image is used to guide the target's rrload (a
+# booloader developed by RidgeRun Inc). The header
+# data contains a field representing the total byte
+# count of the binary data following the header as
+# well as a field that indicates the load address of
+# run image. Additionally, a field exists in the
+# header which indicates the image's entry point which
+# could be called by the bootloader to invoked the
+# just downloaded program.
+# -----------
+# Scenario #2
+# -----------
+# If the supplied image is not a standard binary
+# executagle image then that is ok too, a header is
+# constructed and tacked onto the front of the supplied
+# binary data forming the new binary image (in rr format).
+# In this case the EntryAddr is set to 0xFFFFFFFF by
+# default and the LoadAddr is set to 0x00000000 by
+# default unless otherwise indicated by command line
+# arguments -LEntry and -LAddr which if used are assumed
+# to be in hexidecimal units.
+#
+# -----------
+# Scenario #3
+# -----------
+#
+# Read/Write file system (like JFFS) that will not
+# work if rrload stores a 20 byte header at the beginning
+# of the flashed component image
+#
+# mkimage [--NoHeader ] <input-bin> <out-RR>
+#
+# Usage:
+# mkimage [--LAddr h] [--EAddr h] [--NoHeader] <input-bin> <out-RR>
+#
+# Examples:
+# $ mkimage linux linux.rr
+# ..or..
+# $ mkimage -LAddr 10008000 -EAddr 10008000 vmlinux vmlinux.rr
+# ..or..
+# $ mkimage --NoHeader fileSys.gz fileSys.gz.rr
+# ..or..
+# $ mkimage --LAddr A00 fileSys.gz fileSys.gz.rr
+# ..or..
+# $ mkimage --LAddr A00 fileSys.gz fileSys.gz.rr
+# ^
+# |
+# Assumed hex units.
+# Please omit the
+# leading "0x".
+########################################################
+
+if [ "${CADENUX_ARCH}" = "dsc21" ] ; then
+ prefix="arm-uclinux-"
+elif [ "${CADENUX_ARCH}" = "dsc24" ] ; then
+ prefix="arm-uclinux-"
+elif [ "${CADENUX_ARCH}" = "dsc25" ] ; then
+ prefix="arm-uclinux-"
+elif [ "${CADENUX_ARCH}" = "dm270" ] ; then
+ prefix="arm-uclinux-"
+elif [ "${CADENUX_ARCH}" = "c5471" ] ; then
+ prefix="arm-uclinux-"
+elif [ "${CADENUX_ARCH}" = "ti925" ] ; then
+ prefix="arm-linux-"
+elif [ "${CADENUX_ARCH}" = "omap710" ] ; then
+ prefix="arm-linux-"
+elif [ "${CADENUX_ARCH}" = "omap1510" ] ; then
+ prefix="arm-linux-"
+elif [ "${CADENUX_ARCH}" = "dm310" ] ; then
+ prefix="arm-linux-"
+else
+ prefix=""
+fi
+
+if [ $# -lt 2 ] ; then
+ echo "Error: missing argument"
+ echo "Usage: mkimage [--LAddr n] [--EAddr n] [--NoHeader] <input-Bin> <out-RR>"
+ exit 1
+fi
+
+# Pleae Note the following formatting inconsistency.
+# (Sorry, for now this is necessary)
+LoadAddr="00000000" # Note: hex val *without* proceeding "0x"
+EntryAddr="0xFFFFFFFF" # Note: hex val *with* procedding "0x"
+
+Header="y"
+LAddrSupplied="n"
+EAddrSupplied="n"
+compress="n"
+
+while [ $# -gt 0 ] ; do
+ case "$1" in
+ --LAddr )
+ shift
+ LoadAddr="$1"
+ # Next, make the supplied LAddr exactly 8 hex chars long.
+ LoadAddr="0000000${LoadAddr}"
+ LoadAddr=$(echo $LoadAddr | sed -e "s/^.*\(........\)$/\1/g")
+ LAddrSupplied="y"
+ shift
+ ;;
+ --EAddr )
+ shift
+ EntryAddr="$1"
+ # Next, make the supplied LEntry exactly 8 hex chars long.
+ EntryAddr="0000000${EntryAddr}"
+ EntryAddr=$(echo $EntryAddr | sed -e "s/^.*\(........\)$/\1/g")
+ EntryAddr=0x$EntryAddr
+ EAddrSupplied="y"
+ shift
+ ;;
+ --NoHeader )
+ Header="n"
+ shift
+ ;;
+ --compress )
+ compress="y"
+ shift
+ ;;
+ *)
+ break
+ ;;
+ esac
+done
+
+if [ ! $# -eq 2 ] ; then
+ echo "Error: invalid argument set."
+ echo "Usage: mkimage [--LAddr h] <input-Bin> <out-RR>"
+ exit 1
+fi
+
+binary=$1.stripped
+outbin=$2
+
+cp $1 $binary
+FileTypeExec=$(${prefix}objdump -f $binary 2>/dev/null | egrep "EXEC_P")
+
+if [ ! -z "$FileTypeExec" ] ; then
+
+ # -----------
+ # Scenario #1
+ # -----------
+ # We have an executable style binary (like ELF, etc).
+ # So...
+ # ---------------------------------
+ # Next | Create the binary image data.
+ # ---------------------------------
+ ${prefix}strip ${binary}
+ ${prefix}objcopy -S -O binary $binary ${binary}.binary
+ # ---------------------------------
+ # Next | Create compress image if requested
+ # ---------------------------------
+ image_file=${binary}.binary
+ if [ "$compress" = "y" ] ; then
+ gzip -f -9 -c ${binary}.binary > ${binary}.binary.gz
+ image_file=${binary}.binary.gz
+ fi
+ # ---------------------------------
+ # Next | Create the header information (ascii) needed
+ # | by the TI925 bootloader. This includes the
+ # | load address, entry address and byte count of
+ # | the binary executable data which will follow it.
+ # ---------------------------------
+ if [ "$LAddrSupplied" = "n" ] ; then
+ # Next, Since LoadAddr not already supplied by user we'll
+ # derive it by consulting the binary executable file.
+ LoadAddr=$(${prefix}objdump -h ${binary} | grep " 0 \.")
+ LoadAddr=$(echo $LoadAddr | cut -d' ' -f4) # eight hex chars
+ fi
+ if [ "$EAddrSupplied" = "n" ] ; then
+ # Next, Since EntryAddr not already supplied by user we'll
+ # derive it by consulting the binary executable file.
+ EntryAddr=$(${prefix}objdump -f ${binary} | grep -i "start")
+ EntryAddr=$(echo $EntryAddr | cut -d' ' -f3) # eight hex chars
+ fi
+ # Next, Compute byte length of binary portion.
+ numBytes=$(wc --bytes $image_file)
+ numBytes=$(echo $numBytes | cut -d' ' -f1)
+ numBytes=$(echo 16o $numBytes p | dc) # converts to hex.
+ # Next, make the numBytes string exactly 8 hex chars long.
+ numBytes="0000000${numBytes}"
+ numBytes=$(echo $numBytes | sed -e "s/^.*\(........\)$/\1/g")
+ # ---------------------------------
+ # Next | Combine the ascii header information
+ # | with the binary image to make the
+ # | final downloadable *mostly* binary
+ # | image.
+ # ---------------------------------
+ rm -f ${outbin}
+ echo ">LoadAddr :0x${LoadAddr}" >> ${outbin}
+ if [ "${Header}" = "y" ]; then
+ echo ">EntryAddr:${EntryAddr}" >> ${outbin}
+ else
+ echo ">NoHeader" >> ${outbin}
+ fi
+ echo ">NumBytes :0x${numBytes}" >> ${outbin}
+ cat $image_file >> ${outbin}
+ # ---------------------------------
+ # Cleanup and exit
+ # ---------------------------------
+ rm -f ${binary}.binary $image_file
+ exit 0
+
+else
+
+ # -----------
+ # Scenario #2
+ # -----------
+ # Just a binary image but not a standard executable
+ # style binary (like ELF, etc). Might be a compressed
+ # filesystem image, etc.
+ # So...
+ # ---------------------------------
+ # Next | Create the header information (ascii) needed
+ # | by the TI925 bootloader. This includes the
+ # | load address, entry address and byte count of
+ # | the binary file which will follow it.
+ # ---------------------------------
+ # | Create compress image if requested
+ # ---------------------------------
+ #
+ image_file=${binary}
+ if [ "$compress" = "y" ] ; then
+ gzip -f -9 -c ${image_file} > ${image_file}.gz
+ image_file=${image_file}.gz
+ fi
+ #
+ # Note: The LoadAddr and EntryAddr are already established
+ # for us at this point, but we will need to compute the
+ # byte length of binary portion next.
+ #
+ numBytes=$(wc --bytes ${image_file})
+ numBytes=$(echo $numBytes | cut -d' ' -f1)
+ numBytes=$(echo 16o $numBytes p | dc) # converts to hex.
+ # Next, make the numBytes string exactly 8 hex chars long.
+ numBytes="0000000${numBytes}"
+ numBytes=$(echo $numBytes | sed -e "s/^.*\(........\)$/\1/g")
+ #
+ # ---------------------------------
+ # Next | Combine the ascii header information
+ # | with the binary image to make the
+ # | final downloadable *mostly* binary
+ # | image.
+ # ---------------------------------
+ #
+ rm -f ${outbin}
+ echo ">LoadAddr :0x${LoadAddr}" >> ${outbin}
+ if [ ${Header} = "y" ]; then
+ echo ">EntryAddr:${EntryAddr}" >> ${outbin}
+ else
+ echo ">NoHeader" >> ${outbin}
+ fi
+ echo ">NumBytes :0x${numBytes}" >> ${outbin}
+ cat ${image_file} >> ${outbin}
+ # ---------------------------------
+ # Cleanup and exit
+ # ---------------------------------
+ rm -f ${image_file}.gz
+ exit 0
+fi