From 31523a8b0a5b4aa43466b93b87cfe8da28636506 Mon Sep 17 00:00:00 2001 From: Aaron Cuevas Lopez Date: Mon, 18 Dec 2023 12:59:00 +0100 Subject: [PATCH] Some fixes to ft600 onidriver --- api/liboni/drivers/ft600/circbuffer.h | 4 +- api/liboni/drivers/ft600/onidriver_ft600.c | 113 +++++++++++------- .../drivers/ft600/onidriver_ft600.vcxproj | 8 +- .../drivers/riffa/onidriver_riffa.vcxproj | 8 +- .../drivers/test/onidriver_test.vcxproj | 8 +- .../xillybus/onidriver_xillybus.vcxproj | 8 +- api/liboni/liboni-test/liboni-test.vcxproj | 8 +- api/liboni/liboni.vcxproj | 8 +- .../onix-loadtest/onix-loadtest.vcxproj | 8 +- drivers/riffa/windows/lib/riffa.vcxproj | 8 +- 10 files changed, 105 insertions(+), 76 deletions(-) diff --git a/api/liboni/drivers/ft600/circbuffer.h b/api/liboni/drivers/ft600/circbuffer.h index 106734b..d5e22e4 100644 --- a/api/liboni/drivers/ft600/circbuffer.h +++ b/api/liboni/drivers/ft600/circbuffer.h @@ -6,8 +6,8 @@ //This buffer and its functions should be thread safe as long as only one thread //writes and only one thread reads typedef struct { - size_t read; - size_t write; + volatile size_t read; + volatile size_t write; size_t size; uint8_t* buffer; } circ_buffer_t; diff --git a/api/liboni/drivers/ft600/onidriver_ft600.c b/api/liboni/drivers/ft600/onidriver_ft600.c index db96992..f581e1e 100644 --- a/api/liboni/drivers/ft600/onidriver_ft600.c +++ b/api/liboni/drivers/ft600/onidriver_ft600.c @@ -71,7 +71,7 @@ struct oni_ft600_ctx_impl { uint8_t* auxBuffer; size_t auxSize; uint32_t prioValue; - oni_ft600_state state; + volatile oni_ft600_state state; oni_ft600_sigstate sigState; unsigned short sigOffset; unsigned short sigError; @@ -180,18 +180,26 @@ void oni_ft600_usb_callback(PVOID context, E_FT_NOTIFICATION_CALLBACK_TYPE type, if (!info) return; oni_ft600_ctx ctx = (oni_ft600_ctx)context; ULONG transferred; + ULONG total = 0; + do { + FT_ReadPipe(ctx->ftHandle, + info->ucEndpointNo, + ctx->auxBuffer + total, + info->ulRecvNotificationLength - total, + &transferred, + &ctx->sigOverlapped); + ftStatus = FT_GetOverlappedResult( + ctx->ftHandle, &ctx->sigOverlapped, &transferred, TRUE); + if (ftStatus != FT_OK) { + ctx->sigError = 1; + return; + } + total += transferred; + } while (total < info->ulRecvNotificationLength); - FT_ReadPipe(ctx->ftHandle, info->ucEndpointNo, ctx->auxBuffer, info->ulRecvNotificationLength, &transferred, &ctx->sigOverlapped); - ftStatus = FT_GetOverlappedResult(ctx->ftHandle, &ctx->sigOverlapped, &transferred, TRUE); - if (ftStatus != FT_OK) - { - ctx->sigError = 1; - return; - } - - if (transferred > 0) + if (total > 0) { fill_control_buffers(ctx, transferred); } @@ -529,6 +537,8 @@ int oni_driver_read_stream(oni_driver_ctx driver_ctx, } else if (stream == ONI_READ_STREAM_DATA) { + while (ctx->state != STATE_RUNNING) + ; size_t remaining = ((size >> 2) << 2);//round to 32bit boundaries; FT_STATUS ftStatus; int read = 0; @@ -549,37 +559,55 @@ int oni_driver_read_stream(oni_driver_ctx driver_ctx, dstPtr += to_read; read += to_read; } - while (remaining > 0) - { - unsigned int simIndex = ctx->nextReadIndex % ctx->numInOverlapped; - unsigned int nextIndex = (ctx->nextReadIndex + ctx->numInOverlapped) % (2 * ctx->numInOverlapped); - ULONG transferred; - ftStatus = FT_GetOverlappedResult(ctx->ftHandle, &ctx->inOverlapped[simIndex], &ctx->inTransferred[simIndex], TRUE); - if (ftStatus != FT_OK) - { - printf("Read failure %d\n", ftStatus); - return ONI_EREADFAILURE; - } - transferred = ctx->inTransferred[simIndex]; - //read in the next part of the double buffer - FT_ReadPipeEx(ctx->ftHandle, pipe_in, ctx->inBuffer + ((size_t)nextIndex * ctx->inBlockSize), ctx->inBlockSize, - &ctx->inTransferred[simIndex], &ctx->inOverlapped[simIndex]); - srcPtr = ctx->inBuffer + ctx->inBlockSize * (size_t)ctx->nextReadIndex; - to_read = MIN(remaining, transferred); - memcpy(dstPtr, srcPtr, to_read); - // for (int i = 0; i < to_read; i++) printf("%x ", *(dstPtr + i)); - remaining -= to_read; - dstPtr += to_read; - read += to_read; - ctx->nextReadIndex = (ctx->nextReadIndex + 1) % (2 * ctx->numInOverlapped); - if (to_read < transferred) - { - ctx->lastReadRead = transferred; - ctx->lastReadOffset = to_read; - } - else - ctx->lastReadOffset = 0; - } + while (remaining > 0) { + unsigned int simIndex = ctx->nextReadIndex % ctx->numInOverlapped; + unsigned int nextIndex = (ctx->nextReadIndex + ctx->numInOverlapped) + % (2 * ctx->numInOverlapped); + ULONG transferred; + ftStatus = FT_GetOverlappedResult(ctx->ftHandle, + &ctx->inOverlapped[simIndex], + &ctx->inTransferred[simIndex], + TRUE); + if (ftStatus != FT_OK) { + printf("Read failure %d\n", ftStatus); + return ONI_EREADFAILURE; + } + transferred = ctx->inTransferred[simIndex]; + // read in the next part of the double buffer + FT_ReadPipeEx(ctx->ftHandle, + pipe_in, + ctx->inBuffer + + ((size_t)nextIndex * ctx->inBlockSize), + ctx->inBlockSize, + &ctx->inTransferred[simIndex], + &ctx->inOverlapped[simIndex]); + // printf("R: %d\n", nextIndex); + srcPtr + = ctx->inBuffer + ctx->inBlockSize * (size_t)ctx->nextReadIndex; + to_read = MIN(remaining, transferred); + /* printf("\n%d - %d - %d - %d\n", + ctx->nextReadIndex, + nextIndex, + simIndex, + to_read);*/ + memcpy(dstPtr, srcPtr, to_read); + /* for (int i = 0; i < to_read; i++) + printf("%x ", *(dstPtr + i)); + printf("\n"); + for (int i = 0; i < to_read; i++) printf("%x ", *(srcPtr + + i));*/ + remaining -= to_read; + dstPtr += to_read; + read += to_read; + ctx->nextReadIndex + = (ctx->nextReadIndex + 1) % (2 * ctx->numInOverlapped); + if (to_read < transferred) { + ctx->lastReadRead = transferred; + ctx->lastReadOffset = to_read; + } else { + ctx->lastReadOffset = 0; + } + } #else ULONG transferred; uint8_t* dstPtr = (uint8_t*)data; @@ -738,12 +766,13 @@ int oni_driver_read_config(oni_driver_ctx driver_ctx, oni_config_t reg, oni_reg_ inline void oni_ft600_start_acq(oni_ft600_ctx ctx) { -#if _WIN32 + #if _WIN32 FT_STATUS rc; rc = FT_SetStreamPipe(ctx->ftHandle, FALSE, FALSE, pipe_in, ctx->inBlockSize); for (size_t i = 0; i < ctx->numInOverlapped; i++) { FT_ReadPipeEx(ctx->ftHandle, pipe_in, ctx->inBuffer + (i * ctx->inBlockSize), ctx->inBlockSize, &ctx->inTransferred[i], &ctx->inOverlapped[i]); + //printf("R: %d\n", i); } #endif ctx->state = STATE_RUNNING; diff --git a/api/liboni/drivers/ft600/onidriver_ft600.vcxproj b/api/liboni/drivers/ft600/onidriver_ft600.vcxproj index 521cd1f..4868617 100644 --- a/api/liboni/drivers/ft600/onidriver_ft600.vcxproj +++ b/api/liboni/drivers/ft600/onidriver_ft600.vcxproj @@ -29,26 +29,26 @@ DynamicLibrary true - v142 + v143 MultiByte DynamicLibrary false - v142 + v143 true MultiByte DynamicLibrary true - v142 + v143 MultiByte DynamicLibrary false - v142 + v143 true MultiByte diff --git a/api/liboni/drivers/riffa/onidriver_riffa.vcxproj b/api/liboni/drivers/riffa/onidriver_riffa.vcxproj index a032fd2..6e3301d 100644 --- a/api/liboni/drivers/riffa/onidriver_riffa.vcxproj +++ b/api/liboni/drivers/riffa/onidriver_riffa.vcxproj @@ -28,26 +28,26 @@ DynamicLibrary true - v142 + v143 MultiByte DynamicLibrary false - v142 + v143 true MultiByte DynamicLibrary true - v142 + v143 MultiByte DynamicLibrary false - v142 + v143 true MultiByte diff --git a/api/liboni/drivers/test/onidriver_test.vcxproj b/api/liboni/drivers/test/onidriver_test.vcxproj index 4453a5b..f5b4d45 100644 --- a/api/liboni/drivers/test/onidriver_test.vcxproj +++ b/api/liboni/drivers/test/onidriver_test.vcxproj @@ -29,26 +29,26 @@ DynamicLibrary true - v142 + v143 Unicode DynamicLibrary false - v142 + v143 true Unicode DynamicLibrary true - v142 + v143 Unicode DynamicLibrary false - v142 + v143 true Unicode diff --git a/api/liboni/drivers/xillybus/onidriver_xillybus.vcxproj b/api/liboni/drivers/xillybus/onidriver_xillybus.vcxproj index 1ea24c6..2d3878f 100644 --- a/api/liboni/drivers/xillybus/onidriver_xillybus.vcxproj +++ b/api/liboni/drivers/xillybus/onidriver_xillybus.vcxproj @@ -35,23 +35,23 @@ DynamicLibrary true - v142 + v143 DynamicLibrary false - v142 + v143 true DynamicLibrary true - v142 + v143 DynamicLibrary false - v142 + v143 true diff --git a/api/liboni/liboni-test/liboni-test.vcxproj b/api/liboni/liboni-test/liboni-test.vcxproj index 1f19c40..7c964fc 100644 --- a/api/liboni/liboni-test/liboni-test.vcxproj +++ b/api/liboni/liboni-test/liboni-test.vcxproj @@ -28,26 +28,26 @@ Application true - v142 + v143 Unicode Application false - v142 + v143 true Unicode Application true - v142 + v143 Unicode Application false - v142 + v143 true Unicode diff --git a/api/liboni/liboni.vcxproj b/api/liboni/liboni.vcxproj index fc49ee7..77d65eb 100644 --- a/api/liboni/liboni.vcxproj +++ b/api/liboni/liboni.vcxproj @@ -27,22 +27,22 @@ DynamicLibrary true - v142 + v143 DynamicLibrary false - v142 + v143 DynamicLibrary true - v142 + v143 DynamicLibrary false - v142 + v143 diff --git a/api/liboni/onix-loadtest/onix-loadtest.vcxproj b/api/liboni/onix-loadtest/onix-loadtest.vcxproj index 746873e..60965b5 100644 --- a/api/liboni/onix-loadtest/onix-loadtest.vcxproj +++ b/api/liboni/onix-loadtest/onix-loadtest.vcxproj @@ -29,26 +29,26 @@ Application true - v142 + v143 Unicode Application false - v142 + v143 true Unicode Application true - v142 + v143 Unicode Application false - v142 + v143 true Unicode diff --git a/drivers/riffa/windows/lib/riffa.vcxproj b/drivers/riffa/windows/lib/riffa.vcxproj index 9addb3a..87c13bf 100644 --- a/drivers/riffa/windows/lib/riffa.vcxproj +++ b/drivers/riffa/windows/lib/riffa.vcxproj @@ -28,26 +28,26 @@ DynamicLibrary true - v142 + v143 MultiByte DynamicLibrary false - v142 + v143 true MultiByte DynamicLibrary true - v142 + v143 MultiByte DynamicLibrary false - v142 + v143 true MultiByte