FreeCalypso > hg > freecalypso-sw
diff rvinterf/tmsh/etmbasic.c @ 260:c146f38d2b5f
rvinterf subdir structure made a little more sensible
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Wed, 05 Feb 2014 04:02:13 +0000 |
parents | rvinterf/etm/etmbasic.c@c413e791595a |
children | 577291a2ad76 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/tmsh/etmbasic.c Wed Feb 05 04:02:13 2014 +0000 @@ -0,0 +1,98 @@ +/* + * Basic ETM interaction + */ + +#include <sys/types.h> +#include <stdio.h> +#include <string.h> +#include <strings.h> +#include <stdlib.h> +#include "pktmux.h" +#include "limits.h" +#include "etm.h" + +extern u_char rvi_msg[]; +extern int rvi_msg_len; + +void +print_etm_pkt_raw(err) + char *err; +{ + char buf[MAX_PKT_FROM_TARGET*3+80], *dp; + int i; + + sprintf(buf, "%s:", err); + dp = index(buf, '\0'); + for (i = 2; i < rvi_msg_len; i++) { + sprintf(dp, " %02X", rvi_msg[i]); + dp += 3; + } + async_msg_output(buf); +} + +void +etm_packet_rx() +{ + int i, c; + + if (rvi_msg_len < 4) { +runt: print_etm_pkt_raw("ETM Runt"); + return; + } + c = 0; + for (i = 2; i < rvi_msg_len; i++) + c ^= rvi_msg[i]; + if (c) { + print_etm_pkt_raw("BAD CKSUM"); + return; + } + switch (rvi_msg[2]) { + case ETM_CORE: + if (rvi_msg_len < 6) + goto runt; + tmcore_msg_rx(); + return; + case ETM_FFS1: + print_etm_pkt_raw("FFS1"); + return; + case ETM_FFS2: + print_etm_pkt_raw("FFS2"); + return; + default: + print_etm_pkt_raw("ETM Unknown"); + } +} + +void +cmd_etmpkt(argc, argv) + char **argv; +{ + u_char pkt[MAX_PKT_TO_TARGET]; + int di, c, b; + char **ap; + + pkt[0] = RVT_TM_HEADER; + di = 1; + c = 0; + for (ap = argv + 1; *ap; ap++) { + b = strtoul(*ap, 0, 16); + pkt[di++] = b; + c ^= b; + } + pkt[di++] = c; + send_pkt_to_target(pkt, di); +} + +void +send_etm_cmd(buf, len) + u_char *buf; +{ + int i, c; + + buf[0] = RVT_TM_HEADER; + c = 0; + for (i = 1; i <= len; i++) + c ^= buf[i]; + buf[i] = c; + send_pkt_to_target(buf, len + 2); +}