jep106: update to revision JEP106BH September 2023
[openocd.git] / src / rtt / tcl.c
blobf949aa1c94d968aa9b434a53068d18d8103c4225
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 /*
4 * Copyright (C) 2019-2020 by Marc Schink <dev@zapb.de>
5 */
7 #ifdef HAVE_CONFIG_H
8 #include "config.h"
9 #endif
11 #include <helper/log.h>
12 #include <target/rtt.h>
14 #include "rtt.h"
16 #define CHANNEL_NAME_SIZE 128
18 COMMAND_HANDLER(handle_rtt_setup_command)
20 struct rtt_source source;
22 if (CMD_ARGC != 3)
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;
34 uint32_t size;
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)
42 return ERROR_FAIL;
44 return ERROR_OK;
47 COMMAND_HANDLER(handle_rtt_start_command)
49 if (CMD_ARGC > 0)
50 return ERROR_COMMAND_SYNTAX_ERROR;
52 if (!rtt_configured()) {
53 command_print(CMD, "RTT is not configured");
54 return ERROR_FAIL;
57 return rtt_start();
60 COMMAND_HANDLER(handle_rtt_stop_command)
62 if (CMD_ARGC > 0)
63 return ERROR_COMMAND_SYNTAX_ERROR;
65 return rtt_stop();
68 COMMAND_HANDLER(handle_rtt_polling_interval_command)
70 if (CMD_ARGC == 0) {
71 int ret;
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");
78 return ret;
81 command_print(CMD, "%u ms", interval);
82 } else if (CMD_ARGC == 1) {
83 int ret;
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");
91 return ret;
93 } else {
94 return ERROR_COMMAND_SYNTAX_ERROR;
97 return ERROR_OK;
100 COMMAND_HANDLER(handle_rtt_channels_command)
102 int ret;
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");
109 return ERROR_FAIL;
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);
125 if (ret != ERROR_OK)
126 return ret;
128 if (!info.size)
129 continue;
131 command_print(CMD, "%u: %s %u %u", i, info.name, info.size,
132 info.flags);
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);
140 if (ret != ERROR_OK)
141 return ret;
143 if (!info.size)
144 continue;
146 command_print(CMD, "%u: %s %u %u", i, info.name, info.size,
147 info.flags);
150 return ERROR_OK;
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;
159 if (CMD_ARGC != 0)
160 return ERROR_COMMAND_SYNTAX_ERROR;
162 if (!rtt_found_cb()) {
163 command_print(CMD, "rtt: Control block not available");
164 return ERROR_FAIL;
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);
176 if (ret != ERROR_OK)
177 return ret;
179 if (!info.size)
180 continue;
182 command_print(CMD,
183 " {\n"
184 " name %s\n"
185 " size 0x%" PRIx32 "\n"
186 " flags 0x%" PRIx32 "\n"
187 " }",
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);
195 if (ret != ERROR_OK)
196 return ret;
198 if (!info.size)
199 continue;
201 command_print(CMD,
202 " {\n"
203 " name %s\n"
204 " size 0x%" PRIx32 "\n"
205 " flags 0x%" PRIx32 "\n"
206 " }",
207 info.name, info.size, info.flags);
210 command_print(CMD, "}");
212 return ERROR_OK;
215 static const struct command_registration rtt_subcommand_handlers[] = {
217 .name = "setup",
218 .handler = handle_rtt_setup_command,
219 .mode = COMMAND_ANY,
220 .help = "setup RTT",
221 .usage = "<address> <size> <ID>"
224 .name = "start",
225 .handler = handle_rtt_start_command,
226 .mode = COMMAND_EXEC,
227 .help = "start RTT",
228 .usage = ""
231 .name = "stop",
232 .handler = handle_rtt_stop_command,
233 .mode = COMMAND_EXEC,
234 .help = "stop RTT",
235 .usage = ""
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]"
245 .name = "channels",
246 .handler = handle_rtt_channels_command,
247 .mode = COMMAND_EXEC,
248 .help = "list available channels",
249 .usage = ""
252 .name = "channellist",
253 .handler = handle_channel_list,
254 .mode = COMMAND_EXEC,
255 .help = "list available channels",
256 .usage = ""
258 COMMAND_REGISTRATION_DONE
261 const struct command_registration rtt_target_command_handlers[] = {
263 .name = "rtt",
264 .mode = COMMAND_EXEC,
265 .help = "RTT target commands",
266 .usage = "",
267 .chain = rtt_subcommand_handlers
269 COMMAND_REGISTRATION_DONE