-
Notifications
You must be signed in to change notification settings - Fork 5
/
libopenocd.tcl
104 lines (95 loc) · 3.73 KB
/
libopenocd.tcl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#
# SweetAda OpenOCD Tcl library.
#
# Copyright (C) 2020-2024 Gabriele Galeotti
#
# This work is licensed under the terms of the MIT License.
# Please consult the LICENSE.txt file located in the top-level directory.
#
#
# Arguments:
# none
#
# Environment variables:
# none
#
################################################################################
# openocd_rpc_set_socket #
# #
################################################################################
proc openocd_rpc_set_socket {s} {
global openocd_rpc_socket
set openocd_rpc_socket $s
}
################################################################################
# openocd_rpc_get_socket #
# #
################################################################################
proc openocd_rpc_get_socket {} {
global openocd_rpc_socket
return $openocd_rpc_socket
}
################################################################################
# openocd_rpc_disconnect #
# #
################################################################################
proc openocd_rpc_disconnect {} {
set s [openocd_rpc_get_socket]
close $s
}
################################################################################
# openocd_rpc_rx #
# #
# "noecho" disables output of received data messages output. #
################################################################################
proc openocd_rpc_rx {{mode ""}} {
set s [openocd_rpc_get_socket]
while {true} {
set data [read $s 4096]
if {[eof $s]} {
openocd_rpc_disconnect
return ""
}
if {[llength $data] > 0} {
set token [string first \x1A $data]
if {$token ne -1} {
# end of response, print and exit
set outdata [string range $data 0 [expr {$token - 1}]]
if {$mode ne "noecho"} {
puts -nonewline stdout $outdata
}
break
} else {
# print and continue reading
set outdata $data
if {$mode ne "noecho"} {
puts -nonewline stdout $outdata
}
}
}
}
return $outdata
}
################################################################################
# openocd_rpc_tx #
# #
################################################################################
proc openocd_rpc_tx {command} {
set s [openocd_rpc_get_socket]
puts -nonewline $s $command\x1A
}
################################################################################
# openocd_rpc_init #
# #
################################################################################
proc openocd_rpc_init {{server 127.0.0.1} {port 6666}} {
set s [socket $server $port]
openocd_rpc_set_socket $s
fconfigure $s \
-blocking false \
-buffering none \
-encoding binary \
-eofchar {}
fconfigure stdout \
-buffering none
}