| #!/bin/bash |
| # |
| # 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 [ $# -lt 2 ] ; then |
| echo "Error: missing argument" |
| echo "Usage: mkimage [--Prefix prefix] [--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" |
| |
| unset prefix |
| Header="y" |
| LAddrSupplied="n" |
| EAddrSupplied="n" |
| compress="n" |
| |
| while [ $# -gt 0 ] ; do |
| case "$1" in |
| --Prefix) |
| shift; |
| prefix="$1" |
| shift |
| ;; |
| --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 |