public void TestJESDSingleCase() { AdiCommandServerClient Link = AdiCommandServerClient.Instance; Link.hw.Connect(TestSetupConfig.ipAddr, TestSetupConfig.port); Link.Mykonos.resetDevice(); //Configure Rx & Orx DataPath Settings // 2 Rx Channels enabled equates to 4 Converters Represented JESD M = 4 //Use Lanes 0 & 1 for Rx1&Rx2 Channels // 1 Observer Channel from ORX1 Input equates to 2 Converters JESD M = 2 //Use Lanes 3 & 4 for ORx Channel //Use K = 32 //Calculate F Mykonos.RXCHANNEL rxChannels = Mykonos.RXCHANNEL.RX1_RX2; byte framerM = 4; byte serializerLanesEnabled = 0x03; byte framerK = 32; byte framerF = (byte)(2 * (int)framerM / ConvertMaskToCount(serializerLanesEnabled)); byte Obsrxchannels = (byte)Mykonos.OBSRXCHANNEL_ENABLE.MYK_ORX1; byte obsRxframerM = 2; byte obsRxserializerLanesEnabled = 0x0; byte obsRxframerK = 32; byte obsRxframerF = (byte)(2 * (int)obsRxframerM / ConvertMaskToCount(obsRxserializerLanesEnabled)); Mykonos.TXCHANNEL txChannels = Mykonos.TXCHANNEL.TX1_TX2; byte deframerM = 4; byte desLanesEnabled = 0x0F; byte deframerK = 32; byte deframerF = (byte)(2 * (int)deframerM / ConvertMaskToCount(desLanesEnabled)); //Update Test settings structure with JESD Test JESD Settings JESDTestInit(deframerM, deframerK, desLanesEnabled, framerM, framerK, serializerLanesEnabled, obsRxframerM, obsRxframerK, obsRxserializerLanesEnabled); //Call Test Initialisation with Minimum Initialisation for JESD Links TestSetup.JESDTestSetupInit(settings, rxChannels, txChannels, Obsrxchannels); DateTime timeStamp = DateTime.Now; string text = "Tx M: " + deframerM + ", Tx K: " + deframerK + ", Tx lanes: " + string.Format("{0:X}", desLanesEnabled) + ", Tx F: " + deframerF + ", Rx M: " + framerM + ", Rx K: " + framerK + ", Rx lanes: " + string.Format("{0:X}", serializerLanesEnabled) + ", Rx F: " + framerF + ", ORx M: " + obsRxframerM + ", ORx K: " + obsRxframerK + ", ORx lanes: " + string.Format("{0:X}", obsRxserializerLanesEnabled) + ", ORx F: " + obsRxframerF + " " + timeStamp.ToString(); using (System.IO.StreamWriter file = new System.IO.StreamWriter(resFilePath, true)) { file.WriteLine(text); } //Enable Full JESD Links in the System mykonosUnitTest.Helper.EnableRxFramerLink_JESD(resFilePath); mykonosUnitTest.Helper.EnableORxFramerLink_JESD(resFilePath); mykonosUnitTest.Helper.EnableTxLink_JESD(resFilePath); }
public static void TestTxToneGenerator([Values(Mykonos.TXCHANNEL.TX1, Mykonos.TXCHANNEL.TX2)] Mykonos.TXCHANNEL channel) { UInt64 txPllLoFrequency_Hz = 5650000000 / 1000000;; UInt32 txiqRate_kHz = 245760; UInt32 primarySigBw_Hz = 75000000 / 1000000;; double[] profileInfo = new double[3]; profileInfo[0] = txPllLoFrequency_Hz; profileInfo[1] = txiqRate_kHz; profileInfo[2] = primarySigBw_Hz; Helper.GenerateTxTone(channel, profileInfo, 12000000, 0); }
public static void CheckGetDacPower([Values(Mykonos.TXCHANNEL.TX1, Mykonos.TXCHANNEL.TX2)] Mykonos.TXCHANNEL TxCh) { AdiCommandServerClient Link = AdiCommandServerClient.Instance; Link.hw.Connect(TestSetupConfig.ipAddr, TestSetupConfig.port); byte spiData1 = 0x0; byte spiData2 = 0x0; byte channelPowerMsbMask = 0x03; UInt16 dacPower = 0; Link.Mykonos.GetDacPower(TxCh, ref dacPower); spiData1 = Link.spiRead(0x959); Console.WriteLine("power readback LSB: " + spiData1.ToString("X")); spiData2 = Link.spiRead(0x95A); Console.WriteLine("power readback MSB: " + spiData1.ToString("X")); Assert.AreEqual(dacPower, (spiData1 | (((UInt16)(spiData2 & channelPowerMsbMask)) << 8)), "Myk:PA Protection readback not as expected"); Link.Disconnect(); }
public static void TxLOLInitCalCheck([Values(Mykonos.TXCHANNEL.TX1, Mykonos.TXCHANNEL.TX2)] Mykonos.TXCHANNEL channel) { //Setup the calibrations settings.calMask = (UInt32)(Mykonos.CALMASK.TX_BB_FILTER) | (UInt32)(Mykonos.CALMASK.ADC_TUNER) | (UInt32)(Mykonos.CALMASK.TIA_3DB_CORNER) | (UInt32)(Mykonos.CALMASK.DC_OFFSET) | (UInt32)(Mykonos.CALMASK.TX_ATTENUATION_DELAY) | (UInt32)(Mykonos.CALMASK.RX_GAIN_DELAY) | (UInt32)(Mykonos.CALMASK.FLASH_CAL) | (UInt32)(Mykonos.CALMASK.PATH_DELAY) | //(UInt32)(Mykonos.CALMASK.TX_LO_LEAKAGE_INTERNAL) | (UInt32)(Mykonos.CALMASK.TX_QEC_INIT) | (UInt32)(Mykonos.CALMASK.LOOPBACK_RX_LO_DELAY) | (UInt32)(Mykonos.CALMASK.LOOPBACK_RX_RX_QEC_INIT) | (UInt32)(Mykonos.CALMASK.RX_LO_DELAY) | (UInt32)(Mykonos.CALMASK.RX_QEC_INIT); TestSetup.TestSetupInit(settings); //Retrieve Profile Information, samplingFreq_Hz, ProfileBW, LO Frequency Information double[] profileInfo = new double[3]; int backoff = 0; string boardfreq = settings.testBoard; profileInfo[0] = settings.txProfileData.IqRate_kHz; profileInfo[1] = settings.txPllLoFreq_Hz; profileInfo[2] = settings.txProfileData.PrimarySigBw_Hz; double txIqDataRate_kHz = profileInfo[0]; double profileBandwidth_MHz = profileInfo[2] / 1000000; Console.WriteLine("IQ Data Rate (kHz): " + txIqDataRate_kHz); Console.WriteLine("Profile Bandwdith (MHz): " + profileBandwidth_MHz); double freqTxLo_MHz = profileInfo[1] / 1000000; Console.WriteLine("Tx LO Frequency (MHz): " + freqTxLo_MHz); //Define variables for storing Fundamental Amplitue, LoLeakage and ImageAmplitude double[] fundAmp = new double[2]; double[] LoLeakageAmp = new double[2]; //Connect to Signal Analyser //The span is fixed to 100MHz //Set Marker 2 as LO leakage marker //Note: this may need to be set depending on profile. NumberStyles style = NumberStyles.AllowExponent | NumberStyles.Number; SA_AgilentPXA pxa = new SA_AgilentPXA(measEquipment.PXAAddress); pxa.SetCenterSpan(freqTxLo_MHz, 100, 0); pxa.SetAtten(20); pxa.SetRefLevel(10); pxa.SetMarker(2, freqTxLo_MHz); //Config and Enable Mykonos with Test Specific Settings //Use Default Test Constructor //Start Calibration AdiCommandServerClient Link = AdiCommandServerClient.Instance; Link.hw.Connect(TestSetupConfig.ipAddr, TestSetupConfig.port); Link.Mykonos.setTx1Attenuation(0); System.Threading.Thread.Sleep(500); Link.Mykonos.radioOn(); Link.Disconnect(); //Generate Tone and Measure Image double offsetFreq_Mhz = 10; double testFreq_MHz = freqTxLo_MHz + offsetFreq_Mhz; double offsetFreq_Hz = offsetFreq_Mhz * 1000000; Helper.GenerateTxTone(Mykonos.TXCHANNEL.TX1_TX2, profileInfo, offsetFreq_Hz, backoff); //Take Measurements from PXA pxa.SetMarker(1, testFreq_MHz); //Fundamental amplitue marker System.Threading.Thread.Sleep(500); fundAmp[0] = Double.Parse(pxa.GetMarker(1), style); LoLeakageAmp[0] = Double.Parse(pxa.GetMarker(2), style); Console.WriteLine("No Init LO Leakage" + ": FundAmp: " + fundAmp[0] + ", LO Leakage: " + LoLeakageAmp[0]); //Re-Initialise with TX QEC init Cal settings.calMask = settings.calMask | (UInt32)(Mykonos.CALMASK.TX_LO_LEAKAGE_INTERNAL); TestSetup.TestSetupInit(settings); //Turn Radio Off and Link = AdiCommandServerClient.Instance; Link.hw.Connect(TestSetupConfig.ipAddr, TestSetupConfig.port); Link.Mykonos.setTx1Attenuation(0); Link.Mykonos.radioOff(); System.Threading.Thread.Sleep(500); System.Threading.Thread.Sleep(500); Link.Disconnect(); //Config and Enable Mykonos with Test Specific Settings Link = AdiCommandServerClient.Instance; Link.hw.Connect(TestSetupConfig.ipAddr, TestSetupConfig.port); Link.Mykonos.setTx1Attenuation(0); Link.Mykonos.radioOn(); Link.Disconnect(); //Generate Tone and Measure Image Helper.GenerateTxTone(Mykonos.TXCHANNEL.TX1_TX2, profileInfo, offsetFreq_Hz, backoff); //Take Measurements from PXA System.Threading.Thread.Sleep(500); fundAmp[1] = Double.Parse(pxa.GetMarker(1), style); LoLeakageAmp[1] = Double.Parse(pxa.GetMarker(2), style); Console.WriteLine("Init LO Leakage" + ": FundAmp: " + fundAmp[1] + ", LO Leakage: " + LoLeakageAmp[1] + ", " + (fundAmp[1] - LoLeakageAmp[1]) + ", "); Console.WriteLine("Lo Leakage Diff: " + (LoLeakageAmp[0] - LoLeakageAmp[1])); // Check that Image has reduced NUnit.Framework.Assert.Less(LoLeakageAmp[1], LoLeakageAmp[0]); }
public static void TxPassbandSweepTxNCO([Values(Mykonos.TXCHANNEL.TX1, Mykonos.TXCHANNEL.TX2)] Mykonos.TXCHANNEL channel, [Values(2500, 2500)] double deltaF_kHz) { AdiCommandServerClient Link = AdiCommandServerClient.Instance; Link.hw.Connect(TestSetupConfig.ipAddr, TestSetupConfig.port); SA_AgilentPXA pxa = new SA_AgilentPXA(measEquipment.PXAAddress); NumberStyles style = NumberStyles.AllowExponent | NumberStyles.Number; double spanMhz; int numSteps = 0; double txIqDataRate_MHz = 0; double freqTxLo_MHz = 0; double profileBandwidth_MHz = 0; double toneOffsetFreq_Mhz = 0; double offsetFreq_Hz = 0; double testRfFreq_MHz = 0; try { //Enable the Transmitter Path Link.Mykonos.radioOn(); //Profile Information txIqDataRate_MHz = (double)(settings.txProfileData.IqRate_kHz) / 1000; freqTxLo_MHz = (double)(settings.txPllLoFreq_Hz) / 1000000; profileBandwidth_MHz = (double)settings.txProfileData.PrimarySigBw_Hz; numSteps = (int)(txIqDataRate_MHz / (deltaF_kHz / 1000.0)); spanMhz = txIqDataRate_MHz; //Define Data Array for storing Fundamental Amplitue, LoLeakage and ImageAmplitude double[,] fundAmpXY = new double[numSteps, 2]; double[,] loLeakageXY = new double[numSteps, 2]; double[,] imageAmpXY = new double[numSteps, 2]; pxa.SysPreset(); pxa.SetRBW_VBW(30, 30); pxa.SetCenterSpan(freqTxLo_MHz, 200, 0); pxa.SetAtten(20); pxa.SetMarker(2, freqTxLo_MHz); //LO leakage marker double peakAmp_dBm = 0; double peakFreq_Mhz = 0; double deltaF = txIqDataRate_MHz / numSteps; double fundAmp = 0; double loLeakage = 0; double imageAmp = 0; Console.Write(numSteps + 1); for (int i = 0; (i < numSteps); i++) { toneOffsetFreq_Mhz = (-0.5 * txIqDataRate_MHz) + ((deltaF_kHz / 1000.0) * i); offsetFreq_Hz = toneOffsetFreq_Mhz * 1000000; testRfFreq_MHz = freqTxLo_MHz + offsetFreq_Hz / 1000000; Link.Mykonos.enableTxNco(1, (int)(toneOffsetFreq_Mhz * 1000), (int)(toneOffsetFreq_Mhz * 1000)); System.Threading.Thread.Sleep(500); //pxa.HoldAverage(10); pxa.MeasPeakPower(ref peakAmp_dBm, ref peakFreq_Mhz); //Set PXA Markers /* for this to work, NCO freq set must be rastered to its actual frequency in the chip */ //pxa.SetMarker(3, freqTxLo_MHz - (freqTxLo_MHz - peakFreq_Mhz)); //Image marker //pxa.SetMarker(1, testRfFreq_MHz); //Fundamental amplitue marker //fundAmp = Double.Parse(pxa.GetMarker(1), style); //loLeakage = Double.Parse(pxa.GetMarker(2), style); //imageAmp = Double.Parse(pxa.GetMarker(3), style); //TODO: Marker 3 does not always sit on the image, sometimes its off a bin or so and measures incorrectly. pxa.SetMarker(3, (freqTxLo_MHz - ((peakFreq_Mhz / 1000000.0) - freqTxLo_MHz))); //Image marker fundAmp = peakAmp_dBm; loLeakage = Double.Parse(pxa.GetMarker(2), style); imageAmp = Double.Parse(pxa.GetMarker(3), style); fundAmpXY[i, 0] = toneOffsetFreq_Mhz; fundAmpXY[i, 1] = fundAmp; loLeakageXY[i, 0] = toneOffsetFreq_Mhz; loLeakageXY[i, 1] = loLeakage; imageAmpXY[i, 0] = toneOffsetFreq_Mhz; imageAmpXY[i, 1] = imageAmp; if ((toneOffsetFreq_Mhz > -1) && (toneOffsetFreq_Mhz < 1)) { Console.WriteLine("Bypass:"******"Fundamental Amplitude (dBm)" + i + ": " + toneOffsetFreq_Mhz + ": " + fundAmp); Console.WriteLine("LO Leakage (dBm)" + toneOffsetFreq_Mhz + ": " + loLeakage); Console.WriteLine("Image Amplitude (dBm)" + toneOffsetFreq_Mhz + ": " + imageAmp); Console.WriteLine("Image Amplitude (dBc)" + toneOffsetFreq_Mhz + ": " + (fundAmp - imageAmp)); #endif } Link.Disconnect(); //Graph Data and Save in PDF Form var doc1 = new Document(); string path = TxRfTests.ResPath + "TxPassbandSweepTxNco"; string[] pcbInfo; iTextSharp.text.Image[] container = new iTextSharp.text.Image[3]; string[] fundAmpLabels = new string[] { "Fundamental Amplitude Versus Offset Tone Frequency (from LO)", "Offset Tone Frequency (MHz)", "Amplitude (dBm)", "Trace Amplitude" }; string[] loLeakageLabels = new string[] { "LO Leakage Versus Offset Tone Frequency", "Offset Tone Frequency (MHz)", "Amplitude (dBm)", "Trace Amplitude" }; string[] imageAmpLabels = new string[] { "Image Amplitude Versus Offset Tone Frequency", "Offset Tone Frequency (MHz)", "Amplitude (dBm)", "Trace Amplitude" }; pcbInfo = Helper.PcbInfo(); Console.Write(fundAmpXY[48, 0]); container[0] = Helper.MakeChartObject(fundAmpXY, fundAmpLabels, path); container[1] = Helper.MakeChartObject(loLeakageXY, loLeakageLabels, path); container[2] = Helper.MakeChartObject(imageAmpXY, imageAmpLabels, path); Helper.AddAllChartsToPdf(container, path + ".pdf", pcbInfo); //Open Result PDF System.Diagnostics.Process.Start(path + ".pdf"); //Check Min Max Fund Amplitudes are within +/-0.5db of each other. var MinFundAmp = System.Linq.Enumerable.Range(15, 30).Select(i => fundAmpXY[i, 1]).Min(); var MaxFundAmp = System.Linq.Enumerable.Range(15, 30).Select(i => fundAmpXY[i, 1]).Max(); Console.WriteLine("MinFundAmp: " + MinFundAmp); Console.WriteLine("MaxFundAmp: " + MaxFundAmp); Console.WriteLine("MaxDiffFundAmp: " + (MaxFundAmp - MinFundAmp)); NUnit.Framework.Assert.IsTrue((MaxFundAmp - MinFundAmp) < 1.0); } catch (Exception e) { Console.WriteLine(e); throw; } }
public static void TxAttenuationSweep([Values(Mykonos.TXCHANNEL.TX1, Mykonos.TXCHANNEL.TX2)] Mykonos.TXCHANNEL channel) { int atten = 0; int backoff = 0; //Retrieve Profile Information, samplingFreq_Hz, ProfileBW, LO Frequency Information double[] profileInfo = new double[3]; profileInfo[0] = settings.txProfileData.IqRate_kHz; profileInfo[1] = settings.txPllLoFreq_Hz; profileInfo[2] = settings.txProfileData.PrimarySigBw_Hz; double txIqDataRate_kHz = profileInfo[0]; double profileBandwidth_MHz = profileInfo[2] / 1000000; Console.WriteLine("IQ Data Rate (kHz): " + txIqDataRate_kHz); Console.WriteLine("Profile Bandwdith (MHz): " + profileBandwidth_MHz); double freqTxLo_MHz = profileInfo[1] / 1000000; Console.WriteLine("Tx LO Frequency (MHz): " + freqTxLo_MHz); //Configure Tone Generator //10MHz offset tone generation double offsetFreq_Hz = 10000000; double[,] fundAmpXY = new double[42, 2]; Helper.GenerateTxTone(Mykonos.TXCHANNEL.TX1_TX2, profileInfo, offsetFreq_Hz, backoff); //Connect to Signal Analyser //The span is fixed to 50MHz NumberStyles style = NumberStyles.AllowExponent | NumberStyles.Number; SA_AgilentPXA pxa = new SA_AgilentPXA(measEquipment.PXAAddress); pxa.SetCenterSpan(freqTxLo_MHz, 50, 0); pxa.SetAtten(20); pxa.SetRefLevel(10); pxa.SetMarker(1, freqTxLo_MHz + 10); //Fundemental Amplitued Marker pxa.SetMarker(2, freqTxLo_MHz); //LO Leakage Marker pxa.SetMarker(3, freqTxLo_MHz - (offsetFreq_Hz / 1000000)); //Image Amplitude marker //Config and Enable Mykonos with Test Specific Settings AdiCommandServerClient Link = AdiCommandServerClient.Instance; Link.hw.Connect(TestSetupConfig.ipAddr, TestSetupConfig.port); Link.Mykonos.radioOn(); //Test Sequence //Iterate Thru Tx Attenuation Settings //Measure Amplitude of the fundamental //TODO: 0 to 41950 int step = 0; double fundAmp_dB = 0; double minAttnVal_dB = 0; double maxAttnVal_dB = 41.95; for (double attenVal_dB = minAttnVal_dB; (attenVal_dB < maxAttnVal_dB); attenVal_dB += 1) { try { if (channel == Mykonos.TXCHANNEL.TX1) { Link.Mykonos.setTx1Attenuation(attenVal_dB); } if (channel == Mykonos.TXCHANNEL.TX2) { Link.Mykonos.setTx2Attenuation(attenVal_dB); } } catch (Exception e) { Console.WriteLine(e); break; } pxa.HoldAverage(); System.Threading.Thread.Sleep(500); fundAmp_dB = Double.Parse(pxa.GetMarker(1), style); fundAmpXY[step, 1] = fundAmp_dB; fundAmpXY[step, 0] = attenVal_dB; step++; #if WR_RES_TO_CONSOLE Console.WriteLine("Fundamental Amplitude, Attenuation Value " + attenVal_dB + ": " + fundAmp_dB); #endif } Link.Disconnect(); #if WR_RES_TO_PDF //Graph Data and Save in PDF Form var doc1 = new Document(); string path = TxRfTests.ResPath + "TxAttenuationSweep"; string[] pcbInfo; iTextSharp.text.Image[] container = new iTextSharp.text.Image[1]; string[] fundAmpLabels = new string[] { "Fundamental Amplitude Versus Offset Tone Frequency (from LO)", "setTxAtten Argument", "Amplitude (dBm)", "Trace Amplitude" }; pcbInfo = Helper.PcbInfo((settings.txPllLoFreq_Hz / 1000000.0).ToString(), (settings.rxPllLoFreq_Hz / 1000000.0).ToString(), settings.mykSettings.txProfileName, settings.mykSettings.rxProfileName, backoff.ToString(), atten.ToString()); container[0] = Helper.MakeChartObject(fundAmpXY, fundAmpLabels, path); TxRfTests instance = new TxRfTests(); Helper.AddAllChartsToPdf(container, path + ".pdf", pcbInfo); //Open Result PDF System.Diagnostics.Process.Start(path + ".pdf"); #endif }
public static void TxPassbandSweep([Values(Mykonos.TXCHANNEL.TX1, Mykonos.TXCHANNEL.TX2)] Mykonos.TXCHANNEL channel) { //Retrieve Profile Information, samplingFreq_Hz, ProfileBW, LO Frequency Information double[] profileInfo = new double[3]; int atten = 0; int backoff = 0; profileInfo[0] = settings.txProfileData.IqRate_kHz; profileInfo[1] = settings.txPllLoFreq_Hz; profileInfo[2] = settings.txProfileData.PrimarySigBw_Hz; double txIqDataRate_kHz = profileInfo[0]; double profileBandwidth_MHz = profileInfo[2] / 1000000; Console.WriteLine("IQ Data Rate (kHz): " + txIqDataRate_kHz); Console.WriteLine("Profile Bandwdith (MHz): " + profileBandwidth_MHz); double freqTxLo_MHz = profileInfo[1] / 1000000; Console.WriteLine("Tx LO Frequency (MHz): " + freqTxLo_MHz); //Define Test Parameters Based on Profile Info & Lo Frequency double SwpMinFreq = freqTxLo_MHz - (1.1 * (profileBandwidth_MHz / 2)); double SwpMaxFreq = freqTxLo_MHz + (1.1 * (profileBandwidth_MHz / 2)); double SwpSigAmp = -40; int SwpNumSteps = 50; SwpParamStruct param = new SwpParamStruct(SwpMinFreq, SwpMaxFreq, SwpSigAmp, SwpNumSteps); double SwpStepSz = (param.freqMax - param.freqMin) / param.numSteps; Console.WriteLine("SwpMinFreq (MHz): " + SwpMinFreq); Console.WriteLine("SwpMaxMax (MHz): " + SwpMaxFreq); Console.WriteLine("SwpSigAmp (MHz): " + SwpSigAmp); //Define Data Array for storing Fundamental Amplitue, LoLeakage and ImageAmplitude double[,] fundAmpXY = new double[param.numSteps + 1, 2]; double[,] loLeakageXY = new double[param.numSteps + 1, 2]; double[,] imageAmpXY = new double[param.numSteps + 1, 2]; //Connect to Signal Analyser //The span is fixed to 100MHz //Set Marker 2 as LO leakage marker //Note: this may need to be set depending on profile. NumberStyles style = NumberStyles.AllowExponent | NumberStyles.Number; SA_AgilentPXA pxa = new SA_AgilentPXA(measEquipment.PXAAddress); pxa.SetCenterSpan(freqTxLo_MHz, 200, 0); pxa.SetAtten(20); pxa.SetRefLevel(10); pxa.SetMarker(2, freqTxLo_MHz); //Config and Enable Mykonos with Test Specific Settings AdiCommandServerClient Link = AdiCommandServerClient.Instance; Link.hw.Connect(TestSetupConfig.ipAddr, TestSetupConfig.port); Link.Mykonos.setTx1Attenuation(0); Link.Mykonos.radioOn(); Link.Disconnect(); #if WR_RES_TO_CONSOLE Console.WriteLine(" OffSet Frequency input (MHz):" + "Fundamental Amplitude (dBm), " + "LO Leakage (dBm)," + "Image Amplitude (dBm),"); #endif //Test Sequence //Sweep Thru Passband for (int i = 0; (i <= param.numSteps); i++) { //Calculate Test Tone And Generate double offsetFreq_Mhz = param.freqMin + (i * SwpStepSz) - (freqTxLo_MHz); double testFreq_MHz = freqTxLo_MHz + offsetFreq_Mhz; double fundAmp, loLeakage, imageAmp; double offsetFreq_Hz = offsetFreq_Mhz * 1000000; if (offsetFreq_Hz == 0) { fundAmpXY[i, 0] = offsetFreq_Mhz; fundAmpXY[i, 1] = fundAmpXY[i - 1, 1]; loLeakageXY[i, 0] = offsetFreq_Mhz; loLeakageXY[i, 1] = loLeakageXY[i - 1, 1]; imageAmpXY[i, 0] = offsetFreq_Mhz; imageAmpXY[i, 1] = imageAmpXY[i - 1, 1]; continue; } Helper.GenerateTxTone(Mykonos.TXCHANNEL.TX1_TX2, profileInfo, offsetFreq_Hz, backoff); //Take Measurements from PXA pxa.SetMarker(3, freqTxLo_MHz - (offsetFreq_Hz / 1000000)); //Image marker pxa.SetMarker(1, testFreq_MHz); //Fundamental amplitue marker //pxa.HoldAverage(); System.Threading.Thread.Sleep(500); fundAmp = Double.Parse(pxa.GetMarker(1), style); loLeakage = Double.Parse(pxa.GetMarker(2), style); imageAmp = Double.Parse(pxa.GetMarker(3), style); fundAmpXY[i, 0] = offsetFreq_Mhz; fundAmpXY[i, 1] = fundAmp; loLeakageXY[i, 0] = offsetFreq_Mhz; loLeakageXY[i, 1] = loLeakage; imageAmpXY[i, 0] = offsetFreq_Mhz; imageAmpXY[i, 1] = imageAmp; #if WR_RES_TO_CONSOLE //Optional printout for text based readout in test output window Console.WriteLine(offsetFreq_Mhz + ": " + fundAmp + ", " + loLeakage + ", " + imageAmp + ", " + (fundAmp - imageAmp) + ", "); #endif } #if WR_RES_TO_PDF //Graph Data and Save in PDF Form var doc1 = new Document(); string path = TxRfTests.ResPath + "TxPassbandSweep"; TxRfTests instance = new TxRfTests(); string[] pcbInfo; iTextSharp.text.Image[] container = new iTextSharp.text.Image[3]; string[] fundAmpLabels = new string[] { "Fundamental Amplitude Versus Offset Tone Frequency (from LO)", "Offset Tone Frequency (MHz)", "Amplitude (dBm)", "Trace Amplitude" }; string[] loLeakageLabels = new string[] { "LO Leakage Versus Offset Tone Frequency", "Offset Tone Frequency (MHz)", "Amplitude (dBm)", "Trace Amplitude" }; string[] imageAmpLabels = new string[] { "Image Amplitude Versus Offset Tone Frequency", "Offset Tone Frequency (MHz)", "Amplitude (dBm)", "Trace Amplitude" }; pcbInfo = Helper.PcbInfo((settings.txPllLoFreq_Hz / 1000000.0).ToString(), (settings.rxPllLoFreq_Hz / 1000000.0).ToString(), settings.mykSettings.txProfileName, settings.mykSettings.rxProfileName, backoff.ToString(), atten.ToString()); // pcbInfo = Helper.PcbInfo(); container[0] = Helper.MakeChartObject(fundAmpXY, fundAmpLabels, path); container[1] = Helper.MakeChartObject(loLeakageXY, loLeakageLabels, path); container[2] = Helper.MakeChartObject(imageAmpXY, imageAmpLabels, path); Helper.AddAllChartsToPdf(container, path + ".pdf", pcbInfo); //Open Result PDF System.Diagnostics.Process.Start(path + ".pdf"); #endif #if WR_RES_TO_TXT // Write data to txt file using (System.IO.StreamWriter file = new System.IO.StreamWriter(path + ".txt")) { file.WriteLine("Sample, Frequency MHz, Fundamental Power(dBm), LOL(dBFS), Image Power(dBFS),"); for (int i = 0; i < param.numSteps; i++) { file.WriteLine(i + "," + fundAmpXY[i, 0].ToString() + "," + fundAmpXY[i, 1].ToString() + "," + loLeakageXY[i, 1].ToString() + "," + imageAmpXY[i, 1].ToString()); } } #endif //Check Min Max Fund Amplitudes are within 0.5db of each other. var MinFundAmp = System.Linq.Enumerable.Range(0, param.numSteps).Select(i => fundAmpXY[i, 1]).Min(); var MaxFundAmp = System.Linq.Enumerable.Range(0, param.numSteps).Select(i => fundAmpXY[i, 1]).Max(); Console.WriteLine("MinFundAmp: " + MinFundAmp); Console.WriteLine("MaxFundAmp: " + MaxFundAmp); Console.WriteLine("MaxDiffFundAmp: " + (MaxFundAmp - MinFundAmp)); NUnit.Framework.Assert.IsTrue((MaxFundAmp - MinFundAmp) < 1.0); }
public static void QECHarmonicSweep([Values(Mykonos.TXCHANNEL.TX1, Mykonos.TXCHANNEL.TX2)] Mykonos.TXCHANNEL channel) { InitCalSweepTests obj = new InitCalSweepTests(); obj.QECTestsInit(); //Retrieve Profile Information, samplingFreq_Hz, ProfileBW, LO Frequency Information double[] profileInfo = new double[3]; double backoff = -15; int atten = 0; profileInfo[0] = settings.txProfileData.IqRate_kHz; profileInfo[1] = settings.txPllLoFreq_Hz; profileInfo[2] = settings.txProfileData.PrimarySigBw_Hz; double txIqDataRate_kHz = profileInfo[0]; double profileBandwidth_MHz = profileInfo[2] / 1000000; Console.WriteLine("IQ Data Rate (kHz): " + txIqDataRate_kHz); Console.WriteLine("Profile Bandwdith (MHz): " + profileBandwidth_MHz); double freqTxLo_MHz = profileInfo[1] / 1000000; Console.WriteLine("Tx LO Frequency (MHz): " + freqTxLo_MHz); //Define Test Parameters Based on Profile Info & Lo Frequency double SwpMinFreq = freqTxLo_MHz - (2 * (profileBandwidth_MHz / 2)); double SwpMaxFreq = freqTxLo_MHz + (2 * (profileBandwidth_MHz / 2)); double SwpSigAmp = -40; int SwpNumSteps = 200; SwpParamStruct param = new SwpParamStruct(SwpMinFreq, SwpMaxFreq, SwpSigAmp, SwpNumSteps); double SwpStepSz = (param.freqMax - param.freqMin) / param.numSteps; Console.WriteLine("SwpMinFreq (MHz): " + SwpMinFreq); Console.WriteLine("SwpMaxMax (MHz): " + SwpMaxFreq); Console.WriteLine("SwpSigAmp (MHz): " + SwpSigAmp); //Define Data Array for storing Fundamental Amplitue, LoLeakage and ImageAmplitude //double[,] fundAmpXY = new double[param.numSteps, 2]; double[,] harmonicAmpnoCal = new double[param.numSteps + 1, 4]; double[,] harmonicAmpCal = new double[param.numSteps + 1, 4]; double[,] loLeakageXYcal = new double[param.numSteps + 1, 2]; double[,] loLeakageXYdif = new double[param.numSteps + 1, 2]; //double[,] imageAmpXY = new double[param.numSteps, 2]; //Connect to Signal Generator //The span is fixed to 100MHz //Set Marker 2 as LO leakage marker //Note: this may need to be set depending on profile. NumberStyles style = NumberStyles.AllowExponent | NumberStyles.Number; SA_AgilentPXA pxa = new SA_AgilentPXA(measEquipment.PXAAddress); pxa.SetCenterSpan(freqTxLo_MHz, 200, 0); pxa.SetAtten(20); pxa.SetRefLevel(10); pxa.SetMarker(2, freqTxLo_MHz); //Config and Enable Mykonos with Test Specific Settings AdiCommandServerClient Link = AdiCommandServerClient.Instance; Link.hw.Connect(TestSetupConfig.ipAddr, TestSetupConfig.port); Link.Mykonos.setTx1Attenuation(0); Link.Mykonos.radioOn(); Link.Disconnect(); #if WR_RES_TO_CONSOLE Console.WriteLine(" OffSet Frequency input (MHz):" + "Image Amplitude (dBm)"); #endif //Test Sequence //Sweep Thru Passband for (int i = 0; (i <= param.numSteps); i++) { //Calculate Test Tone And Generate double offsetFreq_Mhz = param.freqMin + (i * SwpStepSz) - (freqTxLo_MHz); double testFreq_MHz = freqTxLo_MHz + offsetFreq_Mhz; double harmonicAmp; double offsetFreq_Hz = offsetFreq_Mhz * 1000000; if (offsetFreq_Hz == 0) { harmonicAmpnoCal[i, 0] = offsetFreq_Mhz; harmonicAmpnoCal[i, 1] = harmonicAmpnoCal[i - 1, 1]; harmonicAmpnoCal[i, 2] = harmonicAmpnoCal[i - 1, 2]; harmonicAmpnoCal[i, 3] = harmonicAmpnoCal[i - 1, 3]; continue; } Helper.GenerateTxTone(Mykonos.TXCHANNEL.TX1_TX2, profileInfo, offsetFreq_Hz, backoff); //Take Measurements from PXA pxa.SetMarker(1, freqTxLo_MHz + (offsetFreq_Hz / 1000000)); pxa.SetMarker(2, freqTxLo_MHz + 2 * (offsetFreq_Hz / 1000000)); pxa.SetMarker(3, freqTxLo_MHz + 3 * (offsetFreq_Hz / 1000000)); //pxa.HoldAverage(); System.Threading.Thread.Sleep(500); harmonicAmpnoCal[i, 0] = offsetFreq_Mhz; harmonicAmp = Double.Parse(pxa.GetMarker(1), style); harmonicAmpnoCal[i, 1] = harmonicAmp; harmonicAmp = Double.Parse(pxa.GetMarker(2), style); harmonicAmpnoCal[i, 2] = harmonicAmp; harmonicAmp = Double.Parse(pxa.GetMarker(3), style); harmonicAmpnoCal[i, 3] = harmonicAmp; #if WR_RES_TO_CONSOLE //Optional printout for text based readout in test output window Console.WriteLine(offsetFreq_Mhz + ": " + harmonicAmp + ", "); #endif } Link.hw.Connect(TestSetupConfig.ipAddr, TestSetupConfig.port); Link.Mykonos.radioOff(); Link.Disconnect(); obj.AllCalsInit(); Link.hw.Connect(TestSetupConfig.ipAddr, TestSetupConfig.port); Link.Mykonos.setTx1Attenuation(0); Link.Mykonos.radioOn(); Link.Disconnect(); for (int i = 0; (i <= param.numSteps); i++) { //Calculate Test Tone And Generate double offsetFreq_Mhz = param.freqMin + (i * SwpStepSz) - (freqTxLo_MHz); double testFreq_MHz = freqTxLo_MHz + offsetFreq_Mhz; double offsetFreq_Hz = offsetFreq_Mhz * 1000000; double harmonicAmp; if (offsetFreq_Hz == 0) { harmonicAmpCal[i, 0] = offsetFreq_Mhz; harmonicAmpCal[i, 1] = harmonicAmpCal[i - 1, 1]; harmonicAmpCal[i, 2] = harmonicAmpCal[i - 1, 2]; harmonicAmpCal[i, 3] = harmonicAmpCal[i - 1, 3]; //loLeakageXY[i, 3] = loLeakageXY[i, 1] - loLeakageXY[i, 2]; continue; } Helper.GenerateTxTone(Mykonos.TXCHANNEL.TX1_TX2, profileInfo, offsetFreq_Hz, backoff); pxa.SetMarker(1, freqTxLo_MHz + (offsetFreq_Hz / 1000000)); pxa.SetMarker(2, freqTxLo_MHz + 2 * (offsetFreq_Hz / 1000000)); pxa.SetMarker(3, freqTxLo_MHz + 3 * (offsetFreq_Hz / 1000000)); //pxa.HoldAverage(); System.Threading.Thread.Sleep(500); harmonicAmpCal[i, 0] = offsetFreq_Mhz; harmonicAmp = Double.Parse(pxa.GetMarker(1), style); harmonicAmpCal[i, 1] = harmonicAmp; harmonicAmp = Double.Parse(pxa.GetMarker(2), style); harmonicAmpCal[i, 2] = harmonicAmp; harmonicAmp = Double.Parse(pxa.GetMarker(3), style); harmonicAmpCal[i, 3] = harmonicAmp; } #if WR_RES_TO_PDF //Graph Data and Save in PDF Form var doc1 = new Document(); string path = TxRfTests.ResPath + "QECInitSweep"; TxRfTests instance = new TxRfTests(); string[] pcbInfo; iTextSharp.text.Image[] container = new iTextSharp.text.Image[2]; string[] loLeakageLabels = new string[] { "Harmonic Amplitude Versus Offset Tone Frequency without Calibrations", "Offset Tone Frequency (MHz)", "Amplitude (dBm)", "1st Harmonic", "2nd Harmonic", "3rd Harmonic" }; string[] loLeakageLabelscal = new string[] { "Harmonic Amplitude Versus Offset Tone Frequency with Calibrations", "Offset Tone Frequency (MHz)", "Amplitude (dBm)", "1st Harmonic", "2nd Harmonic", "3rd Harmonic" }; string[] loLeakageLabelsdif = new string[] { "Image Amplitude Versus Offset Tone Frequency Difference", "Offset Tone Frequency (MHz)", "Amplitude (dBm)", "Trace Amplitude" }; pcbInfo = Helper.PcbInfo((settings.txPllLoFreq_Hz / 1000000000.0).ToString(), (settings.rxPllLoFreq_Hz / 1000000000.0).ToString(), settings.mykSettings.txProfileName, settings.mykSettings.rxProfileName, backoff.ToString(), atten.ToString()); // pcbInfo = Helper.PcbInfo(); //container[0] = Helper.MakeChartObject(fundAmpXY, fundAmpLabels, path); container[0] = Helper.MakeChartObject(harmonicAmpnoCal, loLeakageLabels, path); container[1] = Helper.MakeChartObject(harmonicAmpCal, loLeakageLabelscal, path); //container[1] = Helper.MakeChartObject(loLeakageXYcal, loLeakageLabelscal, path); //container[2] = Helper.MakeChartObject(loLeakageXYdif, loLeakageLabelsdif, path); //container[2] = Helper.MakeChartObject(imageAmpXY, imageAmpLabels, path); Helper.AddAllChartsToPdf(container, path + ".pdf", pcbInfo); //Open Result PDF System.Diagnostics.Process.Start(path + ".pdf"); #endif #if WR_RES_TO_TXT // Write data to txt file using (System.IO.StreamWriter file = new System.IO.StreamWriter(path + ".txt")) { file.WriteLine("Sample, Frequency MHz, LOL(dBFS) w/o cal, LOL(dBFS) w/ cal"); for (int i = 0; i <= param.numSteps; i++) { file.WriteLine(i + "," + harmonicAmpnoCal[i, 0].ToString() + "," + harmonicAmpnoCal[i, 1].ToString() + "," + harmonicAmpnoCal[i, 2].ToString()); } } #endif }
public void TestJESDDeframerCrossbar([Values(0xE4, 0x1B, 0xB1, 0x4E)] Byte deframerCrossbar, [Values(0xC, 0x3, 0xF)] Byte desLanesEnabled) { Console.WriteLine(settings.txProfileData.IqRate_kHz); //Invalid test conditions, iqrate too high. Temp workaround if ((desLanesEnabled != 0xF) && (TxProfile.Contains("245.76"))) { Assert.Pass(); } AdiCommandServerClient Link = AdiCommandServerClient.Instance; Link.hw.Connect(TestSetupConfig.ipAddr, TestSetupConfig.port); Link.Mykonos.resetDevice(); //Configure Rx & Orx DataPath Settings // 2 Rx Channels enabled equates to 4 Converters Represented JESD M = 4 //Use Lanes 0 & 1 for Rx1&Rx2 Channels // 1 Observer Channel from ORX1 Input equates to 2 Converters JESD M = 2 //Use Lanes 3 & 4 for ORx Channel //Use K = 32 //Calculate F Mykonos.RXCHANNEL rxChannels = Mykonos.RXCHANNEL.RX1_RX2; byte framerM = 4; byte serializerLanesEnabled = 0x03; byte framerK = 32; byte framerF = (byte)(2 * (int)framerM / ConvertMaskToCount(serializerLanesEnabled)); byte Obsrxchannels = (byte)Mykonos.OBSRXCHANNEL_ENABLE.MYK_ORX1; byte obsRxframerM = 2; byte obsRxserializerLanesEnabled = 0xC; byte obsRxframerK = 32; byte obsRxframerF = (byte)(2 * (int)obsRxframerM / ConvertMaskToCount(obsRxserializerLanesEnabled)); Mykonos.TXCHANNEL txChannels = Mykonos.TXCHANNEL.TX1_TX2; byte deframerM = 4; // byte desLanesEnabled = 0x04; byte deframerK = 32; byte deframerF = (byte)(2 * (int)deframerM / ConvertMaskToCount(desLanesEnabled)); //Update Test settings structure with JESD Test JESD Settings JESDTestInit(deframerM, deframerK, desLanesEnabled, framerM, framerK, serializerLanesEnabled, obsRxframerM, obsRxframerK, obsRxserializerLanesEnabled); Console.WriteLine("desLanesEnabled: " + desLanesEnabled); Console.WriteLine("desLanesEnabled: " + settings.txProfileData.IqRate_kHz); //Vary the Deframer Crossbar Setting settings.mykTxDeFrmrCfg.deserializerLaneCrossbar = deframerCrossbar; //Call Test Initialisation with Minimum Initialisation for JESD Links TestSetup.JESDTestSetupInit(settings, rxChannels, txChannels, Obsrxchannels); //Enable Full JESD Links in the System mykonosUnitTest.Helper.EnableRxFramerLink_JESD(resFilePath); mykonosUnitTest.Helper.EnableORxFramerLink_JESD(resFilePath); mykonosUnitTest.Helper.EnableTxLink_JESD(resFilePath); Console.Write(deframerCrossbar.ToString("X")); byte temp = 0; byte deframerCrossbarNew = 0x00; byte deframerCrossbarRb = 0xFF; if (desLanesEnabled == 0xC) { temp = (byte)(deframerCrossbar >> 4); deframerCrossbarNew = temp; Console.Write(deframerCrossbarNew.ToString("X")); } else if (desLanesEnabled == 0x3) { deframerCrossbarNew = (byte)(deframerCrossbar & 0xF); Console.Write(deframerCrossbarNew.ToString("X")); } else { deframerCrossbarNew = deframerCrossbar; Console.Write(deframerCrossbarNew.ToString("X")); } if ((deframerM == 4) && (ConvertMaskToCount(desLanesEnabled) == 2)) { temp = (byte)((deframerCrossbarNew & 0xC0) | ((deframerCrossbarNew & 0xC) << 2) | ((deframerCrossbarNew & 0x30) >> 2) | (deframerCrossbarNew & 0x3)); deframerCrossbarNew = temp; Console.Write(deframerCrossbarNew.ToString("X")); } deframerCrossbarRb = Link.spiRead(0x83); Console.Write(deframerCrossbarRb.ToString("X")); Assert.AreEqual((deframerCrossbarNew), deframerCrossbarRb); }
public void TestJESDAlfaParam([Values(JESDAlphaTests.MYK_DATAPATH_MODE.RX2TX2OBS1, MYK_DATAPATH_MODE.RX1TX2OBS1, MYK_DATAPATH_MODE.RX2TX1OBS1, MYK_DATAPATH_MODE.RX1TX1OBS1)] MYK_DATAPATH_MODE DataPath, [Values(MYK_JESD_LANE_CFG.RL1OBSL0TL2, MYK_JESD_LANE_CFG.RL1OBSL0TL4, MYK_JESD_LANE_CFG.RL1OBSL2TL2, MYK_JESD_LANE_CFG.RL1OBSL2TL4, MYK_JESD_LANE_CFG.RL2OBSL0TL2, MYK_JESD_LANE_CFG.RL2OBSL0TL4, MYK_JESD_LANE_CFG.RL2OBSL2TL2, MYK_JESD_LANE_CFG.RL2OBSL2TL4)] MYK_JESD_LANE_CFG LaneCfg, [Values(16, 32)] byte framerK, [Values(16, 32)] byte obsRxframerK, [Values(20, 32)] byte deframerK) { AdiCommandServerClient Link = AdiCommandServerClient.Instance; Link.hw.Connect(TestSetupConfig.ipAddr, TestSetupConfig.port); Link.Mykonos.resetDevice(); Mykonos.RXCHANNEL rxChannels = Mykonos.RXCHANNEL.RX1_RX2; Mykonos.TXCHANNEL txChannels = Mykonos.TXCHANNEL.TX1_TX2; byte Obsrxchannels = (byte)Mykonos.OBSRXCHANNEL_ENABLE.MYK_ORX1; byte deframerM = 0; byte desLanesEnabled = 0; byte framerM = 0; byte serializerLanesEnabled = 0; byte obsRxframerM = 0; byte obsRxserializerLanesEnabled = 0; byte invalidTest = 0; switch (DataPath) { case MYK_DATAPATH_MODE.RX2TX2OBS1: //Data Path Configuration rxChannels = Mykonos.RXCHANNEL.RX1_RX2; framerM = 4; txChannels = Mykonos.TXCHANNEL.TX1_TX2; deframerM = 4; Obsrxchannels = (byte)Mykonos.OBSRXCHANNEL_ENABLE.MYK_ORX1; obsRxframerM = 2; //Lane Config switch (LaneCfg) { case MYK_JESD_LANE_CFG.RL2OBSL2TL4: serializerLanesEnabled = 0x03; desLanesEnabled = 0x0F; obsRxserializerLanesEnabled = 0xC; break; case MYK_JESD_LANE_CFG.RL2OBSL0TL2: serializerLanesEnabled = 0x03; desLanesEnabled = 0x0F; obsRxserializerLanesEnabled = 0x0; break; default: invalidTest = 1; break; } break; case MYK_DATAPATH_MODE.RX1TX2OBS1: //Data Path Configuration rxChannels = Mykonos.RXCHANNEL.RX1; framerM = 2; txChannels = Mykonos.TXCHANNEL.TX1_TX2; deframerM = 4; Obsrxchannels = (byte)Mykonos.OBSRXCHANNEL_ENABLE.MYK_ORX1; obsRxframerM = 2; //Lane Config switch (LaneCfg) { case MYK_JESD_LANE_CFG.RL1OBSL2TL4: serializerLanesEnabled = 0x01; desLanesEnabled = 0x0F; obsRxserializerLanesEnabled = 0xC; break; case MYK_JESD_LANE_CFG.RL1OBSL0TL4: serializerLanesEnabled = 0x01; desLanesEnabled = 0x0F; obsRxserializerLanesEnabled = 0x0; break; case MYK_JESD_LANE_CFG.RL2OBSL2TL4: serializerLanesEnabled = 0x03; desLanesEnabled = 0x0F; obsRxserializerLanesEnabled = 0xC; break; case MYK_JESD_LANE_CFG.RL2OBSL0TL4: serializerLanesEnabled = 0x03; desLanesEnabled = 0x0F; obsRxserializerLanesEnabled = 0x0; break; default: invalidTest = 1; break; } break; case MYK_DATAPATH_MODE.RX2TX1OBS1: rxChannels = Mykonos.RXCHANNEL.RX1_RX2; framerM = 4; txChannels = Mykonos.TXCHANNEL.TX1; deframerM = 2; Obsrxchannels = (byte)Mykonos.OBSRXCHANNEL_ENABLE.MYK_ORX1; obsRxframerM = 2; switch (LaneCfg) { case MYK_JESD_LANE_CFG.RL2OBSL2TL2: serializerLanesEnabled = 0x03; desLanesEnabled = 0x03; obsRxserializerLanesEnabled = 0xC; break; case MYK_JESD_LANE_CFG.RL2OBSL0TL2: serializerLanesEnabled = 0x03; desLanesEnabled = 0x03; obsRxserializerLanesEnabled = 0x0; break; case MYK_JESD_LANE_CFG.RL2OBSL2TL4: serializerLanesEnabled = 0x03; desLanesEnabled = 0x0F; obsRxserializerLanesEnabled = 0xC; break; case MYK_JESD_LANE_CFG.RL2OBSL0TL4: serializerLanesEnabled = 0x03; desLanesEnabled = 0x0F; obsRxserializerLanesEnabled = 0x0; break; default: invalidTest = 1; break; } break; case MYK_DATAPATH_MODE.RX1TX1OBS1: rxChannels = Mykonos.RXCHANNEL.RX1; framerM = 2; txChannels = Mykonos.TXCHANNEL.TX1; deframerM = 2; Obsrxchannels = (byte)Mykonos.OBSRXCHANNEL_ENABLE.MYK_ORX1; obsRxframerM = 2; switch (LaneCfg) { case MYK_JESD_LANE_CFG.RL1OBSL2TL2: serializerLanesEnabled = 0x01; desLanesEnabled = 0x03; obsRxserializerLanesEnabled = 0xC; break; case MYK_JESD_LANE_CFG.RL1OBSL0TL2: serializerLanesEnabled = 0x01; desLanesEnabled = 0x03; obsRxserializerLanesEnabled = 0x0; break; case MYK_JESD_LANE_CFG.RL1OBSL2TL4: serializerLanesEnabled = 0x01; desLanesEnabled = 0x0F; obsRxserializerLanesEnabled = 0xC; break; case MYK_JESD_LANE_CFG.RL1OBSL0TL4: serializerLanesEnabled = 0x01; desLanesEnabled = 0x0F; obsRxserializerLanesEnabled = 0x0; break; case MYK_JESD_LANE_CFG.RL2OBSL2TL2: serializerLanesEnabled = 0x03; desLanesEnabled = 0x03; obsRxserializerLanesEnabled = 0xC; break; case MYK_JESD_LANE_CFG.RL2OBSL0TL2: serializerLanesEnabled = 0x03; desLanesEnabled = 0x03; obsRxserializerLanesEnabled = 0x0; break; case MYK_JESD_LANE_CFG.RL2OBSL2TL4: serializerLanesEnabled = 0x03; desLanesEnabled = 0x0F; obsRxserializerLanesEnabled = 0xC; break; case MYK_JESD_LANE_CFG.RL2OBSL0TL4: serializerLanesEnabled = 0x03; desLanesEnabled = 0x0F; obsRxserializerLanesEnabled = 0x0; break; default: invalidTest = 1; break; } break; default: break; } if (invalidTest != 1) { byte deframerF = (byte)(2 * (int)deframerM / ConvertMaskToCount(desLanesEnabled)); byte framerF = (byte)(2 * (int)framerM / ConvertMaskToCount(serializerLanesEnabled)); byte obsRxframerF = (byte)(2 * (int)obsRxframerM / ConvertMaskToCount(obsRxserializerLanesEnabled)); DateTime timeStamp = DateTime.Now; string text = "Tx M: " + deframerM + ", Tx K: " + deframerK + ", Tx lanes: " + string.Format("{0:X}", desLanesEnabled) + ", Tx F: " + deframerF + ", Rx M: " + framerM + ", Rx K: " + framerK + ", Rx lanes: " + string.Format("{0:X}", serializerLanesEnabled) + ", Rx F: " + framerF + ", ORx M: " + obsRxframerM + ", ORx K: " + obsRxframerK + ", ORx lanes: " + string.Format("{0:X}", obsRxserializerLanesEnabled) + ", ORx F: " + obsRxframerF + " " + timeStamp.ToString(); using (System.IO.StreamWriter file = new System.IO.StreamWriter(resFilePathAlpha, true)) { file.WriteLine(text); } //Initialize(rxChannels, txChannels, Obsrxchannels, deframerM, deframerK, desLanesEnabled, framerM, framerK, serializerLanesEnabled, obsRxframerM, obsRxframerK, obsRxserializerLanesEnabled); JESDTestInit(deframerM, deframerK, desLanesEnabled, framerM, framerK, serializerLanesEnabled, obsRxframerM, obsRxframerK, obsRxserializerLanesEnabled); Console.WriteLine("Rx Profile: " + settings.mykSettings.rxProfileName); Console.WriteLine("Tx Profile: " + settings.mykSettings.txProfileName); Console.WriteLine("ORx Profile: " + settings.mykSettings.orxProfileName); TestSetup.JESDTestSetupInit(settings, rxChannels, txChannels, Obsrxchannels); mykonosUnitTest.Helper.EnableRxFramerLink_JESD(resFilePathAlpha); mykonosUnitTest.Helper.EnableORxFramerLink_JESD(resFilePathAlpha); mykonosUnitTest.Helper.EnableTxLink_JESD(resFilePathAlpha); } }
public static byte ConfigJesdParams(MYK_DATAPATH_MODE DataPath, MYK_JESD_LANE_CFG LaneCfg, [Values(12, 32)] byte framerK, [Values(12, 32)] byte obsRxframerK, [Values(20, 32)] byte deframerK) { Mykonos.RXCHANNEL rxChannels = Mykonos.RXCHANNEL.RX1_RX2; Mykonos.TXCHANNEL txChannels = Mykonos.TXCHANNEL.TX1_TX2; byte Obsrxchannels = (byte)Mykonos.OBSRXCHANNEL_ENABLE.MYK_ORX1; byte deframerM = 0; byte desLaneEn = 0; byte framerM = 0; byte serLaneEn = 0; byte obsFramerM = 0; byte obsSerLaneEn = 0; byte invalidTest = 0; switch (DataPath) { case MYK_DATAPATH_MODE.RX2TX2OBS1: //Data Path Configuration rxChannels = Mykonos.RXCHANNEL.RX1_RX2; framerM = 4; txChannels = Mykonos.TXCHANNEL.TX1_TX2; deframerM = 4; Obsrxchannels = (byte)Mykonos.OBSRXCHANNEL_ENABLE.MYK_ORX1; obsFramerM = 2; //Lane Config switch (LaneCfg) { case MYK_JESD_LANE_CFG.RL2OBSL2TL4: serLaneEn = 0x03; desLaneEn = 0x0F; obsSerLaneEn = 0xC; break; case MYK_JESD_LANE_CFG.RL2OBSL0TL2: serLaneEn = 0x03; desLaneEn = 0x03; obsSerLaneEn = 0x0; break; default: invalidTest = 1; break; } break; case MYK_DATAPATH_MODE.RX1TX2OBS1: //Data Path Configuration rxChannels = Mykonos.RXCHANNEL.RX1; framerM = 2; txChannels = Mykonos.TXCHANNEL.TX1_TX2; deframerM = 4; Obsrxchannels = (byte)Mykonos.OBSRXCHANNEL_ENABLE.MYK_ORX1; obsFramerM = 2; //Lane Config switch (LaneCfg) { case MYK_JESD_LANE_CFG.RL1OBSL2TL4: serLaneEn = 0x01; desLaneEn = 0x0F; obsSerLaneEn = 0xC; break; case MYK_JESD_LANE_CFG.RL1OBSL0TL4: serLaneEn = 0x01; desLaneEn = 0x0F; obsSerLaneEn = 0x0; break; case MYK_JESD_LANE_CFG.RL2OBSL2TL4: serLaneEn = 0x03; desLaneEn = 0x0F; obsSerLaneEn = 0xC; break; case MYK_JESD_LANE_CFG.RL2OBSL0TL4: serLaneEn = 0x03; desLaneEn = 0x0F; obsSerLaneEn = 0x0; break; default: invalidTest = 1; break; } break; case MYK_DATAPATH_MODE.RX2TX1OBS1: rxChannels = Mykonos.RXCHANNEL.RX1_RX2; framerM = 4; txChannels = Mykonos.TXCHANNEL.TX1; deframerM = 2; Obsrxchannels = (byte)Mykonos.OBSRXCHANNEL_ENABLE.MYK_ORX1; obsFramerM = 2; switch (LaneCfg) { case MYK_JESD_LANE_CFG.RL2OBSL2TL2: serLaneEn = 0x03; desLaneEn = 0x03; obsSerLaneEn = 0xC; break; case MYK_JESD_LANE_CFG.RL2OBSL0TL2: serLaneEn = 0x03; desLaneEn = 0x03; obsSerLaneEn = 0x0; break; case MYK_JESD_LANE_CFG.RL2OBSL2TL4: serLaneEn = 0x03; desLaneEn = 0x0F; obsSerLaneEn = 0xC; break; case MYK_JESD_LANE_CFG.RL2OBSL0TL4: serLaneEn = 0x03; desLaneEn = 0x0F; obsSerLaneEn = 0x0; break; default: invalidTest = 1; break; } break; case MYK_DATAPATH_MODE.RX1TX1OBS1: rxChannels = Mykonos.RXCHANNEL.RX1; framerM = 2; txChannels = Mykonos.TXCHANNEL.TX1; deframerM = 2; Obsrxchannels = (byte)Mykonos.OBSRXCHANNEL_ENABLE.MYK_ORX1; obsFramerM = 2; switch (LaneCfg) { case MYK_JESD_LANE_CFG.RL1OBSL2TL2: serLaneEn = 0x01; desLaneEn = 0x03; obsSerLaneEn = 0xC; break; case MYK_JESD_LANE_CFG.RL1OBSL0TL2: serLaneEn = 0x01; desLaneEn = 0x03; obsSerLaneEn = 0x0; break; case MYK_JESD_LANE_CFG.RL1OBSL2TL4: serLaneEn = 0x01; desLaneEn = 0x0F; obsSerLaneEn = 0xC; break; case MYK_JESD_LANE_CFG.RL1OBSL0TL4: serLaneEn = 0x01; desLaneEn = 0x0F; obsSerLaneEn = 0x0; break; case MYK_JESD_LANE_CFG.RL2OBSL2TL2: serLaneEn = 0x03; desLaneEn = 0x03; obsSerLaneEn = 0xC; break; case MYK_JESD_LANE_CFG.RL2OBSL0TL2: serLaneEn = 0x03; desLaneEn = 0x03; obsSerLaneEn = 0x0; break; case MYK_JESD_LANE_CFG.RL2OBSL2TL4: serLaneEn = 0x03; desLaneEn = 0x0F; obsSerLaneEn = 0xC; break; case MYK_JESD_LANE_CFG.RL2OBSL0TL4: serLaneEn = 0x03; desLaneEn = 0x0F; obsSerLaneEn = 0x0; break; default: invalidTest = 1; break; } break; default: break; } if (invalidTest != 1) { byte deframerF = (byte)((2 * (int)deframerM) / (int)ConvertMaskToCount(desLaneEn)); byte framerF = (byte)(2 * (int)framerM / ConvertMaskToCount(serLaneEn)); byte obsFramerF = (byte)(2 * (int)obsFramerM / ConvertMaskToCount(obsSerLaneEn)); settings.mykSettings.rxChannel = rxChannels; settings.mykSettings.txChannel = txChannels; settings.mykSettings.orxChannel = (Mykonos.OBSRXCHANNEL_ENABLE)Obsrxchannels; settings.mykTxDeFrmrCfg.M = deframerM; settings.mykTxDeFrmrCfg.K = deframerK; settings.mykTxDeFrmrCfg.deserializerLanesEnabled = desLaneEn; settings.mykRxFrmrCfg.M = framerM; settings.mykRxFrmrCfg.K = framerK; settings.mykRxFrmrCfg.serializerLanesEnabled = serLaneEn; settings.mykObsRxFrmrCfg.M = obsFramerM; settings.mykObsRxFrmrCfg.K = obsRxframerK; settings.mykObsRxFrmrCfg.serializerLanesEnabled = obsSerLaneEn; return(0); } return(1); }