From: hadaq Date: Mon, 21 May 2012 20:05:42 +0000 (+0000) Subject: koennte klappen X-Git-Tag: v6.0~48 X-Git-Url: https://jspc29.x-matter.uni-frankfurt.de/git/?a=commitdiff_plain;h=043467628e6e7c294def5c69fd21ce262ae95630;p=trbnettools.git koennte klappen --- diff --git a/libtrbnet/trbnet.c b/libtrbnet/trbnet.c index f0775ec..2a7ceb6 100644 --- a/libtrbnet/trbnet.c +++ b/libtrbnet/trbnet.c @@ -1,4 +1,4 @@ -const char trbnet_version[] = "$Revision: 4.20 $ Local"; +const char trbnet_version[] = "$Revision: 4.21 $ Local"; #include #include @@ -38,10 +38,11 @@ int pexor_dma = 1; #include 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;