-const char trbnet_version[] = "$Revision: 4.20 $ Local";
+const char trbnet_version[] = "$Revision: 4.21 $ Local";
#include <stdlib.h>
#include <signal.h>
#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
/* 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;
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;
}
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)
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};
}
#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 */
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 */
trb_errno = TRB_FIFO_SEQUENZ;
return -1;
}
+#endif
}
switch (counter) {
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) {
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 */
#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;
#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;
#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;
#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;
#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;
#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 {
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;
#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);
#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;