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 |