FreeCalypso > hg > freecalypso-sw
comparison rvinterf/etm/tmcore.c @ 192:707aa640b2dc
fc-tmsh: w8/w16/w32 implemented
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Mon, 25 Nov 2013 05:37:46 +0000 |
parents | 405f5b46cdc4 |
children | c9ea2f7441a5 |
comparison
equal
deleted
inserted
replaced
191:cf8583923dc4 | 192:707aa640b2dc |
---|---|
15 | 15 |
16 extern u_char rvi_msg[]; | 16 extern u_char rvi_msg[]; |
17 extern int rvi_msg_len; | 17 extern int rvi_msg_len; |
18 | 18 |
19 static void | 19 static void |
20 r8_response() | 20 rw8_response() |
21 { | 21 { |
22 char buf[MAX_PKT_FROM_TARGET*3+80], *dp; | 22 char buf[MAX_PKT_FROM_TARGET*3+80], *dp; |
23 int num, i; | 23 int num, i; |
24 | 24 |
25 if (rvi_msg[3]) { | 25 if (rvi_msg[3]) { |
26 print_etm_pkt_raw("r8 error"); | 26 print_etm_pkt_raw("rw8 error"); |
27 return; | 27 return; |
28 } | 28 } |
29 num = rvi_msg_len - 7; | 29 num = rvi_msg_len - 7; |
30 if (!num) { | |
31 async_msg_output("w8 OK"); | |
32 return; | |
33 } | |
30 strcpy(buf, "r8:"); | 34 strcpy(buf, "r8:"); |
31 dp = buf + 3; | 35 dp = buf + 3; |
32 for (i = 0; i < num; i++) { | 36 for (i = 0; i < num; i++) { |
33 sprintf(dp, " %02X", rvi_msg[i+6]); | 37 sprintf(dp, " %02X", rvi_msg[i+6]); |
34 dp += 3; | 38 dp += 3; |
35 } | 39 } |
36 async_msg_output(buf); | 40 async_msg_output(buf); |
37 } | 41 } |
38 | 42 |
39 static void | 43 static void |
40 r16_response() | 44 rw16_response() |
41 { | 45 { |
42 char buf[MAX_PKT_FROM_TARGET*3+80], *dp; | 46 char buf[MAX_PKT_FROM_TARGET*3+80], *dp; |
43 int num, i, d, off; | 47 int num, i, d, off; |
44 | 48 |
45 if (rvi_msg[3]) { | 49 if (rvi_msg[3]) { |
46 print_etm_pkt_raw("r16 error"); | 50 print_etm_pkt_raw("rw16 error"); |
47 return; | 51 return; |
48 } | 52 } |
49 num = rvi_msg_len - 7; | 53 num = rvi_msg_len - 7; |
54 if (!num) { | |
55 async_msg_output("w16 OK"); | |
56 return; | |
57 } | |
50 if (num & 1) { | 58 if (num & 1) { |
51 print_etm_pkt_raw("r16 malformed resp"); | 59 print_etm_pkt_raw("rw16 malformed resp"); |
52 return; | 60 return; |
53 } | 61 } |
54 num >>= 1; | 62 num >>= 1; |
55 strcpy(buf, "r16:"); | 63 strcpy(buf, "r16:"); |
56 dp = buf + 4; | 64 dp = buf + 4; |
63 } | 71 } |
64 async_msg_output(buf); | 72 async_msg_output(buf); |
65 } | 73 } |
66 | 74 |
67 static void | 75 static void |
68 r32_response() | 76 rw32_response() |
69 { | 77 { |
70 char buf[MAX_PKT_FROM_TARGET*3+80], *dp; | 78 char buf[MAX_PKT_FROM_TARGET*3+80], *dp; |
71 int num, i, d, off; | 79 int num, i, d, off; |
72 | 80 |
73 if (rvi_msg[3]) { | 81 if (rvi_msg[3]) { |
74 print_etm_pkt_raw("r32 error"); | 82 print_etm_pkt_raw("rw32 error"); |
75 return; | 83 return; |
76 } | 84 } |
77 num = rvi_msg_len - 7; | 85 num = rvi_msg_len - 7; |
86 if (!num) { | |
87 async_msg_output("w32 OK"); | |
88 return; | |
89 } | |
78 if (num & 3) { | 90 if (num & 3) { |
79 print_etm_pkt_raw("r32 malformed resp"); | 91 print_etm_pkt_raw("rw32 malformed resp"); |
80 return; | 92 return; |
81 } | 93 } |
82 num >>= 2; | 94 num >>= 2; |
83 strcpy(buf, "r32:"); | 95 strcpy(buf, "r32:"); |
84 dp = buf + 4; | 96 dp = buf + 4; |
148 if (rvi_msg_len < 7) | 160 if (rvi_msg_len < 7) |
149 goto unknown; | 161 goto unknown; |
150 switch (rvi_msg[5]) { | 162 switch (rvi_msg[5]) { |
151 case 0x00: | 163 case 0x00: |
152 case 0x04: | 164 case 0x04: |
153 r32_response(); | 165 rw32_response(); |
154 return; | 166 return; |
155 case 0x01: | 167 case 0x01: |
156 r8_response(); | 168 rw8_response(); |
157 return; | 169 return; |
158 case 0x02: | 170 case 0x02: |
159 r16_response(); | 171 rw16_response(); |
160 return; | 172 return; |
161 default: | 173 default: |
162 goto unknown; | 174 goto unknown; |
163 } | 175 } |
164 case TMCORE_OPC_ECHO: | 176 case TMCORE_OPC_ECHO: |
268 cmdpkt[5] = addr; | 280 cmdpkt[5] = addr; |
269 cmdpkt[6] = addr >> 8; | 281 cmdpkt[6] = addr >> 8; |
270 cmdpkt[7] = addr >> 16; | 282 cmdpkt[7] = addr >> 16; |
271 cmdpkt[8] = addr >> 24; | 283 cmdpkt[8] = addr >> 24; |
272 send_etm_cmd(cmdpkt, 8); | 284 send_etm_cmd(cmdpkt, 8); |
285 } | |
286 | |
287 void | |
288 cmd_w8(argc, argv) | |
289 char **argv; | |
290 { | |
291 u32 addr, v; | |
292 u_char cmdpkt[MAX_PKT_TO_TARGET]; | |
293 int di; | |
294 char **ap; | |
295 | |
296 addr = strtoul(argv[1], 0, 16); | |
297 cmdpkt[1] = ETM_CORE; | |
298 cmdpkt[2] = TMCORE_OPC_MEM; | |
299 cmdpkt[3] = 0x11; | |
300 cmdpkt[4] = argc - 2; | |
301 cmdpkt[5] = addr; | |
302 cmdpkt[6] = addr >> 8; | |
303 cmdpkt[7] = addr >> 16; | |
304 cmdpkt[8] = addr >> 24; | |
305 di = 9; | |
306 for (ap = argv + 2; *ap; ap++) { | |
307 v = strtoul(*ap, 0, 16); | |
308 cmdpkt[di++] = v; | |
309 } | |
310 send_etm_cmd(cmdpkt, di - 1); | |
311 } | |
312 | |
313 void | |
314 cmd_w16(argc, argv) | |
315 char **argv; | |
316 { | |
317 u32 addr, v; | |
318 u_char cmdpkt[MAX_PKT_TO_TARGET]; | |
319 int di; | |
320 char **ap; | |
321 | |
322 addr = strtoul(argv[1], 0, 16); | |
323 if (addr & 1) { | |
324 printf("error: address not aligned\n"); | |
325 return; | |
326 } | |
327 cmdpkt[1] = ETM_CORE; | |
328 cmdpkt[2] = TMCORE_OPC_MEM; | |
329 cmdpkt[3] = 0x12; | |
330 cmdpkt[4] = argc - 2; | |
331 cmdpkt[5] = addr; | |
332 cmdpkt[6] = addr >> 8; | |
333 cmdpkt[7] = addr >> 16; | |
334 cmdpkt[8] = addr >> 24; | |
335 di = 9; | |
336 for (ap = argv + 2; *ap; ap++) { | |
337 v = strtoul(*ap, 0, 16); | |
338 cmdpkt[di++] = v; | |
339 cmdpkt[di++] = v >> 8; | |
340 } | |
341 send_etm_cmd(cmdpkt, di - 1); | |
342 } | |
343 | |
344 void | |
345 cmd_w32(argc, argv) | |
346 char **argv; | |
347 { | |
348 u32 addr, v; | |
349 u_char cmdpkt[MAX_PKT_TO_TARGET]; | |
350 int di; | |
351 char **ap; | |
352 | |
353 addr = strtoul(argv[1], 0, 16); | |
354 if (addr & 3) { | |
355 printf("error: address not aligned\n"); | |
356 return; | |
357 } | |
358 cmdpkt[1] = ETM_CORE; | |
359 cmdpkt[2] = TMCORE_OPC_MEM; | |
360 cmdpkt[3] = 0x14; | |
361 cmdpkt[4] = argc - 2; | |
362 cmdpkt[5] = addr; | |
363 cmdpkt[6] = addr >> 8; | |
364 cmdpkt[7] = addr >> 16; | |
365 cmdpkt[8] = addr >> 24; | |
366 di = 9; | |
367 for (ap = argv + 2; *ap; ap++) { | |
368 v = strtoul(*ap, 0, 16); | |
369 cmdpkt[di++] = v; | |
370 cmdpkt[di++] = v >> 8; | |
371 cmdpkt[di++] = v >> 16; | |
372 cmdpkt[di++] = v >> 24; | |
373 } | |
374 send_etm_cmd(cmdpkt, di - 1); | |
273 } | 375 } |
274 | 376 |
275 void | 377 void |
276 cmd_dieid(argc, argv) | 378 cmd_dieid(argc, argv) |
277 char **argv; | 379 char **argv; |