1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * Copyright (C) 2019-2020 by Marc Schink <dev@zapb.de>
11 #include <helper/log.h>
12 #include <target/rtt.h>
16 #define CHANNEL_NAME_SIZE 128
18 COMMAND_HANDLER(handle_rtt_setup_command
)
20 struct rtt_source source
;
23 return ERROR_COMMAND_SYNTAX_ERROR
;
25 source
.find_cb
= &target_rtt_find_control_block
;
26 source
.read_cb
= &target_rtt_read_control_block
;
27 source
.start
= &target_rtt_start
;
28 source
.stop
= &target_rtt_stop
;
29 source
.read
= &target_rtt_read_callback
;
30 source
.write
= &target_rtt_write_callback
;
31 source
.read_channel_info
= &target_rtt_read_channel_info
;
33 target_addr_t address
;
36 COMMAND_PARSE_NUMBER(target_addr
, CMD_ARGV
[0], address
);
37 COMMAND_PARSE_NUMBER(u32
, CMD_ARGV
[1], size
);
39 rtt_register_source(source
, get_current_target(CMD_CTX
));
41 if (rtt_setup(address
, size
, CMD_ARGV
[2]) != ERROR_OK
)
47 COMMAND_HANDLER(handle_rtt_start_command
)
50 return ERROR_COMMAND_SYNTAX_ERROR
;
52 if (!rtt_configured()) {
53 command_print(CMD
, "RTT is not configured");
60 COMMAND_HANDLER(handle_rtt_stop_command
)
63 return ERROR_COMMAND_SYNTAX_ERROR
;
68 COMMAND_HANDLER(handle_rtt_polling_interval_command
)
72 unsigned int interval
;
74 ret
= rtt_get_polling_interval(&interval
);
76 if (ret
!= ERROR_OK
) {
77 command_print(CMD
, "Failed to get polling interval");
81 command_print(CMD
, "%u ms", interval
);
82 } else if (CMD_ARGC
== 1) {
84 unsigned int interval
;
86 COMMAND_PARSE_NUMBER(uint
, CMD_ARGV
[0], interval
);
87 ret
= rtt_set_polling_interval(interval
);
89 if (ret
!= ERROR_OK
) {
90 command_print(CMD
, "Failed to set polling interval");
94 return ERROR_COMMAND_SYNTAX_ERROR
;
100 COMMAND_HANDLER(handle_rtt_channels_command
)
103 char channel_name
[CHANNEL_NAME_SIZE
];
104 const struct rtt_control
*ctrl
;
105 struct rtt_channel_info info
;
107 if (!rtt_found_cb()) {
108 command_print(CMD
, "rtt: Control block not available");
112 ctrl
= rtt_get_control();
114 command_print(CMD
, "Channels: up=%u, down=%u", ctrl
->num_up_channels
,
115 ctrl
->num_down_channels
);
117 command_print(CMD
, "Up-channels:");
119 info
.name
= channel_name
;
120 info
.name_length
= sizeof(channel_name
);
122 for (unsigned int i
= 0; i
< ctrl
->num_up_channels
; i
++) {
123 ret
= rtt_read_channel_info(i
, RTT_CHANNEL_TYPE_UP
, &info
);
131 command_print(CMD
, "%u: %s %u %u", i
, info
.name
, info
.size
,
135 command_print(CMD
, "Down-channels:");
137 for (unsigned int i
= 0; i
< ctrl
->num_down_channels
; i
++) {
138 ret
= rtt_read_channel_info(i
, RTT_CHANNEL_TYPE_DOWN
, &info
);
146 command_print(CMD
, "%u: %s %u %u", i
, info
.name
, info
.size
,
153 COMMAND_HANDLER(handle_channel_list
)
155 char channel_name
[CHANNEL_NAME_SIZE
];
156 const struct rtt_control
*ctrl
;
157 struct rtt_channel_info info
;
160 return ERROR_COMMAND_SYNTAX_ERROR
;
162 if (!rtt_found_cb()) {
163 command_print(CMD
, "rtt: Control block not available");
167 ctrl
= rtt_get_control();
169 info
.name
= channel_name
;
170 info
.name_length
= sizeof(channel_name
);
172 command_print(CMD
, "{");
174 for (unsigned int i
= 0; i
< ctrl
->num_up_channels
; i
++) {
175 int ret
= rtt_read_channel_info(i
, RTT_CHANNEL_TYPE_UP
, &info
);
185 " size 0x%" PRIx32
"\n"
186 " flags 0x%" PRIx32
"\n"
188 info
.name
, info
.size
, info
.flags
);
191 command_print(CMD
, "}\n{");
193 for (unsigned int i
= 0; i
< ctrl
->num_down_channels
; i
++) {
194 int ret
= rtt_read_channel_info(i
, RTT_CHANNEL_TYPE_DOWN
, &info
);
204 " size 0x%" PRIx32
"\n"
205 " flags 0x%" PRIx32
"\n"
207 info
.name
, info
.size
, info
.flags
);
210 command_print(CMD
, "}");
215 static const struct command_registration rtt_subcommand_handlers
[] = {
218 .handler
= handle_rtt_setup_command
,
221 .usage
= "<address> <size> <ID>"
225 .handler
= handle_rtt_start_command
,
226 .mode
= COMMAND_EXEC
,
232 .handler
= handle_rtt_stop_command
,
233 .mode
= COMMAND_EXEC
,
238 .name
= "polling_interval",
239 .handler
= handle_rtt_polling_interval_command
,
240 .mode
= COMMAND_EXEC
,
241 .help
= "show or set polling interval in ms",
242 .usage
= "[interval]"
246 .handler
= handle_rtt_channels_command
,
247 .mode
= COMMAND_EXEC
,
248 .help
= "list available channels",
252 .name
= "channellist",
253 .handler
= handle_channel_list
,
254 .mode
= COMMAND_EXEC
,
255 .help
= "list available channels",
258 COMMAND_REGISTRATION_DONE
261 const struct command_registration rtt_target_command_handlers
[] = {
264 .mode
= COMMAND_EXEC
,
265 .help
= "RTT target commands",
267 .chain
= rtt_subcommand_handlers
269 COMMAND_REGISTRATION_DONE