]> jspc29.x-matter.uni-frankfurt.de Git - trbnettools.git/commitdiff
koennte klappen
authorhadaq <hadaq>
Mon, 21 May 2012 20:05:42 +0000 (20:05 +0000)
committerhadaq <hadaq>
Mon, 21 May 2012 20:05:42 +0000 (20:05 +0000)
libtrbnet/trbnet.c

index f0775ec704f6ac10b25d5b27e36da1de2c29e6ed..2a7ceb6790dc4e1ab24f8f84f244ebef55e4bec3 100644 (file)
@@ -1,4 +1,4 @@
-const char trbnet_version[] = "$Revision: 4.20 $  Local";
+const char trbnet_version[] = "$Revision: 4.21 $  Local";
 
 #include <stdlib.h>
 #include <signal.h>
@@ -38,10 +38,11 @@ int pexor_dma = 1;
 #include <netdb.h>
 
 static uint16_t udpBuffer[750]; /* Maxminum is payload of one Ethernet-Frame */
-static uint32_t dataBuffer[4096 * 1024];
+static uint16_t dataBuffer[4096 * 1024];
 static unsigned int dataBufferSize = 0;
-static int trb3_sockfd  = -1;
-static uint16_t trb3_port = 26000; 
+static int trb3_sockfd = -1;
+static int trb3_sockfd_in = -1;
+static uint16_t trb3_port = 25000; 
 uint16_t sender_address = 0x5555;
 #endif
 
@@ -167,7 +168,8 @@ static sigset_t blockSetOld;
 
 /* Semaphore handling */
 static int semid = -1;
-static const key_t sem_key = 0x545242;
+/* static const key_t sem_key = 0x545242;*/
+static const key_t sem_key = 0x545245;
 
 unsigned int trb_debug = 0;
 
@@ -370,19 +372,39 @@ static inline void com_reset_FPGA()
 static int sendTrbPackage(size_t size)
 {
   int status;
+  int i;
+  
+  /* Adjust endianess ... */
+  for (i = 0; i < size; i++) {
+    if (trb_debug > 2) {
+      fprintf(stderr, "%d  0x%04x\n", i, udpBuffer[i]);
+    }
+    udpBuffer[i] = htons(udpBuffer[i]);
+  }
   
-  if (send(trb3_sockfd, (void*)udpBuffer, size, MSG_CONFIRM) == -1) {
+  if (send(trb3_sockfd, (void*)udpBuffer, size * 2, MSG_CONFIRM) == -1) {
     trb_errno = TRB_TRB3_SOCKET_ERROR;
     return -1;
   }
-
+  
   /* GetData */
-  status = recv(trb3_sockfd, (void*)dataBuffer, 1500, 0);
+  status = recv(trb3_sockfd_in, (void*)dataBuffer, 1500, 0);
   if (status == -1) {
     trb_errno = TRB_TRB3_SOCKET_ERROR;
     return -1;
   }
-  dataBufferSize = status;
+  dataBufferSize = status / 2;
+  
+  /* Adjust endianess ... */
+  if (trb_debug > 2) {
+    fprintf(stderr, "udp received: %d\n", status);
+  }
+  for (i = 0; i < status / 2; i++) {
+    dataBuffer[i] = ntohs(dataBuffer[i]);
+    if (trb_debug > 2) {
+      fprintf(stderr, "%d  0x%04x\n", i, dataBuffer[i]);
+    }
+  }
   
   return status;
 }
@@ -587,7 +609,7 @@ enum FIFO_READ_MODE {
   FIFO_MODE_SET_ADDRESS
 };
 
-static int trb_fifo_read(uint8_t channel,
+int trb_fifo_read(uint8_t channel,
                          int mode,
                          uint32_t data[],
                          unsigned int dsize)
@@ -598,8 +620,10 @@ static int trb_fifo_read(uint8_t channel,
   uint32_t* tmp = &dataBuffer;
   uint32_t fifoBuffer = 0;
   unsigned int timeout = 0;
-#elif defined PEXOR || defined TRB3 
+#elif defined PEXOR
   uint32_t* tmp = dataBuffer;
+#elif defined TRB3
+  uint16_t* tmp = dataBuffer;
 #endif
 
   TRB_Package package = {0,0,0,0,0};
@@ -650,13 +674,18 @@ static int trb_fifo_read(uint8_t channel,
   }
 #endif
 #endif
-  
-  /* Read FIFO-Buffer, copy to User-Buffer */
+#ifndef TRB3
   while ((*tmp & MASK_FIFO_VALID) != 0) {
-    
+#else
+    while (1) {
+#endif
     fifoDebugCtr++;
 
+#ifndef TRB3
     if (((*tmp & MASK_FIFO_TYPE) >> SHIFT_FIFO_TYPE) == FIFO_TYPE_IS_HEADER) {
+#else
+    if ((counter % 5) == 0) {
+#endif     
       /* TRBNet HEADER */
       if ((counter % 5) == 0) {
         /* New Package begins */
@@ -695,6 +724,7 @@ static int trb_fifo_read(uint8_t channel,
                 fifoDebugCtr, *tmp);
       }
 
+#ifndef TRB3
       if (((*tmp & MASK_FIFO_TYPE) >> SHIFT_FIFO_TYPE) !=
           (counter - 1) % 2) {
         /* Error: invalid sequence (not 0, 1, .), flush FIFO-BUFFER, exit */
@@ -704,6 +734,7 @@ static int trb_fifo_read(uint8_t channel,
         trb_errno = TRB_FIFO_SEQUENZ;
         return -1;
       }
+#endif
     }
 
     switch (counter) {
@@ -1465,9 +1496,10 @@ void close_ports()
 int init_ports()
 {
   char* trb3_name = NULL;
-  struct sockaddr_in server_addr;
-  struct hostent *host = NULL;
-  
+  struct sockaddr_in sender_addr;
+  struct sockaddr_in receiver_addr;
+  struct hostent* host = NULL;
+
   trb_errno = TRB_NONE;
   
   if (trb_debug > 0) {
@@ -1484,24 +1516,46 @@ int init_ports()
     return -1;
   }
  
+  /* Sender Socket */
   trb3_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
   if (trb3_sockfd == -1) {
     trb_errno = TRB_TRB3_SOCKET_ERROR;
     return -1;
   }
-  server_addr.sin_family = AF_INET;
-  server_addr.sin_port = htons(trb3_port);  
-  server_addr.sin_addr = *((struct in_addr *)host->h_addr);
-  memset(&(server_addr.sin_zero), 0, 8);
+  sender_addr.sin_family = AF_INET;
+  sender_addr.sin_port = htons(trb3_port);  
+  sender_addr.sin_addr = *((struct in_addr *)host->h_addr);
+  memset(&(sender_addr.sin_zero), 0, 8);
   if (connect(trb3_sockfd, 
-              (struct sockaddr *)&server_addr,
+              (struct sockaddr *)&sender_addr,
               sizeof(struct sockaddr)) == -1) {
     trb_errno = TRB_TRB3_SOCKET_ERROR;
     return -1;
   }
-
+  
   if (trb_debug > 0) {
-    fprintf(stderr, "init_ports: TRB3-Socket opened = %d\n", trb3_sockfd);
+    fprintf(stderr, "init_ports: TRB3-Socket out opened = %d\n", trb3_sockfd);
+  }
+  
+  /* Receiver Socket */
+  trb3_sockfd_in = socket(AF_INET, SOCK_DGRAM, 0);
+  if (trb3_sockfd_in == -1) {
+    trb_errno = TRB_TRB3_SOCKET_ERROR;
+    return -1;
+  }
+  receiver_addr.sin_family = AF_INET;
+  receiver_addr.sin_port = htons(trb3_port);  
+  receiver_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+  memset(&(receiver_addr.sin_zero), 0, 8);
+  if (bind(trb3_sockfd_in,
+          (struct sockaddr *)&receiver_addr,
+          sizeof(struct sockaddr)) ==-1) {
+    trb_errno = TRB_TRB3_SOCKET_ERROR;
+    return -1;
+  }
+  
+  if (trb_debug > 0) {
+    fprintf(stderr, "init_ports: TRB3-Socket in opened = %d\n", trb3_sockfd_in);
   }
   
   /* Init semaphore and signal handling */
@@ -1568,19 +1622,19 @@ int trb_register_read(uint16_t trb_address,
 
 #elif defined TRB3
   /* Create TRBPackage */
-  udpBuffer[0] = HEADER_HDR;
+  udpBuffer[0] = HEADER_HDR | 0x30;
   udpBuffer[1] = sender_address;
   udpBuffer[2] = trb_address;
   udpBuffer[3] = 0;
   udpBuffer[4] = CMD_REGISTER_READ;
   
-  udpBuffer[5] = HEADER_DAT;
+  udpBuffer[5] = HEADER_DAT | 0x30;
   udpBuffer[6] = reg_address;
   udpBuffer[7] = 0;
   udpBuffer[8] = 0;
   udpBuffer[9] = 0;
   
-  udpBuffer[10] = HEADER_TRM;
+  udpBuffer[10] = HEADER_TRM | 0x30;
   udpBuffer[11] = 0;
   udpBuffer[12] = 0;
   udpBuffer[13] = 0;
@@ -1664,19 +1718,19 @@ int trb_registertime_read(uint16_t trb_address,
 
 #elif defined TRB3
   /* Create TRBPackage */
-  udpBuffer[0] = HEADER_HDR;
+  udpBuffer[0] = HEADER_HDR | 0x30;
   udpBuffer[1] = sender_address;
   udpBuffer[2] = trb_address;
   udpBuffer[3] = 0;
   udpBuffer[4] = CMD_REGISTER_READ;
   
-  udpBuffer[5] = HEADER_DAT;
+  udpBuffer[5] = HEADER_DAT | 0x30;
   udpBuffer[6] = reg_address;
   udpBuffer[7] = 0;
   udpBuffer[8] = 0;
   udpBuffer[9] = 0;
   
-  udpBuffer[10] = HEADER_TRM;
+  udpBuffer[10] = HEADER_TRM | 0x30;
   udpBuffer[11] = 0;
   udpBuffer[12] = 0;
   udpBuffer[13] = 0;
@@ -1771,19 +1825,19 @@ int trb_register_read_mem(uint16_t trb_address,
 
 #elif defined TRB3
   /* Create TRBPackage */
-  udpBuffer[0] = HEADER_HDR;
+  udpBuffer[0] = HEADER_HDR | 0x30;
   udpBuffer[1] = sender_address;
   udpBuffer[2] = trb_address;
   udpBuffer[3] = 0;
   udpBuffer[4] = CMD_REGISTER_READ_MEM;
   
-  udpBuffer[5] = HEADER_DAT;
+  udpBuffer[5] = HEADER_DAT | 0x30;
   udpBuffer[6] = reg_address;
   udpBuffer[7] = length;
   udpBuffer[8] = 0;
   udpBuffer[9] = 0;
   
-  udpBuffer[10] = HEADER_TRM;
+  udpBuffer[10] = HEADER_TRM | 0x30;
 
   udpBuffer[12] = 0;
   udpBuffer[13] = 0;
@@ -1889,19 +1943,19 @@ int trb_registertime_read_mem(uint16_t trb_address,
 
 #elif defined TRB3
 
-  udpBuffer[0] = HEADER_HDR;
+  udpBuffer[0] = HEADER_HDR | 0x30;
   udpBuffer[1] = sender_address;
   udpBuffer[2] = trb_address;
   udpBuffer[3] = 0;
   udpBuffer[4] = CMD_REGISTER_READ_MEM;
   
-  udpBuffer[5] = HEADER_DAT;
+  udpBuffer[5] = HEADER_DAT | 0x30;
   udpBuffer[6] = reg_address;
   udpBuffer[7] = length;
   udpBuffer[8] = 0;
   udpBuffer[9] = 0;
   
-  udpBuffer[10] = HEADER_TRM;
+  udpBuffer[10] = HEADER_TRM | 0x30;
   udpBuffer[11] = 0;
   udpBuffer[12] = 0;
   udpBuffer[13] = 0;
@@ -1996,19 +2050,19 @@ int trb_register_write(uint16_t trb_address,
 
 #elif defined TRB3
 
-  udpBuffer[0] = HEADER_HDR;
+  udpBuffer[0] = HEADER_HDR | 0x30;
   udpBuffer[1] = sender_address;
   udpBuffer[2] = trb_address;
   udpBuffer[3] = 0;
   udpBuffer[4] = CMD_REGISTER_WRITE;
   
-  udpBuffer[5] = HEADER_DAT;
+  udpBuffer[5] = HEADER_DAT | 0x30;
   udpBuffer[6] = reg_address;
   udpBuffer[7] = (value >> 16) & 0xffff;
   udpBuffer[8] = value & 0xffff;
   udpBuffer[9] = 0;
   
-  udpBuffer[10] = HEADER_TRM;
+  udpBuffer[10] = HEADER_TRM | 0x30;
   udpBuffer[11] = 0;
   udpBuffer[12] = 0;
   udpBuffer[13] = 0;
@@ -2116,13 +2170,13 @@ int trb_register_write_mem(uint16_t trb_address,
 
 #elif defined TRB3
 
-  udpBuffer[0] = HEADER_HDR;
+  udpBuffer[0] = HEADER_HDR | 0x30;
   udpBuffer[1] = sender_address;
   udpBuffer[2] = trb_address;
   udpBuffer[3] = 0;
   udpBuffer[4] = CMD_REGISTER_WRITE_MEM;
   
-  udpBuffer[5] = HEADER_DAT;
+  udpBuffer[5] = HEADER_DAT | 0x30;
   if (option == 0) {
     udpBuffer[6] = reg_address + ctr;
   } else {
@@ -2134,14 +2188,14 @@ int trb_register_write_mem(uint16_t trb_address,
   
   udpCtr = 10;  
   for (i = 0; i < len; i++, ctr++) {
-    udpBuffer[udpCtr++] = HEADER_DAT;
+    udpBuffer[udpCtr++] = HEADER_DAT | 0x30;
     udpBuffer[udpCtr++] = 0x00000000;
     udpBuffer[udpCtr++] = (data[ctr] >> 16) & 0xffff;
     udpBuffer[udpCtr++] = data[ctr] & 0xffff;
     udpBuffer[udpCtr++] = 0x00000000;
   }
 
-  udpBuffer[udpCtr++] = HEADER_TRM;
+  udpBuffer[udpCtr++] = HEADER_TRM | 0x30;
   udpBuffer[udpCtr++] = 0;
   udpBuffer[udpCtr++] = 0;
   udpBuffer[udpCtr++] = 0;
@@ -2234,23 +2288,24 @@ int trb_read_uid(uint16_t trb_address,
 
 #elif defined TRB3
 
-  udpBuffer[0] = HEADER_HDR;
+  udpBuffer[0] = HEADER_HDR | 0x30;
   udpBuffer[1] = sender_address;
   udpBuffer[2] = trb_address;
   udpBuffer[3] = 0;
   udpBuffer[4] = CMD_NETADMINISTRATION;
   
-  udpBuffer[5] = HEADER_DAT;
+  udpBuffer[5] = HEADER_DAT | 0x30 ;
   udpBuffer[6] = NET_READUNIQUEID;
   udpBuffer[7] = 0;
   udpBuffer[8] = 0;
   udpBuffer[9] = 0;
   
-  udpBuffer[10] = HEADER_TRM;
+  udpBuffer[10] = HEADER_TRM | 0x30;
   udpBuffer[11] = 0;
   udpBuffer[12] = 0;
   udpBuffer[13] = 0;
   udpBuffer[14] = CMD_NETADMINISTRATION;
+    
   
   status = sendTrbPackage(15);
   
@@ -2336,25 +2391,25 @@ int trb_set_address(uint64_t uid,
 
 #elif defined TRB3
 
-  udpBuffer[0] = HEADER_HDR;
+  udpBuffer[0] = HEADER_HDR | 0x30;
   udpBuffer[1] = sender_address;
   udpBuffer[2] = trb_address;
   udpBuffer[3] = 0;
   udpBuffer[4] = CMD_NETADMINISTRATION;
   
-  udpBuffer[5] = HEADER_DAT;
+  udpBuffer[5] = HEADER_DAT | 0x30;
   udpBuffer[6] = NET_SETADDRESS;
   udpBuffer[7] = (uint16_t)(uid);
   udpBuffer[8] = (uint16_t)(uid >> 16);
   udpBuffer[9] = (uint16_t)(uid >> 32);
 
-  udpBuffer[10] = HEADER_DAT;
+  udpBuffer[10] = HEADER_DAT | 0x30;
   udpBuffer[11] = (uint16_t)(uid >> 48);
   udpBuffer[12] = endpoint;
   udpBuffer[13] = trb_address;
   udpBuffer[14] = 0;
   
-  udpBuffer[15] = HEADER_TRM;
+  udpBuffer[15] = HEADER_TRM | 0x30;
   udpBuffer[16] = 0;
   udpBuffer[17] = 0;
   udpBuffer[18] = 0;