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;
"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> -> "
(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",
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) {
/*******************************************/
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,
"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,
"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) {
/*******************************************/
#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>
#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>
#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 */
#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;
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;
-}
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,
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
}
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)
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'} } );
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!
}
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
return (nettrace_1_svc(argp->arg1, argp->arg2, result, rqstp));
}
-
void
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;
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;
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;
#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;
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)
{
}
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);
#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;
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;
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) {
/*
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;