diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 6 | ||||
-rw-r--r-- | src/file2c.tcl | 125 | ||||
-rw-r--r-- | src/openocd.c | 7 | ||||
-rw-r--r-- | src/startup.tcl (renamed from src/tcl/commands.tcl) | 132 |
4 files changed, 203 insertions, 67 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index ff0eb6e5..1c96fb47 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 00000000..288751a1 --- /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 <file to encode> <output C header file> +# +#####DESCRIPTIONEND#### +#=============================================================================== + + + +if { $argc != 2 } { + puts "Usage: file2c.tcl <file to encode> <output C file>" + 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 64965e37..eef6e60d 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 index 8d7cdb82..0a829128 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 ""
+}
|