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 static int jim_channel_list(Jim_Interp *interp, int argc,
154 Jim_Obj * const *argv)
157 Jim_Obj *channel_list;
158 char channel_name[CHANNEL_NAME_SIZE];
159 const struct rtt_control *ctrl;
160 struct rtt_channel_info info;
162 if (!rtt_found_cb()) {
163 Jim_SetResultFormatted(interp, "rtt: Control block not available");
167 ctrl = rtt_get_control();
169 info.name = channel_name;
170 info.name_length = sizeof(channel_name);
172 list = Jim_NewListObj(interp, NULL, 0);
173 channel_list = Jim_NewListObj(interp, NULL, 0);
175 for (unsigned int i = 0; i < ctrl->num_up_channels; i++) {
179 ret = rtt_read_channel_info(i, RTT_CHANNEL_TYPE_UP, &info);
187 tmp = Jim_NewListObj(interp, NULL, 0);
189 Jim_ListAppendElement(interp, tmp, Jim_NewStringObj(interp,
191 Jim_ListAppendElement(interp, tmp, Jim_NewStringObj(interp,
194 Jim_ListAppendElement(interp, tmp, Jim_NewStringObj(interp,
196 Jim_ListAppendElement(interp, tmp, Jim_NewIntObj(interp,
199 Jim_ListAppendElement(interp, tmp, Jim_NewStringObj(interp,
201 Jim_ListAppendElement(interp, tmp, Jim_NewIntObj(interp,
204 Jim_ListAppendElement(interp, channel_list, tmp);
207 Jim_ListAppendElement(interp, list, channel_list);
209 channel_list = Jim_NewListObj(interp, NULL, 0);
211 for (unsigned int i = 0; i < ctrl->num_down_channels; i++) {
215 ret = rtt_read_channel_info(i, RTT_CHANNEL_TYPE_DOWN, &info);
223 tmp = Jim_NewListObj(interp, NULL, 0);
225 Jim_ListAppendElement(interp, tmp, Jim_NewStringObj(interp,
227 Jim_ListAppendElement(interp, tmp, Jim_NewStringObj(interp,
230 Jim_ListAppendElement(interp, tmp, Jim_NewStringObj(interp,
232 Jim_ListAppendElement(interp, tmp, Jim_NewIntObj(interp,
235 Jim_ListAppendElement(interp, tmp, Jim_NewStringObj(interp,
237 Jim_ListAppendElement(interp, tmp, Jim_NewIntObj(interp,
240 Jim_ListAppendElement(interp, channel_list, tmp);
243 Jim_ListAppendElement(interp, list, channel_list);
244 Jim_SetResult(interp, list);
249 static const struct command_registration rtt_subcommand_handlers[] = {
252 .handler = handle_rtt_setup_command,
255 .usage = "<address> <size> <ID>"
259 .handler = handle_rtt_start_command,
260 .mode = COMMAND_EXEC,
266 .handler = handle_rtt_stop_command,
267 .mode = COMMAND_EXEC,
272 .name = "polling_interval",
273 .handler = handle_rtt_polling_interval_command,
274 .mode = COMMAND_EXEC,
275 .help = "show or set polling interval in ms",
276 .usage = "[interval]"
280 .handler = handle_rtt_channels_command,
281 .mode = COMMAND_EXEC,
282 .help = "list available channels",
286 .name = "channellist",
287 .jim_handler = jim_channel_list,
288 .mode = COMMAND_EXEC,
289 .help = "list available channels",
292 COMMAND_REGISTRATION_DONE
295 const struct command_registration rtt_target_command_handlers[] = {
298 .mode = COMMAND_EXEC,
299 .help = "RTT target commands",
301 .chain = rtt_subcommand_handlers
303 COMMAND_REGISTRATION_DONE