From efc6063df873b3419010ad66d183b997d52e630c Mon Sep 17 00:00:00 2001 From: oharboe Date: Fri, 11 Jul 2008 06:44:22 +0000 Subject: [PATCH] startup.tcl (former commands.tcl) is now embedded into OpenOCD executable. git-svn-id: svn://svn.berlios.de/openocd/trunk@787 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- src/Makefile.am | 6 +- src/file2c.tcl | 125 ++++++++++++++++++++++++ src/openocd.c | 7 +- src/{tcl/commands.tcl => startup.tcl} | 132 ++++++++++++++------------ 4 files changed, 203 insertions(+), 67 deletions(-) create mode 100644 src/file2c.tcl rename src/{tcl/commands.tcl => startup.tcl} (90%) diff --git a/src/Makefile.am b/src/Makefile.am index ff0eb6e519..1c96fb474b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -7,7 +7,7 @@ MAINFILE = main.c jim.c endif -openocd_SOURCES = $(MAINFILE) openocd.c +openocd_SOURCES = $(MAINFILE) openocd.c startup.c # set the include path found by configure INCLUDES = -I$(top_srcdir)/src/helper \ @@ -82,7 +82,6 @@ openocd_LDADD = $(top_builddir)/src/xsvf/libxsvf.a \ nobase_dist_pkglib_DATA = \ - tcl/commands.tcl \ tcl/bitsbytes.tcl \ tcl/chip/atmel/at91/aic.tcl \ tcl/chip/atmel/at91/at91sam7x128.tcl \ @@ -98,3 +97,6 @@ nobase_dist_pkglib_DATA = \ tcl/mmr_helpers.tcl \ tcl/readable.tcl +# Convert .tcl to .c file +startup.c: $(top_srcdir)/src/startup.tcl Makefile $(top_srcdir)/src/file2c.tcl + tclsh $(top_srcdir)/src/file2c.tcl $(top_srcdir)/src/startup.tcl startup.c \ No newline at end of file diff --git a/src/file2c.tcl b/src/file2c.tcl new file mode 100644 index 0000000000..288751a1a8 --- /dev/null +++ b/src/file2c.tcl @@ -0,0 +1,125 @@ +#!/bin/bash +# restart using a Tcl shell \ + exec sh -c 'for tclshell in tclsh tclsh83 cygtclsh80 ; do \ + ( echo | $tclshell ) 2> /dev/null && exec $tclshell "`( cygpath -w \"$0\" ) 2> /dev/null || echo $0`" "$@" ; \ + done ; \ + echo "file2c.tcl: cannot find Tcl shell" ; exit 1' "$0" "$@" + +#=============================================================================== +# +# file2c.tcl +# +# Convert a file into a header that can be #included from C. +# +#=============================================================================== +#####ECOSGPLCOPYRIGHTBEGIN#### +## ------------------------------------------- +## This file is part of eCos, the Embedded Configurable Operating System. +## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. +## +## eCos 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 or (at your option) any later version. +## +## eCos is distributed in the hope that it will be useful, but WITHOUT ANY +## WARRANTY; without even the implied warranty of MERCHANTABILITY or +## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +## for more details. +## +## You should have received a copy of the GNU General Public License along +## with eCos; if not, write to the Free Software Foundation, Inc., +## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +## +## As a special exception, if other files instantiate templates or use macros +## or inline functions from this file, or you compile this file and link it +## with other works to produce a work based on this file, this file does not +## by itself cause the resulting work to be covered by the GNU General Public +## License. However the source code for this file must still be made available +## in accordance with section (3) of the GNU General Public License. +## +## This exception does not invalidate any other reasons why a work based on +## this file might be covered by the GNU General Public License. +## +## Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. +## at http://sources.redhat.com/ecos/ecos-license/ +## ------------------------------------------- +#####ECOSGPLCOPYRIGHTEND#### +#=============================================================================== +######DESCRIPTIONBEGIN#### +# +# Author(s): jlarmour,bartv +# Contact(s): +# Date: 2001-07-20 +# Purpose: +# Description: +# Usage: file2c.tcl +# +#####DESCRIPTIONEND#### +#=============================================================================== + + + +if { $argc != 2 } { + puts "Usage: file2c.tcl " + exit 1 +} +set infile [lindex $argv 0] +set outfile [lindex $argv 1] +set label [string range $outfile [expr 1+[string last / $outfile]] [expr [string last . $outfile]-1]] + +set status [ catch { + set infilefd [open $infile "r"] + fconfigure $infilefd -translation binary + set data [read $infilefd] + close $infilefd +} message] + +if { $status != 0 } { + error "Unable to read file $infile: $message" +} + +set result "" + +set status [ catch { + set outfilefd [ open $outfile "w" ] +} message ] + +if { $status != 0 } { + error "Unable to create file $outfile: $message" +} + +append result "/* This is a generated file. Do not edit. */\n\n" +append result "const unsigned char filedata_$label\[\] = {\n" + +set datalength [ string length $data ] + +set aligned_datalength [expr $datalength - ($datalength % 8)] + +for { set i 0 } {$i < $aligned_datalength} {incr i 8} { + binary scan $data "@[set i]H16" var0 + append result [format " 0x%2s, 0x%2s, 0x%2s, 0x%2s, 0x%2s, 0x%2s, 0x%2s, 0x%2s,\n" \ + [string range $var0 0 1] \ + [string range $var0 2 3] \ + [string range $var0 4 5] \ + [string range $var0 6 7] \ + [string range $var0 8 9] \ + [string range $var0 10 11] \ + [string range $var0 12 13] \ + [string range $var0 14 15]] +} + +if { $aligned_datalength != $datalength } { + append result " " + for { set i $aligned_datalength } {$i < $datalength} {incr i} { + binary scan $data "@[set i]H2" var0 + append result [format "0x%2s, " $var0] + } +} + +# Remove either comma+newline or comma+space from the end +set result [string range $result 0 [expr [string length $result] - 3]] + +append result "\n};" + +puts $outfilefd $result +close $outfilefd diff --git a/src/openocd.c b/src/openocd.c index 64965e37a6..eef6e60dca 100644 --- a/src/openocd.c +++ b/src/openocd.c @@ -742,12 +742,15 @@ void initJim(void) interp->cb_fgets = openocd_jim_fgets; } +extern const unsigned char filedata_startup[]; + /* after command line parsing */ void initJim2(void) { - if (Jim_Eval(interp, "source [find tcl/commands.tcl]")==JIM_ERR) + if (Jim_Eval(interp, filedata_startup)==JIM_ERR) { - LOG_ERROR("Can not find tcl/commands.tcl - check installation"); + LOG_ERROR("Failed to run startup.tcl (embedded into OpenOCD compile time)"); + Jim_PrintErrorMessage(interp); exit(-1); } } diff --git a/src/tcl/commands.tcl b/src/startup.tcl similarity index 90% rename from src/tcl/commands.tcl rename to src/startup.tcl index 8d7cdb8234..0a829128e3 100644 --- a/src/tcl/commands.tcl +++ b/src/startup.tcl @@ -1,63 +1,69 @@ - -# Production command -# FIX!!! need to figure out how to feed back relevant output -# from e.g. "flash banks" command... -proc board_produce {filename serialnumber} { - openocd "reset init" - openocd "flash write_image erase $filename [flash] bin"]] - openocd "verify_image $filename [flash] bin"]] - echo "Successfully ran production procedure" -} - -proc board_test {} { - echo "Production test not implemented" -} - -# Show flash in human readable form -# This is an example of a human readable form of a low level fn -proc flash_banks_pretty {} { - set i 0 - set result "" - foreach {a} [flash_banks] { - if {$i > 0} { - set result "$result\n" - } - set result [format "$result#%d: %s at 0x%08x, size 0x%08x, buswidth %d, chipwidth %d" $i [lindex $a 0] [lindex $a 1] [lindex $a 2] [lindex $a 3] [lindex $a 4]] - set i [expr $i+1] - } - return $result -} - -# We need to explicitly redirect this to the OpenOCD command -# as Tcl defines the exit proc -proc exit {} { - openocd_throw exit -} - -# We have currently converted only "flash banks" to tcl. -proc flash args { - if {[string compare [lindex $args 0] banks]==0} { - return [flash_banks_pretty] - } - openocd_throw "flash $args" -} - -# If a fn is unknown to Tcl, we try to execute it as an OpenOCD command -proc unknown {args} { - if {[string length $args]>0} { - set cmd "" - # We need to add back quotes for arguments w/space - # for args without space, we can add quotes anyway - foreach {a} $args { - set cmd "$cmd \"$a\"" - } - openocd_throw $cmd - } - # openocd_throw outputs while running and also sets the - # primary return value to the output of the command - # - # The primary return value have been set by "openocd" above, - # so we need to clear it, lest we print out the output from - # the command twice. - return "" -} +# +# Defines basic Tcl procs that must be there for +# OpenOCD to work. +# +# Embedded into OpenOCD executable +# + +# Production command +# FIX!!! need to figure out how to feed back relevant output +# from e.g. "flash banks" command... +proc board_produce {filename serialnumber} { + openocd "reset init" + openocd "flash write_image erase $filename [flash] bin"]] + openocd "verify_image $filename [flash] bin"]] + echo "Successfully ran production procedure" +} + +proc board_test {} { + echo "Production test not implemented" +} + +# Show flash in human readable form +# This is an example of a human readable form of a low level fn +proc flash_banks_pretty {} { + set i 0 + set result "" + foreach {a} [flash_banks] { + if {$i > 0} { + set result "$result\n" + } + set result [format "$result#%d: %s at 0x%08x, size 0x%08x, buswidth %d, chipwidth %d" $i [lindex $a 0] [lindex $a 1] [lindex $a 2] [lindex $a 3] [lindex $a 4]] + set i [expr $i+1] + } + return $result +} + +# We need to explicitly redirect this to the OpenOCD command +# as Tcl defines the exit proc +proc exit {} { + openocd_throw exit +} + +# We have currently converted only "flash banks" to tcl. +proc flash args { + if {[string compare [lindex $args 0] banks]==0} { + return [flash_banks_pretty] + } + openocd_throw "flash $args" +} + +# If a fn is unknown to Tcl, we try to execute it as an OpenOCD command +proc unknown {args} { + if {[string length $args]>0} { + set cmd "" + # We need to add back quotes for arguments w/space + # for args without space, we can add quotes anyway + foreach {a} $args { + set cmd "$cmd \"$a\"" + } + openocd_throw $cmd + } + # openocd_throw outputs while running and also sets the + # primary return value to the output of the command + # + # The primary return value have been set by "openocd" above, + # so we need to clear it, lest we print out the output from + # the command twice. + return "" +} -- 2.30.2