#!/bin/sh # __________ __ ___. # Open \______ \ ____ ____ | | _\_ |__ _______ ___ # Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / # Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < # Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ # \/ \/ \/ \/ \/ # $Id$ # # Purpose of this script: # # Inputs: music player model name and a file name # # Action: Build a valid mi4 file (prepending and appending magic) # Encrypt the file with TEA encryption so that the model's own # bootloader accepts this file. # Sign the file with a DSA signature the bootloader accepts # # Output: A built, encrypted and signed mi4 file image. # # Requirement: # # This script assumes that you have the mi4code tool in your path, that # you have the environment variable MI4CODE pointing to the tool or that you # have it in the same dir that you invoke this script with. # # mi4 info and tool are here: http://daniel.haxx.se/sansa/mi4.html # mkmi4=$0 target=$1 input=$2 output=$3 # scan the $PATH for the given command findtool(){ file="$1" IFS=":" for path in $PATH do # echo "checks for $file in $path" >&2 if test -f "$path/$file"; then echo "$path/$file" return fi done } help () { echo "Usage: mi4fix.sh " exit } if test -z "$output"; then help fi # sign - if the firmware should be DSA signed with a dummy (only 010301 # firmwares) # tea - name of the TEA crypt key to use for encrypting, but only if ... # encrypt - is set to "yes" for encrypting the firmware case $target in # fake example) # sign="yes" # encrypt="yes" # tea=targetkey # ;; e200) sign="yes" ;; h10) sign="yes" ;; h10_5gb) buildopt="-2" ;; elio) buildopt="-2" ;; *) echo "unsupported target" help ;; esac if test -z "$MI4CODE"; then tool=`findtool mi4code` if test -z "$tool"; then # not in path tool=`dirname $mkmi4`/mi4code if ! test -f $tool; then echo "Couldn't find mi4code" exit fi fi else tool=$MI4CODE fi # Use full file plaintext length if not encrypting if test -z "$encrypt"; then buildopt="$buildopt -pall" fi # build mi4 #echo "$tool build $input $output.raw" $tool build $buildopt $input $output.raw # encrypt if test -n "$encrypt"; then #echo "$tool encrypt $output.raw $output.encrypt $tea" $tool encrypt $output.raw $output.encrypt $tea else # Even if we don't encrypt we need to do this to ensure the crc gets fixed $tool encrypt -pall $output.raw $output.encrypt default fi # sign if test -n "$sign"; then #echo "$tool sign $output.encrypt $output" $tool sign $output.encrypt $output else mv $output.encrypt $output fi