#ifndef HEXMODE
#define HEXMODE 0
#endif
-
+
static int hexMode = HEXMODE;
-static const char trbcmd_version[] = "$Revision: 2.66 $";
+static const char trbcmd_version[] = "$Revision: 2.67 $";
#define BACKLOG 10
static uint16_t tcp_port = 55555;
static int tcp_debug = 0; /* turn to 0 to suppress TCP/IP output */
+static int tcp_mode = 0;
/* ---- User Buffer Size ------------------------------------------------ */
char* msgEnd = NULL;
char* line = NULL;
va_list args;
-
+
va_start(args, format);
-
+
if (scriptFile != NULL) {
snprintf(fmt, 512, "Line #%d: %s",
lineCtr, format);
vsnprintf(msg, 4096, fmt, args);
va_end(args);
- msgEnd = msg + strlen(msg);
+ msgEnd = msg + strlen(msg);
line = msg;
do {
char *p = strchr(line, '\n');
fprintf(stdout, " -d turn on Debugging Information\n");
fprintf(stdout, " level 1: TRB_Package debugging\n");
fprintf(stdout, " level 2: +FIFO debugging\n");
- fprintf(stdout, " -D FIFO DMA-Mode\n");
fprintf(stdout,
" -H hex-mode: all arguments will be interpreted "
"as hexadecimal-numbers\n");
"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> -> "
"clear bits of a register\n");
fprintf(stdout, " loadbit <trbaddress> <register> <bitmask> <val> -> "
"load bits of a register\n");
-
+
fprintf(stdout, " reload <trbaddress> -> "
"reload FPGA\n");
fprintf(stdout, " reset -> "
"disconnect from server\n"
" "
"(tcp-server mode only)\n\n");
-
+
fprintf(stdout, "Start as TCP/IP-Server:\n");
fprintf(stdout, "Usage: %s [-h] [-d] [-p portnumber] [-b] [-V] tcp\n",
progName);
int opt;
int i;
+#ifdef PEXOR
+ const char optString[] = "+hf:n:d:HMVD";
+ pexor_dma = 1;
+#else
+ const char optString[] = "+hf:n:d:HMV";
+#endif
+
+ trb_debug = 0;
for (i = 0; i < CMD_MAX_ARGS; i++) {
cmd[i][0] = 0;
}
-
- trb_debug = 0;
-
/* Parse Arguments */
optind = 1;
- while ((opt = getopt(argc, argv, "+hf:n:d:DHMV")) != -1) {
+ while ((opt = getopt(argc, argv, optString)) != -1) {
switch (opt) {
case '?':
usage(basename(argv[0]));
case 'd':
trb_debug = strtoul(optarg, NULL, 0);
break;
- case 'D':
- trb_dma = 1;
- break;
case 'H':
hexMode = 1;
break;
/* HighMem Setting */
USER_BUFFER_MAX_SIZE = 5242880; /* *4Bytes = 20MByte */
break;
+#ifdef PEXOR
+ case 'D':
+ pexor_dma = 0;
+ break;
+#endif
default:
break;
}
}
}
}
-
+ if (tcp_mode == 0) {
+ if (init_ports() == -1) return -1;
+ }
+
/* Start repeat-loop */
while ((loop == -1) || (loopCtr++ < loop)) {
ssize_t scriptStatus = 0;
cmd[5], cmd[6], cmd[7], cmd[8], cmd[9]);
for (i = 0, cmdLen = 0; i < CMD_MAX_ARGS; i++, cmdLen++) {
- if (cmd[i][0] == '\0')
- break;
+ if (cmd[i][0] == '\0')
+ break;
}
if (cmdLen == 0) {
- /* Empty Line */
+ /* Empty Line */
continue;
}
for (i = 0; i < status; i += 2) {
fprintf(stdout, "0x%04x 0x%08x\n", data[i], data[i + 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));
- }
+ }
}
free(data);
logError(ERROR, "read_register failed: %s\n", trb_strerror());
} else {
for (i = 0; i < status; i += 3) {
- fprintf(stdout, "0x%04x 0x%08x 0x%04x\n",
+ fprintf(stdout, "0x%04x 0x%08x 0x%04x\n",
data[i], data[i + 1], data[i + 2]);
}
-
+
/* Check Status-Bits */
if (trb_errno == TRB_STATUS_WARNING) {
logError(WARNING, "Status-Bit(s) have been set:\n%s\n",
trb_termstr(trb_term));
- }
+ }
}
free(data);
-
+
} else if (strncmp(cmd[0], "w", CMD_SIZE) == 0) {
-
+
/*******************************************/
/* Register Write */
/*******************************************/
reg_address = strtoul(cmd[2], NULL, hexMode == 1 ? 16 : 0);
size = strtoul(cmd[3], NULL, hexMode == 1 ? 16 : 0);
option = strtoul(cmd[4], NULL, hexMode == 1 ? 16 : 0);
-
+
/* DEBUG Info */
if (trb_debug > 0) {
fprintf(stderr,
"size: 0x%04x, "
"option: %d\n", trb_address, reg_address, size, option);
}
-
- USER_BUFFER_SIZE =
- (NUM_ENDPOINTS * size + NUM_ENDPOINTS) < USER_BUFFER_MAX_SIZE
- ? NUM_ENDPOINTS * size + NUM_ENDPOINTS
+
+ USER_BUFFER_SIZE =
+ (NUM_ENDPOINTS * size + NUM_ENDPOINTS) < USER_BUFFER_MAX_SIZE
+ ? NUM_ENDPOINTS * size + NUM_ENDPOINTS
: USER_BUFFER_MAX_SIZE;
-
+
data = (uint32_t *) malloc(sizeof(uint32_t) * USER_BUFFER_SIZE);
if (data == NULL)
abort();
(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",
}
}
free(data);
-
+
} else if (strncmp(cmd[0], "rmt", CMD_SIZE) == 0) {
-
+
/*******************************************/
/* Register Read Memory plus TimeStamp */
/*******************************************/
"size: 0x%04x, "
"option: %d\n", trb_address, reg_address, size, option);
}
-
- USER_BUFFER_SIZE =
- (NUM_ENDPOINTS * size * 2 + NUM_ENDPOINTS) < USER_BUFFER_MAX_SIZE
- ? NUM_ENDPOINTS * size * 2 + NUM_ENDPOINTS
+
+ USER_BUFFER_SIZE =
+ (NUM_ENDPOINTS * size * 2 + NUM_ENDPOINTS) < USER_BUFFER_MAX_SIZE
+ ? NUM_ENDPOINTS * size * 2 + NUM_ENDPOINTS
: USER_BUFFER_MAX_SIZE;
-
+
data = (uint32_t *) malloc(sizeof(uint32_t) * USER_BUFFER_SIZE);
if (data == NULL)
abort();
}
}
free(data);
-
+
} else if (strncmp(cmd[0], "wm", CMD_SIZE) == 0) {
/*******************************************/
file = fopen(fileName, "r");
if (file == NULL) {
logError(ERROR, "opening file '%s': %s\n",
- fileName, strerror(errno));
+ fileName, strerror(errno));
return -1;
}
}
while (getline(&line, &len, file) != -1) {
char* c = NULL;
-
+
if (size >= dataSize) {
dataSize += 64;
data = (uint32_t *) realloc(data, sizeof(uint32_t) * dataSize);
if (data == NULL)
abort();
}
-
+
/* Remove newline and comments */
if ((c = strchr(line, '\n')) != NULL) {
*c = '\0';
if ((c = strchr(line, '#')) != NULL) {
*c = '\0';
}
- if (strlen(line) == 0) continue;
+ if (strlen(line) == 0) continue;
data[size++] = strtoul(line, NULL, hexMode == 1 ? 16 : 0);
}
free(line);
trb_termstr(trb_term));
}
}
-
+
free(data);
} else if (strncmp(cmd[0], "i", CMD_SIZE) == 0) {
trb_strerror());
return -1;
} else {
- for (i = 0;
+ for (i = 0;
((i < (unsigned int)status) && (i < NUM_ENDPOINTS * 4));
i += 4) {
fprintf(stdout, "0x%04x 0x%08x%08x 0x%02x\n",
trb_termstr(trb_term));
}
}
-
+
} else if (strncmp(cmd[0], "T", CMD_SIZE) == 0) {
/*******************************************/
trb_termstr(trb_term));
}
}
-
+
} else if (strncmp(cmd[0], "TR", CMD_SIZE) == 0) {
/*********************************************/
"info: 0x%02x, "
"number: 0x%04x\n", type, random, info, number);
}
-
+
buffer = (uint32_t *) malloc(sizeof(uint32_t) * USER_BUFFER_MAX_SIZE);
if (buffer == NULL)
abort();
if (trb_debug > 0) {
fprintf(stderr,
"Command: READ_FIFO_REGISTER: reg_address: "
-#ifndef PEXOR
+#ifndef PEXOR
"0x%04x "
#else
"0x%08x "
-#endif
+#endif
"\n", reg_address);
}
} else {
fprintf(stdout,
-#ifndef PEXOR
- "0x%04x "
+#ifndef PEXOR
+ "0x%04x "
#else
"0x%08x "
#endif
#else
uint32_t reg_address = 0;
#endif
-
+
if (cmdLen != 3) {
logError(ERROR, "Invalid command, try -h option\n");
return -1;
}
-
+
reg_address = strtoul(cmd[1], NULL, hexMode == 1 ? 16 : 0);
value = strtoul(cmd[2], NULL, hexMode == 1 ? 16 : 0);
#endif
"value: 0x%08x\n", reg_address, value);
}
-
+
if (fpga_register_write(reg_address, value) == -1) {
logError(ERROR, "fpga_register_write failed\n");
return -1;
}
-
+
} else if (strncmp(cmd[0], "setbit", CMD_SIZE) == 0) {
-
+
/*******************************************/
/* Register Set Bits */
/*******************************************/
-
+
int status = 0;
-
+
uint32_t bitMask;
-
+
if (cmdLen != 4) {
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,
1, bitMask, 0);
if (status == -1) {
trb_strerror());
return -1;
}
-
+
} else if (strncmp(cmd[0], "clearbit", CMD_SIZE) == 0) {
-
+
/*******************************************/
/* Register Clear Bits */
/*******************************************/
-
+
int status = 0;
-
+
uint32_t bitMask;
-
+
if (cmdLen != 4) {
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);
if (status == -1) {
logError(ERROR, "clearbit of register failed: %s\n",
trb_strerror());
-
+
return -1;
}
-
+
} else if (strncmp(cmd[0], "loadbit", CMD_SIZE) == 0) {
-
+
/*******************************************/
/* Register Load Bits */
/*******************************************/
-
+
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);
if (status == -1) {
trb_strerror());
return -1;
}
-
+
} else {
/*******************************************/
if (strcmp(argv[argc - 1], "tcp") != 0) {
/* Run normal TRBCMD */
- if (init_ports() == -1) exit(EXIT_FAILURE);
-
if (start(argc, argv) == 0) {
exit(EXIT_SUCCESS);
}
int yes = 1;
int daemonMode = 0;
int opt;
-
+ tcp_mode = 1;
+
/* Parse Arguments */
optind = 1;
while ((opt = getopt(argc, argv, "+hdVbp:")) != -1) {
exit(EXIT_SUCCESS);
break;
case 'p':
- tcp_port = strtol(optarg, NULL, 0);
- break;
+ tcp_port = strtol(optarg, NULL, 0);
+ break;
case 'd':
tcp_debug = 1;
break;
my_addr.sin_port = htons(tcp_port);
my_addr.sin_addr.s_addr = INADDR_ANY;
memset(&(my_addr.sin_zero), 0, 8);
-
+
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int))
== -1) {
perror("setsockopt() error!");
" to port %d [OK]\n\n",
tcp_port);
}
-
+
if (init_ports() == -1) exit(EXIT_FAILURE);
-
+
/* Enter an infinite loop to accept clients */
while (1) {
socklen_t sin_size = sizeof(struct sockaddr_in);
atexit(atexit0);
clientout = fdopen(myFd, "a");
-
+
/* redirect output */
fclose(stdout);
fclose(stderr);
stdout = clientout;
stderr = clientout;
-
+
while (1) {
int start_argc = 0;
char *start_argv[256];
int start_arg = 0;
char command[256] = "";
ssize_t msgLen = 0;
-
+
msgLen = recv(myFd, (void *)command, 256, 0);
if (msgLen == -1) {
perror("Error recv");
fprintf(stderr, "%d: empty package\n", myPid);
continue;
}
-
-
+
+
msgLen -= 2;
command[msgLen] = '\0';
-
+
char *p;
p = strpbrk( command, "#");
- if (p != NULL){
- fprintf(stdout, ">ERROR: The client transfered 2 commands as one.");
- fprintf(clientout, "\n----------------------------\n\n");
- fflush(clientout);
- if (tcp_debug > 0) {
- fprintf(stderr, "%d: received: %i\n", myPid, (int)msgLen);
- if (msgLen > 0) {
- fprintf(stderr, "%d: command: ", myPid);
- for (i = 1; i < (unsigned int)start_argc; i++) {
- fprintf(stderr, "%s ", start_argv[i]);
- }
- fprintf(stderr, "\n");
- }
- }
- }
- else{
- start_argv[start_argc++] = argv[0];
- for (i = 0; i < (unsigned int)msgLen; i++) {
- if (isspace((int)command[i]) != 0) {
- command[i] = '\0';
- }
- if (command[i] != '\0') {
- if (start_arg == 0) {
- start_argv[start_argc++] = &command[i];
- start_arg = 1;
- } else {
- continue;
- }
- } else {
- command[i] = '\0';
- start_arg = 0;
- }
- }
-
- if (tcp_debug > 0) {
- fprintf(stderr, "%d: received: %i\n", myPid, (int)msgLen);
- if (msgLen > 0) {
- fprintf(stderr, "%d: command: ", myPid);
- for (i = 1; i < (unsigned int)start_argc; i++) {
- fprintf(stderr, "%s ", start_argv[i]);
- }
- fprintf(stderr, "\n");
- }
- }
-
- /* Execute command */
- if (start_argc == 1) continue;
- if ((strcmp(start_argv[1], "exit") == 0) ||
- (strcmp(start_argv[1], "quit") == 0)) {
- if (tcp_debug > 0) {
- fprintf(stderr, "%d: client disconnected\n", myPid);
- }
- exit(EXIT_SUCCESS);
- }
-
- start(start_argc, start_argv);
- fprintf(clientout, "\n----------------------------\n\n");
- fflush(clientout);
+ if (p != NULL){
+ fprintf(stdout,
+ ">ERROR: The client transfered 2 commands as one.");
+ fprintf(clientout, "\n----------------------------\n\n");
+ fflush(clientout);
+ if (tcp_debug > 0) {
+ fprintf(stderr, "%d: received: %i\n", myPid, (int)msgLen);
+ if (msgLen > 0) {
+ fprintf(stderr, "%d: command: ", myPid);
+ for (i = 1; i < (unsigned int)start_argc; i++) {
+ fprintf(stderr, "%s ", start_argv[i]);
+ }
+ fprintf(stderr, "\n");
+ }
+ }
+ }
+ else{
+ start_argv[start_argc++] = argv[0];
+ for (i = 0; i < (unsigned int)msgLen; i++) {
+ if (isspace((int)command[i]) != 0) {
+ command[i] = '\0';
+ }
+ if (command[i] != '\0') {
+ if (start_arg == 0) {
+ start_argv[start_argc++] = &command[i];
+ start_arg = 1;
+ } else {
+ continue;
+ }
+ } else {
+ command[i] = '\0';
+ start_arg = 0;
+ }
+ }
+
+ if (tcp_debug > 0) {
+ fprintf(stderr, "%d: received: %i\n", myPid, (int)msgLen);
+ if (msgLen > 0) {
+ fprintf(stderr, "%d: command: ", myPid);
+ for (i = 1; i < (unsigned int)start_argc; i++) {
+ fprintf(stderr, "%s ", start_argv[i]);
+ }
+ fprintf(stderr, "\n");
+ }
+ }
+
+ /* Execute command */
+ if (start_argc == 1) continue;
+ if ((strcmp(start_argv[1], "exit") == 0) ||
+ (strcmp(start_argv[1], "quit") == 0)) {
+ if (tcp_debug > 0) {
+ fprintf(stderr, "%d: client disconnected\n", myPid);
+ }
+ exit(EXIT_SUCCESS);
+ }
+
+ start(start_argc, start_argv);
+ fprintf(clientout, "\n----------------------------\n\n");
+ fflush(clientout);
}
}
}