From 220ec4cc3cfccb13e2707a3df03cae3e85358644 Mon Sep 17 00:00:00 2001 From: hadaq Date: Fri, 30 Nov 2012 15:36:39 +0000 Subject: [PATCH] added functions setbit, clearbit and loadbit to libtrbnet and libtrbnet_perl, removed trb_register_modify function. --- libtrbnet/trbcmd.c | 60 ++++--- libtrbnet/trbnet.c | 247 ++++++++++++++++++----------- libtrbnet/trbnet.h | 19 ++- libtrbnet_perl/TrbNet.xs | 38 ++++- libtrbnet_perl/lib/HADES/TrbNet.pm | 19 +-- trbnetd/server/rpcserver.c | 51 ++++-- trbnetd/server/trbnetd.c | 47 +++++- trbnetd/trbnetrpc.c | 81 +++++++++- trbnetd/trbrpc.x | 15 +- 9 files changed, 410 insertions(+), 167 deletions(-) diff --git a/libtrbnet/trbcmd.c b/libtrbnet/trbcmd.c index 9144dc2..8785590 100644 --- a/libtrbnet/trbcmd.c +++ b/libtrbnet/trbcmd.c @@ -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 -> " "read IPU data\n", '%'); - fprintf(stdout, " setbit -> " "set bits of a register\n"); fprintf(stdout, " clearbit -> " @@ -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) { /*******************************************/ diff --git a/libtrbnet/trbnet.c b/libtrbnet/trbnet.c index 9cf9d3c..492896d 100644 --- a/libtrbnet/trbnet.c +++ b/libtrbnet/trbnet.c @@ -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 @@ -23,6 +23,11 @@ const char trbnet_version[] = "$Revision: 4.41 $ UNKNOWN, i.e. ERROR"; #include #include +/* Used by trb_register_modify and trb_nettrace */ +#define TMP_DATA_SIZE (1024 * 2) +static uint32_t tmpData[TMP_DATA_SIZE]; + + #ifdef PEXOR #include #include @@ -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; -} diff --git a/libtrbnet/trbnet.h b/libtrbnet/trbnet.h index df2f6c8..f0478ee 100644 --- a/libtrbnet/trbnet.h +++ b/libtrbnet/trbnet.h @@ -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 diff --git a/libtrbnet_perl/TrbNet.xs b/libtrbnet_perl/TrbNet.xs index ac6643e..d6d6204 100644 --- a/libtrbnet_perl/TrbNet.xs +++ b/libtrbnet_perl/TrbNet.xs @@ -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) diff --git a/libtrbnet_perl/lib/HADES/TrbNet.pm b/libtrbnet_perl/lib/HADES/TrbNet.pm index 4272330..f8730a9 100644 --- a/libtrbnet_perl/lib/HADES/TrbNet.pm +++ b/libtrbnet_perl/lib/HADES/TrbNet.pm @@ -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! diff --git a/trbnetd/server/rpcserver.c b/trbnetd/server/rpcserver.c index 57a82be..d27d17c 100644 --- a/trbnetd/server/rpcserver.c +++ b/trbnetd/server/rpcserver.c @@ -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; diff --git a/trbnetd/server/trbnetd.c b/trbnetd/server/trbnetd.c index a3409ce..0979780 100644 --- a/trbnetd/server/trbnetd.c +++ b/trbnetd/server/trbnetd.c @@ -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); diff --git a/trbnetd/trbnetrpc.c b/trbnetd/trbnetrpc.c index 34f15b6..fceb7bd 100644 --- a/trbnetd/trbnetrpc.c +++ b/trbnetd/trbnetrpc.c @@ -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) { /* diff --git a/trbnetd/trbrpc.x b/trbnetd/trbrpc.x index a4583f9..9531e5d 100644 --- a/trbnetd/trbrpc.x +++ b/trbnetd/trbrpc.x @@ -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; -- 2.43.0