From: hadaq Date: Tue, 19 Oct 2010 15:57:32 +0000 (+0000) Subject: added 2 new functions to RPC trbnet.h, time stamping FPGA support X-Git-Tag: v6.0~209 X-Git-Url: https://jspc29.x-matter.uni-frankfurt.de/git/?a=commitdiff_plain;h=35d73a53c487469190cdee1998a58294ad4eca79;p=trbnettools.git added 2 new functions to RPC trbnet.h, time stamping FPGA support --- diff --git a/trbnetd/Makefile b/trbnetd/Makefile index c9e5a22..ed9d373 100644 --- a/trbnetd/Makefile +++ b/trbnetd/Makefile @@ -77,6 +77,7 @@ clean: .PHONY: distclean distclean: clean rm -f $(TARGETS) $(LIB_TARGETS) + rm -f trbrpc.h trbrpc_clnt.c trbrpc_svc.c trbrpc_xdr.c find . -type l -exec rm {} \; rcsclean -u @@ -116,6 +117,8 @@ trbnetrpc.o: trbnetrpc.c trbrpc.h trbnet.h trberror.h trbrpc_clnt.o: trbrpc_clnt.c trbrpc.h +trbrpc_xdr.o: trbrpc_xdr.c trbrpc.h + trbrpc.o: trbrpc.c trbrpc.h trbrpc.h: trbrpc.x @@ -123,6 +126,7 @@ trbrpc.h: trbrpc.x trberror.o: trberror.c # ---------------------------------------------------------------------- + trbcmd.c: ln -s ../libtrbnet/trbcmd.c diff --git a/trbnetd/server/Makefile b/trbnetd/server/Makefile index fbe3d44..17fd80b 100644 --- a/trbnetd/server/Makefile +++ b/trbnetd/server/Makefile @@ -66,6 +66,8 @@ ARFLAGS = -srv %.h: %.x rpcgen -N -M $^ + rpcgen -N -M $^ + # ------------ Targets ------------------------------------------------- .PHONY: all @@ -92,14 +94,11 @@ depend: # ------------ Dependencies -------------------------------------------- -trbnetd: trbnetd.o server.o trbrpc_xdr.o - -trbnetd: server.o trbnetd.o trbrpc_xdr.o +trbnetd: trbnetd.o rpcserver.o trbrpc_xdr.o trbnetd.o: trbnetd.c trbrpc.h -server.o: server.c - +rpcserver.o: rpcserver.c trbrpc_xdr.o: trbrpc_xdr.c trbrpc.h # ---------------------------------------------------------------------- @@ -108,4 +107,7 @@ trbrpc.h: ln -s ../trbrpc.h trbrpc_xdr.c: - ln -s ../trbrpc_xdr.c \ No newline at end of file + ln -s ../trbrpc_xdr.c + +rpcserver.c: + rpcgen -N -m -M ../trbrpc.x > ./rpcserver.c \ No newline at end of file diff --git a/trbnetd/server/trbnetd.c b/trbnetd/server/trbnetd.c index 8f0972a..9c33b72 100644 --- a/trbnetd/server/trbnetd.c +++ b/trbnetd/server/trbnetd.c @@ -5,12 +5,14 @@ #include #include #include +#include #include #include #include "trbrpc.h" + int trbnetrpcprog_1_freeresult(SVCXPRT * transp, xdrproc_t xdr_result, caddr_t result) { @@ -55,6 +57,29 @@ bool_t register_read_1_svc(uint16_t trb_address, return TRUE; } +bool_t registertime_read_1_svc(uint16_t trb_address, + uint16_t reg_address, + u_int dsize, + RetVal * retVal, + struct svc_req * rqstp) +{ + int status; + + /* allocate buffer memory */ + retVal->data.Buffer_val = (uint32_t *) malloc(sizeof(uint32_t) * dsize); + if (retVal->data.Buffer_val == NULL) { + return FALSE; + } + + status = trb_registertime_read(trb_address, reg_address, + (uint32_t *) retVal->data.Buffer_val, dsize); + retVal->data.Buffer_len = status == -1 ? 0 : status; + retVal->status.retVal = status; + copyStatus(&retVal->status); + + return TRUE; +} + bool_t register_read_mem_1_svc(uint16_t trb_address, uint16_t reg_address, uint8_t option, @@ -80,6 +105,31 @@ bool_t register_read_mem_1_svc(uint16_t trb_address, return TRUE; } +bool_t registertime_read_mem_1_svc(uint16_t trb_address, + uint16_t reg_address, + uint8_t option, + uint16_t size, + u_int dsize, + RetVal* retVal, + struct svc_req * rqstp) +{ + int status; + + /* allocate buffer memory */ + retVal->data.Buffer_val = (uint32_t *) malloc(sizeof(uint32_t) * dsize); + if (retVal->data.Buffer_val == NULL) + return FALSE; + + status = trb_registertime_read_mem(trb_address, reg_address, option, size, + (uint32_t *) retVal->data.Buffer_val, dsize); + + retVal->data.Buffer_len = status == -1 ? 0 : status; + retVal->status.retVal = status; + copyStatus(&retVal->status); + + return TRUE; +} + bool_t register_write_1_svc(uint16_t trb_address, uint16_t reg_address, uint32_t value, @@ -271,4 +321,74 @@ bool_t register_modify_1_svc(uint16_t trb_address, return TRUE; } +void trbnetrpcprog_1(struct svc_req *rqstp, register SVCXPRT * transp); + +static pid_t myPid = -1; + +int main(int argc, char **argv) +{ + int daemonMode = 1; + register SVCXPRT *transp; + + if ((argc >= 2) && (strcmp(argv[1], "-f") == 0)) + daemonMode = 0; + pmap_unset(TRBNETRPCPROG, TRBNETRPCVERS); + + transp = svcudp_create(RPC_ANYSOCK); + if (transp == NULL) { + fprintf(stderr, "%s", "cannot create udp service."); + exit(EXIT_FAILURE); + } + if (!svc_register + (transp, TRBNETRPCPROG, TRBNETRPCVERS, trbnetrpcprog_1, IPPROTO_UDP)) { + fprintf(stderr, "%s", + "unable to register (TRBNETRPCPROG, TRBNETRPCVERS, udp)."); + exit(EXIT_FAILURE); + } + + transp = svctcp_create(RPC_ANYSOCK, 0, 0); + if (transp == NULL) { + fprintf(stderr, "%s", "cannot create tcp service."); + exit(EXIT_FAILURE); + } + if (!svc_register + (transp, TRBNETRPCPROG, TRBNETRPCVERS, trbnetrpcprog_1, IPPROTO_TCP)) { + fprintf(stderr, "%s", + "unable to register (TRBNETRPCPROG, TRBNETRPCVERS, tcp)."); + exit(EXIT_FAILURE); + } + + /* initialize FPGA */ + init_ports(); + + if (daemonMode == 1) { + /* fork the first time */ + if ((myPid = fork()) == -1) { /* Error fork, Mother exit, no child */ + perror(argv[0]); + exit(EXIT_FAILURE); + } + if (myPid > 0) { + exit(EXIT_SUCCESS); /* Mother exit */ + } + /* fork the second time */ + setsid(); + if ((myPid = fork()) == -1) { /* Error fork, Mother exit, no child */ + perror(argv[0]); + exit(EXIT_FAILURE); + } + if (myPid > 0) { + exit(EXIT_SUCCESS); /* Mother exit */ + } + /* close stdin, stdout, stderr, change dir */ + chdir("/"); + freopen("/dev/null", "r", stdin); + freopen("/dev/null", "a", stdout); + freopen("/dev/console", "a", stderr); + } + svc_run(); + + /* NOTREACHED */ + fprintf(stderr, "%s", "svc_run returned"); + exit(EXIT_FAILURE); +} diff --git a/trbnetd/trbnetrpc.c b/trbnetd/trbnetrpc.c index 0344553..042fe2a 100644 --- a/trbnetd/trbnetrpc.c +++ b/trbnetd/trbnetrpc.c @@ -5,7 +5,7 @@ #include "trbnet.h" -const char trbnet_version[] = "$Revision: 1.3 $"; +const char trbnet_version[] = "$Revision: 1.4 $"; unsigned int trb_debug = 0; unsigned int trb_dma = 0; @@ -82,6 +82,35 @@ int trb_register_read(uint16_t trb_address, return retVal.status.retVal; } +int trb_registertime_read(uint16_t trb_address, + uint16_t reg_address, + uint32_t * data, unsigned int dsize) +{ + enum clnt_stat status; + RetVal retVal; + + if (trb_client == NULL) return -1; + + retVal.data.Buffer_val = data; + retVal.data.Buffer_len = dsize; + + status = + registertime_read_1(trb_address, reg_address, dsize, + &retVal, trb_client); + copyStatus(&retVal.status); + + if (status != RPC_SUCCESS) { + /* + * An error occurred while calling the server. + * Print error message and stop. + */ + clnt_perror(trb_client, trb_server); + return -1; + } + + return retVal.status.retVal; +} + int trb_register_read_mem(uint16_t trb_address, uint16_t reg_address, uint8_t option, @@ -114,6 +143,38 @@ int trb_register_read_mem(uint16_t trb_address, return retVal.status.retVal; } +int trb_registertime_read_mem(uint16_t trb_address, + uint16_t reg_address, + uint8_t option, + uint16_t size, + uint32_t* data, + unsigned int dsize) +{ + enum clnt_stat status; + RetVal retVal; + + if (trb_client == NULL) return -1; + + retVal.data.Buffer_val = data; + retVal.data.Buffer_len = dsize; + + status = + registertime_read_mem_1(trb_address, reg_address, option, size, dsize, + &retVal, trb_client); + copyStatus(&retVal.status); + + if (status != RPC_SUCCESS) { + /* + * An error occurred while calling the server. + * Print error message and stop. + */ + clnt_perror(trb_client, trb_server); + return -1; + } + + return retVal.status.retVal; +} + int trb_read_uid(uint16_t trb_address, uint32_t* data, @@ -180,7 +241,7 @@ int trb_register_write_mem(uint16_t trb_address, if (trb_client == NULL) return -1; - buffer.Buffer_val = data; + buffer.Buffer_val = (uint32_t*)data; buffer.Buffer_len = size; status = register_write_mem_1(trb_address, reg_address, option, buffer, diff --git a/trbnetd/trbrpc.x b/trbnetd/trbrpc.x index 4060c4f..0f620bf 100644 --- a/trbnetd/trbrpc.x +++ b/trbnetd/trbrpc.x @@ -23,11 +23,21 @@ program TRBNETRPCPROG { uint16_t, unsigned int) = 1; + RetVal REGISTERTIME_READ(uint16_t, + uint16_t, + unsigned int) = 16; + RetVal REGISTER_READ_MEM(uint16_t, uint16_t, uint8_t, uint16_t, unsigned int) = 2; + + RetVal REGISTERTIME_READ_MEM(uint16_t, + uint16_t, + uint8_t, + uint16_t, + unsigned int) = 17; Status REGISTER_WRITE(uint16_t, uint16_t,