#!/bin/bash # # File: mkimage # # Copyright (C) 2002 RidgeRun, Inc. # Author: RidgeRun, 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 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. # # Please report all bugs/problems to the author or # # key: RRGPLCR (do not remove) # ######################################################## # 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 respectively, which if # used is assumed to be in hexidecimal units. # # Usage: # mkimage [--LAddr h] [--EAddr h] # # Examples: # $ mkimage vmlinux vmlinux.rr # ..or.. # $ mkimage --LAddr A00 --EAddr A00 fileSys.gz fileSys.gz.rr # ..or.. # $ mkimage --LAddr A00 --EAddr A00 fileSys.gz fileSys.gz.rr # ^ # | # Assumed hex units. # Please omit the # leading "0x". ######################################################## if [ "${DSPLINUX_ARCH}" = "TIDSC21_EVM" ] ; then prefix="arm-uclinux-" elif [ "${DSPLINUX_ARCH}" = "TI925DC_EVM" ] ; then prefix="arm-linux-" else prefix="arm_920t_le-" fi if [ $# -lt 2 ] ; then echo "Error: missing argument" echo "Usage: mkimage [--LAddr n] [--EAddr h] " 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" LAddrSupplied="n" EAddrSupplied="n" while [ $# -gt 2 ] ; 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 ;; *) break ;; esac done if [ ! $# -eq 2 ] ; then echo "Error: invalid argument set." echo "Usage: mkimage [--LAddr h] " exit 1 fi binary=$1.stripped outbin=$2 cp $1 $binary || exit 1 FileTypeExec=$(file $binary | egrep "relocatable|executable") 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} || exit 1 ${prefix}objcopy -S -O binary $binary ${binary}.binary || exit 1 # --------------------------------- # 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 ${binary}.binary) 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} echo ">EntryAddr:${EntryAddr}" >> ${outbin} echo ">NumBytes :0x${numBytes}" >> ${outbin} cat ${binary}.binary >> ${outbin} # --------------------------------- # Cleanup and exit # --------------------------------- rm -f ${binary}.binary 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. # --------------------------------- # 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 ${binary}) 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} echo ">EntryAddr:${EntryAddr}" >> ${outbin} echo ">NumBytes :0x${numBytes}" >> ${outbin} cat ${binary} >> ${outbin} # --------------------------------- # Cleanup and exit # --------------------------------- exit 0 fi