From 771e3244291d2d306e914e5d80b4a84617a133c9 Mon Sep 17 00:00:00 2001
From: Berk Silemek <berk.silemek@gmail.com>
Date: Mon, 14 Nov 2022 14:54:50 +0000
Subject: [PATCH] The script to run the transmitter to produce 297MHz
 sinusoidal output that are synced by using star-hub system in 2 transmitter
 m4i cards

---
 Software/Transmitter/m4iset_8ch.c | 196 ++++++++++++++++++++++++++++++
 1 file changed, 196 insertions(+)
 create mode 100644 Software/Transmitter/m4iset_8ch.c

diff --git a/Software/Transmitter/m4iset_8ch.c b/Software/Transmitter/m4iset_8ch.c
new file mode 100644
index 0000000..320ba88
--- /dev/null
+++ b/Software/Transmitter/m4iset_8ch.c
@@ -0,0 +1,196 @@
+#include "../c_header/dlltyp.h"
+#include "../c_header/regs.h"
+#include "../c_header/spcm_drv.h"
+#include "../c_header/spcerr.h"
+
+#include <stdio.h>
+
+
+void m4iset_(int16 *pvData, int16 *pvData1, int32 *lMemsize)
+    {
+
+    drv_handle hDrv;
+    drv_handle hDrv1;
+    drv_handle hSync;
+
+    char szErrorText[ERRORTEXTLEN];
+    int32 lCardType;
+    int32 allchan;
+    int32 ausgabe;
+    int64 lSamplerate;
+    uint32 dwXMode;
+
+//    hDrv  = spcm_hOpen ("/dev/spcm0");
+//    hDrv1 = spcm_hOpen ("/dev/spcm1");
+
+    hDrv  = spcm_hOpen ("/dev/spcm1");
+    hDrv1 = spcm_hOpen ("/dev/spcm2");
+
+    hSync = spcm_hOpen ("sync0");
+    
+
+        if (!hSync)
+        {
+	printf("Error Star-Hub\n");
+        spcm_vClose (hSync);
+	}
+
+    spcm_dwSetParam_i64 (hDrv, SPC_M2CMD, M2CMD_CARD_RESET);
+    spcm_dwSetParam_i64 (hDrv1, SPC_M2CMD, M2CMD_CARD_RESET);
+
+
+    spcm_dwSetParam_i32 (hSync, SPC_SYNC_ENABLEMASK, 0x0003);
+
+
+    spcm_dwSetParam_i32 (hDrv, SPC_TRIG_ORMASK, SPC_TM_NONE);
+
+
+
+    spcm_dwSetParam_i32 (hDrv1, SPC_CLOCKMODE, SPC_CM_INTPLL);
+//    spcm_dwSetParam_i64 (hDrv1, SPC_SAMPLERATE,625000000);
+    spcm_dwSetParam_i64 (hDrv1, SPC_SAMPLERATE,400000000);
+    spcm_dwSetParam_i32 (hDrv1, SPC_CLOCKOUT,  1);  // enable clock output
+
+//    spcm_dwSetParam_i32 (hDrv, SPC_CLOCKMODE, SPC_CM_INTPLL);
+//    spcm_dwSetParam_i64 (hDrv, SPC_SAMPLERATE,625000000);
+    spcm_dwSetParam_i64 (hDrv, SPC_SAMPLERATE,400000000);
+//    spcm_dwSetParam_i32 (hDrv, SPC_CLOCKOUT,  1);  // enable clock output
+
+
+    spcm_dwSetParam_i32 (hDrv,  SPCM_X2_MODE, SPCM_XMODE_TRIGOUT);
+    spcm_dwSetParam_i32 (hDrv1, SPCM_X2_MODE, SPCM_XMODE_TRIGOUT);
+    
+    
+
+//    spcm_dwSetParam_i32 (hDrv1, SPCM_X2_MODE, SPCM_XMODE_CONTOUTMARK);
+
+
+//    spcm_dwGetParam_i32 (hDrv1, SPCM_X1_AVAILMODES, &ausgabe);
+//    printf ("available modes = %d\n", ausgabe);
+
+
+    spcm_dwGetParam_i64 (hDrv1, SPC_SAMPLERATE, &lSamplerate);
+    printf ("Sample rate = %d\n", lSamplerate);
+
+//    printf ("first sample = %d\n", pvData[0]);
+//    printf ("first sample = %d\n", pvData1[0]);
+
+
+//    dwXMode = (SPCM_XMODE_DIGOUT | SPCM_XMODE_DIGOUTSRC_CH1 | SPCM_XMODE_DIGOUTSRC_BIT15);
+//    spcm_dwSetParam_i32 (hDrv1, SPCM_X1_MODE, dwXMode);
+//    spcm_dwGetParam_i32 (hDrv1, SPCM_X1_MODE, &ausgabe);
+//    printf ("actual X0 mode = %d\n", ausgabe);
+
+
+
+
+    spcm_dwSetParam_i32 (hDrv, SPC_CHENABLE, CHANNEL0|CHANNEL1|CHANNEL2|CHANNEL3);
+
+
+//    dwXMode = (SPCM_XMODE_DIGOUT | SPCM_XMODE_DIGOUTSRC_CH0 | SPCM_XMODE_DIGOUTSRC_BIT15);
+//    spcm_dwSetParam_i32 (hDrv, SPCM_X0_MODE, dwXMode);
+//    spcm_dwGetParam_i32 (hDrv, SPCM_X0_MODE, &ausgabe);
+//    printf ("actual X0 mode = %d\n", ausgabe);
+
+
+
+
+    spcm_dwSetParam_i32 (hDrv, SPC_ENABLEOUT0, 1);
+    spcm_dwSetParam_i32 (hDrv, SPC_AMP0, 1000);
+    spcm_dwSetParam_i32 (hDrv, SPC_FILTER0, 0);
+
+    spcm_dwSetParam_i32 (hDrv, SPC_ENABLEOUT1, 1);
+    spcm_dwSetParam_i32 (hDrv, SPC_AMP1, 1000);
+    spcm_dwSetParam_i32 (hDrv, SPC_FILTER1, 0);
+
+    spcm_dwSetParam_i32 (hDrv, SPC_ENABLEOUT2, 1);
+    spcm_dwSetParam_i32 (hDrv, SPC_AMP2, 1000);
+    spcm_dwSetParam_i32 (hDrv, SPC_FILTER2, 0);
+
+    spcm_dwSetParam_i32 (hDrv, SPC_ENABLEOUT3, 1);
+    spcm_dwSetParam_i32 (hDrv, SPC_AMP3, 1000);
+    spcm_dwSetParam_i32 (hDrv, SPC_FILTER3, 0);
+
+
+
+
+    spcm_dwSetParam_i32 (hDrv1, SPC_CHENABLE, CHANNEL0|CHANNEL1|CHANNEL2|CHANNEL3);
+
+
+//    dwXMode = (SPCM_XMODE_DIGOUT | SPCM_XMODE_DIGOUTSRC_CH0 | SPCM_XMODE_DIGOUTSRC_BIT15);
+//    spcm_dwSetParam_i32 (hDrv1, SPCM_X0_MODE, dwXMode);
+//    spcm_dwGetParam_i32 (hDrv1, SPCM_X0_MODE, &ausgabe);
+//    printf ("actual X0 mode = %d\n", ausgabe);
+
+
+
+
+    spcm_dwSetParam_i32 (hDrv1, SPC_ENABLEOUT0, 1);
+    spcm_dwSetParam_i32 (hDrv1, SPC_AMP0, 1000);
+    spcm_dwSetParam_i32 (hDrv1, SPC_FILTER0, 0);
+
+    spcm_dwSetParam_i32 (hDrv1, SPC_ENABLEOUT1, 1);
+    spcm_dwSetParam_i32 (hDrv1, SPC_AMP1, 1000);
+    spcm_dwSetParam_i32 (hDrv1, SPC_FILTER1, 0);
+
+    spcm_dwSetParam_i32 (hDrv1, SPC_ENABLEOUT2, 1);
+    spcm_dwSetParam_i32 (hDrv1, SPC_AMP2, 1000);
+    spcm_dwSetParam_i32 (hDrv1, SPC_FILTER2, 0);
+
+    spcm_dwSetParam_i32 (hDrv1, SPC_ENABLEOUT3, 1);
+    spcm_dwSetParam_i32 (hDrv1, SPC_AMP3, 1000);
+    spcm_dwSetParam_i32 (hDrv1, SPC_FILTER3, 0);
+
+
+
+
+
+
+
+//    spcm_dwSetParam_i32 (hDrv, SPC_M2CMD, M2CMD_CARD_WRITESETUP);
+//    spcm_dwSetParam_i32 (hDrv1, SPC_M2CMD, M2CMD_CARD_WRITESETUP);
+
+
+
+
+//    spcm_dwSetParam_i32 (hDrv, SPCM_XX_ASYNCIO, 0);
+//    spcm_dwSetParam_i32 (hDrv, SPCM_XX_ASYNCIO, 1);
+//    spcm_dwSetParam_i32 (hDrv, SPCM_XX_ASYNCIO, 0);
+
+
+    spcm_dwSetParam_i32 (hDrv, SPC_CARDMODE, SPC_REP_STD_SINGLE);
+    spcm_dwSetParam_i32 (hDrv, SPC_MEMSIZE, *lMemsize);
+    spcm_dwSetParam_i32 (hDrv, SPC_LOOPS, 1);   //60000
+    
+    spcm_dwSetParam_i32 (hDrv1, SPC_CARDMODE, SPC_REP_STD_SINGLE);
+    spcm_dwSetParam_i32 (hDrv1, SPC_MEMSIZE, *lMemsize);
+    spcm_dwSetParam_i32 (hDrv1, SPC_LOOPS, 1);
+
+
+
+
+    spcm_dwDefTransfer_i64 (hDrv, SPCM_BUF_DATA, SPCM_DIR_PCTOCARD, 0, pvData, 0, 8* *lMemsize);
+    spcm_dwDefTransfer_i64 (hDrv1, SPCM_BUF_DATA, SPCM_DIR_PCTOCARD, 0, pvData1, 0, 8* *lMemsize);
+
+
+
+    spcm_dwSetParam_i32 (hDrv, SPC_M2CMD, M2CMD_DATA_STARTDMA | M2CMD_DATA_WAITDMA);
+    spcm_dwSetParam_i32 (hDrv1, SPC_M2CMD, M2CMD_DATA_STARTDMA | M2CMD_DATA_WAITDMA);
+    
+    
+    spcm_dwSetParam_i32 (hSync, SPC_M2CMD, M2CMD_CARD_START | M2CMD_CARD_FORCETRIGGER | M2CMD_CARD_WAITREADY);
+
+
+
+    
+    if (spcm_dwGetErrorInfo_i32(hDrv,NULL,NULL,szErrorText) != ERR_OK)
+       {printf(szErrorText);
+        spcm_vClose (hDrv);
+	}
+	
+    spcm_vClose (hDrv);
+    spcm_vClose (hDrv1);
+    spcm_vClose (hSync);
+    
+    }
+    
-- 
GitLab