# HG changeset patch # User Michael Spacefalcon # Date 1393213367 0 # Node ID e23fc1228efdbba8ab431f19dee88827b5f0df75 # Parent 909f00c15f276e30e2d91108f5429f8e7a6fd298 fc-fsio: low-level rvinterf link implemented diff -r 909f00c15f27 -r e23fc1228efd rvinterf/etmsync/Makefile --- a/rvinterf/etmsync/Makefile Sun Feb 23 21:31:30 2014 +0000 +++ b/rvinterf/etmsync/Makefile Mon Feb 24 03:42:47 2014 +0000 @@ -3,7 +3,7 @@ PROGS= fc-fsio INSTBIN=/usr/local/bin -FSIO_OBJS= connect.o dispatch.o fscmdtab.o fsiomain.o launchrvif.o +FSIO_OBJS= connect.o dispatch.o fscmdtab.o fsiomain.o interf.o launchrvif.o all: ${PROGS} diff -r 909f00c15f27 -r e23fc1228efd rvinterf/etmsync/fsiomain.c --- a/rvinterf/etmsync/fsiomain.c Sun Feb 23 21:31:30 2014 +0000 +++ b/rvinterf/etmsync/fsiomain.c Mon Feb 24 03:42:47 2014 +0000 @@ -64,6 +64,7 @@ for (;;) { if (isatty(0)) { + rx_control(0); fputs("fsio> ", stdout); fflush(stdout); } diff -r 909f00c15f27 -r e23fc1228efd rvinterf/etmsync/interf.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/etmsync/interf.c Mon Feb 24 03:42:47 2014 +0000 @@ -0,0 +1,123 @@ +/* + * In this module we implement our synchronous interface to the target + * via rvinterf. + */ + +#include +#include +#include +#include +#include "limits.h" +#include "localsock.h" +#include "pktmux.h" +#include "exitcodes.h" + +extern int sock; + +int rx_enable_state; +u_char rvi_msg[LOCALSOCK_MAX_MSG]; +int rvi_msg_len; + +static void +collect_bytes_from_rvi(buf, nbytes) + u_char *buf; +{ + int cc; + + while (nbytes) { + cc = read(sock, buf, nbytes); + if (cc <= 0) { + perror("read from rvinterf socket"); + exit(ERROR_RVINTERF); + } + buf += cc; + nbytes -= cc; + } +} + +collect_rvi_msg() +{ + u_char lenbuf[2]; + + collect_bytes_from_rvi(lenbuf, 2); + rvi_msg_len = lenbuf[0] << 8 | lenbuf[1]; + if (rvi_msg_len < 1 || rvi_msg_len > LOCALSOCK_MAX_MSG) { + fprintf(stderr, "Invalid length from rvinterf: %02X%02X\n", + lenbuf[0], lenbuf[1]); + exit(ERROR_RVINTERF); + } + collect_bytes_from_rvi(rvi_msg, rvi_msg_len); + return(0); +} + +send_rvimisc_command(cmdpkt, cmdlen) + u_char *cmdpkt; +{ + u_char lenbuf[2]; + + lenbuf[0] = 0; + lenbuf[1] = cmdlen; + write(sock, lenbuf, 2); + write(sock, cmdpkt, cmdlen); +} + +rx_control(enable) +{ + u_char cmdpkt[2]; + int cmdlen; + + /* are we already in the desired state? */ + if (rx_enable_state == enable) + return(0); + /* no, do the work */ + if (enable) { + cmdpkt[0] = CLI2RVI_WANT_MUXPROTO; + cmdpkt[1] = RVT_TM_HEADER; + cmdlen = 2; + } else { + cmdpkt[0] = CLI2RVI_RESET_PACKET_RX; + cmdlen = 1; + } + send_rvimisc_command(cmdpkt, cmdlen); + collect_rvi_msg(); + if (rvi_msg[0] != RVI2CLI_LOCAL_CMD_RESP || rvi_msg_len < 2) { + fprintf(stderr, + "error: unexpected response to rvinterf local command\n"); + exit(ERROR_RVINTERF); + } + if (rvi_msg[1] != '+') { + fprintf(stderr, "Error from rvinterf: %.*s\n", rvi_msg_len - 1, + rvi_msg + 1); + exit(ERROR_RVINTERF); + } + rx_enable_state = enable; + return(0); +} + +send_pkt_to_target(pkt, pktlen) + u_char *pkt; +{ + u_char hdrbuf[3]; + int len1; + + len1 = pktlen + 1; + hdrbuf[0] = len1 >> 8; + hdrbuf[1] = len1 & 0xFF; + hdrbuf[2] = CLI2RVI_PKT_TO_TARGET; + write(sock, hdrbuf, 3); + write(sock, pkt, pktlen); +} + +target_pkt_exch(outpkt, outpktlen) + u_char *outpkt; +{ + rx_control(1); + send_pkt_to_target(outpkt, outpktlen); + collect_rvi_msg(); + if (rvi_msg[0] != RVI2CLI_PKT_FROM_TARGET) { + fprintf(stderr, + "error: unexpected response type from rvinterf\n"); + exit(ERROR_RVINTERF); + } + return(0); +}