]> jspc29.x-matter.uni-frankfurt.de Git - trbnettools.git/commitdiff
added 2 new functions to RPC trbnet.h, time stamping FPGA support
authorhadaq <hadaq>
Tue, 19 Oct 2010 15:57:32 +0000 (15:57 +0000)
committerhadaq <hadaq>
Tue, 19 Oct 2010 15:57:32 +0000 (15:57 +0000)
trbnetd/Makefile
trbnetd/server/Makefile
trbnetd/server/trbnetd.c
trbnetd/trbnetrpc.c
trbnetd/trbrpc.x

index c9e5a224c8304f526986c0e3ea58f260103f9eb1..ed9d373bd9525d0c5644a15d40b933a3f16b7420 100644 (file)
@@ -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
 
index fbe3d44d5628d12c782edb499ce32cd8ecda085a..17fd80b4bc77b0142f595378098538b057197172 100644 (file)
@@ -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
index 8f0972a7a28a4b0b57dc1f4d0c43d2d422e58786..9c33b723be614cbb87f2e9b13b09b47577ee2392 100644 (file)
@@ -5,12 +5,14 @@
 #include <memory.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
+#include <unistd.h>
 
 #include <trbnet.h>
 #include <trberror.h>
 
 #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);
+}
index 0344553a1041b94f9396afbfccd7b48924d4f267..042fe2a3658786f1a0f51628b913862121d7bc9b 100644 (file)
@@ -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,
index 4060c4fcf957bd86915fc588f0ae9d6d2a5c3ae1..0f620bfa8e36e910c7469040be588fe28f580353 100644 (file)
@@ -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,