OpenCores
URL https://opencores.org/ocsvn/openmsp430/openmsp430/trunk

Subversion Repositories openmsp430

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /openmsp430/trunk/tools/bin
    from Rev 110 to Rev 158
    Reverse comparison

Rev 110 → Rev 158

/openmsp430-gdbproxy.tcl
34,20 → 34,6
# $LastChangedDate$
#------------------------------------------------------------------------------
 
global serial_baudrate
global serial_device
global serial_status
global hw_break
global clients
global server
global verbose
global shell
global omsp_info
 
# Initializations
set serial_status 0
 
 
###############################################################################
# #
# SOURCE LIBRARIES #
63,6 → 49,7
 
# Source library
source $lib_path/dbg_functions.tcl
source $lib_path/dbg_utils.tcl
 
# Source remaining files
source [file dirname $current_file]/../openmsp430-gdbproxy/server.tcl
71,6 → 58,44
 
###############################################################################
# #
# GLOBAL VARIABLES #
# #
###############################################################################
 
global CpuNr
 
global omsp_conf
global omsp_info
 
global omsp_nr
 
global gui_dbg_if
global gui_adapter
global clients
global server
global verbose
global shell
 
# Initialize to default values
set CpuNr 0
set omsp_nr 1
set omsp_conf(interface) uart_generic
#set omsp_nr 4
#set omsp_conf(interface) i2c_usb-iss
set omsp_conf(device) [lindex [utils::uart_port_list] end]
set omsp_conf(baudrate) [lindex [GetAllowedSpeeds] 1]
set omsp_conf(0,cpuaddr) 50
set omsp_conf(1,cpuaddr) 51
set omsp_conf(2,cpuaddr) 52
set omsp_conf(3,cpuaddr) 53
 
set server(port) 2000
 
set shell 0
set verbose 0
 
###############################################################################
# #
# PARAMETER CHECK #
# #
###############################################################################
77,39 → 102,77
 
proc help {} {
puts ""
puts "USAGE : openmsp430-gdbproxy.tcl \[-device <communication device>\]"
puts " \[-baudrate <communication speed>\]"
puts "USAGE : openmsp430-gdbproxy.tcl \[-device <communication port>\]"
puts " \[-adaptor <adaptor type>\]"
puts " \[-speed <communication speed>\]"
puts " \[-i2c_addr <cpu address>\]"
puts " \[-port <server port>\]"
puts " \[-shell]"
puts " \[-verbose\]"
puts " \[-help\]"
puts ""
puts "Examples: openmsp430-gdbproxy.tcl -device /dev/ttyUSB0 -baudrate 9600 -port 2000"
puts " openmsp430-gdbproxy.tcl -device COM2: -baudrate 38400 -port 2000"
puts "Examples: openmsp430-gdbproxy.tcl -device /dev/ttyUSB0 -adaptor uart_generic -speed 115200 -port 2000"
puts " openmsp430-gdbproxy.tcl -device COM2: -adaptor i2c_usb-iss -speed I2C_S_100KHZ -i2c_addr 75 -port 2000"
puts ""
}
 
# Default values
set serial_device [lindex [dbg_list_uart] end]
set serial_baudrate 115200
set server(port) 2000
set shell 0
set verbose 0
 
# Parse arguments
for {set i 0} {$i < $argc} {incr i} {
switch -exact -- [lindex $argv $i] {
-device {set serial_device [lindex $argv [expr $i+1]]; incr i}
-baudrate {set serial_baudrate [lindex $argv [expr $i+1]]; incr i}
-port {set server(port) [lindex $argv [expr $i+1]]; incr i}
-shell {set shell 1}
-verbose {set verbose 1}
-h {help; exit 0}
-help {help; exit 0}
default {}
-device {set omsp_conf(device) [lindex $argv [expr $i+1]]; incr i}
-adaptor {set omsp_conf(interface) [lindex $argv [expr $i+1]]; incr i}
-speed {set omsp_conf(baudrate) [lindex $argv [expr $i+1]]; incr i}
-i2c_addr {set omsp_conf(0,cpuaddr) [lindex $argv [expr $i+1]]; incr i}
-port {set server(port) [lindex $argv [expr $i+1]]; incr i}
-shell {set shell 1}
-verbose {set verbose 1}
-h {help; exit 0}
-help {help; exit 0}
default {}
}
}
 
# Make sure the selected adptor is valid
if {![string eq $omsp_conf(interface) "uart_generic"] &
![string eq $omsp_conf(interface) "i2c_usb-iss"]} {
puts "\nERROR: Specified adaptor is not valid (should be \"uart_generic\" or \"i2c_usb-iss\")"
help
exit 1
}
 
# Make sure the I2C address is an integer
if {![string is integer $omsp_conf(0,cpuaddr)]} {
puts "\nERROR: Specified I2C address is not an integer"
help
exit 1
}
 
# Make sure the I2C address is valid
if {($omsp_conf(0,cpuaddr)<8) | ($omsp_conf(0,cpuaddr)>119)} {
puts "\nERROR: Specified I2C address should lay between 7 and 120"
help
exit 1
}
 
# If the selected interface is a UART, make sure the selected speed is an integer
if {[string eq $omsp_conf(interface) "uart_generic"]} {
if {![string is integer $omsp_conf(baudrate)]} {
puts "\nERROR: Specified UART communication speed is not an integer"
help
exit 1
}
} elseif {[string eq $omsp_conf(interface) "i2c_usb-iss"]} {
if {[lsearch [lindex [GetAllowedSpeeds] 2] $omsp_conf(baudrate)]==-1} {
puts "\nERROR: Specified I2C communication speed is not valid."
puts " Allowed values are:"
foreach allowedVal [lindex [GetAllowedSpeeds] 2] {
puts " - $allowedVal"
}
puts ""
exit 1
}
}
 
# Source additional library for graphical interface
if {!$shell} {
source $lib_path/combobox.tcl
122,24 → 185,24
global server
global shell
if {$shell} {
if {$nonewline} {
puts -nonewline $string
} else {
puts $string
}
if {$nonewline} {
puts -nonewline $string
} else {
puts $string
}
} else {
if {$nonewline} {
$server(log) insert end "$string"
} else {
$server(log) insert end "$string\n"
}
$server(log) see end
if {$nonewline} {
$server(log) insert end "$string"
} else {
$server(log) insert end "$string\n"
}
$server(log) see end
}
}
proc putsVerbose {string} {
global verbose
if {$verbose} {
putsLog "$string"
putsLog "$string"
}
}
 
149,53 → 212,167
if {$shell} {
 
# Connect to device
if {![GetDevice]} {
puts "ERROR: Could not open $serial_device"
puts "INFO: Available serial ports are:"
foreach port [dbg_list_uart] {
puts "INFO: - $port"
}
exit 1
if {![GetDevice $CpuNr]} {
puts "ERROR: Could not open $omsp_conf(device)
puts "INFO: Available serial ports are:"
foreach port [utils::uart_port_list] {
puts "INFO: - $port"
}
if {[string eq $omsp_conf(interface) "i2c_usb-iss"]} {
puts "\nMake sure the specified I2C device address is correct: $omsp_conf(0,cpuaddr)\n"
}
exit 1
}
 
# Display info
if {$omsp_info(alias)==""} {
puts "INFO: Sucessfully connected with the openMSP430 target."
if {$omsp_info($CpuNr,alias)==""} {
puts "INFO: Sucessfully connected with the openMSP430 target."
} else {
puts "INFO: Sucessfully connected with the openMSP430 target ($omsp_info(alias))."
puts "INFO: Sucessfully connected with the openMSP430 target ($omsp_info($CpuNr,alias))."
}
set sizes [GetCPU_ID_SIZE]
if {$omsp_info(asic)} {
puts "INFO: CPU Version - $omsp_info(cpu_ver) / ASIC"
set sizes [GetCPU_ID_SIZE $CpuNr]
if {$omsp_info($CpuNr,asic)} {
puts "INFO: CPU Version - $omsp_info($CpuNr,cpu_ver) / ASIC"
} else {
puts "INFO: CPU Version - $omsp_info(cpu_ver) / FPGA"
puts "INFO: CPU Version - $omsp_info($CpuNr,cpu_ver) / FPGA"
}
puts "INFO: User Version - $omsp_info(user_ver)"
if {$omsp_info(cpu_ver)==1} {
puts "INFO: Hardware Multiplier - --"
} elseif {$omsp_info(mpy)} {
puts "INFO: Hardware Multiplier - Yes"
puts "INFO: User Version - $omsp_info($CpuNr,user_ver)"
if {$omsp_info($CpuNr,cpu_ver)==1} {
puts "INFO: Hardware Multiplier - --"
} elseif {$omsp_info($CpuNr,mpy)} {
puts "INFO: Hardware Multiplier - Yes"
} else {
puts "INFO: Hardware Multiplier - No"
puts "INFO: Hardware Multiplier - No"
}
puts "INFO: Program Memory Size - $omsp_info(pmem_size) B"
puts "INFO: Data Memory Size - $omsp_info(dmem_size) B"
puts "INFO: Peripheral Address Space - $omsp_info(per_size) B"
puts "INFO: $hw_break(num) Hardware Brea/Watch-point unit(s) detected"
puts "INFO: Program Memory Size - $omsp_info($CpuNr,pmem_size) B"
puts "INFO: Data Memory Size - $omsp_info($CpuNr,dmem_size) B"
puts "INFO: Peripheral Address Space - $omsp_info($CpuNr,per_size) B"
puts "INFO: $omsp_info($CpuNr,hw_break) Hardware Brea/Watch-point unit(s) detected"
puts ""
 
# Reset & Stop CPU
ExecutePOR_Halt
ExecutePOR_Halt $CpuNr
 
# Start server for GDB
if {![startServer]} {
exit 1
exit 1
}
 
vwait forever
}
 
proc getConfiguration {} {
 
global gui_dbg_if
global gui_adapter
global omsp_conf
 
regexp {(.+)_(.+)} $omsp_conf(interface) whole_match tmp_if tmp_adapter
 
set gui_dbg_if [string toupper $tmp_if]
set gui_adapter [string toupper $tmp_adapter]
 
return 1
}
 
proc updateConfiguration {{w ""} {sel ""}} {
 
global gui_dbg_if
global gui_adapter
global omsp_conf
global omsp_nr
 
if {$sel=="UART"} {
eval .connect.cfg.if.config2.adapter.p2 list delete 0 end
eval .connect.cfg.if.config2.adapter.p2 list insert end [list "GENERIC"]
set gui_adapter "GENERIC"
set omsp_conf(interface) uart_generic
 
} elseif {$sel=="I2C"} {
 
eval .connect.cfg.if.config2.adapter.p2 list delete 0 end
eval .connect.cfg.if.config2.adapter.p2 list insert end [list "USB-ISS"]
set gui_adapter "USB-ISS"
set omsp_conf(interface) i2c_usb-iss
}
 
if {$gui_dbg_if=="UART"} {
set omsp_nr 1
.connect.cfg.ad.i2c_nr.l configure -state disabled
.connect.cfg.ad.i2c_nr.s configure -state disabled
.connect.cfg.ad.i2c_addr.l configure -state disabled
.connect.cfg.ad.i2c_addr.s0 configure -state disabled
.connect.cfg.ad.i2c_addr.s1 configure -state disabled
.connect.cfg.ad.i2c_addr.s2 configure -state disabled
.connect.cfg.ad.i2c_addr.s3 configure -state disabled
.connect.cfg.ad.arrow.l0 configure -state disabled
.connect.cfg.ad.arrow.l1 configure -state disabled
.connect.cfg.ad.arrow.l2 configure -state disabled
.connect.cfg.ad.arrow.l3 configure -state disabled
.connect.cfg.ad.server_port.p0 configure -state normal
.connect.cfg.ad.server_port.p1 configure -state disabled
.connect.cfg.ad.server_port.p2 configure -state disabled
.connect.cfg.ad.server_port.p3 configure -state disabled
.connect.cfg.ad.core_nr.l0 configure -state disabled
.connect.cfg.ad.core_nr.l1 configure -state disabled
.connect.cfg.ad.core_nr.l2 configure -state disabled
.connect.cfg.ad.core_nr.l3 configure -state disabled
} elseif {$gui_dbg_if=="I2C"} {
# .connect.cfg.ad.core_nr.l0 configure -state normal
# .connect.cfg.ad.i2c_nr.l configure -state normal
# .connect.cfg.ad.i2c_nr.s configure -state normal
.connect.cfg.ad.i2c_addr.l configure -state normal
.connect.cfg.ad.i2c_addr.s0 configure -state normal
.connect.cfg.ad.arrow.l0 configure -state normal
.connect.cfg.ad.server_port.p0 configure -state normal
# .connect.cfg.ad.core_nr.l0 configure -state normal
 
 
if {$omsp_nr < 2} {
.connect.cfg.ad.core_nr.l1 configure -state disabled
.connect.cfg.ad.server_port.p1 configure -state disabled
.connect.cfg.ad.arrow.l1 configure -state disabled
.connect.cfg.ad.i2c_addr.s1 configure -state disabled
} else {
.connect.cfg.ad.core_nr.l1 configure -state normal
.connect.cfg.ad.server_port.p1 configure -state normal
.connect.cfg.ad.arrow.l1 configure -state normal
.connect.cfg.ad.i2c_addr.s1 configure -state normal
}
if {$omsp_nr < 3} {
.connect.cfg.ad.core_nr.l2 configure -state disabled
.connect.cfg.ad.server_port.p2 configure -state disabled
.connect.cfg.ad.arrow.l2 configure -state disabled
.connect.cfg.ad.i2c_addr.s2 configure -state disabled
} else {
.connect.cfg.ad.core_nr.l2 configure -state normal
.connect.cfg.ad.server_port.p2 configure -state normal
.connect.cfg.ad.arrow.l2 configure -state normal
.connect.cfg.ad.i2c_addr.s2 configure -state normal
}
if {$omsp_nr < 4} {
.connect.cfg.ad.core_nr.l3 configure -state disabled
.connect.cfg.ad.server_port.p3 configure -state disabled
.connect.cfg.ad.arrow.l3 configure -state disabled
.connect.cfg.ad.i2c_addr.s3 configure -state disabled
} else {
.connect.cfg.ad.core_nr.l3 configure -state normal
.connect.cfg.ad.server_port.p3 configure -state normal
.connect.cfg.ad.arrow.l3 configure -state normal
.connect.cfg.ad.i2c_addr.s3 configure -state normal
}
}
 
.connect.cfg.if.config2.serial_port.p2 configure -editable 1
eval .connect.cfg.if.config2.serial_port.p2 list delete 0 end
eval .connect.cfg.if.config2.serial_port.p2 list insert end [lindex [GetAllowedSpeeds] 2]
set omsp_conf(baudrate) [lindex [GetAllowedSpeeds] 1];
.connect.cfg.if.config2.serial_port.p2 configure -editable [lindex [GetAllowedSpeeds] 0];
 
}
 
###############################################################################
# GUI MODE #
###############################################################################
241,44 → 418,116
pack .menu.omsp -side right -padx 20
 
# Create the Configuration, Start & Info frames
frame .connect.config
pack .connect.config -side left -padx 10 -pady 0 -fill x -expand true
getConfiguration
frame .connect.cfg
pack .connect.cfg -side left -padx 0 -pady 0 -fill x -expand true
frame .connect.cfg.if -bd 2 -relief ridge
pack .connect.cfg.if -side top -padx 10 -pady {10 0} -fill x -expand true
frame .connect.cfg.ad -bd 2 -relief ridge
pack .connect.cfg.ad -side top -padx 10 -pady 10 -fill both -expand true
frame .connect.start
pack .connect.start -side right -padx 10 -pady 0 -fill x -expand true
 
# Serial Port fields
set serial_device [lindex [dbg_list_uart] end]
frame .connect.config.serial_port
pack .connect.config.serial_port -side top -padx 5 -pady {10 0} -fill x
label .connect.config.serial_port.l1 -text "Serial Port:" -anchor w
pack .connect.config.serial_port.l1 -side left -padx 5
combobox .connect.config.serial_port.p1 -textvariable serial_device -editable true -width 20
eval .connect.config.serial_port.p1 list insert end [dbg_list_uart]
pack .connect.config.serial_port.p1 -side right -padx 20
frame .connect.cfg.if.config1
pack .connect.cfg.if.config1 -side left -padx 0 -pady 0 -fill x -expand true
frame .connect.cfg.if.config2
pack .connect.cfg.if.config2 -side left -padx 0 -pady 0 -fill x -expand true
 
# Serial Baudrate fields
set serial_baudrate 115200
frame .connect.config.serial_baudrate
pack .connect.config.serial_baudrate -side top -padx 5 -pady {5 0} -fill x
label .connect.config.serial_baudrate.l2 -text " Baudrate:" -anchor w
pack .connect.config.serial_baudrate.l2 -side left
combobox .connect.config.serial_baudrate.p2 -textvariable serial_baudrate -editable true -width 20
eval .connect.config.serial_baudrate.p2 list insert end [list 9600 19200 38400 57600 115200 \
230400 460800 500000 576000 921600 \
1000000 1152000]
pack .connect.config.serial_baudrate.p2 -side right -padx 20
# Interface & Adapter selection
frame .connect.cfg.if.config1.adapter
pack .connect.cfg.if.config1.adapter -side top -padx 5 -pady {10 0} -fill x
label .connect.cfg.if.config1.adapter.l1 -text "Serial Debug Interface:" -anchor w
pack .connect.cfg.if.config1.adapter.l1 -side left -padx 5
combobox .connect.cfg.if.config1.adapter.p1 -textvariable gui_dbg_if -editable false -width 15 -command {updateConfiguration}
eval .connect.cfg.if.config1.adapter.p1 list insert end [list "UART" "I2C"]
pack .connect.cfg.if.config1.adapter.p1 -side right -padx 10
 
# Server Port field
frame .connect.config.server_port
pack .connect.config.server_port -side top -padx 10 -pady {15 10} -fill x
label .connect.config.server_port.l1 -text "Proxy Server Port:" -anchor w
pack .connect.config.server_port.l1 -side left
entry .connect.config.server_port.p -textvariable server(port) -relief sunken -width 20
pack .connect.config.server_port.p -side right -padx 5 -padx 20
frame .connect.cfg.if.config2.adapter
pack .connect.cfg.if.config2.adapter -side top -padx 5 -pady {10 0} -fill x
label .connect.cfg.if.config2.adapter.l2 -text "Adapter selection:" -anchor w
pack .connect.cfg.if.config2.adapter.l2 -side left -padx 5
combobox .connect.cfg.if.config2.adapter.p2 -textvariable gui_adapter -editable false -width 15
eval .connect.cfg.if.config2.adapter.p2 list insert end [list "GENERIC"]
pack .connect.cfg.if.config2.adapter.p2 -side right -padx 5
 
# Device port & Speed selection
frame .connect.cfg.if.config1.serial_port
pack .connect.cfg.if.config1.serial_port -side top -padx 5 -pady {10 10} -fill x
label .connect.cfg.if.config1.serial_port.l1 -text "Device Port:" -anchor w
pack .connect.cfg.if.config1.serial_port.l1 -side left -padx 5
combobox .connect.cfg.if.config1.serial_port.p1 -textvariable omsp_conf(device) -editable true -width 15
eval .connect.cfg.if.config1.serial_port.p1 list insert end [utils::uart_port_list]
pack .connect.cfg.if.config1.serial_port.p1 -side right -padx 10
 
frame .connect.cfg.if.config2.serial_port
pack .connect.cfg.if.config2.serial_port -side top -padx 5 -pady {10 10} -fill x
label .connect.cfg.if.config2.serial_port.l2 -text "Speed:" -anchor w
pack .connect.cfg.if.config2.serial_port.l2 -side left -padx 5
combobox .connect.cfg.if.config2.serial_port.p2 -textvariable omsp_conf(baudrate) -editable [lindex [GetAllowedSpeeds] 0] -width 15
eval .connect.cfg.if.config2.serial_port.p2 list insert end [lindex [GetAllowedSpeeds] 2]
pack .connect.cfg.if.config2.serial_port.p2 -side right -padx 5
 
# Server Port field & I2C address selection
frame .connect.cfg.ad.core_nr
pack .connect.cfg.ad.core_nr -side left -padx 5 -fill y
label .connect.cfg.ad.core_nr.l3 -text "Core 3:" -anchor w
pack .connect.cfg.ad.core_nr.l3 -side bottom -padx {25 0} -pady {10 10}
label .connect.cfg.ad.core_nr.l2 -text "Core 2:" -anchor w
pack .connect.cfg.ad.core_nr.l2 -side bottom -padx {25 0} -pady {10 2}
label .connect.cfg.ad.core_nr.l1 -text "Core 1:" -anchor w
pack .connect.cfg.ad.core_nr.l1 -side bottom -padx {25 0} -pady {10 2}
label .connect.cfg.ad.core_nr.l0 -text "Core 0:" -anchor w
pack .connect.cfg.ad.core_nr.l0 -side bottom -padx {25 0} -pady {10 2}
 
frame .connect.cfg.ad.server_port
pack .connect.cfg.ad.server_port -side left -padx 5 -fill y
entry .connect.cfg.ad.server_port.p3 -textvariable server(port) -relief sunken -width 10
pack .connect.cfg.ad.server_port.p3 -side bottom -padx 5 -pady {10 10}
entry .connect.cfg.ad.server_port.p2 -textvariable server(port) -relief sunken -width 10
pack .connect.cfg.ad.server_port.p2 -side bottom -padx 5 -pady {10 0}
entry .connect.cfg.ad.server_port.p1 -textvariable server(port) -relief sunken -width 10
pack .connect.cfg.ad.server_port.p1 -side bottom -padx 5 -pady {10 0}
entry .connect.cfg.ad.server_port.p0 -textvariable server(port) -relief sunken -width 10
pack .connect.cfg.ad.server_port.p0 -side bottom -padx 5 -pady {10 0}
label .connect.cfg.ad.server_port.l -text "Proxy Server Port" -anchor w
pack .connect.cfg.ad.server_port.l -side bottom -padx 5 -pady {10 0}
 
frame .connect.cfg.ad.arrow
pack .connect.cfg.ad.arrow -side left -padx 5 -fill y
label .connect.cfg.ad.arrow.l3 -text "==>" -anchor w
pack .connect.cfg.ad.arrow.l3 -side bottom -padx 5 -pady {10 10}
label .connect.cfg.ad.arrow.l2 -text "==>" -anchor w
pack .connect.cfg.ad.arrow.l2 -side bottom -padx 5 -pady {10 2}
label .connect.cfg.ad.arrow.l1 -text "==>" -anchor w
pack .connect.cfg.ad.arrow.l1 -side bottom -padx 5 -pady {10 2}
label .connect.cfg.ad.arrow.l0 -text "==>" -anchor w
pack .connect.cfg.ad.arrow.l0 -side bottom -padx 5 -pady {10 2}
 
frame .connect.cfg.ad.i2c_addr
pack .connect.cfg.ad.i2c_addr -side left -padx 5 -fill y
spinbox .connect.cfg.ad.i2c_addr.s3 -from 8 -to 119 -textvariable omsp_conf(3,cpuaddr) -width 4
pack .connect.cfg.ad.i2c_addr.s3 -side bottom -padx 5 -pady {10 10}
spinbox .connect.cfg.ad.i2c_addr.s2 -from 8 -to 119 -textvariable omsp_conf(2,cpuaddr) -width 4
pack .connect.cfg.ad.i2c_addr.s2 -side bottom -padx 5 -pady {10 0}
spinbox .connect.cfg.ad.i2c_addr.s1 -from 8 -to 119 -textvariable omsp_conf(1,cpuaddr) -width 4
pack .connect.cfg.ad.i2c_addr.s1 -side bottom -padx 5 -pady {10 0}
spinbox .connect.cfg.ad.i2c_addr.s0 -from 8 -to 119 -textvariable omsp_conf(0,cpuaddr) -width 4
pack .connect.cfg.ad.i2c_addr.s0 -side bottom -padx 5 -pady {10 0}
label .connect.cfg.ad.i2c_addr.l -text "I2C Address" -anchor w
pack .connect.cfg.ad.i2c_addr.l -side bottom -padx 5 -pady {10 0}
 
frame .connect.cfg.ad.i2c_nr
pack .connect.cfg.ad.i2c_nr -side right -padx 5 -fill y
label .connect.cfg.ad.i2c_nr.l -text "Number of cores" -anchor w
pack .connect.cfg.ad.i2c_nr.l -side top -padx 50 -pady {10 0}
spinbox .connect.cfg.ad.i2c_nr.s -from 1 -to 4 -textvariable omsp_nr -state readonly -width 4 -command {updateConfiguration}
pack .connect.cfg.ad.i2c_nr.s -side top -padx 50 -pady {10 10}
 
# Update according to default values
updateConfiguration
 
# Connect to CPU & start proxy server
button .connect.start.but -text "Connect to CPU\n and \nStart Proxy Server" -command {startServerGUI}
button .connect.start.but -text "Connect to CPU(s)\n and \nStart Proxy Server(s)" -command {startServerGUI}
pack .connect.start.but -side right -padx 30
 
 
/openmsp430-minidebug.tcl
23,7 → 23,7
#
#------------------------------------------------------------------------------
#
# File Name: minidebug.tcl
# File Name: openmsp430-minidebug.tcl
#
# Author(s):
# - Olivier Girard, olgirard@gmail.com
36,14 → 36,40
 
###############################################################################
# #
# SOURCE LIBRARIES #
# #
###############################################################################
 
# Get library path
set current_file [info script]
if {[file type $current_file]=="link"} {
set current_file [file readlink $current_file]
}
set lib_path [file dirname $current_file]/../lib/tcl-lib
 
# Source library
source $lib_path/dbg_functions.tcl
source $lib_path/dbg_utils.tcl
source $lib_path/combobox.tcl
package require combobox 2.3
catch {namespace import combobox::*}
 
 
###############################################################################
# #
# GLOBAL VARIABLES #
# #
###############################################################################
 
global serial_baudrate
global serial_device
global serial_status
global CpuNr
 
global omsp_conf
global omsp_info
 
global omsp_nr
 
global current_file_name
global connection_status
global cpu_status
global reg
global mem
51,9 → 77,25
global sr
global codeSelect
global binFileType
global binFileName
global pmemIHEX
global isPmemRead
global brkpt
global color
 
# Initialize to default values
set CpuNr 0
set omsp_nr 1
set omsp_conf(interface) uart_generic
#set omsp_nr 4
#set omsp_conf(interface) i2c_usb-iss
set omsp_conf(device) [lindex [utils::uart_port_list] end]
set omsp_conf(baudrate) [lindex [GetAllowedSpeeds] 1]
set omsp_conf(0,cpuaddr) 50
set omsp_conf(1,cpuaddr) 51
set omsp_conf(2,cpuaddr) 52
set omsp_conf(3,cpuaddr) 53
 
# Color definitions
set color(PC) "\#c1ffc1"
set color(Brk0_active) "\#ba55d3"
64,8 → 106,13
set color(Brk2_disabled) "\#ffffe0"
 
# Initializations
set codeSelect 2
set serial_status 0
set codeSelect 2
set binFileType ""
set binFileName ""
set pmemIHEX ""
set mem_sizes ""
set isPmemRead 0
set connection_status 0
set cpu_status 1
for {set i 0} {$i<3} {incr i} {
set brkpt(addr_$i) 0x0000
77,27 → 124,11
set mem(address_$i) [format "0x%04x" [expr 0x0200+$i*2]]
set mem(data_$i) 0x0000
}
 
###############################################################################
# #
# SOURCE LIBRARIES #
# #
###############################################################################
 
# Get library path
set current_file [info script]
if {[file type $current_file]=="link"} {
set current_file [file readlink $current_file]
for {set i 0} {$i<3} {incr i} {
set backup($i,current_file_name) ""
}
set lib_path [file dirname $current_file]/../lib/tcl-lib
 
# Source library
source $lib_path/dbg_functions.tcl
source $lib_path/combobox.tcl
package require combobox 2.3
catch {namespace import combobox::*}
 
 
###############################################################################
# #
# FUNCTIONS #
105,112 → 136,137
###############################################################################
 
proc connect_openMSP430 {} {
global serial_status
global connection_status
global reg
global mem
global brkpt
global mem_sizes
global color
global omsp_conf
global omsp_info
global omsp_nr
global CpuNr
 
set serial_status [GetDevice]
set connection_status [GetDevice $CpuNr]
 
if {$serial_status} {
set mem_sizes [GetCPU_ID_SIZE]
if {$connection_status} {
set mem_sizes [GetCPU_ID_SIZE $CpuNr]
 
if {[lindex $mem_sizes 0]==-1 | [lindex $mem_sizes 1]==-1} {
.ctrl.connect.info.l1.con configure -text "Connection problem" -fg red
if {[lindex $mem_sizes 0]==-1 | [lindex $mem_sizes 1]==-1 | [lindex $mem_sizes 2]==-1} {
.ctrl.connect.info.l1.con configure -text "Connection problem" -fg red
 
} else {
} else {
# Update Core selection section
regexp {(.+)_(.+)} $omsp_conf(interface) whole_match interface adapter
set interface [string toupper $interface]
if {$interface=="I2C"} {
if {$omsp_nr>1} {
.menu.cpusel configure -state normal
.menu.cpu0 configure -state normal
.menu.cpu1 configure -state normal
}
if {$omsp_nr>2} {.menu.cpu2 configure -state normal}
if {$omsp_nr>3} {.menu.cpu3 configure -state normal}
}
 
# Disable connection section
.ctrl.connect.serial.p1 configure -state disabled
.ctrl.connect.serial.p2 configure -state disabled
.ctrl.connect.serial.connect configure -state disabled
if {$omsp_info(alias)==""} {
.ctrl.connect.info.l1.con configure -text "Connected" -fg "\#00ae00"
} else {
.ctrl.connect.info.l1.con configure -text "Connected to $omsp_info(alias)" -fg "\#00ae00"
}
.ctrl.connect.info.l1.more configure -state normal
# Disable connection section
.ctrl.connect.serial.p1 configure -state disabled
.ctrl.connect.serial.p2 configure -state disabled
.ctrl.connect.serial.connect configure -state disabled
 
# Activate ELF file section
.ctrl.load.ft.l configure -state normal
.ctrl.load.ft.file configure -state normal
.ctrl.load.ft.browse configure -state normal
.ctrl.load.fb.read configure -state normal
.ctrl.load.fb.l configure -state normal
if {$omsp_info($CpuNr,alias)==""} {
.ctrl.connect.info.l1.con configure -text "Connected" -fg "\#00ae00"
} else {
.ctrl.connect.info.l1.con configure -text "Connected to $omsp_info($CpuNr,alias)" -fg "\#00ae00"
}
.ctrl.connect.info.l1.more configure -state normal
 
# Activate CPU control section
.ctrl.cpu.cpu.l1 configure -state normal
.ctrl.cpu.cpu.reset configure -state normal
.ctrl.cpu.cpu.run configure -state normal
.ctrl.cpu.cpu.l2 configure -state normal
.ctrl.cpu.cpu.l3 configure -state normal
if {[IsHalted]} {
.ctrl.cpu.cpu.step configure -state normal
.ctrl.cpu.cpu.run configure -text "Run"
.ctrl.cpu.cpu.l3 configure -text "Stopped" -fg "\#cdad00"
set cpu_status 0
} else {
.ctrl.cpu.cpu.step configure -state disabled
.ctrl.cpu.cpu.run configure -text "Stop"
.ctrl.cpu.cpu.l3 configure -text "Running" -fg "\#00ae00"
set cpu_status 1
}
# Activate ELF file section
.ctrl.load.ft.l configure -state normal
.ctrl.load.ft.file configure -state normal
.ctrl.load.ft.browse configure -state normal
.ctrl.load.fb.load configure -state normal
.ctrl.load.fb.open configure -state normal
.ctrl.load.fb.readpmem configure -state normal
.ctrl.load.info.t configure -state normal
.ctrl.load.info.l configure -state normal
 
# Activate CPU Breakpoints section
.ctrl.cpu.brkpt.l1 configure -state normal
for {set i 0} {$i<3} {incr i} {
set brkpt(addr_$i) [format "0x%04x" [expr 0x10000-[lindex $mem_sizes 0]]]
.ctrl.cpu.brkpt.addr$i configure -state normal
.ctrl.cpu.brkpt.addr$i configure -bg $color(Brk$i\_disabled)
.ctrl.cpu.brkpt.addr$i configure -readonlybackground $color(Brk$i\_active)
.ctrl.cpu.brkpt.chk$i configure -state normal
}
# Activate CPU control section
.ctrl.cpu.cpu.l1 configure -state normal
.ctrl.cpu.cpu.reset configure -state normal
.ctrl.cpu.cpu.run configure -state normal
.ctrl.cpu.cpu.l2 configure -state normal
.ctrl.cpu.cpu.l3 configure -state normal
if {[IsHalted $CpuNr]} {
.ctrl.cpu.cpu.step configure -state normal
.ctrl.cpu.cpu.run configure -text "Run"
.ctrl.cpu.cpu.l3 configure -text "Stopped" -fg "\#cdad00"
set cpu_status 0
} else {
.ctrl.cpu.cpu.step configure -state disabled
.ctrl.cpu.cpu.run configure -text "Stop"
.ctrl.cpu.cpu.l3 configure -text "Running" -fg "\#00ae00"
set cpu_status 1
}
 
# Activate CPU status register section
.ctrl.cpu.reg_stat.l1 configure -state normal
.ctrl.cpu.reg_stat.v configure -state normal
.ctrl.cpu.reg_stat.scg1 configure -state normal
.ctrl.cpu.reg_stat.oscoff configure -state normal
.ctrl.cpu.reg_stat.cpuoff configure -state normal
.ctrl.cpu.reg_stat.gie configure -state normal
.ctrl.cpu.reg_stat.n configure -state normal
.ctrl.cpu.reg_stat.z configure -state normal
.ctrl.cpu.reg_stat.c configure -state normal
# Activate CPU Breakpoints section
.ctrl.cpu.brkpt.l1 configure -state normal
for {set i 0} {$i<3} {incr i} {
set brkpt(addr_$i) [format "0x%04x" [expr 0x10000-[lindex $mem_sizes 0]]]
.ctrl.cpu.brkpt.addr$i configure -state normal
.ctrl.cpu.brkpt.addr$i configure -bg $color(Brk$i\_disabled)
.ctrl.cpu.brkpt.addr$i configure -readonlybackground $color(Brk$i\_active)
.ctrl.cpu.brkpt.chk$i configure -state normal
}
 
# Activate CPU registers and memory section
.ctrl.cpu.reg_mem.reg.title.e configure -state normal
.ctrl.cpu.reg_mem.mem.title.l configure -state normal
.ctrl.cpu.reg_mem.mem.title.e configure -state normal
.ctrl.cpu.reg_mem.reg.refresh configure -state normal
.ctrl.cpu.reg_mem.mem.refresh configure -state normal
for {set i 0} {$i<16} {incr i} {
.ctrl.cpu.reg_mem.reg.f$i.l$i configure -state normal
.ctrl.cpu.reg_mem.reg.f$i.e$i configure -state normal
.ctrl.cpu.reg_mem.mem.f$i.addr_e$i configure -state normal
.ctrl.cpu.reg_mem.mem.f$i.data_e$i configure -state normal
}
.ctrl.cpu.reg_mem.reg.f0.e0 configure -bg $color(PC)
refreshReg
refreshMem
# Activate CPU status register section
.ctrl.cpu.reg_stat.l1 configure -state normal
.ctrl.cpu.reg_stat.v configure -state normal
.ctrl.cpu.reg_stat.scg1 configure -state normal
.ctrl.cpu.reg_stat.oscoff configure -state normal
.ctrl.cpu.reg_stat.cpuoff configure -state normal
.ctrl.cpu.reg_stat.gie configure -state normal
.ctrl.cpu.reg_stat.n configure -state normal
.ctrl.cpu.reg_stat.z configure -state normal
.ctrl.cpu.reg_stat.c configure -state normal
 
# Activate Load TCL script section
.ctrl.tclscript.ft.l configure -state normal
.ctrl.tclscript.ft.file configure -state normal
.ctrl.tclscript.ft.browse configure -state normal
.ctrl.tclscript.fb.read configure -state normal
# Activate the code debugger section
.code.rb.txt configure -state normal
.code.rb.none configure -state normal
.code.rb.asm configure -state normal
.code.rb.mix configure -state normal
}
# Activate CPU registers and memory section
.ctrl.cpu.reg_mem.reg.title.e configure -state normal
.ctrl.cpu.reg_mem.mem.title.l configure -state normal
.ctrl.cpu.reg_mem.mem.title.e configure -state normal
.ctrl.cpu.reg_mem.reg.refresh configure -state normal
.ctrl.cpu.reg_mem.mem.refresh configure -state normal
for {set i 0} {$i<16} {incr i} {
.ctrl.cpu.reg_mem.reg.f$i.l$i configure -state normal
.ctrl.cpu.reg_mem.reg.f$i.e$i configure -state normal
.ctrl.cpu.reg_mem.mem.f$i.addr_e$i configure -state normal
.ctrl.cpu.reg_mem.mem.f$i.data_e$i configure -state normal
}
.ctrl.cpu.reg_mem.reg.f0.e0 configure -bg $color(PC)
refreshReg
refreshMem
 
# Activate Load TCL script section
.ctrl.tclscript.ft.l configure -state normal
.ctrl.tclscript.ft.file configure -state normal
.ctrl.tclscript.ft.browse configure -state normal
.ctrl.tclscript.fb.read configure -state normal
# Activate the code debugger section
.code.rb.txt configure -state normal
.code.rb.none configure -state normal
.code.rb.asm configure -state normal
.code.rb.mix configure -state normal
 
# Initial context save for all CPUs
saveContext 0
saveContext 1
saveContext 2
saveContext 3
}
 
} else {
.ctrl.connect.info.l1.con configure -text "Connection problem" -fg red
.ctrl.connect.info.l1.con configure -text "Connection problem" -fg red
}
}
 
217,22 → 273,23
proc displayMore { } {
 
global omsp_info
global CpuNr
 
# Destroy windows if already existing
if {[lsearch -exact [winfo children .] .omsp_extra_info]!=-1} {
destroy .omsp_extra_info
destroy .omsp_extra_info
}
 
# Create master window
toplevel .omsp_extra_info
wm title .omsp_extra_info "openMSP430 extra info"
wm geometry .omsp_extra_info +380+200
toplevel .omsp_extra_info
wm title .omsp_extra_info "openMSP430 extra info"
wm geometry .omsp_extra_info +380+200
wm resizable .omsp_extra_info 0 0
 
# Title
set title "openMSP430"
if {$omsp_info(alias)!=""} {
set title $omsp_info(alias)
if {$omsp_info($CpuNr,alias)!=""} {
set title $omsp_info($CpuNr,alias)
}
label .omsp_extra_info.title -text "$title" -anchor center -fg "\#00ae00" -font {-weight bold -size 16}
pack .omsp_extra_info.title -side top -padx {20 20} -pady {20 10}
253,46 → 310,46
# Fill the text widget will configuration info
.omsp_extra_info.extra.text tag configure bold -font {-family TkFixedFont -weight bold}
.omsp_extra_info.extra.text insert end "Configuration\n\n" bold
.omsp_extra_info.extra.text insert end [format "CPU Version : %5s\n" $omsp_info(cpu_ver)]
.omsp_extra_info.extra.text insert end [format "User Version : %5s\n" $omsp_info(user_ver)]
if {$omsp_info(cpu_ver)==1} {
.omsp_extra_info.extra.text insert end [format "CPU Version : %5s\n" $omsp_info($CpuNr,cpu_ver)]
.omsp_extra_info.extra.text insert end [format "User Version : %5s\n" $omsp_info($CpuNr,user_ver)]
if {$omsp_info($CpuNr,cpu_ver)==1} {
.omsp_extra_info.extra.text insert end [format "Implementation : %5s\n" --]
} elseif {$omsp_info(asic)==0} {
} elseif {$omsp_info($CpuNr,asic)==0} {
.omsp_extra_info.extra.text insert end [format "Implementation : %5s\n" FPGA]
} elseif {$omsp_info(asic)==1} {
} elseif {$omsp_info($CpuNr,asic)==1} {
.omsp_extra_info.extra.text insert end [format "Implementation : %5s\n" ASIC]
}
if {$omsp_info(mpy)==1} {
if {$omsp_info($CpuNr,mpy)==1} {
.omsp_extra_info.extra.text insert end [format "Hardware Multiplier support: %5s\n" Yes]
} elseif {$omsp_info(mpy)==0} {
} elseif {$omsp_info($CpuNr,mpy)==0} {
.omsp_extra_info.extra.text insert end [format "Hardware Multiplier support: %5s\n" No]
} else {
.omsp_extra_info.extra.text insert end [format "Hardware Multiplier support: %5s\n" --]
}
.omsp_extra_info.extra.text insert end [format "Program memory size : %5s B\n" $omsp_info(pmem_size)]
.omsp_extra_info.extra.text insert end [format "Data memory size : %5s B\n" $omsp_info(dmem_size)]
.omsp_extra_info.extra.text insert end [format "Peripheral address space : %5s B\n" $omsp_info(per_size)]
if {$omsp_info(alias)==""} {
.omsp_extra_info.extra.text insert end [format "Program memory size : %5s B\n" $omsp_info($CpuNr,pmem_size)]
.omsp_extra_info.extra.text insert end [format "Data memory size : %5s B\n" $omsp_info($CpuNr,dmem_size)]
.omsp_extra_info.extra.text insert end [format "Peripheral address space : %5s B\n" $omsp_info($CpuNr,per_size)]
if {$omsp_info($CpuNr,alias)==""} {
.omsp_extra_info.extra.text insert end [format "Alias : %5s\n\n\n" None]
} else {
.omsp_extra_info.extra.text insert end [format "Alias : %5s\n\n\n" $omsp_info(alias)]
.omsp_extra_info.extra.text insert end [format "Alias : %5s\n\n\n" $omsp_info($CpuNr,alias)]
}
 
.omsp_extra_info.extra.text insert end "Extra Info\n\n" bold
 
if {$omsp_info(alias)!=""} {
if {$omsp_info($CpuNr,alias)!=""} {
 
set aliasEXTRA [lsort -increasing [array names omsp_info -glob "extra,*"]]
if {[llength $aliasEXTRA]} {
set aliasEXTRA [lsort -increasing [array names omsp_info -glob "$CpuNr,extra,*"]]
if {[llength $aliasEXTRA]} {
 
foreach currentEXTRA $aliasEXTRA {
regexp {^.+,.+,(.+)$} $currentEXTRA whole_match extraATTR
.omsp_extra_info.extra.text insert end [format "%-15s: %s\n" $extraATTR $omsp_info($currentEXTRA)]
}
.omsp_extra_info.extra.text insert end "\n\n"
}
foreach currentEXTRA $aliasEXTRA {
regexp {^.+,.+,(.+)$} $currentEXTRA whole_match extraATTR
.omsp_extra_info.extra.text insert end [format "%-15s: %s\n" $extraATTR $omsp_info($currentEXTRA)]
}
.omsp_extra_info.extra.text insert end "\n\n"
}
} else {
.omsp_extra_info.extra.text insert end "No alias found in 'omsp_alias.xml' file"
.omsp_extra_info.extra.text insert end "No alias found in 'omsp_alias.xml' file"
}
}
 
301,10 → 358,10
.code.text tag remove $tagNameNew 1.0 end
 
switch -exact -- $type {
"0" {.code.text tag add $tagNameNew $line.0 $line.4}
"1" {.code.text tag add $tagNameNew $line.2 $line.4}
"2" {.code.text tag add $tagNameNew $line.3 $line.4}
default {.code.text tag add $tagNameNew $line.4 [expr $line+1].0}
"0" {.code.text tag add $tagNameNew $line.0 $line.4}
"1" {.code.text tag add $tagNameNew $line.2 $line.4}
"2" {.code.text tag add $tagNameNew $line.3 $line.4}
default {.code.text tag add $tagNameNew $line.4 [expr $line+1].0}
}
}
 
315,139 → 372,297
global color
 
if {$codeSelect!=1} {
# Update PC
regsub {0x} $reg(0) {} pc_val
set code_match [.code.text search "$pc_val:" 1.0 end]
set code_line 1
regexp {(\d+).(\d+)} $code_match whole_match code_line code_column
highlightLine $code_line highlightPC highlightPC 3
.code.text see $code_line.0
# Update PC
regsub {0x} $reg(0) {} pc_val
set code_match [.code.text search "$pc_val:" 1.0 end]
set code_line 1
regexp {(\d+).(\d+)} $code_match whole_match code_line code_column
highlightLine $code_line highlightPC highlightPC 3
.code.text see $code_line.0
 
# Some pre-processing
set brkType(0) 0
if {$brkpt(addr_0)==$brkpt(addr_1)} {
set brkType(1) 1
} else {
set brkType(1) 0
}
if {$brkType(1)==1} {
if {$brkpt(addr_1)==$brkpt(addr_2)} {
set brkType(2) 2
} else {
set brkType(2) 0
}
} else {
if {$brkpt(addr_0)==$brkpt(addr_2)} {
set brkType(2) 1
} else {
if {$brkpt(addr_1)==$brkpt(addr_2)} {
set brkType(2) 1
} else {
set brkType(2) 0
}
}
}
# Some pre-processing
set brkType(0) 0
if {$brkpt(addr_0)==$brkpt(addr_1)} {
set brkType(1) 1
} else {
set brkType(1) 0
}
if {$brkType(1)==1} {
if {$brkpt(addr_1)==$brkpt(addr_2)} {
set brkType(2) 2
} else {
set brkType(2) 0
}
} else {
if {$brkpt(addr_0)==$brkpt(addr_2)} {
set brkType(2) 1
} else {
if {$brkpt(addr_1)==$brkpt(addr_2)} {
set brkType(2) 1
} else {
set brkType(2) 0
}
}
}
 
# Update Breakpoints if required
for {set i 0} {$i<3} {incr i} {
regsub {0x} $brkpt(addr_$i) {} brkpt_val
set code_match [.code.text search "$brkpt_val:" 1.0 end]
set code_line 1
regexp {(\d+).(\d+)} $code_match whole_match code_line code_column
if {$brkpt(en_$i)==1} {
highlightLine $code_line "highlightBRK${i}_ACT" "highlightBRK${i}_DIS" $brkType($i)
} else {
highlightLine $code_line "highlightBRK${i}_DIS" "highlightBRK${i}_ACT" $brkType($i)
}
}
# Update Breakpoints if required
for {set i 0} {$i<3} {incr i} {
regsub {0x} $brkpt(addr_$i) {} brkpt_val
set code_match [.code.text search "$brkpt_val:" 1.0 end]
set code_line 1
regexp {(\d+).(\d+)} $code_match whole_match code_line code_column
if {$brkpt(en_$i)==1} {
highlightLine $code_line "highlightBRK${i}_ACT" "highlightBRK${i}_DIS" $brkType($i)
} else {
highlightLine $code_line "highlightBRK${i}_DIS" "highlightBRK${i}_ACT" $brkType($i)
}
}
 
}
}
 
proc updateCodeView { bin_file_name } {
proc waitForFile {fileName} {
 
# Wait until file is present on the filesystem
set timeout 1000
for {set i 0} {$i <= $timeout} {incr i} {
after 50
if {[file exists $fileName]} {
return 1
}
}
return 0
}
 
proc updateCodeView {} {
global codeSelect
global reg
global binFileType
global binFileName
global pmemIHEX
global brkpt
global isPmemRead
 
set temp_elf_file "[clock clicks].elf"
if {[catch {exec msp430-objcopy -I $binFileType -O elf32-msp430 $bin_file_name $temp_elf_file} debug_info]} {
.ctrl.load.fb.l configure -text "$debug_info" -fg red
return 0
if {($binFileName!="") | ($isPmemRead==1)} {
 
if {$isPmemRead==1} {
 
set currentFileType ihex
set currentFileName "[expr [clock clicks] ^ 0xffffffff].ihex"
 
set fileId [open $currentFileName "w"]
puts -nonewline $fileId $pmemIHEX
close $fileId
if {![waitForFile $currentFileName]} {
.ctrl.load.info.l configure -text "Timeout: error writing temprary IHEX file" -fg red
return 0
}
 
} else {
set currentFileType $binFileType
set currentFileName $binFileName
}
 
set temp_elf_file "[clock clicks].elf"
set temp_ihex_file "[clock clicks].ihex"
if {[catch {exec msp430-objcopy -I $currentFileType -O elf32-msp430 $currentFileName $temp_elf_file} debug_info]} {
.ctrl.load.info.l configure -text "$debug_info" -fg red
return 0
}
if {![waitForFile $temp_elf_file]} {
.ctrl.load.info.l configure -text "Timeout: ELF file conversion problem with \"msp430-objcopy\" executable" -fg red
return 0
}
if {[string eq $currentFileType "ihex"]} {
set dumpOpt "-D"
} else {
set dumpOpt "-d"
}
 
if {$codeSelect==1} {
 
clearBreakpoints
for {set i 0} {$i<3} {incr i} {
set brkpt(en_$i) 0
.ctrl.cpu.brkpt.chk$i configure -state disable
updateBreakpoint $i
}
if {[catch {exec msp430-objcopy -I $currentFileType -O ihex $temp_elf_file $temp_ihex_file} debug_info]} {
.ctrl.load.info.l configure -text "$debug_info" -fg red
return 0
}
if {![waitForFile $temp_ihex_file]} {
.ctrl.load.info.l configure -text "Timeout: IHEX file conversion problem with \"msp430-objcopy\" executable" -fg red
return 0
}
set fp [open $temp_ihex_file r]
set debug_info [read $fp]
close $fp
file delete $temp_ihex_file
 
} elseif {$codeSelect==2} {
for {set i 0} {$i<3} {incr i} {
.ctrl.cpu.brkpt.chk$i configure -state normal
}
if {[catch {exec msp430-objdump $dumpOpt $temp_elf_file} debug_info]} {
.ctrl.load.info.l configure -text "$debug_info" -fg red
return 0
}
} elseif {$codeSelect==3} {
for {set i 0} {$i<3} {incr i} {
.ctrl.cpu.brkpt.chk$i configure -state normal
}
if {[catch {exec msp430-objdump $dumpOpt\S $temp_elf_file} debug_info]} {
.ctrl.load.info.l configure -text "$debug_info" -fg red
return 0
}
}
file delete $temp_elf_file
if {$isPmemRead==1} {
file delet $currentFileName
}
 
.code.text configure -state normal
.code.text delete 1.0 end
.code.text insert end $debug_info
highlightCode
.code.text configure -state disabled
return 1
}
if {[string eq $binFileType "ihex"]} {
set dumpOpt "-D"
} else {
set dumpOpt "-d"
}
}
 
if {$codeSelect==1} {
set debug_info ""
clearBreakpoints
for {set i 0} {$i<3} {incr i} {
set brkpt(en_$i) 0
updateBreakpoint $i
}
proc bin2ihex {startAddr binData } {
 
} elseif {$codeSelect==2} {
if {[catch {exec msp430-objdump $dumpOpt $temp_elf_file} debug_info]} {
.ctrl.load.fb.l configure -text "$debug_info" -fg red
return 0
}
} elseif {$codeSelect==3} {
if {[catch {exec msp430-objdump $dumpOpt\S $temp_elf_file} debug_info]} {
.ctrl.load.fb.l configure -text "$debug_info" -fg red
return 0
}
set full_line_size 16
set full_line_nr [expr [llength $binData] / $full_line_size]
set last_line_size [expr [llength $binData] -($full_line_size*$full_line_nr)]
set line_nr $full_line_nr
if {$last_line_size!=0} {incr line_nr}
 
set ihex ""
 
for {set ii 0} {$ii<$line_nr} {incr ii} {
 
set line_size $full_line_size
if {$ii==$full_line_nr} {
set line_size $last_line_size
}
 
set currentAddr [expr $startAddr+($full_line_size*$ii)]
set chksum $line_size
set chksum [expr $chksum+($currentAddr/256)+($currentAddr&255)]
append ihex ":"
append ihex [format "%02x" $line_size]
append ihex [format "%04x" $currentAddr]
append ihex "00"
for {set jj 0} {$jj<$line_size} {incr jj} {
set byte [lindex $binData [expr ($full_line_size*$ii)+$jj]]
set chksum [expr $chksum + $byte]
append ihex [format "%02x" $byte]
}
append ihex [format "%02x\n" [expr 255 & (0x100 - $chksum)]]
}
file delete $temp_elf_file
append ihex ":00000001FF\n"
set ihex [string toupper $ihex]
return $ihex
}
 
.code.text configure -state normal
.code.text delete 1.0 end
.code.text insert end $debug_info
highlightCode
.code.text configure -state disabled
return 1
proc readPmem {} {
 
global CpuNr
global pmemIHEX
global mem_sizes
global isPmemRead
# Get program memory start address
set startAddr [format "0x%04x" [expr 0x10000-[lindex $mem_sizes 0]]]
 
# Retrieve the program memory content
clearBreakpoints
set binData [ReadMemQuick8 $CpuNr $startAddr [lindex $mem_sizes 0]]
setBreakpoints
.ctrl.load.info.l configure -text "Program memory successfully read" -fg "\#00ae00"
 
# Update buttons
.ctrl.load.fb.load configure -fg "\#000000" -activeforeground "\#000000"
.ctrl.load.fb.open configure -fg "\#000000" -activeforeground "\#000000"
.ctrl.load.fb.readpmem configure -fg "\#909000" -activeforeground "\#909000"
update
 
# Convert the binary content into Intel-HEX format
set pmemIHEX [bin2ihex $startAddr $binData]
# Update debugger view
set isPmemRead 1
updateCodeView
 
}
 
proc loadProgram {bin_file_name} {
proc loadProgram {load} {
global current_file_name
global cpu_status
global reg
global mem
global mem_sizes
global binFileType
global binFileName
global brkpt
global CpuNr
global isPmemRead
global pmemIHEX
global backup
 
# Detect the file format depending on the fil extention
# Check if the file exists
#----------------------------------------
if {![file exists $current_file_name]} {
.ctrl.load.info.l configure -text "Specified file doesn't exists: \"$current_file_name\"" -fg red
return 0
}
 
# Eventually initialite other CPU path
for {set i 0} {$i<4} {incr i} {
if {$backup($i,current_file_name)==""} {
set backup($i,current_file_name) "[file dirname $current_file_name]/"
}
}
 
# Detect the file format depending on the file extention
#--------------------------------------------------------
set binFileType [file extension $bin_file_name]
set binFileType [file extension $current_file_name]
set binFileType [string tolower $binFileType]
regsub {\.} $binFileType {} binFileType
 
if {![string eq $binFileType "ihex"] & ![string eq $binFileType "hex"] & ![string eq $binFileType "elf"]} {
.ctrl.load.fb.l configure -text "[string toupper $binFileType] file format not supported\"" -fg red
return 0
.ctrl.load.info.l configure -text "[string toupper $binFileType] file format not supported\"" -fg red
return 0
}
 
# Check if the file exists
#----------------------------------------
if {![file exists $bin_file_name]} {
.ctrl.load.fb.l configure -text "[string toupper $binFileType] file doesn't exists: \"$bin_file_name\"" -fg red
return 0
}
if {[string eq $binFileType "hex"]} {
set binFileType "ihex"
set binFileType "ihex"
}
if {[string eq $binFileType "elf"]} {
set binFileType "elf32-msp430"
set binFileType "elf32-msp430"
}
 
 
# Create and read debug informations
#----------------------------------------
set binFileName $current_file_name
set isPmemRead 0
updateCodeView
 
updateCodeView $bin_file_name
# Update buttons
if {$load} {
.ctrl.load.fb.load configure -fg "\#909000" -activeforeground "\#909000"
.ctrl.load.fb.open configure -fg "\#000000" -activeforeground "\#000000"
} else {
.ctrl.load.fb.load configure -fg "\#000000" -activeforeground "\#000000"
.ctrl.load.fb.open configure -fg "\#909000" -activeforeground "\#909000"
}
.ctrl.load.fb.readpmem configure -fg "\#000000" -activeforeground "\#000000"
update
 
# Create and read binary executable file
#----------------------------------------
454,23 → 669,16
 
# Generate binary file
set bin_file "[clock clicks].bin"
if {[catch {exec msp430-objcopy -I $binFileType -O binary $bin_file_name $bin_file} errMsg]} {
.ctrl.load.fb.l configure -text "$errMsg" -fg red
return 0
if {[catch {exec msp430-objcopy -I $binFileType -O binary $binFileName $bin_file} errMsg]} {
.ctrl.load.info.l configure -text "$errMsg" -fg red
return 0
}
# Wait until bin file is present on the filesystem
set timeout 100
for {set i 0} {$i <= $timeout} {incr i} {
after 500
if {[file exists $bin_file]} {
break
}
if {![waitForFile $bin_file]} {
.ctrl.load.info.l configure -text "Timeout: ELF to BIN file conversion problem with \"msp430-objcopy\" executable" -fg red
return 0
}
if {$i>=$timeout} {
.ctrl.load.fb.l configure -text "Timeout: ELF to BIN file conversion problem with \"msp430-objcopy\" executable" -fg red
return 0
}
 
# Read file
set fp [open $bin_file r]
488,51 → 696,75
 
# Make sure ELF program size is the same as the available program memory
if {[lindex $mem_sizes 0] != [expr $hex_size/2]} {
.ctrl.load.fb.l configure -text "ERROR: ELF program size ([expr $hex_size/2] B) is different than the available program memory ([lindex $mem_sizes 0] B)" -fg red
return 0
.ctrl.load.info.l configure -text "ERROR: ELF program size ([expr $hex_size/2] B) is different than the available program memory ([lindex $mem_sizes 0] B)" -fg red
return 0
}
 
# Format data
for {set i 0} {$i < $hex_size} {set i [expr $i+4]} {
set hex_msb "[string index $hex_data [expr $i+2]][string index $hex_data [expr $i+3]]"
set hex_lsb "[string index $hex_data [expr $i+0]][string index $hex_data [expr $i+1]]"
lappend DataArray "0x$hex_msb$hex_lsb"
set hex_msb "[string index $hex_data [expr $i+2]][string index $hex_data [expr $i+3]]"
set hex_lsb "[string index $hex_data [expr $i+0]][string index $hex_data [expr $i+1]]"
lappend DataArray "0x$hex_msb$hex_lsb"
}
 
# Load program to openmsp430 target
#-----------------------------------
 
# Reset & Stop CPU
ExecutePOR_Halt
 
# Load Program Memory
# Get program memory start address
set StartAddr [format "0x%04x" [expr 0x10000-$byte_size]]
.ctrl.load.fb.l configure -text "Load..." -fg "\#cdad00"
update
WriteMemQuick $StartAddr $DataArray
 
# Clear active breakpoints
clearBreakpoints
 
if {$load==1} {
 
# Reset & Stop CPU
ExecutePOR_Halt $CpuNr
 
# Load Program Memory
.ctrl.load.info.l configure -text "Load..." -fg "\#cdad00"
update
WriteMemQuick $CpuNr $StartAddr $DataArray
}
 
# Verify program memory of the openmsp430 target
#------------------------------------------------
 
# Check Data
.ctrl.load.fb.l configure -text "Verify..." -fg "\#cdad00"
.ctrl.load.info.l configure -text "Verify..." -fg "\#cdad00"
update
if {[VerifyMem $StartAddr $DataArray 1]} {
.ctrl.load.fb.l configure -text "Done" -fg "\#00ae00"
} else {
.ctrl.load.fb.l configure -text "ERROR" -fg red
if {[VerifyMem $CpuNr $StartAddr $DataArray 1]} {
if {$load==1} {
.ctrl.load.info.l configure -text "Binary file successfully loaded" -fg "\#00ae00"
} else {
.ctrl.load.info.l configure -text "Binary file successfully opened" -fg "\#00ae00"
setBreakpoints
}
set pmemIHEX ""
} else {
if {$load==1} {
.ctrl.load.info.l configure -text "ERROR while loading the firmware " -fg red
} else {
.ctrl.load.info.l configure -text "ERROR: Specified binary file doesn't match the program memory content" -fg red
setBreakpoints
}
}
update
 
# Re-initialize breakpoints
for {set i 0} {$i<3} {incr i} {
.ctrl.cpu.brkpt.addr$i configure -state normal
set brkpt(en_$i) 0
if {$load==1} {
# Re-initialize breakpoints
for {set i 0} {$i<3} {incr i} {
.ctrl.cpu.brkpt.addr$i configure -state normal
set brkpt(en_$i) 0
}
 
# Reset & Stop CPU
ExecutePOR_Halt $CpuNr
.ctrl.cpu.cpu.step configure -state normal
.ctrl.cpu.cpu.run configure -text "Run"
.ctrl.cpu.cpu.l3 configure -text "Stopped" -fg "\#cdad00"
set cpu_status 0
}
 
# Reset & Stop CPU
ExecutePOR_Halt
.ctrl.cpu.cpu.step configure -state normal
.ctrl.cpu.cpu.run configure -text "Run"
.ctrl.cpu.cpu.l3 configure -text "Stopped" -fg "\#cdad00"
set cpu_status 0
refreshReg
refreshMem
}
541,22 → 773,23
global cpu_status
global reg
global mem
global CpuNr
 
if {$cpu_status} {
HaltCPU
.ctrl.cpu.cpu.step configure -state normal
.ctrl.cpu.cpu.run configure -text "Run"
.ctrl.cpu.cpu.l3 configure -text "Stopped" -fg "\#cdad00"
set cpu_status 0
HaltCPU $CpuNr
.ctrl.cpu.cpu.step configure -state normal
.ctrl.cpu.cpu.run configure -text "Run"
.ctrl.cpu.cpu.l3 configure -text "Stopped" -fg "\#cdad00"
set cpu_status 0
} else {
clearBreakpoints
StepCPU
setBreakpoints
ReleaseCPU
.ctrl.cpu.cpu.step configure -state disabled
.ctrl.cpu.cpu.run configure -text "Stop"
.ctrl.cpu.cpu.l3 configure -text "Running" -fg "\#00ae00"
set cpu_status 1
clearBreakpoints
StepCPU $CpuNr
setBreakpoints
ReleaseCPU $CpuNr
.ctrl.cpu.cpu.step configure -state disabled
.ctrl.cpu.cpu.run configure -text "Stop"
.ctrl.cpu.cpu.l3 configure -text "Running" -fg "\#00ae00"
set cpu_status 1
}
refreshReg
refreshMem
566,11 → 799,12
global cpu_status
global reg
global mem
global CpuNr
 
if {$cpu_status} {
ExecutePOR
ExecutePOR $CpuNr
} else {
ExecutePOR_Halt
ExecutePOR_Halt $CpuNr
}
refreshReg
refreshMem
580,11 → 814,12
global cpu_status
global reg
global mem
global CpuNr
 
if {$cpu_status==0} {
clearBreakpoints
StepCPU
setBreakpoints
clearBreakpoints
StepCPU $CpuNr
setBreakpoints
}
refreshReg
refreshMem
603,7 → 838,7
($sr(gie) * 0x0008) | \
($sr(n) * 0x0004) | \
($sr(z) * 0x0002) | \
($sr(c) * 0x0001)]
($sr(c) * 0x0001)]
 
set reg(2) [format "0x%04x" $tmp_reg]
 
615,11 → 850,12
global reg
global mem
global sr
global CpuNr
 
# Read register values
set new_vals [ReadRegAll]
set new_vals [ReadRegAll $CpuNr]
for {set i 0} {$i<16} {incr i} {
set reg($i) [lindex $new_vals $i]
set reg($i) [lindex $new_vals $i]
}
set sr(c) [expr $reg(2) & 0x0001]
set sr(z) [expr $reg(2) & 0x0002]
637,8 → 873,9
proc write2Reg {reg_num} {
global reg
global mem
global CpuNr
 
WriteReg $reg_num $reg($reg_num)
WriteReg $CpuNr $reg_num $reg($reg_num)
refreshReg
refreshMem
}
646,17 → 883,18
proc refreshMem {} {
global reg
global mem
global CpuNr
 
for {set i 0} {$i<16} {incr i} {
# Check if address lay in 16 or 8 bit space
if {[expr $mem(address_$i)]>=[expr 0x100]} {
set Format 0
} else {
set Format 1
}
# Check if address lay in 16 or 8 bit space
if {[expr $mem(address_$i)]>=[expr 0x100]} {
set Format 0
} else {
set Format 1
}
 
# Read data
set mem(data_$i) [ReadMem $Format $mem(address_$i)]
# Read data
set mem(data_$i) [ReadMem $CpuNr $Format $mem(address_$i)]
}
}
 
663,15 → 901,16
proc write2Mem {mem_num} {
global reg
global mem
global CpuNr
 
# Check if address lay in 16 or 8 bit space
if {[expr $mem(address_$mem_num)]>=[expr 0x100]} {
set Format 0
set Format 0
} else {
set Format 1
set Format 1
}
 
WriteMem $Format $mem(address_$mem_num) $mem(data_$mem_num)
WriteMem $CpuNr $Format $mem(address_$mem_num) $mem(data_$mem_num)
refreshReg
refreshMem
}
679,34 → 918,38
proc updateBreakpoint {brkpt_num} {
global brkpt
global mem_sizes
global CpuNr
 
# Set the breakpoint
if {$brkpt(en_$brkpt_num)==1} {
# Make sure the specified address is an opcode
regsub {0x} $brkpt(addr_$brkpt_num) {} brkpt_val
set code_match [.code.text search "$brkpt_val:" 1.0 end]
if {![string length $code_match]} {
.ctrl.cpu.brkpt.addr$brkpt_num configure -state normal
set brkpt(en_$brkpt_num) 0
# Make sure the specified address is an opcode
regsub {0x} $brkpt(addr_$brkpt_num) {} brkpt_val
set code_match [.code.text search "$brkpt_val:" 1.0 end]
if {![string length $code_match]} {
.ctrl.cpu.brkpt.addr$brkpt_num configure -state normal
set brkpt(en_$brkpt_num) 0
 
} else {
set brkpt(data_$brkpt_num) [ReadMem 0 $brkpt(addr_$brkpt_num)]
# Only set a breakpoint if there is not already one there :-P
if {$brkpt(data_$brkpt_num)=="0x4343"} {
.ctrl.cpu.brkpt.addr$brkpt_num configure -state normal
set brkpt(en_$brkpt_num) 0
} else {
.ctrl.cpu.brkpt.addr$brkpt_num configure -state readonly
WriteMem 0 $brkpt(addr_$brkpt_num) 0x4343
}
}
} else {
set brkpt(data_$brkpt_num) [ReadMem $CpuNr 0 $brkpt(addr_$brkpt_num)]
# Only set a breakpoint if there is not already one there :-P
if {$brkpt(data_$brkpt_num)=="0x4343"} {
.ctrl.cpu.brkpt.addr$brkpt_num configure -state normal
set brkpt(en_$brkpt_num) 0
} else {
.ctrl.cpu.brkpt.addr$brkpt_num configure -state readonly
WriteMem $CpuNr 0 $brkpt(addr_$brkpt_num) 0x4343
}
}
 
# Clear the breakpoint
} else {
.ctrl.cpu.brkpt.addr$brkpt_num configure -state normal
WriteMem 0 $brkpt(addr_$brkpt_num) $brkpt(data_$brkpt_num)
.ctrl.cpu.brkpt.addr$brkpt_num configure -state normal
set opcode [ReadMem $CpuNr 0 $brkpt(addr_$brkpt_num)]
if {$opcode=="0x4343"} {
WriteMem $CpuNr 0 $brkpt(addr_$brkpt_num) $brkpt(data_$brkpt_num)
}
}
 
highlightCode
713,13 → 956,17
}
 
proc clearBreakpoints {} {
global connection_status
global brkpt
global mem_sizes
global CpuNr
 
for {set i 0} {$i<3} {incr i} {
if {$brkpt(en_$i)==1} {
WriteMem 0 $brkpt(addr_$i) $brkpt(data_$i)
}
if {$connection_status} {
for {set i 0} {$i<3} {incr i} {
if {$brkpt(en_$i)==1} {
WriteMem $CpuNr 0 $brkpt(addr_$i) $brkpt(data_$i)
}
}
}
}
 
726,17 → 973,368
proc setBreakpoints {} {
global brkpt
global mem_sizes
global CpuNr
 
for {set i 0} {$i<3} {incr i} {
if {$brkpt(en_$i)==1} {
set brkpt(data_$i) [ReadMem 0 $brkpt(addr_$i)]
WriteMem 0 $brkpt(addr_$i) 0x4343
}
if {$brkpt(en_$i)==1} {
set brkpt(data_$i) [ReadMem $CpuNr 0 $brkpt(addr_$i)]
WriteMem $CpuNr 0 $brkpt(addr_$i) 0x4343
}
}
}
 
proc selectCPU {CpuNr_next} {
 
global CpuNr
 
# Read current font
set font [.menu.cpu1 cget -font]
set family [font actual $font -family];
set size [font actual $font -size];
set slant [font actual $font -slant];
set underline [font actual $font -underline];
set overstrike [font actual $font -overstrike];
 
# Create normal font
set font_normal "-family $family -size $size -weight normal -slant $slant -underline $underline -overstrike $overstrike"
 
# Create bold font
set font_bold "-family $family -size $size -weight bold -slant $slant -underline $underline -overstrike $overstrike"
 
if {$CpuNr_next==0} {
.menu.cpu0 configure -relief sunken -font $font_bold -fg "\#00ae00" -activeforeground "\#00ae00"
.menu.cpu1 configure -relief raised -font $font_normal -fg "\#000000" -activeforeground "\#000000"
.menu.cpu2 configure -relief raised -font $font_normal -fg "\#000000" -activeforeground "\#000000"
.menu.cpu3 configure -relief raised -font $font_normal -fg "\#000000" -activeforeground "\#000000"
 
} elseif {$CpuNr_next==1} {
.menu.cpu0 configure -relief raised -font $font_normal -fg "\#000000" -activeforeground "\#000000"
.menu.cpu1 configure -relief sunken -font $font_bold -fg "\#00ae00" -activeforeground "\#00ae00"
.menu.cpu2 configure -relief raised -font $font_normal -fg "\#000000" -activeforeground "\#000000"
.menu.cpu3 configure -relief raised -font $font_normal -fg "\#000000" -activeforeground "\#000000"
 
} elseif {$CpuNr_next==2} {
.menu.cpu0 configure -relief raised -font $font_normal -fg "\#000000" -activeforeground "\#000000"
.menu.cpu1 configure -relief raised -font $font_normal -fg "\#000000" -activeforeground "\#000000"
.menu.cpu2 configure -relief sunken -font $font_bold -fg "\#00ae00" -activeforeground "\#00ae00"
.menu.cpu3 configure -relief raised -font $font_normal -fg "\#000000" -activeforeground "\#000000"
 
} else {
.menu.cpu0 configure -relief raised -font $font_normal -fg "\#000000" -activeforeground "\#000000"
.menu.cpu1 configure -relief raised -font $font_normal -fg "\#000000" -activeforeground "\#000000"
.menu.cpu2 configure -relief raised -font $font_normal -fg "\#000000" -activeforeground "\#000000"
.menu.cpu3 configure -relief sunken -font $font_bold -fg "\#00ae00" -activeforeground "\#00ae00"
}
 
saveContext $CpuNr
set CpuNr $CpuNr_next
restoreContext $CpuNr
 
return 1
}
 
proc advancedConfiguration {} {
 
global omsp_info
global omsp_conf
global omsp_nr
 
# Initialize temp variables
global temp_nrcore
global temp_if
global temp_adapt
global temp_addr
regexp {(.+)_(.+)} $omsp_conf(interface) whole_match temp_if temp_adapt
set temp_if [string toupper $temp_if]
set temp_adapt [string toupper $temp_adapt]
set temp_nrcore $omsp_nr
set temp_addr(0) $omsp_conf(0,cpuaddr)
set temp_addr(1) $omsp_conf(1,cpuaddr)
set temp_addr(2) $omsp_conf(2,cpuaddr)
set temp_addr(3) $omsp_conf(3,cpuaddr)
 
# Destroy windows if already existing
if {[lsearch -exact [winfo children .] .omsp_adapt_config]!=-1} {
destroy .omsp_adapt_config
}
 
# Create master window
toplevel .omsp_adapt_config
wm title .omsp_adapt_config "Advanced configuration"
wm geometry .omsp_adapt_config +380+200
wm resizable .omsp_adapt_config 0 0
 
# Title
label .omsp_adapt_config.title -text "Advanced configuration" -anchor center -fg "\#ae0000" -font {-weight bold -size 16}
pack .omsp_adapt_config.title -side top -padx {20 20} -pady {20 10}
 
# Create the main configuration area
frame .omsp_adapt_config.main -bd 2
pack .omsp_adapt_config.main -side top -padx 10 -pady 10
 
# Create the ok/cancel area
frame .omsp_adapt_config.ok -bd 2
pack .omsp_adapt_config.ok -side top -padx 10 -pady 10
 
 
# Create the Adapter Menu
frame .omsp_adapt_config.main.adapter -bd 2 -relief ridge
pack .omsp_adapt_config.main.adapter -side left -padx 10 -pady 10 -fill both
 
# Create the I2C Menu
frame .omsp_adapt_config.main.i2c -bd 2 -relief ridge
pack .omsp_adapt_config.main.i2c -side right -padx 10 -pady 10 -fill both
 
 
# Adapter stuff
label .omsp_adapt_config.main.adapter.title -text "Adapter configuration" -anchor center -fg "\#000000" -font {-weight bold -size 12}
pack .omsp_adapt_config.main.adapter.title -side top -padx 10 -pady 10
frame .omsp_adapt_config.main.adapter.ser
pack .omsp_adapt_config.main.adapter.ser -side top -padx 10 -pady 10
 
label .omsp_adapt_config.main.adapter.ser.l -text "Serial Debug Interface:" -anchor center
pack .omsp_adapt_config.main.adapter.ser.l -side left
combobox .omsp_adapt_config.main.adapter.ser.p -textvariable temp_if -editable false -width 10 -command {updateAdvancedConfiguration}
eval .omsp_adapt_config.main.adapter.ser.p list insert end [list "UART" "I2C"]
pack .omsp_adapt_config.main.adapter.ser.p -side right -padx 5
 
frame .omsp_adapt_config.main.adapter.ada
pack .omsp_adapt_config.main.adapter.ada -side top -padx 10 -pady 10 -fill x
 
label .omsp_adapt_config.main.adapter.ada.l -text "Adapter selection:" -anchor w
pack .omsp_adapt_config.main.adapter.ada.l -side left
combobox .omsp_adapt_config.main.adapter.ada.p -textvariable temp_adapt -editable false -width 10
eval .omsp_adapt_config.main.adapter.ada.p list insert end [list "GENERIC"]
pack .omsp_adapt_config.main.adapter.ada.p -side right -padx 5
 
 
# I2C stuff
label .omsp_adapt_config.main.i2c.title -text "I2C configuration" -anchor center -fg "\#000000" -font {-weight bold -size 12}
pack .omsp_adapt_config.main.i2c.title -side top -padx 10 -pady 10
frame .omsp_adapt_config.main.i2c.cpunr
pack .omsp_adapt_config.main.i2c.cpunr -side top -padx 10 -pady 10 -fill x
label .omsp_adapt_config.main.i2c.cpunr.l -text "Number of cores:" -anchor w
pack .omsp_adapt_config.main.i2c.cpunr.l -side left -padx 5
spinbox .omsp_adapt_config.main.i2c.cpunr.s -from 1 -to 4 -textvariable temp_nrcore -state readonly -width 4 -command {updateAdvancedConfiguration}
pack .omsp_adapt_config.main.i2c.cpunr.s -side right -padx 5
 
frame .omsp_adapt_config.main.i2c.cpu0
pack .omsp_adapt_config.main.i2c.cpu0 -side top -padx 10 -pady 10 -fill x
label .omsp_adapt_config.main.i2c.cpu0.l -text "I2C Address (Core 0):" -anchor w
pack .omsp_adapt_config.main.i2c.cpu0.l -side left -padx 5
spinbox .omsp_adapt_config.main.i2c.cpu0.s -from 8 -to 119 -textvariable temp_addr(0) -width 4
pack .omsp_adapt_config.main.i2c.cpu0.s -side right -padx 5
 
frame .omsp_adapt_config.main.i2c.cpu1
pack .omsp_adapt_config.main.i2c.cpu1 -side top -padx 10 -pady 10 -fill x
label .omsp_adapt_config.main.i2c.cpu1.l -text "I2C Address (Core 1):" -anchor w
pack .omsp_adapt_config.main.i2c.cpu1.l -side left -padx 5
spinbox .omsp_adapt_config.main.i2c.cpu1.s -from 8 -to 119 -textvariable temp_addr(1) -width 4
pack .omsp_adapt_config.main.i2c.cpu1.s -side right -padx 5
 
frame .omsp_adapt_config.main.i2c.cpu2
pack .omsp_adapt_config.main.i2c.cpu2 -side top -padx 10 -pady 10 -fill x
label .omsp_adapt_config.main.i2c.cpu2.l -text "I2C Address (Core 2):" -anchor w
pack .omsp_adapt_config.main.i2c.cpu2.l -side left -padx 5
spinbox .omsp_adapt_config.main.i2c.cpu2.s -from 8 -to 119 -textvariable temp_addr(2) -width 4
pack .omsp_adapt_config.main.i2c.cpu2.s -side right -padx 5
 
frame .omsp_adapt_config.main.i2c.cpu3
pack .omsp_adapt_config.main.i2c.cpu3 -side top -padx 10 -pady 10 -fill x
label .omsp_adapt_config.main.i2c.cpu3.l -text "I2C Address (Core 3):" -anchor w
pack .omsp_adapt_config.main.i2c.cpu3.l -side left -padx 5
spinbox .omsp_adapt_config.main.i2c.cpu3.s -from 8 -to 119 -textvariable temp_addr(3) -width 4
pack .omsp_adapt_config.main.i2c.cpu3.s -side right -padx 5
 
 
# Create OK/Cancel button
button .omsp_adapt_config.ok.okay -text "OK" -command {set omsp_conf(interface) [string tolower "${temp_if}_${temp_adapt}"]
set omsp_nr $temp_nrcore;
set omsp_conf(0,cpuaddr) $temp_addr(0);
set omsp_conf(1,cpuaddr) $temp_addr(1);
set omsp_conf(2,cpuaddr) $temp_addr(2);
set omsp_conf(3,cpuaddr) $temp_addr(3);
.ctrl.connect.serial.p2 configure -editable 1;
eval .ctrl.connect.serial.p2 list delete 0 end;
eval .ctrl.connect.serial.p2 list insert end [lindex [GetAllowedSpeeds] 2];
set omsp_conf(baudrate) [lindex [GetAllowedSpeeds] 1];
.ctrl.connect.serial.p2 configure -editable [lindex [GetAllowedSpeeds] 0];
destroy .omsp_adapt_config}
pack .omsp_adapt_config.ok.okay -side bottom -side left -expand true -fill x -padx 5 -pady 10
button .omsp_adapt_config.ok.cancel -text "CANCEL" -command {destroy .omsp_adapt_config}
pack .omsp_adapt_config.ok.cancel -side bottom -side right -expand true -fill x -padx 5 -pady 10
 
updateAdvancedConfiguration
}
 
proc updateAdvancedConfiguration {{w ""} {sel ""}} {
 
global temp_if
global temp_adapt
global temp_nrcore
global connection_status
 
if {$connection_status} {
.omsp_adapt_config.main.adapter.ser.p configure -state disabled
.omsp_adapt_config.main.adapter.ada.p configure -state disabled
.omsp_adapt_config.main.i2c.cpunr.s configure -state disabled
.omsp_adapt_config.main.i2c.cpu0.s configure -state disabled
.omsp_adapt_config.main.i2c.cpu1.s configure -state disabled
.omsp_adapt_config.main.i2c.cpu2.s configure -state disabled
.omsp_adapt_config.main.i2c.cpu3.s configure -state disabled
 
} else {
if {$sel=="UART"} {
eval .omsp_adapt_config.main.adapter.ada.p list delete 0 end
eval .omsp_adapt_config.main.adapter.ada.p list insert end [list "GENERIC"]
set temp_adapt "GENERIC"
 
} elseif {$sel=="I2C"} {
 
eval .omsp_adapt_config.main.adapter.ada.p list delete 0 end
eval .omsp_adapt_config.main.adapter.ada.p list insert end [list "USB-ISS"]
set temp_adapt "USB-ISS"
 
}
 
if {$temp_if=="UART"} {
 
.omsp_adapt_config.main.i2c.cpunr.s configure -state disabled
.omsp_adapt_config.main.i2c.cpu0.s configure -state disabled
.omsp_adapt_config.main.i2c.cpu1.s configure -state disabled
.omsp_adapt_config.main.i2c.cpu2.s configure -state disabled
.omsp_adapt_config.main.i2c.cpu3.s configure -state disabled
 
} elseif {$temp_if=="I2C"} {
 
.omsp_adapt_config.main.i2c.cpunr.s configure -state disabled
# .omsp_adapt_config.main.i2c.cpunr.s configure -state normal
.omsp_adapt_config.main.i2c.cpu0.s configure -state normal
 
if {$temp_nrcore < 2} {.omsp_adapt_config.main.i2c.cpu1.s configure -state disabled
} else {.omsp_adapt_config.main.i2c.cpu1.s configure -state normal}
if {$temp_nrcore < 3} {.omsp_adapt_config.main.i2c.cpu2.s configure -state disabled
} else {.omsp_adapt_config.main.i2c.cpu2.s configure -state normal}
if {$temp_nrcore < 4} {.omsp_adapt_config.main.i2c.cpu3.s configure -state disabled
} else {.omsp_adapt_config.main.i2c.cpu3.s configure -state normal}
 
}
}
}
 
proc saveContext {CpuNr} {
 
global current_file_name
global brkpt
global mem
global mem_sizes
global codeSelect
global isPmemRead
global binFileType
global binFileName
global pmemIHEX
 
global backup
 
set backup($CpuNr,current_file_name) $current_file_name
 
set backup($CpuNr,load_color) [.ctrl.load.fb.load cget -fg]
set backup($CpuNr,open_color) [.ctrl.load.fb.open cget -fg]
set backup($CpuNr,readpmem_color) [.ctrl.load.fb.readpmem cget -fg]
 
set backup($CpuNr,info_text) [.ctrl.load.info.l cget -text]
set backup($CpuNr,info_color) [.ctrl.load.info.l cget -fg]
 
for {set i 0} {$i<3} {incr i} {
set backup($CpuNr,brkpt_addr_$i) $brkpt(addr_$i)
set backup($CpuNr,brkpt_en_$i) $brkpt(en_$i)
set backup($CpuNr,brkpt_readonly_$i) [.ctrl.cpu.brkpt.addr$i cget -state]
}
 
for {set i 0} {$i<16} {incr i} {
set backup($CpuNr,mem_addr_$i) $mem(address_$i)
}
set backup($CpuNr,mem_sizes) $mem_sizes
 
set backup($CpuNr,codeSelect) $codeSelect
set backup($CpuNr,isPmemRead) $isPmemRead
set backup($CpuNr,binFileType) $binFileType
set backup($CpuNr,binFileName) $binFileName
set backup($CpuNr,pmemIHEX) $pmemIHEX
 
return 1
}
 
proc restoreContext {CpuNr} {
 
global current_file_name
global brkpt
global mem
global mem_sizes
global codeSelect
global isPmemRead
global binFileType
global binFileName
global pmemIHEX
global cpu_status
global connection_status
 
global backup
 
set pmemIHEX $backup($CpuNr,pmemIHEX)
set binFileName $backup($CpuNr,binFileName)
set binFileType $backup($CpuNr,binFileType)
set isPmemRead $backup($CpuNr,isPmemRead)
set codeSelect $backup($CpuNr,codeSelect)
for {set i 0} {$i<16} {incr i} {
set mem(address_$i) $backup($CpuNr,mem_addr_$i)
}
set mem_sizes $backup($CpuNr,mem_sizes)
 
for {set i 0} {$i<3} {incr i} {
set brkpt(addr_$i) $backup($CpuNr,brkpt_addr_$i)
set brkpt(en_$i) $backup($CpuNr,brkpt_en_$i)
.ctrl.cpu.brkpt.addr$i configure -state $backup($CpuNr,brkpt_readonly_$i)
}
 
.ctrl.load.info.l configure -text $backup($CpuNr,info_text)
.ctrl.load.info.l configure -fg $backup($CpuNr,info_color)
 
.ctrl.load.fb.load configure -fg $backup($CpuNr,load_color) -activeforeground $backup($CpuNr,load_color)
.ctrl.load.fb.open configure -fg $backup($CpuNr,open_color) -activeforeground $backup($CpuNr,open_color)
.ctrl.load.fb.readpmem configure -fg $backup($CpuNr,readpmem_color) -activeforeground $backup($CpuNr,readpmem_color)
 
set current_file_name $backup($CpuNr,current_file_name)
 
update
 
if {$connection_status} {
if {[IsHalted $CpuNr]} {
.ctrl.cpu.cpu.step configure -state normal
.ctrl.cpu.cpu.run configure -text "Run"
.ctrl.cpu.cpu.l3 configure -text "Stopped" -fg "\#cdad00"
set cpu_status 0
} else {
.ctrl.cpu.cpu.step configure -state disabled
.ctrl.cpu.cpu.run configure -text "Stop"
.ctrl.cpu.cpu.l3 configure -text "Running" -fg "\#00ae00"
set cpu_status 1
}
refreshReg
refreshMem
.code.text configure -state normal
.code.text delete 1.0 end
.code.text configure -state disabled
updateCodeView
}
 
return 1
}
 
###############################################################################
# #
# CREATE GRAPHICAL INTERFACE #
752,61 → 1350,61
 
# Create the Main Menu
frame .menu
pack .menu -side top -padx 10 -pady 10 -fill x
pack .menu -side top -padx 10 -pady 10 -fill x
 
# Create the CPU Control field
frame .ctrl
pack .ctrl -side left -padx {5 0} -pady 10 -fill both
pack .ctrl -side left -padx {5 0} -pady 10 -fill both
 
# Create the Code text field
frame .code
pack .code -side right -padx 5 -pady 10 -fill both -expand true
pack .code -side right -padx 5 -pady 10 -fill both -expand true
frame .code.rb
pack .code.rb -side bottom -padx 10 -pady 10 -fill both
pack .code.rb -side bottom -padx 10 -pady 10 -fill both
 
# Create the connection frame
frame .ctrl.connect -bd 2 -relief ridge ;# solid
pack .ctrl.connect -side top -padx 10 -pady 0 -fill x
frame .ctrl.connect -bd 2 -relief ridge ;# solid
pack .ctrl.connect -side top -padx 10 -pady 0 -fill x
 
# Create the Serial Menu
frame .ctrl.connect.serial
pack .ctrl.connect.serial -side top -padx 10 -pady {10 0} -fill x
pack .ctrl.connect.serial -side top -padx 10 -pady {10 0} -fill x
 
# Create the memory size
frame .ctrl.connect.info
pack .ctrl.connect.info -side top -padx 10 -pady {10 10} -fill x
pack .ctrl.connect.info -side top -padx 10 -pady {10 10} -fill x
 
# Create the Load executable field
frame .ctrl.load -bd 2 -relief ridge ;# solid
pack .ctrl.load -side top -padx 10 -pady {10 10} -fill x
frame .ctrl.load -bd 2 -relief ridge ;# solid
pack .ctrl.load -side top -padx 10 -pady {10 10} -fill x
 
# Create the cpu field
frame .ctrl.cpu -bd 2 -relief ridge ;# solid
pack .ctrl.cpu -side top -padx 10 -pady {0 10} -fill x
frame .ctrl.cpu -bd 2 -relief ridge ;# solid
pack .ctrl.cpu -side top -padx 10 -pady {0 10} -fill x
 
# Create the cpu control field
frame .ctrl.cpu.cpu
pack .ctrl.cpu.cpu -side top -padx 10 -pady {20 10} -fill x
pack .ctrl.cpu.cpu -side top -padx 10 -pady {20 10} -fill x
 
# Create the breakpoint control field
frame .ctrl.cpu.brkpt
pack .ctrl.cpu.brkpt -side top -padx 10 -pady {10 20} -fill x
pack .ctrl.cpu.brkpt -side top -padx 10 -pady {10 20} -fill x
 
# Create the cpu status field
frame .ctrl.cpu.reg_stat
pack .ctrl.cpu.reg_stat -side top -padx 10 -pady {10 10} -fill x
pack .ctrl.cpu.reg_stat -side top -padx 10 -pady {10 10} -fill x
 
# Create the cpu registers/memory fields
frame .ctrl.cpu.reg_mem
pack .ctrl.cpu.reg_mem -side top -padx 10 -pady {5 10} -fill x
pack .ctrl.cpu.reg_mem -side top -padx 10 -pady {5 10} -fill x
frame .ctrl.cpu.reg_mem.reg
pack .ctrl.cpu.reg_mem.reg -side left -padx {10 30} -fill x
pack .ctrl.cpu.reg_mem.reg -side left -padx {10 30} -fill x
frame .ctrl.cpu.reg_mem.mem
pack .ctrl.cpu.reg_mem.mem -side left -padx {30 10} -fill x
pack .ctrl.cpu.reg_mem.mem -side left -padx {30 10} -fill x
 
# Create the TCL script field
frame .ctrl.tclscript -bd 2 -relief ridge ;# solid
pack .ctrl.tclscript -side top -padx 10 -pady {0 20} -fill x
frame .ctrl.tclscript -bd 2 -relief ridge ;# solid
pack .ctrl.tclscript -side top -padx 10 -pady {0 20} -fill x
 
 
####################################
814,43 → 1412,54
####################################
 
# Exit button
button .menu.exit -text "Exit" -command {exit 0}
button .menu.exit -text "Exit" -command {clearBreakpoints; exit 0}
pack .menu.exit -side left
 
# CPU selection buttons
label .menu.cpusel -text "oMSP core Selection:" -anchor w -state disabled
pack .menu.cpusel -side left -padx "100 0"
button .menu.cpu0 -text "Core 0" -command {selectCPU 0} -state disabled
pack .menu.cpu0 -side left -padx 10
button .menu.cpu1 -text "Core 1" -command {selectCPU 1} -state disabled
pack .menu.cpu1 -side left -padx 10
button .menu.cpu2 -text "Core 2" -command {selectCPU 2} -state disabled
pack .menu.cpu2 -side left -padx 10
button .menu.cpu3 -text "Core 3" -command {selectCPU 3} -state disabled
pack .menu.cpu3 -side left -padx 10
 
# openMSP430 label
label .menu.omsp -text "openMSP430 mini debugger" -anchor center -fg "\#6a5acd" -font {-weight bold -size 16}
pack .menu.omsp -side right -padx 20
 
# Serial Port fields
label .ctrl.connect.serial.l1 -text "Serial Port:" -anchor w
label .ctrl.connect.serial.l1 -text "Device Port:" -anchor w
pack .ctrl.connect.serial.l1 -side left
set serial_device [lindex [dbg_list_uart] end]
combobox .ctrl.connect.serial.p1 -textvariable serial_device -editable true
eval .ctrl.connect.serial.p1 list insert end [dbg_list_uart]
combobox .ctrl.connect.serial.p1 -textvariable omsp_conf(device) -width 15 -editable true
eval .ctrl.connect.serial.p1 list insert end [utils::uart_port_list]
pack .ctrl.connect.serial.p1 -side left -padx 5
 
label .ctrl.connect.serial.l2 -text " Baudrate:" -anchor w
label .ctrl.connect.serial.l2 -text " Speed:" -anchor w
pack .ctrl.connect.serial.l2 -side left
set serial_baudrate 115200
combobox .ctrl.connect.serial.p2 -textvariable serial_baudrate -editable true
eval .ctrl.connect.serial.p2 list insert end [list 9600 19200 38400 57600 115200 \
230400 460800 500000 576000 921600 \
1000000 1152000 2000000]
combobox .ctrl.connect.serial.p2 -textvariable omsp_conf(baudrate) -width 14 -editable [lindex [GetAllowedSpeeds] 0]
eval .ctrl.connect.serial.p2 list insert end [lindex [GetAllowedSpeeds] 2]
pack .ctrl.connect.serial.p2 -side left -padx 5
 
button .ctrl.connect.serial.connect -text "Connect" -width 9 -command {connect_openMSP430}
pack .ctrl.connect.serial.connect -side right -padx 5
 
button .ctrl.connect.serial.extra -text "Advanced..." -width 10 -command {advancedConfiguration}
pack .ctrl.connect.serial.extra -side left -padx 10
 
# CPU status & info
frame .ctrl.connect.info.l1
pack .ctrl.connect.info.l1 -side top -padx 0 -pady {0 0} -fill x
frame .ctrl.connect.info.l1
pack .ctrl.connect.info.l1 -side top -padx 0 -pady {0 0} -fill x
 
label .ctrl.connect.info.l1.cpu -text "CPU Info:" -anchor w
pack .ctrl.connect.info.l1.cpu -side left -padx "0 10"
label .ctrl.connect.info.l1.con -text "Disconnected" -anchor w -fg Red
pack .ctrl.connect.info.l1.con -side left
button .ctrl.connect.info.l1.more -text "More..." -width 9 -command {displayMore} -state disabled
pack .ctrl.connect.info.l1.more -side right -padx 5
label .ctrl.connect.info.l1.cpu -text "CPU Info:" -anchor w
pack .ctrl.connect.info.l1.cpu -side left -padx "0 10"
label .ctrl.connect.info.l1.con -text "Disconnected" -anchor w -fg Red
pack .ctrl.connect.info.l1.con -side left
button .ctrl.connect.info.l1.more -text "More..." -width 9 -command {displayMore} -state disabled
pack .ctrl.connect.info.l1.more -side right -padx 5
 
 
# Load ELF file fields
858,16 → 1467,24
pack .ctrl.load.ft -side top -fill x -padx "10 0" -pady "10 0"
label .ctrl.load.ft.l -text "ELF file:" -state disabled
pack .ctrl.load.ft.l -side left -padx "0 10"
entry .ctrl.load.ft.file -width 58 -relief sunken -textvariable bin_file_name -state disabled
entry .ctrl.load.ft.file -width 58 -relief sunken -textvariable current_file_name -state disabled
pack .ctrl.load.ft.file -side left -padx 10
button .ctrl.load.ft.browse -text "Browse" -width 9 -state disabled -command {set bin_file_name [tk_getOpenFile -filetypes {{{ELF/Intel-Hex Files} {.elf .ihex .hex}} {{All Files} *}}]}
button .ctrl.load.ft.browse -text "Browse" -width 9 -state disabled -command {set current_file_name [tk_getOpenFile -filetypes {{{ELF/Intel-Hex Files} {.elf .ihex .hex}} {{All Files} *}}]}
pack .ctrl.load.ft.browse -side right -padx {5 15}
frame .ctrl.load.fb
pack .ctrl.load.fb -side top -fill x -padx "10 0" -pady "5 10"
button .ctrl.load.fb.read -text "Load ELF File !" -state disabled -command {loadProgram $bin_file_name}
pack .ctrl.load.fb.read -side left -padx 5 -fill x
label .ctrl.load.fb.l -text "Not loaded" -anchor w -fg Red -state disabled
pack .ctrl.load.fb.l -side left
pack .ctrl.load.fb -side top -fill x -padx "10 0" -pady "5 5"
button .ctrl.load.fb.load -text "Load ELF File !" -state disabled -command {loadProgram 1}
pack .ctrl.load.fb.load -side left -padx 5 -fill x
button .ctrl.load.fb.open -text "Open ELF File !" -state disabled -command {loadProgram 0}
pack .ctrl.load.fb.open -side left -padx 5 -fill x
button .ctrl.load.fb.readpmem -text "Read Program Memory !" -state disabled -command {readPmem}
pack .ctrl.load.fb.readpmem -side left -padx 5 -fill x
frame .ctrl.load.info
pack .ctrl.load.info -side top -fill x -padx "10 0" -pady "5 10"
label .ctrl.load.info.t -text "Firmware info:" -anchor w -state disabled
pack .ctrl.load.info.t -side left -padx "0 10"
label .ctrl.load.info.l -text "No info available" -anchor w -fg Red -state disabled
pack .ctrl.load.info.l -side left
 
# CPU Control
label .ctrl.cpu.cpu.l1 -text "CPU Control:" -anchor w -state disabled
932,10 → 1549,10
pack .ctrl.cpu.reg_mem.reg.title.e -side left
for {set i 0} {$i<16} {incr i} {
switch $i {
{0} {set reg_label "r0 (pc):"}
{1} {set reg_label "r1 (sp):"}
{2} {set reg_label "r2 (sr):"}
default {set reg_label "r$i:"}
{0} {set reg_label "r0 (pc):"}
{1} {set reg_label "r1 (sp):"}
{2} {set reg_label "r2 (sr):"}
default {set reg_label "r$i:"}
}
frame .ctrl.cpu.reg_mem.reg.f$i
pack .ctrl.cpu.reg_mem.reg.f$i -side top
992,11 → 1609,11
 
label .code.rb.txt -text "Code View:" -anchor w -state disabled
pack .code.rb.txt -side left
radiobutton .code.rb.none -value "1" -text "None" -state disabled -variable codeSelect -command { updateCodeView $bin_file_name }
radiobutton .code.rb.none -value "1" -text "IHEX" -state disabled -variable codeSelect -command {updateCodeView}
pack .code.rb.none -side left
radiobutton .code.rb.asm -value "2" -text "Assembler" -state disabled -variable codeSelect -command { updateCodeView $bin_file_name }
radiobutton .code.rb.asm -value "2" -text "Assembler" -state disabled -variable codeSelect -command {updateCodeView}
pack .code.rb.asm -side left
radiobutton .code.rb.mix -value "3" -text "C & Assembler" -state disabled -variable codeSelect -command { updateCodeView $bin_file_name }
radiobutton .code.rb.mix -value "3" -text "C & Assembler" -state disabled -variable codeSelect -command {updateCodeView}
pack .code.rb.mix -side left
 
 
1022,6 → 1639,7
#######################################
# PERIODICALLY CHECK THE CPU STATUS #
#######################################
selectCPU 0
 
while 1 {
 
1031,17 → 1649,16
vwait refresh_flag
 
# Check CPU status
if {$serial_status} {
if {$cpu_status} {
if {[IsHalted]} {
.ctrl.cpu.cpu.step configure -state normal
.ctrl.cpu.cpu.run configure -text "Run"
.ctrl.cpu.cpu.l3 configure -text "Stopped" -fg "\#cdad00"
set cpu_status 0
refreshReg
refreshMem
}
}
if {$connection_status} {
if {$cpu_status} {
if {[IsHalted $CpuNr]} {
.ctrl.cpu.cpu.step configure -state normal
.ctrl.cpu.cpu.run configure -text "Run"
.ctrl.cpu.cpu.l3 configure -text "Stopped" -fg "\#cdad00"
set cpu_status 0
refreshReg
refreshMem
}
}
}
}
 
/openmsp430-loader.tcl
34,41 → 34,69
# $LastChangedDate$
#------------------------------------------------------------------------------
 
global serial_baudrate
global serial_device
global omsp_conf
global omsp_info
 
###############################################################################
# SOURCE LIBRARIES #
###############################################################################
 
# Get library path
set current_file [info script]
if {[file type $current_file]=="link"} {
set current_file [file readlink $current_file]
}
set lib_path [file dirname $current_file]/../lib/tcl-lib
 
# Source library
source $lib_path/dbg_functions.tcl
source $lib_path/dbg_utils.tcl
 
 
###############################################################################
# PARAMETER CHECK #
###############################################################################
#proc GetAllowedSpeeds
 
proc help {} {
puts ""
puts "USAGE : openmsp430-loader.tcl \[-device <communication device>\] \[-baudrate <communication speed>\] <elf/ihex-file>"
puts "USAGE : openmsp430-loader.tcl \[-device <communication port>\]"
puts " \[-adaptor <adaptor type>\]"
puts " \[-speed <communication speed>\]"
puts " \[-i2c_addr <cpu address>\] <elf/ihex-file>"
puts ""
puts "Examples: openmsp430-loader.tcl -device /dev/ttyUSB0 -baudrate 9600 leds.elf"
puts " openmsp430-loader.tcl -device COM2: -baudrate 38400 ta_uart.ihex"
puts "DEFAULT : <communication port> = /dev/ttyUSB0"
puts " <adaptor type> = uart_generic"
puts " <communication speed> = 115200 (for UART) / I2C_S_100KHZ (for I2C)"
puts " <core address> = 42"
puts ""
puts "EXAMPLES: openmsp430-loader.tcl -device /dev/ttyUSB0 -adaptor uart_generic -speed 9600 leds.elf"
puts " openmsp430-loader.tcl -device COM2: -adaptor i2c_usb-iss -speed I2C_S_100KHZ -i2c_addr 75 ta_uart.ihex"
puts ""
}
 
# Default values
set serial_device /dev/ttyUSB0
set serial_baudrate 115200
set elf_file -1
set bin_file "[clock clicks].bin"
set omsp_conf(interface) uart_generic
set omsp_conf(device) /dev/ttyUSB0
set omsp_conf(baudrate) [lindex [GetAllowedSpeeds] 1]
set omsp_conf(0,cpuaddr) 42
set elf_file -1
set bin_file "[clock clicks].bin"
 
# Parse arguments
for {set i 0} {$i < $argc} {incr i} {
switch -exact -- [lindex $argv $i] {
-device {set serial_device [lindex $argv [expr $i+1]]; incr i}
-baudrate {set serial_baudrate [lindex $argv [expr $i+1]]; incr i}
default {set elf_file [lindex $argv $i]}
-device {set omsp_conf(device) [lindex $argv [expr $i+1]]; incr i}
-adaptor {set omsp_conf(interface) [lindex $argv [expr $i+1]]; incr i}
-speed {set omsp_conf(baudrate) [lindex $argv [expr $i+1]]; incr i}
-i2c_addr {set omsp_conf(0,cpuaddr) [lindex $argv [expr $i+1]]; incr i}
default {set elf_file [lindex $argv $i]}
}
}
 
# Make sure arugments were specified
if {[string eq $elf_file -1]} {
puts "ERROR: ELF/IHEX file isn't specified"
puts "\nERROR: ELF/IHEX file isn't specified"
help
exit 1
}
75,25 → 103,51
 
# Make sure the elf file exists
if {![file exists $elf_file]} {
puts "ERROR: Specified ELF/IHEX file doesn't exist"
puts "\nERROR: Specified ELF/IHEX file doesn't exist"
help
exit 1
}
 
# Make sure the selected adptor is valid
if {![string eq $omsp_conf(interface) "uart_generic"] &
![string eq $omsp_conf(interface) "i2c_usb-iss"]} {
puts "\nERROR: Specified adaptor is not valid (should be \"uart_generic\" or \"i2c_usb-iss\")"
help
exit 1
}
 
###############################################################################
# SOURCE LIBRARIES #
###############################################################################
# Make sure the I2C address is an integer
if {![string is integer $omsp_conf(0,cpuaddr)]} {
puts "\nERROR: Specified I2C address is not an integer"
help
exit 1
}
 
# Get library path
set current_file [info script]
if {[file type $current_file]=="link"} {
set current_file [file readlink $current_file]
# Make sure the I2C address is valid
if {($omsp_conf(0,cpuaddr)<8) | ($omsp_conf(0,cpuaddr)>119)} {
puts "\nERROR: Specified I2C address should lay between 7 and 120"
help
exit 1
}
set lib_path [file dirname $current_file]/../lib/tcl-lib
 
# Source library
source $lib_path/dbg_functions.tcl
# If the selected interface is a UART, make sure the selected speed is an integer
if {[string eq $omsp_conf(interface) "uart_generic"]} {
if {![string is integer $omsp_conf(baudrate)]} {
puts "\nERROR: Specified UART communication speed is not an integer"
help
exit 1
}
} elseif {[string eq $omsp_conf(interface) "i2c_usb-iss"]} {
if {[lsearch [lindex [GetAllowedSpeeds] 2] $omsp_conf(baudrate)]==-1} {
puts "\nERROR: Specified I2C communication speed is not valid."
puts " Allowed values are:"
foreach allowedVal [lindex [GetAllowedSpeeds] 2] {
puts " - $allowedVal"
}
puts ""
exit 1
}
}
 
 
###############################################################################
105,7 → 159,7
set fileType [string tolower $fileType]
regsub {\.} $fileType {} fileType
if {![string eq $fileType "ihex"] & ![string eq $fileType "hex"] & ![string eq $fileType "elf"]} {
puts "ERROR: [string toupper $fileType] file format not supported"
puts "\nERROR: [string toupper $fileType] file format not supported"
return 0
}
if {[string eq $fileType "hex"]} {
126,11 → 180,11
for {set i 0} {$i <= $timeout} {incr i} {
after 500
if {[file exists $bin_file]} {
break
break
}
}
if {$i>=$timeout} {
puts "Timeout: ELF to BIN file conversion problem with \"msp430-objcopy\" executable"
puts "\nTimeout: ELF to BIN file conversion problem with \"msp430-objcopy\" executable"
puts "$errMsg"
exit 1
}
162,23 → 216,27
###############################################################################
 
# Connect to target and stop CPU
puts -nonewline "Connecting with the openMSP430 ($serial_device, $serial_baudrate\ bps)... "
puts ""
puts -nonewline "Connecting with the openMSP430 ($omsp_conf(device), $omsp_conf(baudrate)\ bps)... "
flush stdout
if {![GetDevice]} {
if {![GetDevice 0]} {
puts "failed"
puts "Could not open $serial_device"
puts "Could not open $omsp_conf(device)"
puts "Available serial ports are:"
foreach port [dbg_list_uart] {
foreach port [utils::uart_port_list] {
puts " - $port"
}
if {[string eq $omsp_conf(interface) "i2c_usb-iss"]} {
puts "\nMake sure the specified I2C device address is correct: $omsp_conf(0,cpuaddr)\n"
}
exit 1
}
ExecutePOR_Halt
ExecutePOR_Halt 0
puts "done"
set sizes [GetCPU_ID_SIZE]
set sizes [GetCPU_ID_SIZE 0]
 
if {$omsp_info(alias)!=""} {
puts "Connected: target device identified as $omsp_info(alias)."
if {$omsp_info(0,alias)!=""} {
puts "Connected: target device identified as $omsp_info(0,alias)."
}
puts "Connected: target device has [lindex $sizes 0]B Program Memory and [lindex $sizes 1]B Data Memory"
puts ""
193,17 → 251,19
set StartAddr [format "0x%04x" [expr 0x10000-$byte_size]]
puts -nonewline "Load Program Memory... "
flush stdout
WriteMemQuick $StartAddr $DataArray
WriteMemQuick 0 $StartAddr $DataArray
after 500
puts "done"
 
# Check Data
puts -nonewline "Verify Program Memory... "
flush stdout
if {[VerifyMem $StartAddr $DataArray 1]} {
if {[VerifyMem 0 $StartAddr $DataArray 1]} {
puts "done"
} else {
puts "ERROR"
exit 1
}
 
# Release device
ReleaseDevice 0xfffe
ReleaseDevice 0 0xfffe

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.