# HG changeset patch # User Space Falcon # Date 1432971683 0 # Node ID dab341e172de1cf3c174deebee627b5b1707cc2c # Parent 72d64c172d85ab651d5251e2bd0c40b719b27069 fc-shell: sysprim sending (sp command) implemented diff -r 72d64c172d85 -r dab341e172de rvinterf/asyncshell/Makefile --- a/rvinterf/asyncshell/Makefile Sat May 30 07:20:50 2015 +0000 +++ b/rvinterf/asyncshell/Makefile Sat May 30 07:41:23 2015 +0000 @@ -1,7 +1,7 @@ CC= gcc CFLAGS= -O2 -I../include PROG= fc-shell -OBJS= init.o main.o pktsort.o rxctl.o usercmd.o +OBJS= init.o main.o pktsort.o rxctl.o sendsp.o usercmd.o LIBS= ../libasync/libasync.a ../libg23/libg23.a INSTBIN=/usr/local/bin diff -r 72d64c172d85 -r dab341e172de rvinterf/asyncshell/sendsp.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/asyncshell/sendsp.c Sat May 30 07:41:23 2015 +0000 @@ -0,0 +1,76 @@ +/* + * Functions for sending GPF system primitives to the target + */ + +#include +#include +#include +#include +#include +#include +#include "pktmux.h" +#include "limits.h" + +send_gpf_sysprim(stackdest, primstr) + char *stackdest, *primstr; +{ + unsigned intlen; + u_char sendpkt[MAX_PKT_TO_TARGET+1]; + unsigned pktlen; + + if (strlen(stackdest) > 4) { + printf( + "error: stack destination arg may not exceed 4 characters\n"); + return(1); + } + intlen = 12 + strlen(primstr); + pktlen = intlen + 4; + if (pktlen > MAX_PKT_TO_TARGET) { + printf("error: max pkt to target limit exceeded\n"); + return(1); + } + /* fill out the packet */ + sendpkt[0] = RVT_L23_HEADER; + sendpkt[1] = 0xB7; /* system prim */ + sendpkt[2] = intlen; + sendpkt[3] = intlen >> 8; + /* send zeros for the timestamp */ + sendpkt[4] = 0; + sendpkt[5] = 0; + sendpkt[6] = 0; + sendpkt[7] = 0; + /* as far as TI's sw is concerned, we are PCO */ + sendpkt[8] = 'P'; + sendpkt[9] = 'C'; + sendpkt[10] = 'O'; + sendpkt[11] = ' '; + sprintf(sendpkt + 12, "%-4s%s", stackdest, primstr); + /* send it! */ + send_pkt_to_target(sendpkt, pktlen); + return(0); +} + +void +cmd_sendsp(args) + char *args; +{ + char *cp, *np; + + for (cp = args; isspace(*cp); cp++) + ; + if (!*cp) { +err: printf("error: two arguments required\n"); + return; + } + for (np = cp; *cp && !isspace(*cp); cp++) + ; + if (!*cp) + goto err; + *cp++ = '\0'; + while (isspace(*cp)) + cp++; + if (!*cp) + goto err; + gpf_rx_control(1); + send_gpf_sysprim(np, cp); +} diff -r 72d64c172d85 -r dab341e172de rvinterf/asyncshell/usercmd.c --- a/rvinterf/asyncshell/usercmd.c Sat May 30 07:20:50 2015 +0000 +++ b/rvinterf/asyncshell/usercmd.c Sat May 30 07:41:23 2015 +0000 @@ -13,6 +13,7 @@ extern void cmd_disable(); extern void cmd_enable(); +extern void cmd_sendsp(); void cmd_exit() @@ -29,6 +30,7 @@ {"enable", cmd_enable}, {"exit", cmd_exit}, {"quit", cmd_exit}, + {"sp", cmd_sendsp}, {0, 0} };