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