diff options
-rw-r--r-- | configure.in | 15 | ||||
-rw-r--r-- | src/Makefile.am | 12 | ||||
-rw-r--r-- | src/file2c.tcl | 125 | ||||
-rw-r--r-- | src/openocd.c | 22 | ||||
-rw-r--r-- | testing/tcl_server.tcl | 30 | ||||
-rw-r--r-- | testing/tcl_test.tcl | 130 |
6 files changed, 111 insertions, 223 deletions
diff --git a/configure.in b/configure.in index cce438f..bc47064 100644 --- a/configure.in +++ b/configure.in @@ -290,13 +290,20 @@ AM_CONDITIONAL(BITQ, test $build_bitq = yes) AC_LANG_C AC_PROG_CC AC_PROG_RANLIB -AC_PATH_PROG(TCLSH, tclsh) -# quit if we have no tclsh -if test "x${TCLSH}" = "x"; then - AC_MSG_ERROR([no working tclsh found]) +AC_CHECK_PROG(OBJDUMP, objdump, objdump) +AC_CHECK_PROG(OBJCOPY, objcopy, objcopy) + +if test x${OBJDUMP} != x -a x${OBJCOPY} != x ; then + AC_MSG_CHECKING(objcopy command line) + AC_TRY_COMPILE(,,[OBJCOPY_format=`${OBJDUMP} -f conftest.$ac_objext | sed -e '/file format/!d' -e 's/.*format \(.*\)/\1/'` + OBJCOPY_arch=`${OBJDUMP} -f conftest.$ac_objext | sed -e '/architecture/!d' -e 's/.*architecture: \(.*\),.*/\1/'`]) + AC_MSG_RESULT(-I binary -O ${OBJCOPY_format} -B ${OBJCOPY_arch}) fi +AC_SUBST(OBJCOPY_FORMAT, ${OBJCOPY_format}) +AC_SUBST(OBJCOPY_ARCH, ${OBJCOPY_arch}) + AC_SUBST(WITH_FTD2XX, $with_ftd2xx) AC_OUTPUT(Makefile src/Makefile src/helper/Makefile src/jtag/Makefile src/xsvf/Makefile src/target/Makefile src/server/Makefile src/flash/Makefile src/pld/Makefile doc/Makefile) diff --git a/src/Makefile.am b/src/Makefile.am index 20b6425..2f1a221 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -6,7 +6,7 @@ else MAINFILE = main.c jim.c endif -openocd_SOURCES = $(MAINFILE) openocd.c startup.c +openocd_SOURCES = $(MAINFILE) openocd.c # set the include path found by configure INCLUDES = -I$(top_srcdir)/src -I$(top_srcdir)/src/helper \ @@ -70,7 +70,7 @@ FTD2XXLIB = endif endif -openocd_LDADD = $(top_builddir)/src/xsvf/libxsvf.a \ +openocd_LDADD = $(top_builddir)/src/startup.o $(top_builddir)/src/xsvf/libxsvf.a \ $(top_builddir)/src/target/libtarget.a $(top_builddir)/src/jtag/libjtag.a \ $(top_builddir)/src/helper/libhelper.a \ $(top_builddir)/src/server/libserver.a $(top_builddir)/src/helper/libhelper.a \ @@ -96,9 +96,7 @@ 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 +# Convert .tcl to object -# add startup.c to make clean list -CLEANFILES = startup.c +$(top_builddir)/src/startup.o: $(top_srcdir)/src/startup.tcl + ${OBJCOPY} -I binary -O ${OBJCOPY_FORMAT} -B ${OBJCOPY_ARCH} startup.tcl startup.o diff --git a/src/file2c.tcl b/src/file2c.tcl deleted file mode 100644 index 288751a..0000000 --- a/src/file2c.tcl +++ /dev/null @@ -1,125 +0,0 @@ -#!/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 8cac553..dcaca78 100644 --- a/src/openocd.c +++ b/src/openocd.c @@ -711,10 +711,14 @@ void add_jim(const char *name, int (*cmd)(Jim_Interp *interp, int argc, Jim_Obj Jim_ListAppendElement(interp, helptext, cmd_entry); } -extern const unsigned char filedata_startup[]; +extern char binary_startup_tcl_start; +extern char binary_startup_tcl_size; void initJim(void) { + char *script; + int script_len; + Jim_CreateCommand(interp, "openocd", Jim_Command_openocd, NULL, NULL); Jim_CreateCommand(interp, "openocd_throw", Jim_Command_openocd_throw, NULL, NULL); Jim_CreateCommand(interp, "find", Jim_Command_find, NULL, NULL); @@ -734,23 +738,27 @@ void initJim(void) add_default_dirs(); - if (Jim_Eval(interp, filedata_startup)==JIM_ERR) + script_len = (int)&binary_startup_tcl_size; + script = malloc(script_len + sizeof(char)); + memcpy(script, &binary_startup_tcl_start, script_len); + + /* null terminate */ + script[script_len] = 0; + + if (Jim_Eval(interp, script)==JIM_ERR) { LOG_ERROR("Failed to run startup.tcl (embedded into OpenOCD compile time)"); Jim_PrintErrorMessage(interp); exit(-1); } + + free(script); } - - int handle_script_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { - FILE *script_file; - if (argc != 1) return ERROR_COMMAND_SYNTAX_ERROR; - /* Run a tcl script file */ return command_run_linef(cmd_ctx, "source [find {%s}]", args[0]); diff --git a/testing/tcl_server.tcl b/testing/tcl_server.tcl index c5ec229..2e229c1 100644 --- a/testing/tcl_server.tcl +++ b/testing/tcl_server.tcl @@ -1,15 +1,15 @@ -# Simple tcl client to connect to openocd
-puts "Use empty line to exit"
-set fo [socket 127.0.0.1 6666]
-puts -nonewline stdout "> "
-flush stdout
-while {[gets stdin line] >= 0} {
- if {$line eq {}} break
- puts $fo $line
- flush $fo
- gets $fo line
- puts $line
- puts -nonewline stdout "> "
- flush stdout
-}
-close $fo
+# Simple tcl client to connect to openocd +puts "Use empty line to exit" +set fo [socket 127.0.0.1 6666] +puts -nonewline stdout "> " +flush stdout +while {[gets stdin line] >= 0} { + if {$line eq {}} break + puts $fo $line + flush $fo + gets $fo line + puts $line + puts -nonewline stdout "> " + flush stdout +} +close $fo diff --git a/testing/tcl_test.tcl b/testing/tcl_test.tcl index 683b4fe..476e1c2 100644 --- a/testing/tcl_test.tcl +++ b/testing/tcl_test.tcl @@ -1,65 +1,65 @@ -if { $argc != 1 } {
- puts "Usage: test_tcl.tcl <ipaddress>"
- exit 1
-}
-
-puts $argv
-
-# Simple tcl client to connect to openocd
-global fo
-set fo [socket $argv 6666]
-
-# If a fn is unknown to Tcl, send it off to OpenOCD
-proc unknown args {
- global fo
- puts $fo $args
- flush $fo
- gets $fo line
- return $line
-}
-
-
-
-#Print help text for a command. Word wrap
-#help text that is too wide inside column.
-proc pc_help {args} {
- global ocd_helptext
- set cmd $args
- foreach a [lsort $ocd_helptext] {
- if {[string length $cmd]==0||[string first $cmd $a]!=-1||[string first $cmd [lindex $a 1]]!=-1} {
- set w 50
- set cmdname [lindex $a 0]
- set h [lindex $a 1]
- set n 0
- while 1 {
- if {$n > [string length $h]} {break}
-
- set next_a [expr $n+$w]
- if {[string length $h]>$n+$w} {
- set xxxx [string range $h $n [expr $n+$w]]
- for {set lastpos [expr [string length $xxxx]-1]} {$lastpos>=0&&[string compare [string range $xxxx $lastpos $lastpos] " "]!=0} {set lastpos [expr $lastpos-1]} {
- }
- #set next_a -1
- if {$lastpos!=-1} {
- set next_a [expr $lastpos+$n+1]
- }
- }
-
-
- puts [format "%-25s %s" $cmdname [string range $h $n [expr $next_a-1]] ]
- set cmdname ""
- set n [expr $next_a]
- }
- }
- }
-}
-
-puts "Running flash_banks"
-puts [flash_banks]
-puts "Running help on PC using data from OpenOCD"
-global ocd_helptext
-set ocd_helptext [get_help_text]
-puts [pc_help]
-
-
-
+if { $argc != 1 } { + puts "Usage: test_tcl.tcl <ipaddress>" + exit 1 +} + +puts $argv + +# Simple tcl client to connect to openocd +global fo +set fo [socket $argv 6666] + +# If a fn is unknown to Tcl, send it off to OpenOCD +proc unknown args { + global fo + puts $fo $args + flush $fo + gets $fo line + return $line +} + + + +#Print help text for a command. Word wrap +#help text that is too wide inside column. +proc pc_help {args} { + global ocd_helptext + set cmd $args + foreach a [lsort $ocd_helptext] { + if {[string length $cmd]==0||[string first $cmd $a]!=-1||[string first $cmd [lindex $a 1]]!=-1} { + set w 50 + set cmdname [lindex $a 0] + set h [lindex $a 1] + set n 0 + while 1 { + if {$n > [string length $h]} {break} + + set next_a [expr $n+$w] + if {[string length $h]>$n+$w} { + set xxxx [string range $h $n [expr $n+$w]] + for {set lastpos [expr [string length $xxxx]-1]} {$lastpos>=0&&[string compare [string range $xxxx $lastpos $lastpos] " "]!=0} {set lastpos [expr $lastpos-1]} { + } + #set next_a -1 + if {$lastpos!=-1} { + set next_a [expr $lastpos+$n+1] + } + } + + + puts [format "%-25s %s" $cmdname [string range $h $n [expr $next_a-1]] ] + set cmdname "" + set n [expr $next_a] + } + } + } +} + +puts "Running flash_banks" +puts [flash_banks] +puts "Running help on PC using data from OpenOCD" +global ocd_helptext +set ocd_helptext [get_help_text] +puts [pc_help] + + + |