From f25e567f5440de3314ed1d42bdf89c4cb303e5cf Mon Sep 17 00:00:00 2001 From: Aaron Cuevas Lopez <aacuelo@teleco.upv.es> Date: Tue, 23 Jun 2015 00:09:21 +0200 Subject: [PATCH] Adapt rhythm API to use up to 16 data streams --- .../rhythm-api/rhd2000evalboard.cpp | 78 ++++++++++++++----- .../DataThreads/rhythm-api/rhd2000evalboard.h | 10 ++- 2 files changed, 64 insertions(+), 24 deletions(-) diff --git a/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.cpp b/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.cpp index 44b95a509..0e24f8da2 100755 --- a/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.cpp +++ b/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.cpp @@ -170,7 +170,7 @@ bool Rhd2000EvalBoard::uploadFpgaBitfile(string filename) boardId = dev->GetWireOutValue(WireOutBoardId); boardVersion = dev->GetWireOutValue(WireOutBoardVersion); - if (boardId != RHYTHM_BOARD_ID) { + if (boardId != (usb3 ? RHYTHM_BOARD_ID_USB3 : RHYTHM_BOARD_ID_USB2)) { cerr << "FPGA configuration does not support Rhythm. Incorrect board ID: " << boardId << endl; return(false); } else { @@ -234,7 +234,7 @@ void Rhd2000EvalBoard::initialize() setDataSource(7, PortD2); enableDataStream(0, true); // start with only one data stream enabled - for (i = 1; i < MAX_NUM_DATA_STREAMS; i++) { + for (i = 1; i < MAX_NUM_DATA_STREAMS(usb3); i++) { enableDataStream(i, false); } @@ -846,7 +846,7 @@ void Rhd2000EvalBoard::setDataSource(int stream, BoardDataSource dataSource) int bitShift; OkEndPoint endPoint; - if (stream < 0 || stream > 7) { + if (stream < 0 || stream > (MAX_NUM_DATA_STREAMS(usb3) - 1)) { cerr << "Error in Rhd2000EvalBoard::setDataSource: stream out of range." << endl; return; } @@ -884,6 +884,38 @@ void Rhd2000EvalBoard::setDataSource(int stream, BoardDataSource dataSource) endPoint = WireInDataStreamSel5678; bitShift = 12; break; + case 8: + endPoint = WireInDataStreamSel1234; + bitShift = 16; + break; + case 9: + endPoint = WireInDataStreamSel1234; + bitShift = 20; + break; + case 10: + endPoint = WireInDataStreamSel1234; + bitShift = 24; + break; + case 11: + endPoint = WireInDataStreamSel1234; + bitShift = 28; + break; + case 12: + endPoint = WireInDataStreamSel5678; + bitShift = 16; + break; + case 13: + endPoint = WireInDataStreamSel5678; + bitShift = 20; + break; + case 14: + endPoint = WireInDataStreamSel5678; + bitShift = 24; + break; + case 15: + endPoint = WireInDataStreamSel5678; + bitShift = 28; + break; } dev->SetWireInValue(endPoint, dataSource << bitShift, 0x000f << bitShift); @@ -893,7 +925,7 @@ void Rhd2000EvalBoard::setDataSource(int stream, BoardDataSource dataSource) // Enable or disable one of the eight available USB data streams (0-7). void Rhd2000EvalBoard::enableDataStream(int stream, bool enabled) { - if (stream < 0 || stream > (MAX_NUM_DATA_STREAMS - 1)) { + if (stream < 0 || stream > (MAX_NUM_DATA_STREAMS(usb3) - 1)) { cerr << "Error in Rhd2000EvalBoard::setDataSource: stream out of range." << endl; return; } @@ -991,30 +1023,32 @@ void Rhd2000EvalBoard::enableDac(int dacChannel, bool enabled) return; } + UINT32 dacEnMask = usb3 ? 0x0400 : 0x0200; + switch (dacChannel) { case 0: - dev->SetWireInValue(WireInDacSource1, (enabled ? 0x0200 : 0x0000), 0x0200); + dev->SetWireInValue(WireInDacSource1, (enabled ? dacEnMask : 0x0000), dacEnMask); break; case 1: - dev->SetWireInValue(WireInDacSource2, (enabled ? 0x0200 : 0x0000), 0x0200); + dev->SetWireInValue(WireInDacSource2, (enabled ? dacEnMask : 0x0000), dacEnMask); break; case 2: - dev->SetWireInValue(WireInDacSource3, (enabled ? 0x0200 : 0x0000), 0x0200); + dev->SetWireInValue(WireInDacSource3, (enabled ? dacEnMask : 0x0000), dacEnMask); break; case 3: - dev->SetWireInValue(WireInDacSource4, (enabled ? 0x0200 : 0x0000), 0x0200); + dev->SetWireInValue(WireInDacSource4, (enabled ? dacEnMask : 0x0000), dacEnMask); break; case 4: - dev->SetWireInValue(WireInDacSource5, (enabled ? 0x0200 : 0x0000), 0x0200); + dev->SetWireInValue(WireInDacSource5, (enabled ? dacEnMask : 0x0000), dacEnMask); break; case 5: - dev->SetWireInValue(WireInDacSource6, (enabled ? 0x0200 : 0x0000), 0x0200); + dev->SetWireInValue(WireInDacSource6, (enabled ? dacEnMask : 0x0000), dacEnMask); break; case 6: - dev->SetWireInValue(WireInDacSource7, (enabled ? 0x0200 : 0x0000), 0x0200); + dev->SetWireInValue(WireInDacSource7, (enabled ? dacEnMask : 0x0000), dacEnMask); break; case 7: - dev->SetWireInValue(WireInDacSource8, (enabled ? 0x0200 : 0x0000), 0x0200); + dev->SetWireInValue(WireInDacSource8, (enabled ? dacEnMask : 0x0000), dacEnMask); break; } dev->UpdateWireIns(); @@ -1054,35 +1088,37 @@ void Rhd2000EvalBoard::selectDacDataStream(int dacChannel, int stream) return; } - if (stream < 0 || stream > 9) { + if (stream < 0 || stream > MAX_NUM_DATA_STREAMS(usb3)) { cerr << "Error in Rhd2000EvalBoard::selectDacDataStream: stream out of range." << endl; return; } + UINT32 dacStreamMask = (usb3 ? 0x03e0 : 0x01e0); + switch (dacChannel) { case 0: - dev->SetWireInValue(WireInDacSource1, stream << 5, 0x01e0); + dev->SetWireInValue(WireInDacSource1, stream << 5, dacStreamMask); break; case 1: - dev->SetWireInValue(WireInDacSource2, stream << 5, 0x01e0); + dev->SetWireInValue(WireInDacSource2, stream << 5, dacStreamMask); break; case 2: - dev->SetWireInValue(WireInDacSource3, stream << 5, 0x01e0); + dev->SetWireInValue(WireInDacSource3, stream << 5, dacStreamMask); break; case 3: - dev->SetWireInValue(WireInDacSource4, stream << 5, 0x01e0); + dev->SetWireInValue(WireInDacSource4, stream << 5, dacStreamMask); break; case 4: - dev->SetWireInValue(WireInDacSource5, stream << 5, 0x01e0); + dev->SetWireInValue(WireInDacSource5, stream << 5, dacStreamMask); break; case 5: - dev->SetWireInValue(WireInDacSource6, stream << 5, 0x01e0); + dev->SetWireInValue(WireInDacSource6, stream << 5, dacStreamMask); break; case 6: - dev->SetWireInValue(WireInDacSource7, stream << 5, 0x01e0); + dev->SetWireInValue(WireInDacSource7, stream << 5, dacStreamMask); break; case 7: - dev->SetWireInValue(WireInDacSource8, stream << 5, 0x01e0); + dev->SetWireInValue(WireInDacSource8, stream << 5, dacStreamMask); break; } dev->UpdateWireIns(); diff --git a/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.h b/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.h index f52bda3bb..75438d52a 100755 --- a/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.h +++ b/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.h @@ -22,10 +22,14 @@ #define RHD2000EVALBOARD_H #define USB_BUFFER_SIZE 2560000 -#define RHYTHM_BOARD_ID 500 -#define MAX_NUM_DATA_STREAMS 8 +#define RHYTHM_BOARD_ID_USB2 500 +#define RHYTHM_BOARD_ID_USB3 600 +#define MAX_NUM_DATA_STREAMS_USB2 8 +#define MAX_NUM_DATA_STREAMS_USB3 16 #define FIFO_CAPACITY_WORDS 67108864 +#define MAX_NUM_DATA_STREAMS(u3) ( u3 ? MAX_NUM_DATA_STREAMS_USB3 : MAX_NUM_DATA_STREAMS_USB2 ) + #define USB3_BLOCK_SIZE 512 #include <queue> @@ -167,7 +171,7 @@ private: okCFrontPanel *dev; AmplifierSampleRate sampleRate; int numDataStreams; // total number of data streams currently enabled - int dataStreamEnabled[MAX_NUM_DATA_STREAMS]; // 0 (disabled) or 1 (enabled) + int dataStreamEnabled[MAX_NUM_DATA_STREAMS_USB3]; // 0 (disabled) or 1 (enabled), set for maximum stream number vector<int> cableDelay; // Buffer for reading bytes from USB interface -- GitLab