#include <stdint.h>
#include <math.h>
+//#define TRB_DEBUGGER 1
+
+
/* Used by trb_register_modify and trb_nettrace */
#define TMP_DATA_SIZE (1024 * 2)
static uint32_t tmpData[TMP_DATA_SIZE];
static uint16_t* udpBuffer = udpBufferS + 1;
static uint16_t dataBufferR[1 + 4096 * 1024]; /* UDP Receive buffer + Header */
static uint16_t* dataBuffer = dataBufferR + 1;
+
static unsigned int dataBufferSize = 0; /* Size of dataBuffer in 16Bit words */
static uint8_t udp_command_index = 0;
static int trb3_sockfd = -1;
}
/* Read Data */
- status = recvfrom(trb3_sockfd,
- (void*)dataBufferR,
+
+ uint8_t command_index_type = 2;
+ uint8_t command_index_ret;
+
+ dataBufferSize = 0;
+
+ uint8_t pkt_nr = 0;
+
+ static uint16_t dataBufferTemp[32768 * 2]; // temporary buffer for multi-packet responses
+
+// gk this fragment rewritten to support multi-packet responses
+ while(1) {
+
+ status = recvfrom(trb3_sockfd,
+ (void*)dataBufferTemp,
65536,
- MSG_DONTWAIT,
+ //MSG_DONTWAIT,
+ MSG_WAITALL, //MSG_DONTWAIT,
(struct sockaddr*)&in_addr,
&in_addr_len);
-
- if (status == -1) {
- trb_errno = TRB_TRB3_SOCKET_ERROR;
- return -1;
- }
-
- dataBufferSize = status / 2;
- if (trb_debug > 2) {
- fprintf(stderr, "udp received: %d\n", status);
- }
-
- /* Adjust endianess ... */
- for (i = 0; i < status / 2; i++) {
- dataBufferR[i] = ntohs(dataBufferR[i]);
- if (trb_debug > 2) {
- fprintf(stderr, "%d 0x%04x\n", i, dataBufferR[i]);
- }
- }
-
- /* Check returned udp_command_index */
- if (trb3_udp_version == 2) {
- uint8_t command_index_type = (uint8_t)(dataBufferR[0] >> 8);
- uint8_t command_index_ret = (uint8_t)(dataBufferR[0] & 0x00ff);
- if (command_index_type != 2) {
- if (trb_debug > 1) {
- fprintf(stderr, "getUDPPackage: invalid command_index_type: %d\n",
- command_index_type);
- }
- trb_errno = TRB_TRB3_INVALID_UDP_HEADER;
- return -1;
- }
+
+ if (trb_debug > 2)
+ fprintf(stderr, "Received %d bytes\n", status);
+
+ if (status == -1) {
+ trb_errno = TRB_TRB3_SOCKET_ERROR;
+ return -1;
+ }
+
+ if (trb_debug > 2) {
+ fprintf(stderr, "udp received: %d\n", status);
+ }
- if (command_index_ret != udp_command_index) {
- if (trb_debug > 1) {
- fprintf(stderr,
- "getUDPPackage: invalid : udp_command_index: "
- "0x%02x != 0x%02x\n",
- command_index_ret, udp_command_index);
- }
- trb_errno = TRB_TRB3_INVALID_UDP_HEADER;
- return -1;
- }
- }
-
- return status;
+// fprintf(stderr, "dataBufferSize %d status %d pkt_nr %d\n", dataBufferSize, status, pkt_nr);
+
+// for (i = 0; i < status / 2; i+= 2)
+// fprintf(stdout, "%d: %04x %04x\n", i, (unsigned int) dataBufferTemp[i], (unsigned int) dataBufferTemp[i+1]);
+
+ // workaround for minimal successive packet
+ //if (pkt_nr > 1 && status == 12) {
+ // dataBufferSize -= 1;
+ //}
+
+
+ /* Adjust endianess ... */
+ for (i = 0; i < (status - (pkt_nr == 0 ? 0 : 2)) / 2; i++) {
+ dataBufferR[dataBufferSize + i] = ntohs(dataBufferTemp[i + (pkt_nr == 0 ? 0 : 1)]);
+ if (trb_debug > 2) {
+ fprintf(stderr, "%d 0x%04x\n", i, dataBufferR[i]);
+ }
+ }
+
+ dataBufferSize += status / 2 - (pkt_nr == 0 ? 0 : 1);
+
+
+ /* Check returned udp_command_index */
+ if (trb3_udp_version == 2) {
+ command_index_type = (uint8_t)(dataBufferTemp[0] & 0x00ff);
+ command_index_ret = (uint8_t)(dataBufferTemp[0] >> 8);
+
+ //fprintf(stderr, "index_type %d index_ret %d %d\n", command_index_type, command_index_ret, udp_command_index);
+
+ if (command_index_type != 2 && command_index_type != 3 && command_index_type != 4) {
+ if (trb_debug > 1) {
+ fprintf(stderr, "getUDPPackage: invalid command_index_type: %d\n",
+ command_index_type);
+ }
+ trb_errno = TRB_TRB3_INVALID_UDP_HEADER;
+ fprintf(stderr, "exiting because of the command type");
+ return -1;
+ }
+
+ /*if (command_index_ret != udp_command_index) {
+ if (trb_debug > 1) {
+ fprintf(stderr,
+ "getUDPPackage: invalid : udp_command_index: "
+ "0x%02x != 0x%02x\n",
+ command_index_ret, udp_command_index);
+ }
+ trb_errno = TRB_TRB3_INVALID_UDP_HEADER;
+ return -1;
+ }*/
+
+
+ if (command_index_type == 2) {
+ //fprintf(stderr, "getUDPPackage: received standard packet\n");
+ break;
+ }
+ else if (command_index_type == 3) {
+ //fprintf(stderr, "getUDPPackage: received multi-packet flag\n");
+ pkt_nr++;
+ }
+ else if (command_index_type == 4) {
+ //fprintf(stderr, "getUDPPackage: received end-of-response flag\n");
+ break;
+ }
+
+ }
+ else {
+ //fprintf(stderr, "trb3_udp_version %d\n", trb3_udp_version);
+ break;
+ }
+ }
+ //fprintf(stdout, "Total size: %d\n", dataBufferSize);
+
+// for (i = 0; i < dataBufferSize; i+=2)
+ // fprintf(stdout, "%d: %04x %04x \n", i, (unsigned int) dataBufferR[i], (unsigned int) dataBufferR[i+1]);
+
+// for (i = 3; i < dataBufferSize; i++) {
+// if (dataBufferR[i] == 0x8300) {
+// if (dataBufferR[i + 1] != 0x0000 || dataBufferR[i + 2] != 0x0000 || dataBufferR[i - 1] != 0x0038) {
+// fprintf(stderr, "data format error at %d\n", i);
+// }
+// }
+// }
+
+
+
+// for (i = 0; i < dataBufferSize; i++) {
+// fprintf(stderr, "%04X\n", dataBufferR[i]);
+// }
+
+// fprintf(stderr, "TESTING:\n");
+ unsigned int prev_d2 = 0;
+ unsigned int prev_d3 = 0;
+ for (i = 6; i < dataBufferSize; i += 5) {
+ //d = i(d << 16) | dataBufferR[i];
+ //if (i % 2 == 0) fprintf(stderr, "%08X\n", d);
+ unsigned int d1 = dataBufferR[i] << 16 | dataBufferR[i+1];
+ unsigned int d2 = dataBufferR[i+2] << 16 | dataBufferR[i+3];
+ unsigned int d3 = dataBufferR[i+4];
+// fprintf(stderr, "%08X %08X %04X\n", d1, d2, d3);
+ if (prev_d2 != 0 && d2 - prev_d2 != 1 && d1 == 0x00388315)
+ fprintf(stderr, "ERROR in counter sequence %d\n", i);
+// if (d1 != 0x00388315 && d2 != 0x00000001)
+// fprintf(stdout, "ERROR in fixed d1 values %d\n", i);
+// if (prev_d3 != 0 && d3 != prev_d3 && d2 != 0x00000001)
+// fprintf(stdout, "ERROR in fixed d3 value %d\n", i);
+
+
+ prev_d2 = d2;
+ prev_d3 = d3;
+ }
+
+// fprintf(stderr, "TEST END\n");
+
+
+//fprintf(stderr, "return size %d\n", dataBufferSize * 2);
+ return dataBufferSize * 2;
}
static int sendTrbPackage(size_t size)
/* GetData */
status = getUDPPackage();
+
+//fprintf(stderr, "status %d\n", status);
+
if (status > 0) break; /* Success */
if (trb_errno == TRB_TRB3_SOCKET_ERROR) return -1; /* UDP Error */
+
/* UDP Timeout, resend request */
timeoutCtr++;
}
-
+
+
return status;
}
uint32_t data[],
unsigned int dsize)
{
-
#ifdef ETRAX
static uint32_t dataBuffer = 0;
uint32_t* tmp = &dataBuffer;
uint32_t memLen = 0; /* used by FIFO_MODE_REG_READ_MEM
and FIFO_MODE_IPU_DATA Mode */
+
+//fprintf(stderr, "gk: %u %u\n", dataBufferSize, dsize);
+
#ifdef ETRAX
/* Determin FIFO-Address */
if (channel >= 4) {
/* Determine H0 HeaderType */
headerType = (package.H0 & MASK_HEADER_TYPE) >> SHIFT_HEADER_TYPE;
-
+//fprintf(stderr, "gk %x\n", package.H0);
/* DEBUG INFO */
if (trb_debug > 0) {
TRB_Package_dump(&package);
break;
case FIFO_MODE_REG_READ_MEM:
+//fprintf(stderr, "gk %d %d %d\n", headerType, dataCtr, dsize);
switch (headerType) {
+
case HEADER_HDR:
if (dataCtr < dsize) {
if (lastHeader != NULL) {
((uint32_t)package.F2));
#ifdef TRB_DEBUGGER
fprintf(stderr,
- "D: 0x%04x 0x%08x\n", memLen, data[dataCtr - 1]);
+ "D: 0x%04x 0x%08x\n", memLen, data[dataCtr - 1]);
#endif
memLen++;
} else {
#ifdef ETRAX
fifo_flush(channel);
#endif
+fprintf(stderr, "tutaj\n");
trb_errno = TRB_FIFO_INVALID_HEADER;
return -1;
}
udpBuffer[14] = CMD_REGISTER_READ_MEM;
status = sendTrbPackage(15);
-
if (status < 0) {
unlockPorts(0);
return -1;
if (trb_debug > 0) {
fprintf(stderr, "CMD_REGISTER_READ_MEM started.\n");
}
-
status = trb_fifo_read(3, FIFO_MODE_REG_READ_MEM, data, dsize);
-
if (unlockPorts(0) == -1) return -1;
if (status == -1) return status;