#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)
{
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,
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,
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);
+}
#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;
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,
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,
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,