From: hadaq Date: Fri, 29 Oct 2010 19:21:55 +0000 (+0000) Subject: major bug in FIFO_READ_MEM, second try X-Git-Tag: v6.0~188 X-Git-Url: https://jspc29.x-matter.uni-frankfurt.de/git/?a=commitdiff_plain;h=7b6bb1c17256480a630ccd506171535cf7a46640;p=trbnettools.git major bug in FIFO_READ_MEM, second try --- diff --git a/libtrbnet/trbnet.c b/libtrbnet/trbnet.c index 1914c0a..efac30a 100644 --- a/libtrbnet/trbnet.c +++ b/libtrbnet/trbnet.c @@ -1,4 +1,4 @@ -const char trbnet_version[] = "$Revision: 2.86 $"; +const char trbnet_version[] = "$Revision: 2.87 $"; #include #include @@ -481,6 +481,10 @@ static int trb_fifo_read(uint8_t channel, int userBufferOvf = 0; unsigned int timeout = 0; + uint32_t* lastHeader = NULL; /* used by FIFO_MODE_REG_READ_MEM Mode */ + uint32_t memLen = 0; /* used by FIFO_MODE_REG_READ_MEM + and FIFO_MODE_IPU_DATA Mode */ + /* Determin FIFO-Address */ if (channel >= 4) { trb_errno = TRB_INVALID_CHANNEL; @@ -512,9 +516,7 @@ static int trb_fifo_read(uint8_t channel, /* Read FIFO-Buffer, copy to User-Buffer */ while ((*tmp & MASK_FIFO_VALID) != 0) { - uint32_t* lastHeader = NULL; /* used by FIFO_MODE_REG_READ_MEM Mode */ - uint32_t memLen = 0; /* used by FIFO_MODE_REG_READ_MEM - and FIFO_MODE_IPU_DATA Mode */ + fifoDebugCtr++; if (((*tmp & MASK_FIFO_TYPE) >> SHIFT_FIFO_TYPE) == FIFO_TYPE_IS_HEADER) { @@ -737,7 +739,6 @@ static int trb_fifo_read(uint8_t channel, break; case FIFO_MODE_REG_READ_MEM: - { switch (headerType) { case HEADER_HDR: if (dataCtr < dsize) { @@ -773,7 +774,6 @@ static int trb_fifo_read(uint8_t channel, case HEADER_TRM: if (lastHeader != NULL) { *lastHeader |= (memLen << 16); - lastHeader = NULL; } break; @@ -782,64 +782,60 @@ static int trb_fifo_read(uint8_t channel, trb_errno = TRB_FIFO_INVALID_HEADER; return -1; } - } - break; + break; case FIFO_MODE_REGTIME_READ_MEM: - { - switch (headerType) { - case HEADER_HDR: - if (dataCtr < dsize) { - if (lastHeader != NULL) { - *lastHeader |= (memLen << 16); - } - memLen = 0; - lastHeader = &data[dataCtr]; - data[dataCtr++] = (uint32_t)package.F0; + switch (headerType) { + case HEADER_HDR: + if (dataCtr < dsize) { + if (lastHeader != NULL) { + *lastHeader |= (memLen << 16); + } + memLen = 0; + lastHeader = &data[dataCtr]; + data[dataCtr++] = (uint32_t)package.F0; #ifdef TRB_DEBUGGER - fprintf(stderr, "D: H: 0x%04x\n", data[dataCtr - 1]); + fprintf(stderr, "D: H: 0x%04x\n", data[dataCtr - 1]); #endif - } else { - userBufferOvf = 1; - } - break; - - case HEADER_DAT: - if (dataCtr + 1< dsize) { - if (package.F0 == 0x0000) break; /* it a hack, ask Jan */ - data[dataCtr++] = (((uint32_t)package.F1 << 16) | - ((uint32_t)package.F2)); - data[dataCtr++] = (uint32_t)package.F3; + } else { + userBufferOvf = 1; + } + break; + + case HEADER_DAT: + if (dataCtr + 1< dsize) { + if (package.F0 == 0x0000) break; /* it a hack, ask Jan */ + data[dataCtr++] = (((uint32_t)package.F1 << 16) | + ((uint32_t)package.F2)); + data[dataCtr++] = (uint32_t)package.F3; #ifdef TRB_DEBUGGER - fprintf(stderr, - "D: 0x%04x 0x%08x\n", memLen, data[dataCtr - 1]); + fprintf(stderr, + "D: 0x%04x 0x%08x\n", memLen, data[dataCtr - 1]); #endif - memLen++; - } else { - userBufferOvf = 1; - } - break; - - case HEADER_TRM: - if (lastHeader != NULL) { - *lastHeader |= (memLen << 16); - lastHeader = NULL; - } - break; - - default: - fifo_flush(channel); - trb_errno = TRB_FIFO_INVALID_HEADER; - return -1; + memLen++; + } else { + userBufferOvf = 1; + } + break; + + case HEADER_TRM: + if (lastHeader != NULL) { + *lastHeader |= (memLen << 16); } + break; + + default: + fifo_flush(channel); + trb_errno = TRB_FIFO_INVALID_HEADER; + return -1; } break; - + case FIFO_MODE_REG_WRITE: if (headerType == HEADER_TRM) break; break; - + case FIFO_MODE_IPU_DATA: { unsigned int i; @@ -2025,3 +2021,4 @@ int trb_register_modify(uint16_t trb_address, return 0; } +