Changeset 32 in SVN


Ignore:
Timestamp:
10/31/2017 01:12:32 PM (12 months ago)
Author:
Tim Harvey
Message:

mkimage_jtag: add a scripted mode for more flexibility

In order to produce flexible binary firmware images compatible with the
Gateworks JTAG programming hardware and jtag_usbv4 software a scripted mode
has been added that can create configurations above and beyond the
pre-configured options.

Usage:

mkimage_jtag -s <image1> [<image2> <...>]
mkimage_jtag -e <image1> [<image2> <...>]

The -s parameter invokes scripted mode and will only erase segments specified
while the -e parameter invokes scripted mode flagging the entire flash to
be erased as well.

The image arguments are specified as: <file>@<start>-[end]

  • The 'end' argument is used to determine the length of the flash segment for erasing. The 'start' and 'end' sizes can be decimal or hex with preceeding '0x'. The 'end' is optional and if not specified will erase to the end of the flash.
  • examples: file@start file@start-end file@start-

Examples:

  • create an image that updates the Falcon mode kernel@18MB only mkimage_jtag -s uImage@18M > image.bin
  • create an image that updates the SPL and U-Boot with a full flash erase: mkimage_jtag -e SPL@0-14M u-boot.img@14M
  • create an image that erases the U-Boot env segment only dd if=/dev/zero of=env bs=1M count=1 && mkimage_jtag -s env@16M

Signed-off-by: Tim Harvey <tharvey@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • ventana/images/mkimage_jtag

    r31 r32  
    1 #!/bin/sh
     1#!/bin/bash
    22#
    33# mkimage_jtag v1.0.0
     
    4444ERASE_PRT=2
    4545ERASE_END=3
     46
     47error() {
     48        echo "$@" 1>&2
     49        exit
     50}
     51
     52debug() {
     53        echo "$@" 1>&2
     54}
     55
     56getmode() {
     57        case $1 in
     58                $ERASE_ALL) echo "all";;
     59                $ERASE_NON) echo "segment";;
     60                $ERASE_PRT) echo "partition";;
     61                $ERASE_END) echo "to-end";;
     62        esac
     63}
     64
     65getsize() {(
     66        local mult=1
     67        local val=$1
     68        local suffix regex
     69
     70        shopt -s nocasematch
     71        for suffix in '' K M G; do
     72                regex="^([0-9]+)(${suffix}i?B?)?\$"
     73                [[ $val =~ $regex ]] && {
     74                        echo $((${BASH_REMATCH[1]} * mult))
     75                        return 0
     76                }
     77                regex="^0x([0-9A-Fa-f]+)(${suffix}i?B?)?\$"
     78                [[ $1 =~ $regex ]] && {
     79                        echo $((0x${BASH_REMATCH[1]} * mult))
     80                        return 0
     81                }
     82
     83                ((mult *= 1024))
     84        done
     85        echo "invalid size: $1" >&2
     86        return 1
     87)}
    4688
    4789# output binary u32
     
    82124        local fsize
    83125
     126        if [ $(($part_size)) -eq 0 ]; then
     127                debug "$(/usr/bin/printf "  emit %s@0x%08x erase:%s\n" $file $offset $(getmode $erase_mode))"
     128        else
     129                debug "$(/usr/bin/printf "  emit %s@0x%08x-0x%08x erase:%s\n" $file $offset $((offset+part_size)) $(getmode $erase_mode))"
     130        fi
     131
     132        [ "$file" -a -r "$file" ] || error "invalid file '$file'"
    84133        fsize=$(ls -lL $file | awk '{print $5}')
    85134
     
    92141}
    93142
     143# Scripted usage: space separated list of:
     144#  file@offset[-end]
     145#  if -end not specified will erase up to size of file (rounded to end of block)
     146#  if end not specified will erase to end of device
     147#
     148# Examples:
     149#  - update falcon mode kernel at 18MB:
     150#  mkimage_jtag -s uImage@18M
     151#  - update SPL and uboot with full erase:
     152#  mkimage_jtag -e SPL@0 u-boot.img@14M
     153#  - erase env
     154#  dd if=/dev/zero of=env bs=1M count=1 && ./mkimage_jtag -s env@16M
     155[ "$1" = "-s" -o "$1" = "-e" ] && {
     156        mode=$1
     157        count=0
     158        #regex="^([0-9]+)(${suffix}i?B?)?\$"
     159        # <file>@<start>-<end>
     160        #regex="^(.+)@([0-9A-Z]+)-([0-9A-Z]+)\$"
     161        shift
     162        while [ "$1" ]; do
     163                count=$((count+1))
     164                str=$1
     165                shift
     166
     167                if [ $count -eq 1 -a $mode = "-e" ]; then
     168                        mode=$ERASE_ALL
     169                else
     170                        mode=$ERASE_NON
     171                fi
     172
     173                #debug "  parsing param${count}:$str"
     174                # file@start-end
     175                if [[ $str =~ ^(.*)@(.*)-(.+)$ ]]; then
     176                        file=${BASH_REMATCH[1]}
     177                        start=$(getsize ${BASH_REMATCH[2]})
     178                        end=$(getsize ${BASH_REMATCH[3]})
     179                        size=$(/usr/bin/printf "0x%x" $((end-start)))
     180                        emit $file $mode $start $size
     181                # file@start-
     182                elif [[ $str =~ ^(.*)@(.*)-$ ]]; then
     183                        file=${BASH_REMATCH[1]}
     184                        start=$(getsize ${BASH_REMATCH[2]})
     185                        emit $file $ERASE_END $start
     186                # file@start
     187                elif [[ $str =~ ^(.*)@(.*)$ ]]; then
     188                        file=${BASH_REMATCH[1]}
     189                        start=$(getsize ${BASH_REMATCH[2]})
     190                        emit $file $mode $start
     191                else
     192                        error "invalid parameter: $str"
     193                fi
     194        done
     195        exit
     196}
     197
     198
    94199# output image to stdout
    95200case $# in
    96201        # ubi (w/o touching bootloader+env)
    97202        1)
    98         emit $1 $ERASE_END 0x1100000    # rootfs@17MB+ (erase to end)
     203        debug "rootfs (erase to end):"
     204        emit $1 $ERASE_END 0x1100000    # rootfs@17MB- (erase to end)
    99205        ;;
    100206
    101207        # bootloader (SPL + u-boot.img) w/o eraseing env/ubi
    102208        2)
    103         emit $1 $ERASE_PRT 0 0xE00000   # SPL@0
     209        debug "SPL + u-boot.img (bootloader only):"
     210        emit $1 $ERASE_PRT 0 0xE00000   # SPL@0-14MB
    104211        emit $2 $ERASE_PRT 0x0E00000 0x0200000  # u-boot@14MB-16MB
    105212        ;;
     
    107214        # erase entire part and program SPL + u-boot.img + ubi
    108215        3)
    109         emit $1 $ERASE_ALL 0 0xE00000   # SPL@0
     216        debug "SPL + u-boot.img + ubi (full erase):"
     217        emit $1 $ERASE_ALL 0 0xE00000   # SPL@0-14MB
    110218        emit $2 $ERASE_NON 0x0E00000    # u-boot@14MB
    111219        emit $3 $ERASE_NON 0x1100000    # rootfs@17MB
     
    115223        # mtdparts=nand:16m(uboot),10m(env),-(rootfs)
    116224        4)
    117         emit $1 $ERASE_ALL  0 0xE00000  # SPL@0
     225        debug "SPL + u-boot.img + kernel + ubi (full erase):"
     226        emit $1 $ERASE_ALL 0 0xE00000   # SPL@0-14MB
    118227        emit $2 $ERASE_NON 0x0E00000    # u-boot@14MB
    119228        emit $3 $ERASE_NON 0x1200000    # kernel@18MB
    120         emit $4 $ERASE_NON 0x1c00000    # rootfs@28MB+
     229        emit $4 $ERASE_NON 0x1c00000    # rootfs@28MB-
    121230        ;;
    122231
     
    124233        # mtdparts=nand:16m(uboot),10m(env),-(rootfs)
    125234        5)
    126         emit $1 $ERASE_ALL  0 0xE00000  # SPL@0
     235        debug "SPL + u-boot.img + env + kernel + ubi:"
     236        emit $1 $ERASE_ALL 0 0xE00000   # SPL@0-14MB
    127237        emit $2 $ERASE_NON 0x0E00000    # u-boot@14MB
    128238        emit $3 $ERASE_NON 0x1000000    # env@16MB
    129239        emit $4 $ERASE_NON 0x1200000    # kernel@18MB
    130         emit $5 $ERASE_NON 0x1c00000    # rootfs@28MB+
     240        emit $5 $ERASE_NON 0x1c00000    # rootfs@28MB-
    131241        ;;
    132242
Note: See TracChangeset for help on using the changeset viewer.