2 * Copyright (C) 2019-2020 by Marc Schink <dev@zapb.de>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #include <helper/log.h>
19 #include <target/rtt.h>
23 #define CHANNEL_NAME_SIZE 128
25 COMMAND_HANDLER(handle_rtt_setup_command
)
27 struct rtt_source source
;
30 return ERROR_COMMAND_SYNTAX_ERROR
;
32 source
.find_cb
= &target_rtt_find_control_block
;
33 source
.read_cb
= &target_rtt_read_control_block
;
34 source
.start
= &target_rtt_start
;
35 source
.stop
= &target_rtt_stop
;
36 source
.read
= &target_rtt_read_callback
;
37 source
.write
= &target_rtt_write_callback
;
38 source
.read_channel_info
= &target_rtt_read_channel_info
;
40 target_addr_t address
;
43 COMMAND_PARSE_NUMBER(target_addr
, CMD_ARGV
[0], address
);
44 COMMAND_PARSE_NUMBER(u32
, CMD_ARGV
[1], size
);
46 rtt_register_source(source
, get_current_target(CMD_CTX
));
48 if (rtt_setup(address
, size
, CMD_ARGV
[2]) != ERROR_OK
)
54 COMMAND_HANDLER(handle_rtt_start_command
)
57 return ERROR_COMMAND_SYNTAX_ERROR
;
59 if (!rtt_configured()) {
60 command_print(CMD
, "RTT is not configured");
67 COMMAND_HANDLER(handle_rtt_stop_command
)
70 return ERROR_COMMAND_SYNTAX_ERROR
;
75 COMMAND_HANDLER(handle_rtt_polling_interval_command
)
79 unsigned int interval
;
81 ret
= rtt_get_polling_interval(&interval
);
83 if (ret
!= ERROR_OK
) {
84 command_print(CMD
, "Failed to get polling interval");
88 command_print(CMD
, "%u ms", interval
);
89 } else if (CMD_ARGC
== 1) {
91 unsigned int interval
;
93 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], interval
);
94 ret
= rtt_set_polling_interval(interval
);
96 if (ret
!= ERROR_OK
) {
97 command_print(CMD
, "Failed to set polling interval");
101 return ERROR_COMMAND_SYNTAX_ERROR
;
107 COMMAND_HANDLER(handle_rtt_channels_command
)
110 char channel_name
[CHANNEL_NAME_SIZE
];
111 const struct rtt_control
*ctrl
;
112 struct rtt_channel_info info
;
114 if (!rtt_found_cb()) {
115 command_print(CMD
, "rtt: Control block not available");
119 ctrl
= rtt_get_control();
121 command_print(CMD
, "Channels: up=%u, down=%u", ctrl
->num_up_channels
,
122 ctrl
->num_down_channels
);
124 command_print(CMD
, "Up-channels:");
126 info
.name
= channel_name
;
127 info
.name_length
= sizeof(channel_name
);
129 for (unsigned int i
= 0; i
< ctrl
->num_up_channels
; i
++) {
130 ret
= rtt_read_channel_info(i
, RTT_CHANNEL_TYPE_UP
, &info
);
138 command_print(CMD
, "%u: %s %u %u", i
, info
.name
, info
.size
,
142 command_print(CMD
, "Down-channels:");
144 for (unsigned int i
= 0; i
< ctrl
->num_down_channels
; i
++) {
145 ret
= rtt_read_channel_info(i
, RTT_CHANNEL_TYPE_DOWN
, &info
);
153 command_print(CMD
, "%u: %s %u %u", i
, info
.name
, info
.size
,
160 static int jim_channel_list(Jim_Interp
*interp
, int argc
,
161 Jim_Obj
* const *argv
)
164 Jim_Obj
*channel_list
;
165 char channel_name
[CHANNEL_NAME_SIZE
];
166 const struct rtt_control
*ctrl
;
167 struct rtt_channel_info info
;
169 if (!rtt_found_cb()) {
170 Jim_SetResultFormatted(interp
, "rtt: Control block not available");
174 ctrl
= rtt_get_control();
176 info
.name
= channel_name
;
177 info
.name_length
= sizeof(channel_name
);
179 list
= Jim_NewListObj(interp
, NULL
, 0);
180 channel_list
= Jim_NewListObj(interp
, NULL
, 0);
182 for (unsigned int i
= 0; i
< ctrl
->num_up_channels
; i
++) {
186 ret
= rtt_read_channel_info(i
, RTT_CHANNEL_TYPE_UP
, &info
);
194 tmp
= Jim_NewListObj(interp
, NULL
, 0);
196 Jim_ListAppendElement(interp
, tmp
, Jim_NewStringObj(interp
,
198 Jim_ListAppendElement(interp
, tmp
, Jim_NewStringObj(interp
,
201 Jim_ListAppendElement(interp
, tmp
, Jim_NewStringObj(interp
,
203 Jim_ListAppendElement(interp
, tmp
, Jim_NewIntObj(interp
,
206 Jim_ListAppendElement(interp
, tmp
, Jim_NewStringObj(interp
,
208 Jim_ListAppendElement(interp
, tmp
, Jim_NewIntObj(interp
,
211 Jim_ListAppendElement(interp
, channel_list
, tmp
);
214 Jim_ListAppendElement(interp
, list
, channel_list
);
216 channel_list
= Jim_NewListObj(interp
, NULL
, 0);
218 for (unsigned int i
= 0; i
< ctrl
->num_down_channels
; i
++) {
222 ret
= rtt_read_channel_info(i
, RTT_CHANNEL_TYPE_DOWN
, &info
);
230 tmp
= Jim_NewListObj(interp
, NULL
, 0);
232 Jim_ListAppendElement(interp
, tmp
, Jim_NewStringObj(interp
,
234 Jim_ListAppendElement(interp
, tmp
, Jim_NewStringObj(interp
,
237 Jim_ListAppendElement(interp
, tmp
, Jim_NewStringObj(interp
,
239 Jim_ListAppendElement(interp
, tmp
, Jim_NewIntObj(interp
,
242 Jim_ListAppendElement(interp
, tmp
, Jim_NewStringObj(interp
,
244 Jim_ListAppendElement(interp
, tmp
, Jim_NewIntObj(interp
,
247 Jim_ListAppendElement(interp
, channel_list
, tmp
);
250 Jim_ListAppendElement(interp
, list
, channel_list
);
251 Jim_SetResult(interp
, list
);
256 static const struct command_registration rtt_subcommand_handlers
[] = {
259 .handler
= handle_rtt_setup_command
,
262 .usage
= "<address> <size> <ID>"
266 .handler
= handle_rtt_start_command
,
267 .mode
= COMMAND_EXEC
,
273 .handler
= handle_rtt_stop_command
,
274 .mode
= COMMAND_EXEC
,
279 .name
= "polling_interval",
280 .handler
= handle_rtt_polling_interval_command
,
281 .mode
= COMMAND_EXEC
,
282 .help
= "show or set polling interval in ms",
283 .usage
= "[interval]"
287 .handler
= handle_rtt_channels_command
,
288 .mode
= COMMAND_EXEC
,
289 .help
= "list available channels",
293 .name
= "channellist",
294 .jim_handler
= jim_channel_list
,
295 .mode
= COMMAND_EXEC
,
296 .help
= "list available channels",
299 COMMAND_REGISTRATION_DONE
302 const struct command_registration rtt_target_command_handlers
[] = {
305 .mode
= COMMAND_EXEC
,
306 .help
= "RTT target commands",
308 .chain
= rtt_subcommand_handlers
310 COMMAND_REGISTRATION_DONE
Linking to existing account procedure
If you already have an account and want to add another login method
you
MUST first sign in with your existing account and
then change URL to read
https://review.openocd.org/login/?link
to get to this page again but this time it'll work for linking. Thank you.
SSH host keys fingerprints
1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=.. |
|+o.. . |
|*.o . . |
|+B . . . |
|Bo. = o S |
|Oo.+ + = |
|oB=.* = . o |
| =+=.+ + E |
|. .=o . o |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)