FreeCalypso > hg > freecalypso-sw
comparison rvinterf/etm/tmcore.c @ 189:a95d253ef952
fc-tmsh: some basic tmcore commands implemented
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Mon, 25 Nov 2013 03:10:41 +0000 |
parents | 9f4f331ac24d |
children | 405f5b46cdc4 |
comparison
equal
deleted
inserted
replaced
188:9f4f331ac24d | 189:a95d253ef952 |
---|---|
8 #include <string.h> | 8 #include <string.h> |
9 #include <strings.h> | 9 #include <strings.h> |
10 #include <stdlib.h> | 10 #include <stdlib.h> |
11 #include "../pktmux.h" | 11 #include "../pktmux.h" |
12 #include "../limits.h" | 12 #include "../limits.h" |
13 #include "localtypes.h" | |
13 #include "etm.h" | 14 #include "etm.h" |
14 | 15 |
15 extern u_char rvi_msg[]; | 16 extern u_char rvi_msg[]; |
16 extern int rvi_msg_len; | 17 extern int rvi_msg_len; |
17 | 18 |
176 default: | 177 default: |
177 unknown: | 178 unknown: |
178 print_etm_pkt_raw("ETM_CORE resp"); | 179 print_etm_pkt_raw("ETM_CORE resp"); |
179 } | 180 } |
180 } | 181 } |
182 | |
183 void | |
184 cmd_r8(argc, argv) | |
185 char **argv; | |
186 { | |
187 u32 addr; | |
188 int count; | |
189 u_char cmdpkt[10]; | |
190 | |
191 addr = strtoul(argv[1], 0, 16); | |
192 if (argv[2]) | |
193 count = strtoul(argv[2], 0, 0); | |
194 else | |
195 count = 1; | |
196 if (count < 1 || count > 253) { | |
197 printf("error: count argument outside valid range\n"); | |
198 return; | |
199 } | |
200 cmdpkt[1] = ETM_CORE; | |
201 cmdpkt[2] = TMCORE_OPC_MEM; | |
202 cmdpkt[3] = 0x01; | |
203 cmdpkt[4] = count; | |
204 cmdpkt[5] = addr; | |
205 cmdpkt[6] = addr >> 8; | |
206 cmdpkt[7] = addr >> 16; | |
207 cmdpkt[8] = addr >> 24; | |
208 send_etm_cmd(cmdpkt, 8); | |
209 } | |
210 | |
211 void | |
212 cmd_r16(argc, argv) | |
213 char **argv; | |
214 { | |
215 u32 addr; | |
216 int count; | |
217 u_char cmdpkt[10]; | |
218 | |
219 addr = strtoul(argv[1], 0, 16); | |
220 if (argv[2]) | |
221 count = strtoul(argv[2], 0, 0); | |
222 else | |
223 count = 1; | |
224 if (addr & 1) { | |
225 printf("error: address not aligned\n"); | |
226 return; | |
227 } | |
228 if (count < 1 || count > 126) { | |
229 printf("error: count argument outside valid range\n"); | |
230 return; | |
231 } | |
232 cmdpkt[1] = ETM_CORE; | |
233 cmdpkt[2] = TMCORE_OPC_MEM; | |
234 cmdpkt[3] = 0x02; | |
235 cmdpkt[4] = count; | |
236 cmdpkt[5] = addr; | |
237 cmdpkt[6] = addr >> 8; | |
238 cmdpkt[7] = addr >> 16; | |
239 cmdpkt[8] = addr >> 24; | |
240 send_etm_cmd(cmdpkt, 8); | |
241 } | |
242 | |
243 void | |
244 cmd_r32(argc, argv) | |
245 char **argv; | |
246 { | |
247 u32 addr; | |
248 int count; | |
249 u_char cmdpkt[10]; | |
250 | |
251 addr = strtoul(argv[1], 0, 16); | |
252 if (argv[2]) | |
253 count = strtoul(argv[2], 0, 0); | |
254 else | |
255 count = 1; | |
256 if (addr & 3) { | |
257 printf("error: address not aligned\n"); | |
258 return; | |
259 } | |
260 if (count < 1 || count > 63) { | |
261 printf("error: count argument outside valid range\n"); | |
262 return; | |
263 } | |
264 cmdpkt[1] = ETM_CORE; | |
265 cmdpkt[2] = TMCORE_OPC_MEM; | |
266 cmdpkt[3] = 0x04; | |
267 cmdpkt[4] = count; | |
268 cmdpkt[5] = addr; | |
269 cmdpkt[6] = addr >> 8; | |
270 cmdpkt[7] = addr >> 16; | |
271 cmdpkt[8] = addr >> 24; | |
272 send_etm_cmd(cmdpkt, 8); | |
273 } | |
274 | |
275 void | |
276 cmd_dieid(argc, argv) | |
277 char **argv; | |
278 { | |
279 u_char cmdpkt[4]; | |
280 | |
281 cmdpkt[1] = ETM_CORE; | |
282 cmdpkt[2] = TMCORE_OPC_DIEID; | |
283 send_etm_cmd(cmdpkt, 2); | |
284 } | |
285 | |
286 void | |
287 cmd_ping(argc, argv) | |
288 char **argv; | |
289 { | |
290 int delay, size; | |
291 u_char cmdpkt[8]; | |
292 | |
293 if (argc > 1) { | |
294 delay = strtoul(argv[1], 0, 0); | |
295 if (delay > 65535) { | |
296 printf("error: ping delay argument too big\n"); | |
297 return; | |
298 } | |
299 } else | |
300 delay = 0; | |
301 if (argc > 2) { | |
302 size = strtoul(argv[2], 0, 0); | |
303 if (size > 240) { | |
304 printf("error: ping size argument too big\n"); | |
305 return; | |
306 } | |
307 } else | |
308 size = 1; | |
309 cmdpkt[1] = ETM_CORE; | |
310 cmdpkt[2] = TMCORE_OPC_ECHO; | |
311 cmdpkt[3] = delay; | |
312 cmdpkt[4] = delay >> 8; | |
313 cmdpkt[5] = size; | |
314 cmdpkt[6] = size >> 8; | |
315 send_etm_cmd(cmdpkt, 6); | |
316 } | |
317 | |
318 void | |
319 cmd_tgtreset(argc, argv) | |
320 char **argv; | |
321 { | |
322 u_char cmdpkt[4]; | |
323 | |
324 cmdpkt[1] = ETM_CORE; | |
325 cmdpkt[2] = TMCORE_OPC_RESET; | |
326 send_etm_cmd(cmdpkt, 2); | |
327 } | |
328 | |
329 void | |
330 cmd_version(argc, argv) | |
331 char **argv; | |
332 { | |
333 u32 arg; | |
334 u_char cmdpkt[8]; | |
335 | |
336 arg = strtoul(argv[1], 0, 16); | |
337 cmdpkt[1] = ETM_CORE; | |
338 cmdpkt[2] = TMCORE_OPC_VERSION; | |
339 cmdpkt[3] = arg; | |
340 cmdpkt[4] = arg >> 8; | |
341 cmdpkt[5] = arg >> 16; | |
342 cmdpkt[6] = arg >> 24; | |
343 send_etm_cmd(cmdpkt, 6); | |
344 } |