comcom/comcom.sh

668 lines
13 KiB
Bash
Raw Normal View History

2013-07-31 18:23:27 +00:00
#!/bin/sh
#
name="\"comcom\" - AVR Shellscript for JTAG"
# Author: Buchberger Florian
version="2.2.3.5"
# Date: 01. 06. 2012
# Description:
# Shellscript to convert C++ and assambler files to hexadecimal files for µ-processors over a JTAG ICE emulator.
#
# Changelog:
# 2.2.3.5: better source code, device type parmeter is avrdude device partno, if not supported by this script
# 2.2.3.4: device type parameter (atmega8, 16, 32, 64, 128, attiny10, 13, 15)
# 2.2.3.3: better source code
# 2.2.3.2: better cl help
# 2.2.3.1: cl help updated
# 2.2.3: multible c files
# 2.2.2: liunx installer
# 2.2.1: os cl option
# 2.2: mac version
# 2.1: cl options
# 2.0: hex input
# 1.9: asm input
# 1.4: better error messages
# 1.0: first version
#
#
# exit codes:
# 0 : no error
# 1 : argument error
# 2 : compiling error
# 3 : conversion error
# 4 : removing error
# 5 : comunitating error
# 6x : programs not found
# : 1 : avr-gcc
# : 2 : avr-asm
# : 3 : objcopy
# : 4 : rm
# : 5 : cp
# : 6 : avrdude
# 7 : os error
################################
# variables
################################
# constant definitions
defInputC=""
defInputAsm=$defInputC
defInputHex=""
defTmpObj=$defInputC.$$.obj
defOutputHex=$defInputC.hex
defDev="/dev/ttyUSB0"
defAtType="atmega16"
# basic variables (parameter)
inputC=$defInputC
inputAsm=$defInputAsm
inputHex=$defInputHex
tmpObj=$defTmpObj
outputHex=$defOutputHex
dev=$defDev
atType=$defAtType
# type selection variables
usingC=0
usingAsm=0;
usingHex=0
# C++ compiler & arguments
compiler="/usr/bin/avr-g++"
compilerArgsT="-g -Os -Wall -mcall-prologues -mmcu="
compilerO="-o"
# if compiler isn't found, then get path
if test ! -f $compiler ;then
compiler=`which avr-g++`
fi
# assambler & arguments
asm="/usr/bin/avr-as"
asmO="-o"
asmT="-mmcu"
# if compiler isn't found, then get path
if test ! -f $asm ;then
asm=`which avr-as`
fi
# obj2hex program & arguments
objcopys="/usr/bin/avr-objcopy"
objcopyArgs="-R .eeprom -O ihex"
# if program isn't found, then get path
if test ! -f $objcopys ;then
objcopys=`which avr-objcopy`
fi
# remove
remove="/bin/cp"
# if program isn't found, then get path
if test ! -f $copy ;then
copy=`which cp`
fi
# copy
remove="/bin/rm"
# if program isn't found, then get path
if test ! -f $remove ;then
remove=`which rm`
fi
# programmer (here jtag1 -> JTAG ICE)
prog="jtag1"
# avrdude & arguments
dude="/usr/bin/avrdude"
dudeT="-p"
dudeD="-P"
dudeP="-c"
dudeHex="-U flash:w:"
# if program isn't found, then get path
if test ! -f $dude ;then
dude=`which avrdude`
fi
# temporary variables & time variables
eTmp=0
# start time in s & ns
sTimeN=`date +%N`
sTimeS=`date +%s`
# end time in s & ns (not defined yet)
eTimeN=0;
eTimeS=0;
# deference time (eTime - sTime)
dTimeN=0;
dTimeS=0;
# user specified os
uos=0;
# only output file
outputOnly=0
################################
# texts
################################
error="Error occurred!"
ec="Exiting with error code"
helptext="
$name
Version $version
by Buchberger Florian
Usage: $0 [options]
Options:
--output [file] or -o [file]
: filename for compiled file
--c-input [files] or -ic [files]
: filenames for a c or c++ coded source file
--asm-input [file] or -ia [file]
: filename for a assambler coded source file
--hex-input [file] or -ih [file]
: filename for a compliled hex source file
--temp-file [file] or -tf [file]
: filename for a temporary output file
--os [type]
: specify operating system
: possibilitys for [type]:
: : macosx
: : linux
--device [file] or -d [file]
: filename of device (default: /dev/ttyUSB0)
--type [type] or -t [type]
: device type (default: atmega16)
--help or -h
: displays this help text"
################################
# installation function
################################
install() {
case $1 in
"linux")
echo "This skript needs root rights for installing necessary programs."
# download programs via apt-get
sudo apt-get install gcc-avr binutils-avr avrdude
;;
"macosx")
echo "Mac installer not finished yet."
# todo
;;
*)
return 1
esac
return 0
}
################################
# interpret arguments
################################
# which other parameter is needed (out, asm, hex, tmp, dev, type, os, c or empty ())
needString=""
# parameter error
parameterE=""
# should the cl help text be displeyed?
useHelp=0
# should the installer be started?
install=0
# is next parameter a option or a file/type? (0 -> option, 1 -> file/type)
next=0
# for ervery parameter do
for i in $* ;do
case $needString in
# outfile
"out")
outputHex=$i
needString=""
;;
# infile is an asambler file
"asm")
inputAsm=$i
usingAsm=1
needString=""
;;
# infile is a hex file
"hex")
inputHex=$i
usingHex=1
needString=""
;;
# tmp file
"tmp")
tmpObj=$i
needString=""
;;
# specified device (default: /dev/ttyUSB0)
"dev")
dev=$i
needString=""
;;
# controller type (default: atmega16)
"type")
atType=$i
needString=""
;;
# operating system
"os")
uos=$i
needString=""
;;
# infile(s) is/are c files
"c")
# if file exists then ad file to list of c files
if test -f $i ;then
inputC="$inputC $i"
usingC=`echo "scale=0; ($usingC + 1)" | bc`
# else no other strings will be used for this option
# this parameter $i is also used for interpreting options
else
needString=""
next=1
fi
;;
# if no string is needed ($needString = "") this parameter is used for interpreting options
*)
next=1
;;
esac
# if parameter is used for interprting options
if test $next = 1 ;then
case $i in
"-o" | "--output")
needString="out" ;;
"-ic" | "--c-input")
needString="c" ;;
"-ia" | "--asm-input")
needString="asm" ;;
"-tf" | "--temp-file")
needString="tmp" ;;
"-d" | "--device")
needString="dev" ;;
"-t" | "--type")
needString="type" ;;
"-h" | "--help")
useHelp=1 ;;
"--os")
needString="os" ;;
"-ih" | "--hex-input")
needString="hex" ;;
"-oo" | "--output-only")
outputOnly=1 ;;
"--install")
install=1 ;;
*)
parameterE="Invalid Argument $i. \nUse '--help' to get a list of parameters." ;;
esac
next=0
fi
done
# if number of args = 0 display error
if test $# = 0 ;then
echo $error
echo "$ec 1..."
echo "No arguments specified!"
echo "Use '--help' to get a list of parameters."
exit 1
fi
# if help text is used ... ehm yeah...
if test $useHelp = 1 ;then
echo "$helptext"
exit 0
fi
# if install should be startet
if test $install = 1 ;then
# if no operating system is specified then abort
if test $uos = 0 ;then
echo $error
echo "$ec 7..."
echo "No Operating System specified!"
exit 7
fi
# start install function
install $uos
# if function return error 1 then abort
if test $? = 1 ;then
echo $error
echo "$ec 7..."
echo "Operating System not supported!"
exit 7
fi
exit 0
fi
tmp=0;
tmp=`echo "scale=0; ($usingAsm + $usingC + $usingHex)" | bc`
# number of different types of input files should be exact 1
if test $tmp != 1 ;then
parameterE="Invalid number of input files!"
fi
# if another parameter is needed
# and needed parameter is not c file
# and there is at least 1 c file
if test \( "$needString" != "" \) -a \( "$needString" != "c" \) -a \( $usingC = 0 \) ;then
parameterE="Expression missing!"
fi
# if error is set display error message
if test "$parameterE" != "" ;then
echo $error
echo "$ec 1..."
echo $parameterE
exit 1
fi
# if no tmp file is specified a new file name will be set
if test "$tmpObj" = "$defTmpObj" ;then
tmpObj=$$.obj
fi
# if no output file name is specified the file name will be set
if test "$outputHex" = "$defOutputHex" ;then
input=""
if test $usingC = 1 ;then
input=$inputC
fi
if test $usingHex = 1 ;then
input=$inputHex
fi
if test $usingAsm = 1 ;then
input=$inputAsm
fi
fname=`echo $input | awk '{print $1}'`
outputHex=$fname.hex
fi
################################
# check operating system
################################
# is the operation system Linux?
oos=`uname -a | awk "/Linux/{print $1}"`
os=0
# if operating system is linux
if test $oos != "" ;then
os=1
fi
# if --os parameter is specified
if test $uos != 0 ;then
case $uos in
"macosx")
def="/dev/cu.usbserial-000012FD"
os=1
;;
"linux")
os=1
;;
*)
os=0 ;;
esac
fi
# if still os unknown
if test $os = 0 ;then
echo $error
echo "$ec 7..."
echo "Unknown Operating System!"
echo "Please use --help to get advice."
exit 7
fi
################################
# testing program installation
################################
# testing all programs if they exist
if test ! -f $compiler ;then
echo $error
echo "$ec 61..."
echo "Program not found."
echo "Please install avr-gcc or start with parameter \"--install\"."
exit 61
fi
if test ! -f $asm ;then
echo $error
echo "$ec 62..."
echo "Program not found."
echo "Please install avr-as or start with parameter \"--install\"."
exit 62
fi
if test ! -f $objcopys ;then
echo $error
echo "$ec 63..."
echo "Program not found."
echo "Please install avr-objcopy or start with parameter \"--install\"."
exit 63
fi
if test ! -f $remove ;then
echo $error
echo "$ec 64..."
echo "Program not found."
echo "Please install rm or start with parameter \"--install\"."
exit 64
fi
if test ! -f $copy ;then
echo $error
echo "$ec 65..."
echo "Program not found."
echo "Please install cp or start with parameter \"--install\"."
exit 65
fi
if test ! -f $dude ;then
echo $error
echo "$ec 66..."
echo "Program not found."
echo "Please install avrdude or start with parameter \"--install\"."
exit 66
fi
################################
# program
################################
# if not hex input
if test $usingHex = 0 ;then
# if c, compile c files to $tmpObj
if test $usingC = 1 ;then
$compiler $compilerArgsT$compilerArgsTp$atType $inputC $compilerO $tmpObj
fi
# if asm, compile asm files to $tmpObj
if test $usingAsm = 1 ;then
$asm $asmO $tmpObj $asmT$atType $inputAsm
fi
eTmp=$?
# if compiler returns error, display error and abort
if test ! \( $eTmp = 0 \) ;then
echo $error
if test $usingC = 1 ;then
echo "$compiler returned $eTmp"
else
echo "$asm returned $eTmp"
fi
echo "Aborting..."
echo "$ec 2..."
exit 2
fi
# if tmpObj not exists
if test ! \( -f $tmpObj \) ;then
echo $error
echo "Unable to create temporary object file!"
echo "$ec 2..."
exit 2
fi
# copy tmpObj to $ouputhex
$objcopys $objcopyArgs $tmpObj $outputHex
eTmp=$?
# if objcopy returns error, display error and abort
if test ! \( $eTmp = 0 \) ;then
echo $error
echo "$objcopys returned $eTmp"
echo "Aborting..."
echo "$ec 3..."
exit 3
fi
# if $outputHex not exists
if test ! -f $outputHex ;then
echo $error
echo "Unable to create .hex - file!"
echo "$ec 3..."
exit 3
fi
# remove tmp file
$remove $tmpObj
eTmp=$?
# if rm returns an error, display error and abort
if test ! \( $eTmp = 0 \) ;then
echo $error
echo "$remove returned $eTmp"
echo "Aborting..."
echo "$ec 4..."
fi
# if tmpObj still exists, display error
if test -f $tmpObj ;then
echo $error
echo "Unable to delete temporary object file!"
echo "$ec 4..."
exit 4
fi
else
# if hex input file does not exist
if test ! \( -f $inputHex \) ;then
echo $error
echo "Input file not found!"
echo "$ec 1..."
exit 1
fi
# copy input hex to output hex
$copy $inputHex $outputHex
fi
# if output only parameter isn't set
if test $outputOnly = 0 ;then
# convert name into partno parameter for avrdude
case $atType in
"atmega8") dAtType="m8" ;;
"atmega16") dAtType="m16" ;;
"atmega32") dAtType="m32" ;;
"atmega64") dAtType="m64" ;;
"atmega128") dAtType="m128" ;;
"attiny10") dAtType="t10" ;;
"attiny13") dAtType="t13" ;;
"attiny15") dAtType="t15" ;;
# if name isn't supported, partno parmeter is type argument
*) dAtType=$atType ;;
esac
# execute avrdude
$dude $dudeT $dAtType $dudeD $dev $dudeP $prog $dudeHex$outputHex
eTmp=$?
# if avrdude retruns an error, display error and abort
if test ! \( $eTmp = 0 \) ;then
echo $error
echo "$dude returned $eTmp"
echo "Aborting..."
echo "Unable to send hex file to $atType"
echo "$ec 5..."
exit 5
fi
fi
# set end time
eTimeN=`date +%N`
eTimeS=`date +%s`
# calculate time difference
dTimeN=`echo "scale=0; ($eTimeN - $sTimeN) / 1000000" | bc`
dTimeS=`echo "scale=0; ($eTimeS - $sTimeS)" | bc`
################################
# summary
################################
echo "\n"
echo "Summary:"
if test $usingC ;then
echo " Source(s): $inputC"
fi
if test $usingAsm ;then
echo "Source(s): $inputAsm"
fi
echo " Hex-File: $outputHex"
echo " Device: $dev"
echo " Programmer: $prog"
echo " Compiler: $compiler"
echo " Hex-File-Coder: $objcopys"
echo " Driver: $dude"
echo " Time: $dTimeS s $dTimeN ms"
echo ""
echo "Writing successfully!"
exit 0