]> jspc29.x-matter.uni-frankfurt.de Git - trbnettools.git/commitdiff
added functions setbit, clearbit and loadbit to libtrbnet and libtrbnet_perl, removed...
authorhadaq <hadaq>
Fri, 30 Nov 2012 15:36:39 +0000 (15:36 +0000)
committerhadaq <hadaq>
Fri, 30 Nov 2012 15:36:39 +0000 (15:36 +0000)
libtrbnet/trbcmd.c
libtrbnet/trbnet.c
libtrbnet/trbnet.h
libtrbnet_perl/TrbNet.xs
libtrbnet_perl/lib/HADES/TrbNet.pm
trbnetd/server/rpcserver.c
trbnetd/server/trbnetd.c
trbnetd/trbnetrpc.c
trbnetd/trbrpc.x

index 9144dc2390aa5d01a7638fee08aa0896019487be..87855901612de814454589ece51853b29cc58d5b 100644 (file)
@@ -25,7 +25,7 @@
 
 static int hexMode = HEXMODE;
 
-static const char trbcmd_version[] = "$Revision: 2.80 $";
+static const char trbcmd_version[] = "$Revision: 2.81 $";
 
 #define BACKLOG 10
 static uint16_t tcp_port = 55555;
@@ -135,7 +135,6 @@ void usage(const char *progName)
           "send trigger to RICH only\n", '%');
   fprintf(stdout, "   I <type> <random> <info> <number|%cctr>           -> "
           "read IPU data\n", '%');
-
   fprintf(stdout, "   setbit <trbaddress> <register> <bitmask>         -> "
           "set bits of a register\n");
   fprintf(stdout, "   clearbit <trbaddress> <register> <bitmask>       -> "
@@ -499,7 +498,7 @@ int start(int argc, char **argv)
                       (option == 0 ? reg_address + i : i),
                       *p++);
             }
-         }
+          }
           /* Check Status-Bits */
           if (trb_errno == TRB_STATUS_WARNING) {
             logError(WARNING, "Status-Bits are active:\n%s\n",
@@ -1118,14 +1117,21 @@ int start(int argc, char **argv)
                   trb_address, reg_address, bitMask);
         }
 
-        status = trb_register_modify(trb_address, reg_address,
-                                     1, bitMask, 0);
+        status = trb_register_setbit(trb_address,
+                                     reg_address,
+                                     bitMask
+                                     );
         if (status == -1) {
           logError(ERROR, "setbit of register failed: %s\n",
                    trb_strerror());
           return -1;
         }
-
+        
+        /* Check Status-Bits */
+        if (trb_errno == TRB_STATUS_WARNING) {
+          logError(WARNING, "Status-Bit(s) have been set:\n%s\n",
+                   trb_termstr(trb_term));
+        }
       } else if (strncmp(cmd[0], "clearbit", CMD_SIZE) == 0) {
 
         /*******************************************/
@@ -1140,11 +1146,11 @@ int start(int argc, char **argv)
           logError(ERROR, "Invalid command, try -h option\n");
           return -1;
         }
-
+        
         trb_address = strtoul(cmd[1], NULL, hexMode == 1 ? 16 : 0);
         reg_address = strtoul(cmd[2], NULL, hexMode == 1 ? 16 : 0);
         bitMask = strtoul(cmd[3], NULL, hexMode == 1 ? 16 : 0);
-
+        
         /* DEBUG Info */
         if (trb_debug > 0) {
           fprintf(stderr,
@@ -1152,36 +1158,43 @@ int start(int argc, char **argv)
                   "reg_address: 0x%04x, bitMask: 0x%04x\n",
                   trb_address, reg_address, bitMask);
         }
-
-        status = trb_register_modify(trb_address, reg_address,
-                                     2, bitMask, 0);
+        
+        status = trb_register_clearbit(trb_address, 
+                                       reg_address,
+                                       bitMask
+                                       );
         if (status == -1) {
           logError(ERROR, "clearbit of register failed: %s\n",
                    trb_strerror());
           return -1;
         }
-
+        
+        /* Check Status-Bits */
+        if (trb_errno == TRB_STATUS_WARNING) {
+          logError(WARNING, "Status-Bit(s) have been set:\n%s\n",
+                   trb_termstr(trb_term));
+        }
       } else if (strncmp(cmd[0], "loadbit", CMD_SIZE) == 0) {
 
         /*******************************************/
-        /* Register Load Bits                      */
+        /* Register Load Bit                       */
         /*******************************************/
 
         int status = 0;
-
+        
         uint32_t bitMask;
         uint32_t bitValue;
-
+        
         if (cmdLen != 5) {
           logError(ERROR, "Invalid command, try -h option\n");
           return -1;
         }
-
+        
         trb_address = strtoul(cmd[1], NULL, hexMode == 1 ? 16 : 0);
         reg_address = strtoul(cmd[2], NULL, hexMode == 1 ? 16 : 0);
         bitMask = strtoul(cmd[3], NULL, hexMode == 1 ? 16 : 0);
         bitValue = strtoul(cmd[4], NULL, hexMode == 1 ? 16 : 0);
-
+        
         /* DEBUG Info */
         if (trb_debug > 0) {
           fprintf(stderr,
@@ -1189,15 +1202,22 @@ int start(int argc, char **argv)
                   "reg_address: 0x%04x, bitMask: 0x%04x bitValue: 0x%04x\n",
                   trb_address, reg_address, bitMask, bitValue);
         }
-
-        status = trb_register_modify(trb_address, reg_address,
-                                     3, bitMask, bitValue);
+        
+        status = trb_register_loadbit(trb_address,
+                                      reg_address,
+                                      bitMask,
+                                      bitValue);
         if (status == -1) {
           logError(ERROR, "loadbit of register failed: %s\n",
                    trb_strerror());
           return -1;
         }
         
+        /* Check Status-Bits */
+        if (trb_errno == TRB_STATUS_WARNING) {
+          logError(WARNING, "Status-Bit(s) have been set:\n%s\n",
+                   trb_termstr(trb_term));
+        }
       } else if (strncmp(cmd[0], "nettrace", CMD_SIZE) == 0) {
 
         /*******************************************/
index 9cf9d3caec1d9ce1211910053e3bddadf1bda460..492896d8cd08c45c0f8382939f189e5af7e2af2b 100644 (file)
@@ -1,11 +1,11 @@
 #ifdef ETRAX
-const char trbnet_version[] = "$Revision: 4.41 $  Local Etrax";
+const char trbnet_version[] = "$Revision: 4.42 $  Local Etrax";
 #elif defined PEXOR
-const char trbnet_version[] = "$Revision: 4.41 $  Local Pexor";
+const char trbnet_version[] = "$Revision: 4.42 $  Local Pexor";
 #elif defined TRB3
-const char trbnet_version[] = "$Revision: 4.41 $  Local TRB3";
+const char trbnet_version[] = "$Revision: 4.42 $  Local TRB3";
 #else
-const char trbnet_version[] = "$Revision: 4.41 $  UNKNOWN, i.e. ERROR";
+const char trbnet_version[] = "$Revision: 4.42 $  UNKNOWN, i.e. ERROR";
 #endif
 
 #include <stdlib.h>
@@ -23,6 +23,11 @@ const char trbnet_version[] = "$Revision: 4.41 $  UNKNOWN, i.e. ERROR";
 #include <stdint.h>
 #include <math.h>
 
+/* Used by trb_register_modify and trb_nettrace */
+#define TMP_DATA_SIZE (1024 * 2)
+static uint32_t tmpData[TMP_DATA_SIZE];
+
+
 #ifdef PEXOR
 #include <pexor_user.h>
 #include <sys/ioctl.h>
@@ -1490,6 +1495,65 @@ static int init_semaphore()
 #endif
 }
 
+static int trb_register_modify(uint16_t trb_address,
+                               uint16_t reg_address,
+                               int mode, /* 1 = set, 2 = clear, 3 = modify */
+                               uint32_t bitMask,
+                               uint32_t bitValue)
+{
+  int status = 0;
+  uint32_t value;
+  int singleWrite = 0;
+  int i;
+  
+  status = trb_register_read(trb_address, reg_address,
+                             tmpData, TMP_DATA_SIZE);
+  if (status == -1) {
+    return -1;
+  }
+
+  /* Now set bits on all endpoints             */
+  /* check, whether all registers are the same */
+  singleWrite = 1;
+  value = tmpData[1];
+  for (i = 2; (i + 1) < status; i += 2) {
+    if (tmpData[i + 1] != value) {
+      singleWrite = 0;
+      break;
+    }
+  }
+
+  /* Write modified register value(s) */
+  for (i = 0; (i + 1) < (singleWrite == 0 ? status : 2); i += 2) {
+    if (singleWrite == 0) {
+      trb_address = tmpData[i];
+      value = tmpData[i + 1];
+    }
+    switch (mode) {
+    case 1:
+      value |= bitMask;
+      break;
+
+    case 2:
+      value &= ~bitMask;
+      break;
+
+    case 3:
+      value = (value & ~bitMask) | (bitValue & bitMask);
+      break;
+
+    default:
+      return -1;
+    }
+
+    if (trb_register_write(trb_address, reg_address, value) == -1) {
+      return -1;
+    }
+  }
+
+  return 0;
+}
+
 /* ----- Global Functions ----------------------------------------------- */
 
 #ifdef ETRAX     /* Etrax-Board */
@@ -3029,12 +3093,89 @@ int com_reset()
 
 #endif
 
+
+int trb_register_setbit(uint16_t trb_address,
+                        uint16_t reg_address,
+                        uint32_t bitMask)
+{
+  int status = 0;
+
+  trb_errno = TRB_NONE;
+  
+  if (lockPorts(1) == -1) return -1;
+
+  status = trb_register_modify(trb_address, 
+                               reg_address,
+                               1,
+                               bitMask, 
+                               0);
+
+  if (status == -1) {
+    unlockPorts(1);
+    return -1;
+  }
+
+  if (unlockPorts(1) == -1) return -1;
+
+  return 0;
+}
+
+int trb_register_clearbit(uint16_t trb_address,
+                        uint16_t reg_address,
+                        uint32_t bitMask)
+{
+  int status = 0;
+
+  trb_errno = TRB_NONE;
+  
+  if (lockPorts(1) == -1) return -1;
+
+  status = trb_register_modify(trb_address, 
+                               reg_address,
+                               2,
+                               bitMask, 
+                               0);
+  if (status == -1) {
+    unlockPorts(1);
+    return -1;
+  }
+  
+  if (unlockPorts(1) == -1) return -1;
+
+  return 0;
+}
+
+int trb_register_loadbit(uint16_t trb_address,
+                         uint16_t reg_address,
+                         uint32_t bitMask,
+                         uint32_t bitValue
+                         )
+{
+  int status = 0;
+
+  trb_errno = TRB_NONE;
+  
+  if (lockPorts(1) == -1) return -1;
+
+  status = trb_register_modify(trb_address, 
+                               reg_address,
+                               3,
+                               bitMask, 
+                               bitValue);
+  if (status == -1) {
+    unlockPorts(1);
+    return -1;
+  }
+  
+  if (unlockPorts(1) == -1) return -1;
+
+  return 0;
+}
+
 int trb_nettrace(uint16_t trb_address,
                  uint32_t *data,
                  unsigned int dsize)
 {
-  static const size_t NUM_ENDPOINTS = 1024;
-  uint32_t *buffer = NULL;
   int status = 0;
   unsigned int i;
   unsigned int ctr;
@@ -3043,117 +3184,35 @@ int trb_nettrace(uint16_t trb_address,
   
   if (lockPorts(1) == -1) return -1;
   
-  buffer = (uint32_t *) malloc(sizeof(uint32_t) * NUM_ENDPOINTS * 2);
-  if (buffer == NULL) abort(); 
-  
   /* DEBUG INFO */
   if (trb_debug > 0) {
     fprintf(stderr, "nettrace started.\n");
   }
   
-  if (trb_register_read(0xfffe, 0xa5, buffer, NUM_ENDPOINTS * 2) == -1) {
+  if (trb_register_read(0xfffe, 0xa5, tmpData, TMP_DATA_SIZE) == -1) {
     unlockPorts(1);
-    free(buffer);
     return -1;
   }
-  trb_register_read_mem(trb_address, 0, 0, 1, buffer, NUM_ENDPOINTS * 2);
+  trb_register_read_mem(trb_address, 0, 0, 1, tmpData, TMP_DATA_SIZE);
   
-  status = trb_register_read(0xfffe, 0xa5, buffer, NUM_ENDPOINTS * 2);
+  status = trb_register_read(0xfffe, 0xa5, tmpData, TMP_DATA_SIZE);
   if (unlockPorts(1) == -1) return -1; 
   
   if (status == -1) {
-    free(buffer);
     return -1;
   }
   
   ctr = 0;
   for (i = 0; (i + 1) < status; i += 2) {
-    if (buffer[i + 1] == 0) continue;
+    if (tmpData[i + 1] == 0) continue;
     if (ctr + 1 >= dsize) {
       trb_errno = TRB_USER_BUFFER_OVF;
-      free(buffer);
       return -1;
     }
-    data[ctr++] = buffer[i];
-    data[ctr++] = log(buffer[i + 1]) / log(2);
+    data[ctr++] = tmpData[i];
+    data[ctr++] = log(tmpData[i + 1]) / log(2);
   }
   
-  free(buffer);
   return ctr;
 }
 
-int trb_register_modify(uint16_t trb_address,
-                        uint16_t reg_address,
-                        int mode,
-                        uint32_t bitMask,
-                        uint32_t bitValue)
-{
-  static const size_t NUM_ENDPOINTS = 1024;
-  int status = 0;
-
-  uint32_t value;
-  int singleWrite = 0;
-  uint32_t *data = NULL;
-  int i;
-
-  if (lockPorts(1) == -1) return -1;
-
-  data = (uint32_t *) malloc(sizeof(uint32_t) * NUM_ENDPOINTS * 2);
-  if (data == NULL) abort();
-
-  status = trb_register_read(trb_address, reg_address,
-                             data, NUM_ENDPOINTS * 2);
-  if (status == -1) {
-    free(data);
-    unlockPorts(1);
-    return -1;
-  }
-
-  /* Now set bits on all endpoints             */
-  /* check, whether all registers are the same */
-  singleWrite = 1;
-  value = data[1];
-  for (i = 2; (i + 1) < status; i += 2) {
-    if (data[i + 1] != value) {
-      singleWrite = 0;
-      break;
-    }
-  }
-
-  /* Write modified register value(s) */
-  for (i = 0; (i + 1) < (singleWrite == 0 ? status : 2); i += 2) {
-    if (singleWrite == 0) {
-      trb_address = data[i];
-      value = data[i + 1];
-    }
-    switch (mode) {
-    case 1:
-      value |= bitMask;
-      break;
-
-    case 2:
-      value &= ~bitMask;
-      break;
-
-    case 3:
-      value = (value & ~bitMask) | (bitValue & bitMask);
-      break;
-
-    default:
-      free(data);
-      unlockPorts(1);
-      return -1;
-    }
-
-    if (trb_register_write(trb_address, reg_address, value) == -1) {
-      free(data);
-      unlockPorts(1);
-      return -1;
-    }
-  }
-
-  free(data);
-  if (unlockPorts(1) == -1) return -1;
-
-  return 0;
-}
index df2f6c8645a352ed292c1ec89de656c93e3115aa..f0478eecd8592c05ed5e4f4cf6ef9b406cfb8874 100644 (file)
@@ -92,6 +92,19 @@ int trb_nettrace(uint16_t trb_address,
                  uint32_t *data,
                  unsigned int dsize);
 
+int trb_register_setbit(uint16_t trb_address,
+                        uint16_t reg_address,
+                        uint32_t bitMask);
+
+int trb_register_clearbit(uint16_t trb_address,
+                          uint16_t reg_address,
+                          uint32_t bitMask);
+
+int trb_register_loadbit(uint16_t trb_address,
+                         uint16_t reg_address,
+                         uint32_t bitMask,
+                         uint32_t bitValue);
+
 #ifdef PEXOR
 int fpga_register_read_mem(uint32_t reg_address, 
                            uint32_t* data,
@@ -108,12 +121,6 @@ int network_reset();
 
 int com_reset();
   
-int trb_register_modify(uint16_t trb_address,
-                        uint16_t reg_address,
-                        int mode,
-                        uint32_t bitMask,
-                        uint32_t bitValue);
-
 /* ---------------------------------------------------------------------- */
 
 /* This library provides several function to access the trbnet on a 
index ac6643ed970077535b8be100eb6e6f1eb69d4a5d..d6d62042851da97f86850e99e2f6cbb06f434f6c 100644 (file)
@@ -196,23 +196,53 @@ trb_nettrace_c(trb_address)
        }
 
 void
-trb_register_modify(trb_address, reg_address, mode, bitMask, bitValue)
+trb_register_setbit(trb_address, reg_address, bitMask)
+     U16 trb_address
+     U16 reg_address
+     U32 bitMask
+   INIT:
+     int status;
+        
+   PPCODE:
+     status = trb_register_setbit(trb_address, reg_address, bitMask);
+     if (status < 0) {
+       XSRETURN_UNDEF;
+     } else {
+       XPUSHs(sv_2mortal(newSVuv(1)));
+     }
+
+void
+trb_register_clearbit(trb_address, reg_address, bitMask)
      U16 trb_address
      U16 reg_address
-     int mode
      U32 bitMask
-     U32 bitValue
    INIT:
      int status;
         
    PPCODE:
-     status = trb_register_modify(trb_address, reg_address, mode, bitMask, bitValue);
+     status = trb_register_clearbit(trb_address, reg_address, bitMask);
      if (status < 0) {
        XSRETURN_UNDEF;
      } else {
        XPUSHs(sv_2mortal(newSVuv(1)));
      }
 
+void
+trb_register_loadbit_c(trb_address, reg_address, bitMask, bitValue)
+     U16 trb_address
+     U16 reg_address
+     U32 bitMask
+     U32 bitValue
+   INIT:
+     int status;
+        
+   PPCODE:
+     status = trb_register_loadbit(trb_address, reg_address, bitMask, bitValue);
+     if (status < 0) {
+       XSRETURN_UNDEF;
+     } else {
+       XPUSHs(sv_2mortal(newSVuv(1)));
+     }
 
 void
 trb_set_address(uid, endpoint, trb_address)
index 427233047bf218e4289a308da674c4ca318fcd09..f8730a9e872a987718d4d1f5f290c2b0e52de3b7 100644 (file)
@@ -35,9 +35,10 @@ our %EXPORT_TAGS = ( 'all' => [ qw(
                                    trb_read_uid_c
                                    trb_nettrace
                                    trb_nettrace_c
-                                   trb_setbit
+                                   trb_register_setbit
+                                   trb_register_clearbit
+                                   trb_register_loadbit
                                    trb_set_address
-                                   trb_clearbit
                                 ) ] );
 
 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
@@ -160,20 +161,6 @@ sub trb_nettrace {
   return \@array;
 }
 
-sub trb_setbit {
-    my ($trb_address, $reg_address, $bitMask) = @_;
-    my $ret = trb_register_modify($trb_address, $reg_address,
-                                  1, $bitMask, 0);
-    return $ret;
-}
-
-sub trb_clearbit {
-    my ($trb_address, $reg_address, $bitMask) = @_;
-    my $ret = trb_register_modify($trb_address, $reg_address,
-                                  2, $bitMask, 0);
-    return $ret;
-}
-
 1;
 __END__
 # Below is stub documentation for your module. You'd better edit it!
index 57a82be75fa0149a1ec39a937f8e635df871355e..d27d17c257c874b00397232090fb5836ffc10438 100644 (file)
@@ -113,9 +113,21 @@ _com_reset_1 (void  *argp, void *result, struct svc_req *rqstp)
 }
 
 int
-_register_modify_1 (register_modify_1_argument *argp, void *result, struct svc_req *rqstp)
+_register_setbit_1 (register_setbit_1_argument *argp, void *result, struct svc_req *rqstp)
 {
-  return (register_modify_1_svc(argp->arg1, argp->arg2, argp->arg3, argp->arg4, argp->arg5, result, rqstp));
+  return (register_setbit_1_svc(argp->arg1, argp->arg2, argp->arg3, result, rqstp));
+}
+
+int
+_register_clearbit_1 (register_clearbit_1_argument *argp, void *result, struct svc_req *rqstp)
+{
+  return (register_clearbit_1_svc(argp->arg1, argp->arg2, argp->arg3, result, rqstp));
+}
+
+int
+_register_loadbit_1 (register_loadbit_1_argument *argp, void *result, struct svc_req *rqstp)
+{
+  return (register_loadbit_1_svc(argp->arg1, argp->arg2, argp->arg3, argp->arg4, result, rqstp));
 }
 
 int
@@ -124,7 +136,6 @@ _nettrace_1 (nettrace_1_argument *argp, void *result, struct svc_req *rqstp)
   return (nettrace_1_svc(argp->arg1, argp->arg2, result, rqstp));
 }
 
-
 void
 trbnetrpcprog_1(struct svc_req *rqstp, register SVCXPRT *transp)
 {
@@ -143,7 +154,10 @@ trbnetrpcprog_1(struct svc_req *rqstp, register SVCXPRT *transp)
     uint16_t fpga_register_read_1_arg;
     fpga_register_write_1_argument fpga_register_write_1_arg;
     uint8_t trb_fifo_flush_1_arg;
-    register_modify_1_argument register_modify_1_arg;
+    register_setbit_1_argument register_setbit_1_arg;
+    register_clearbit_1_argument register_clearbit_1_arg;
+    register_loadbit_1_argument register_loadbit_1_arg;
+    nettrace_1_argument nettrace_1_arg;
   } argument;
   union {
     RetVal register_read_1_res;
@@ -162,7 +176,10 @@ trbnetrpcprog_1(struct svc_req *rqstp, register SVCXPRT *transp)
     Status trb_fifo_flush_1_res;
     Status network_reset_1_res;
     Status com_reset_1_res;
-    Status register_modify_1_res;
+    Status register_setbit_1_res;
+    Status register_clearbit_1_res;
+    Status register_loadbit_1_res;
+    RetVal nettrace_1_res;
   } result;
   bool_t retval;
   xdrproc_t _xdr_argument, _xdr_result;
@@ -269,18 +286,30 @@ trbnetrpcprog_1(struct svc_req *rqstp, register SVCXPRT *transp)
     local = (bool_t (*) (char *, void *,  struct svc_req *))_com_reset_1;
     break;
 
-  case REGISTER_MODIFY:
-    _xdr_argument = (xdrproc_t) xdr_register_modify_1_argument;
+  case REGISTER_SETBIT:
+    _xdr_argument = (xdrproc_t) xdr_register_setbit_1_argument;
     _xdr_result = (xdrproc_t) xdr_Status;
-    local = (bool_t (*) (char *, void *,  struct svc_req *))_register_modify_1;
+    local = (bool_t (*) (char *, void *,  struct svc_req *))_register_setbit_1;
     break;
-  
+
+  case REGISTER_CLEARBIT:
+    _xdr_argument = (xdrproc_t) xdr_register_clearbit_1_argument;
+    _xdr_result = (xdrproc_t) xdr_Status;
+    local = (bool_t (*) (char *, void *,  struct svc_req *))_register_clearbit_1;
+    break;
+
+  case REGISTER_LOADBIT:
+    _xdr_argument = (xdrproc_t) xdr_register_loadbit_1_argument;
+    _xdr_result = (xdrproc_t) xdr_Status;
+    local = (bool_t (*) (char *, void *,  struct svc_req *))_register_loadbit_1;
+    break;
+
   case NETTRACE:
     _xdr_argument = (xdrproc_t) xdr_nettrace_1_argument;
     _xdr_result = (xdrproc_t) xdr_RetVal;
     local = (bool_t (*) (char *, void *,  struct svc_req *))_nettrace_1;
-    break;  
-    
+    break;
+
   default:
     svcerr_noproc (transp);
     return;
index a3409ce7a92719ce1a5a56a98b08260c6948a320..0979780eac9e9adbc64802598ffb18cd2ca439da 100644 (file)
@@ -14,7 +14,7 @@
 
 #include "trbrpc.h"
 
-static const char trbnetd_version[] = "$Revision: 1.14 $";
+static const char trbnetd_version[] = "$Revision: 1.15 $";
 static uint32_t server_rpc_prog_id = TRBNETRPCPROG;
 
 static int daemon_lock = 0;
@@ -417,11 +417,9 @@ bool_t com_reset_1_svc(Status* retVal,
   return TRUE; 
 }
 
-bool_t register_modify_1_svc(uint16_t trb_address, 
+bool_t register_setbit_1_svc(uint16_t trb_address, 
                              uint16_t reg_address, 
-                             int mode, 
                              uint32_t bitMask, 
-                             uint32_t bitValue, 
                              Status* retVal, 
                              struct svc_req* rqstp)
 {
@@ -431,7 +429,46 @@ bool_t register_modify_1_svc(uint16_t trb_address,
   }
   
   retVal->retVal = 
-    trb_register_modify(trb_address, reg_address, mode, bitMask, bitValue);
+    trb_register_setbit(trb_address, reg_address, bitMask);
+  
+  copyStatus(retVal);
+  
+  return TRUE; 
+}
+
+bool_t register_clearbit_1_svc(uint16_t trb_address, 
+                               uint16_t reg_address, 
+                               uint32_t bitMask, 
+                               Status* retVal, 
+                               struct svc_req* rqstp)
+{
+  if (daemon_lock == 1) {
+    retVal->retVal = -128;
+    return TRUE;
+  }
+  
+  retVal->retVal = 
+    trb_register_clearbit(trb_address, reg_address, bitMask);
+  
+  copyStatus(retVal);
+  
+  return TRUE; 
+}
+
+bool_t register_loadbit_1_svc(uint16_t trb_address, 
+                              uint16_t reg_address, 
+                              uint32_t bitMask, 
+                              uint32_t bitValue,
+                              Status* retVal, 
+                              struct svc_req* rqstp)
+{
+  if (daemon_lock == 1) {
+    retVal->retVal = -128;
+    return TRUE;
+  }
+  
+  retVal->retVal = 
+    trb_register_loadbit(trb_address, reg_address, bitMask, bitValue);
   
   copyStatus(retVal);
   
index 34f15b6da776ffdac79ac70ea3a35e6b18cec372..fceb7bd913f68214aba865f582219b7af6319ea8 100644 (file)
@@ -7,7 +7,7 @@
 
 #include "trbnet.h"
 
-const char trbnet_version[] = "$Revision: 1.13 $  RPC";
+const char trbnet_version[] = "$Revision: 1.14 $  RPC";
 unsigned int trb_debug = 0;
 unsigned int trb_dma = 0;
 static CLIENT *trb_client = NULL;
@@ -523,11 +523,9 @@ int com_reset()
   return -1;
 }
 
-int trb_register_modify(uint16_t trb_address,
+int trb_register_setbit(uint16_t trb_address,
                         uint16_t reg_address,
-                        int mode,
-                        uint32_t bitMask,
-                        uint32_t bitValue)
+                        uint32_t bitMask)
 {
   enum clnt_stat status;
   Status retVal;
@@ -535,8 +533,77 @@ int trb_register_modify(uint16_t trb_address,
   if (trb_client == NULL) return -1;
   do { 
     status =
-      register_modify_1(trb_address, reg_address, mode, bitMask, bitValue, 
-                        &retVal, trb_client);
+      register_setbit_1(trb_address, 
+                        reg_address, 
+                        bitMask, 
+                        &retVal,
+                        trb_client);
+    
+    if (status != RPC_SUCCESS) {
+      /*
+       * An error occurred while calling the server.
+       * Print error message and stop.
+       */
+      trb_errno = status + 256;
+      return -1;
+    }
+    if (retVal.retVal != -128) break;
+    sleep(SLEEP_TIME);
+  } while (1);
+  
+  copyStatus(&retVal);
+  return retVal.retVal;
+}
+
+int trb_register_clearbit(uint16_t trb_address,
+                          uint16_t reg_address,
+                          uint32_t bitMask)
+{
+  enum clnt_stat status;
+  Status retVal;
+  
+  if (trb_client == NULL) return -1;
+  do { 
+    status =
+      register_clearbit_1(trb_address, 
+                          reg_address, 
+                          bitMask, 
+                          &retVal,
+                          trb_client);
+    
+    if (status != RPC_SUCCESS) {
+      /*
+       * An error occurred while calling the server.
+       * Print error message and stop.
+       */
+      trb_errno = status + 256;
+      return -1;
+    }
+    if (retVal.retVal != -128) break;
+    sleep(SLEEP_TIME);
+  } while (1);
+  
+  copyStatus(&retVal);
+  return retVal.retVal;
+}
+
+int trb_register_loadbit(uint16_t trb_address,
+                          uint16_t reg_address,
+                          uint32_t bitMask,
+                          uint32_t bitValue)
+{
+  enum clnt_stat status;
+  Status retVal;
+  
+  if (trb_client == NULL) return -1;
+  do { 
+    status =
+      register_loadbit_1(trb_address, 
+                         reg_address, 
+                         bitMask, 
+                         bitValue,
+                         &retVal,
+                         trb_client);
     
     if (status != RPC_SUCCESS) {
       /*
index a4583f9efff1773703f70213708d3c8cb57791fb..9531e5da622511a5d50495048508de37382a89a8 100644 (file)
@@ -84,14 +84,21 @@ program TRBNETRPCPROG {
 
     Status COM_RESET(void) = 16;
 
-    Status REGISTER_MODIFY(uint16_t, 
+    Status REGISTER_SETBIT(uint16_t, 
                            uint16_t, 
-                           int,
-                           uint32_t,
                            uint32_t) = 17;
 
+    Status REGISTER_CLEARBIT(uint16_t, 
+                             uint16_t, 
+                             uint32_t) = 18;
+
+    Status REGISTER_LOADBIT(uint16_t, 
+                            uint16_t, 
+                            uint32_t,
+                            uint32_t) = 19;
+
     RetVal NETTRACE(uint16_t, 
-                    unsigned int) = 18;
+                    unsigned int) = 20;
 
   } = 1;
 } = 0x20000099;