view rvinterf/tmsh/etmbasic.c @ 1034:405b5469abc4
default tip
top README: repository change notice
author |
Mychaela Falconia <falcon@freecalypso.org> |
date |
Sun, 12 Jun 2016 19:06:34 +0000 (2016-06-12) |
parents |
ebdf5afa9fb5 |
children |
|
line source
/*
* 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"
#include "tm3.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("TM 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:
if (rvi_msg_len < 5)
goto runt;
handle_ffs2_response();
return;
/* TM3 */
case MEM_READ:
if (rvi_msg_len < 5)
goto runt;
handle_omr_response();
return;
default:
print_etm_pkt_raw("TM 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);
}