diff --git a/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp b/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp index ddd608d0a1b09bacc1037a41aa654cb30dd841f8..0ddc3ef4a9c4f77a8dde131181a697dd3adcb5f4 100644 --- a/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp +++ b/targets/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp @@ -354,7 +354,7 @@ int openair0_dev_init_sodera(openair0_device* device, openair0_config_t *openair printf("Configuring LMS7002\n"); - + int bw_gain_adjust=0; @@ -404,14 +404,65 @@ int openair0_dev_init_sodera(openair0_device* device, openair0_config_t *openair printf("Failed to load configuration file %s\n",openair0_cfg[0].configFilename); exit(-1); } - /* - for(i=0;i<openair0_cfg[0].rx_num_channels;i++) { - s->usrp->set_rx_rate(openair0_cfg[0].sample_rate,i); - s->usrp->set_rx_bandwidth(openair0_cfg[0].rx_bw,i); - printf("Setting rx freq/gain on channel %lu/%lu : BW %f (readback %f)\n",i,s->usrp->get_rx_num_channels(),openair0_cfg[0].rx_bw/1e6,s->usrp->get_rx_bandwidth(i)/1e6); - s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[i],i); - set_rx_gain_offset(&openair0_cfg[0],i,bw_gain_adjust); + opStatus = lmsControl.UploadAll(); + + if (opStatus != LIBLMS7_SUCCESS) { + printf("Failed to upload configuration file\n"); + exit(-1); + } + + opStatus = lmsControl.SetFrequencySX(LMS7002M::Tx, openair0_cfg[0].tx_freq[0]/1e6,30.72); + + if (opStatus != LIBLMS7_SUCCESS) { + printf("Cannot set TX frequency %f MHz\n",openair0_cfg[0].tx_freq[0]/1e6); + exit(-1); + } + + opStatus = lmsControl.SetFrequencySX(LMS7002M::Rx, openair0_cfg[0].rx_freq[0]/1e6,30.72); + + if (opStatus != LIBLMS7_SUCCESS) { + printf("Cannot set RX frequency %f MHz\n",openair0_cfg[0].rx_freq[0]/1e6); + exit(-1); + } + + + // this makes RX/TX sampling rates equal + opStatus = lmsControl.Modify_SPI_Reg_bits(EN_ADCCLKH_CLKGN,0); + if (opStatus != LIBLMS7_SUCCESS) { + printf("Cannot modify SPI (EN_ADCCLKH_CLKGN)\n"); + exit(-1); + } + opStatus = lmsControl.Modify_SPI_Reg_bits(CLKH_OV_CLKL_CGEN,2); + if (opStatus != LIBLMS7_SUCCESS) { + printf("Cannot modify SPI (CLKH_OV_CLKL_CGEN)\n"); + exit(-1); + } + + const float cgen_freq_MHz = 245.76; + const int interpolation = 0; // real interpolation = 2 + const int decimation = 0; // real decimation = 2 + opStatus = lmsControl.SetInterfaceFrequency(cgen_freq_MHz,interpolation,decimation); + if (opStatus != LIBLMS7_SUCCESS) { + printf("Cannot SetInterfaceFrequency (%f,%d,%d)\n",cgen_freq_MHz,interpolation,decimation); + exit(-1); + } + // Run calibration procedure + float txrx_calibrationBandwidth_MHz = 5; + opStatus = lmsControl.CalibrateTx(txrx_calibrationBandwidth_MHz); + if (opStatus != LIBLMS7_SUCCESS){ + printf("TX Calibration failed\n"); + exit(-1); + } + opStatus = lmsControl.CalibrateRx(txrx_calibrationBandwidth_MHz); + if (opStatus != LIBLMS7_SUCCESS){ + printf("RX Calibration failed\n"); + exit(-1); + } + + // this will configure that sampling rate at output of FPGA + // LMS_StreamBoard::ConfigurePLL(&s->Port,openair0_cfg[0].sample_rate,openair0_cfg[0].sample_rate,90); + /* ::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(i); // limit to maximum gain if (openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] > gain_range.stop()) { @@ -482,6 +533,6 @@ int openair0_dev_init_sodera(openair0_device* device, openair0_config_t *openair s->sample_rate = openair0_cfg[0].sample_rate; // TODO: - + exit(-1); return 0; }