diff --git a/openair1/PHY/impl_defs_top.h b/openair1/PHY/impl_defs_top.h index 75da3fab6dcd061e852079a13f1baf7c6eb21302..98615d6f6e8ede879cf25abd86006b6c875c8721 100755 --- a/openair1/PHY/impl_defs_top.h +++ b/openair1/PHY/impl_defs_top.h @@ -50,6 +50,7 @@ * @defgroup _GENERIC_PHY_RF_INTERFACE_ Generic PHY - RF Interface * @defgroup _USRP_PHY_RF_INTERFACE_ PHY - USRP RF Interface * @defgroup _BLADERF_PHY_RF_INTERFACE_ PHY - BLADERF RF Interface + * @defgroup _LMSSDR_PHY_RF_INTERFACE_ PHY - LMSSDR RF Interface * @} * * @ingroup _ref_implementation_ diff --git a/openair1/SCHED/phy_mac_stub.c b/openair1/SCHED/phy_mac_stub.c index 3620b8bf27b72e37b8f4f7795f195d8426b853bb..7a8944b1b1527db7d4ef54da5a23dcef73edb1d9 100644 --- a/openair1/SCHED/phy_mac_stub.c +++ b/openair1/SCHED/phy_mac_stub.c @@ -51,7 +51,6 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_eNB) { - int i; //uint8_t cooperation_flag = phy_vars_eNB->cooperation_flag; uint8_t transmission_mode = phy_vars_eNB->transmission_mode[0]; @@ -583,7 +582,6 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eNB) { - int i; //uint8_t cooperation_flag = phy_vars_eNB->cooperation_flag; uint8_t transmission_mode = phy_vars_eNB->transmission_mode[0]; diff --git a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c index d9b7bfa9050be30fb22b28725395916b08389250..6cc1d8c5d2dfec4fe75f4e9d4674e0e74124452d 100644 --- a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c +++ b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c @@ -37,6 +37,7 @@ #include <stdlib.h> #include <inttypes.h> #include "bladerf_lib.h" +#include "math.h" /** @addtogroup _BLADERF_PHY_RF_INTERFACE_ * @{ @@ -58,14 +59,16 @@ int num_devices=0; /*! \brief BladeRF Init function (not used at the moment) * \param device RF frontend parameters set by application + * \returns 0 on success */ int trx_brf_init(openair0_device *device) { - + return 0; } /*! \brief get current timestamp *\param device the hardware to use *\param module the bladeRf module + *\returns timestamp of BladeRF */ openair0_timestamp trx_get_timestamp(openair0_device *device, bladerf_module module) { @@ -83,28 +86,22 @@ openair0_timestamp trx_get_timestamp(openair0_device *device, bladerf_module mod } /*! \brief Start BladeRF - *\param device the hardware to use + * \param device the hardware to use + * \returns 0 on success */ int trx_brf_start(openair0_device *device) { return 0; } -/*! \brief Get BladeRF stats - *\param device the hardware to use - */ -static void trx_brf_stats(openair0_device *device){ - - -} - /*! \brief Called to send samples to the BladeRF RF target - @param device pointer to the device structure specific to the RF hardware target - @param timestamp The timestamp at whicch the first sample MUST be sent - @param buff Buffer which holds the samples - @param nsamps number of samples to be sent - @param cc index of the component carrier - @param flags Ignored for the moment + \param device pointer to the device structure specific to the RF hardware target + \param timestamp The timestamp at whicch the first sample MUST be sent + \param buff Buffer which holds the samples + \param nsamps number of samples to be sent + \param cc index of the component carrier + \param flags Ignored for the moment + \returns 0 on success */ static int trx_brf_write(openair0_device *device,openair0_timestamp ptimestamp, void **buff, int nsamps, int cc, int flags) { @@ -156,6 +153,7 @@ static int trx_brf_write(openair0_device *device,openair0_timestamp ptimestamp, * \param[out] buff An array of pointers to buffers for received samples. The buffers must be large enough to hold the number of samples \ref nsamps. * \param nsamps Number of samples. One sample is 2 byte I + 2 byte Q => 4 byte. * \param cc Index of component carrier + * \returns number of samples read */ static int trx_brf_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) { @@ -176,9 +174,10 @@ static int trx_brf_read(openair0_device *device, openair0_timestamp *ptimestamp, brf->num_rx_errors++; } else if ( brf->meta_rx.status & BLADERF_META_STATUS_OVERRUN) { brf->num_overflows++; - printf("RX overrun (%d) is detected. t=%u. Got %u samples. nsymps %d\n", + printf("RX overrun (%d) is detected. t=" "%" PRIu64 "Got %u samples. nsymps %d\n", brf->num_overflows,brf->meta_rx.timestamp, brf->meta_rx.actual_count, nsamps); } + //printf("Current RX timestampe %u\n", brf->meta_rx.timestamp); //printf("[BRF] (buff %p) ts=0x%"PRIu64" %s\n",samples, brf->meta_rx.timestamp,bladerf_strerror(status)); brf->rx_current_ts=brf->meta_rx.timestamp; @@ -196,7 +195,7 @@ static int trx_brf_read(openair0_device *device, openair0_timestamp *ptimestamp, /*! \brief Terminate operation of the BladeRF transceiver -- free all associated resources * \param device the hardware to use */ -int trx_brf_end(openair0_device *device) { +void trx_brf_end(openair0_device *device) { int status; brf_state_t *brf = (brf_state_t*)device->priv; @@ -208,7 +207,6 @@ int trx_brf_end(openair0_device *device) { fprintf(stderr, "Failed to disable TX module: %s\n", bladerf_strerror(status)); } bladerf_close(brf->dev); - return 0; } /*! \brief print the BladeRF statistics @@ -231,10 +229,11 @@ int trx_brf_reset_stats(openair0_device* device) { } -/*! \brief Stop USRP - * \param device the hardware to use +/*! \brief Stop BladeRF + * \param card the hardware to use + * \returns 0 in success */ -int trx_brf_stop(openair0_device* device) { +int trx_brf_stop(int card) { return(0); @@ -242,9 +241,11 @@ int trx_brf_stop(openair0_device* device) { /*! \brief Set frequencies (TX/RX) * \param device the hardware to use + * \param openair0_cfg1 openair0 Config structure (ignored. It is there to comply with RF common API) + * \param exmimo_dump_config (ignored) * \returns 0 in success */ -int trx_brf_set_freq(openair0_device* device) { +int trx_brf_set_freq(openair0_device* device, openair0_config_t *openair0_cfg1,int exmimo_dump_config) { int status; brf_state_t *brf = (brf_state_t *)device->priv; @@ -269,9 +270,10 @@ int trx_brf_set_freq(openair0_device* device) { /*! \brief Set Gains (TX/RX) * \param device the hardware to use + * \param openair0_cfg openair0 Config structure * \returns 0 in success */ -int trx_brf_set_gains(openair0_device* device) { +int trx_brf_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) { return(0); @@ -283,12 +285,17 @@ int trx_brf_set_gains(openair0_device* device) { int16_t cos_fsover8[8] = {2047, 1447, 0, -1448, -2047, -1448, 0, 1447}; int16_t cos_3fsover8[8] = {2047, -1448, 0, 1447, -2047, 1447, 0, -1448}; +/*! \brief calibration table for BladeRF */ rx_gain_calib_table_t calib_table_fx4[] = { {2300000000.0,53.5}, {1880000000.0,57.0}, {816000000.0,73.0}, {-1,0}}; +/*! \brief set RX gain offset from calibration table + * \param openair0_cfg RF frontend parameters set by application + * \param chain_index RF chain ID + */ void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index) { int i=0; @@ -310,6 +317,9 @@ void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index) { } +/*! \brief Calibrate LMSSDR RF + * \param device the hardware to use + */ void calibrate_rf(openair0_device *device) { @@ -885,11 +895,10 @@ void calibrate_rf(openair0_device *device) { /*! \brief Initialize Openair BLADERF target. It returns 0 if OK * \param device the hardware to use * \param openair0_cfg RF frontend parameters set by application + * \returns 0 on success */ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { int status; - int card=0; - brf_state_t *brf = (brf_state_t*)malloc(sizeof(brf_state_t)); memset(brf, 0, sizeof(brf_state_t)); /* device specific */ @@ -1063,8 +1072,6 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { }else printf("[BRF] RX module calibrated DC \n"); - - bladerf_log_set_verbosity(get_brf_log_level(openair0_cfg->log_level)); printf("BLADERF: Initializing openair0_device\n"); @@ -1091,16 +1098,18 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { /*! \brief bladeRF error report * \param status + * \returns 0 on success */ int brf_error(int status) { //exit(-1); - //return 1; // or status error code + return status; // or status error code } /*! \brief Open BladeRF from serial port * \param serial name of serial port on which to open BladeRF device + * \returns bladerf device structure */ struct bladerf * open_bladerf_from_serial(const char *serial) { @@ -1131,6 +1140,7 @@ struct bladerf * open_bladerf_from_serial(const char *serial) { /*! \brief Get BladeRF log level * \param log_level log level + * \returns log level of BLADERF device */ int get_brf_log_level(int log_level){ diff --git a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h index 3a05c80e5c8f83e8d7e7434e3e5ead3484493709..743baf1bc815cdafd979135d6fb3bcedfe16b425 100644 --- a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h +++ b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h @@ -106,6 +106,27 @@ typedef struct { /* * func prototypes */ +/*! \brief BladeRF Init function (not used at the moment) + * \param device RF frontend parameters set by application + */ +int trx_brf_init(openair0_device *device); + +/*! \brief get current timestamp + *\param device the hardware to use + *\param module the bladeRf module + */ +openair0_timestamp trx_get_timestamp(openair0_device *device, bladerf_module module); +/*! \brief Get BladeRF log level + * \param log_level log level + * \returns log level of BLADERF device + */ +int get_brf_log_level(int log_level); + +/*! \brief bladeRF error report + * \param status + * \returns 0 on success + */ int brf_error(int status); + /*@}*/ diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp index 3ca15c66602c7760a563df391de9a8ba2f09a453..4be796e5888ace3f274bef977dc53ba24c68fe03 100644 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp @@ -49,6 +49,9 @@ #include <cmath> +/** @addtogroup _LMSSDR_PHY_RF_INTERFACE_ + * @{ + */ ///define for parameter enumeration if prefix might be needed #define LMS7param(id) id @@ -69,6 +72,15 @@ extern "C" int write_output(const char *fname,const char *vname,void *data,int length,int dec,char format); } +/*! \brief Called to send samples to the LMSSDR RF target + \param device pointer to the device structure specific to the RF hardware target + \param timestamp The timestamp at whicch the first sample MUST be sent + \param buff Buffer which holds the samples + \param nsamps number of samples to be sent + \param antenna_id index of the antenna + \param flags Ignored for the moment + \returns 0 on success +*/ int trx_lms_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int antenna_id, int flags) { LMS_TRxWrite((int16_t*)buff[0], nsamps,0, timestamp); @@ -76,7 +88,17 @@ int trx_lms_write(openair0_device *device, openair0_timestamp timestamp, void ** return nsamps; } - +/*! \brief Receive samples from hardware. + * Read \ref nsamps samples from each channel to buffers. buff[0] is the array for + * the first channel. *ptimestamp is the time at which the first sample + * was received. + * \param device the hardware to use + * \param[out] ptimestamp the time at which the first sample was received. + * \param[out] buff An array of pointers to buffers for received samples. The buffers must be large enough to hold the number of samples \ref nsamps. + * \param nsamps Number of samples. One sample is 2 byte I + 2 byte Q => 4 byte. + * \param antenna_id Index of antenna port + * \returns number of samples read +*/ int trx_lms_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int antenna_id) { uint64_t timestamp; @@ -87,6 +109,11 @@ int trx_lms_read(openair0_device *device, openair0_timestamp *ptimestamp, void * return ret; } + +/*! \brief set RX gain offset from calibration table + * \param openair0_cfg RF frontend parameters set by application + * \param chain_index RF chain ID + */ void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index) { int i=0; @@ -107,469 +134,12 @@ void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index) { } } -/* -void calibrate_rf(openair0_device *device) { - - openair0_timestamp ptimestamp; - int16_t *calib_buffp,*calib_tx_buffp; - int16_t calib_buff[2*RXDCLENGTH]; - int16_t calib_tx_buff[2*RXDCLENGTH]; - int i,j; - int8_t offI,offQ,offIold,offQold,offInew,offQnew,offphase,offphaseold,offphasenew,offgain,offgainold,offgainnew; - int32_t meanI,meanQ,meanIold,meanQold; - int cnt=0,loop; - liblms7_status opStatus; - int16_t dcoffi; - int16_t dcoffq; - int16_t dccorri; - int16_t dccorrq; - const int16_t firCoefs[] = - { - -2531, - -517, - 2708, - 188, - -3059, - 216, - 3569, - -770, - -4199, - 1541, - 4886, - -2577, - -5552, - 3909, - 6108, - -5537, - -6457, - 7440, - 6507, - -9566, - -6174, - 11845, - 5391, - -14179, - -4110, - 16457, - 2310, - -18561, - 0, - 20369, - -2780, - -21752, - 5963, - 22610, - -9456, - -22859, - 13127, - 22444, - -16854, - -21319, - 20489, - 19492, - -23883, - -17002, - 26881, - 13902, - -29372, - -10313, - 31226, - 6345, - -32380, - -2141, - 32767, - -2141, - -32380, - 6345, - 31226, - -10313, - -29372, - 13902, - 26881, - -17002, - -23883, - 19492, - 20489, - -21319, - -16854, - 22444, - 13127, - -22859, - -9456, - 22610, - 5963, - -21752, - -2780, - 20369, - 0, - -18561, - 2310, - 16457, - -4110, - -14179, - 5391, - 11845, - -6174, - -9566, - 6507, - 7440, - -6457, - -5537, - 6108, - 3909, - -5552, - -2577, - 4886, - 1541, - -4199, - -770, - 3569, - 216, - -3059, - 188, - 2708, - -517, - -2531 - }; - - j=0; - for (i=0;i<RXDCLENGTH;i++) { - calib_tx_buff[j++] = cos_fsover8[i&7]; - calib_tx_buff[j++] = cos_fsover8[(i+6)&7]; // sin - } - calib_buffp = &calib_buff[0]; - calib_tx_buffp = &calib_tx_buff[0]; - - lms7->BackupAllRegisters(); - uint8_t ch = (uint8_t)lms7->Get_SPI_Reg_bits(LMS7param(MAC)); - //Stage 1 - uint8_t sel_band1_trf = (uint8_t)lms7->Get_SPI_Reg_bits(LMS7param(SEL_BAND1_TRF)); - uint8_t sel_band2_trf = (uint8_t)lms7->Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF)); - { - uint16_t requiredRegs[] = { 0x0400, 0x040A, 0x010D, 0x040C }; - uint16_t requiredMask[] = { 0x6000, 0x3007, 0x0040, 0x00FF }; //CAPSEL, AGC_MODE, AGC_AVG, EN_DCOFF, Bypasses - uint16_t requiredValue[] = { 0x0000, 0x1007, 0x0040, 0x00BD }; - - lms7->Modify_SPI_Reg_mask(requiredRegs, requiredMask, requiredValue, 0, 3); - } - - // opStatus = lms7->SetFrequencySX(LMS7002M::Rx, device->openair0_cfg[0].tx_freq[0]/1e6,30.72); - // put TX on fs/4 - opStatus = lms7->CalibrateRxSetup(device->openair0_cfg[0].sample_rate/1e6); - if (opStatus != LIBLMS7_SUCCESS) { - printf("Cannot calibrate for %f MHz\n",device->openair0_cfg[0].sample_rate/1e6); - exit(-1); - } - // fill TX buffer with fs/8 complex sinusoid - offIold=offQold=64; - lms7->SetRxDCOFF(offIold,offQold); - LMS_RxStart(); - for (i=0;i<NUMBUFF;i++) - trx_lms_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0); - - for (meanIold=meanQold=i=j=0;i<RXDCLENGTH;i++) { - meanIold+=calib_buff[j++]; - meanQold+=calib_buff[j++]; - } - meanIold/=RXDCLENGTH; - meanQold/=RXDCLENGTH; - printf("[LMS] RX DC: (%d,%d) => (%d,%d)\n",offIold,offQold,meanIold,meanQold); - - offI=offQ=-64; - lms7->SetRxDCOFF(offI,offQ); - - for (i=0;i<NUMBUFF;i++) - trx_lms_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0); - - for (meanI=meanQ=i=j=0;i<RXDCLENGTH;i++) { - meanI+=calib_buff[j++]; - meanQ+=calib_buff[j++]; - } - meanI/=RXDCLENGTH; - meanQ/=RXDCLENGTH; - printf("[LMS] RX DC: (%d,%d) => (%d,%d)\n",offI,offQ,meanI,meanQ); - - while (cnt++ < 7) { - - offInew=(offIold+offI)>>1; - offQnew=(offQold+offQ)>>1; - - if (meanI*meanI < meanIold*meanIold) { - meanIold = meanI; - offIold = offI; - printf("[LMS] *** RX DC: offI %d => %d\n",offIold,meanI); - } - if (meanQ*meanQ < meanQold*meanQold) { - meanQold = meanQ; - offQold = offQ; - printf("[LMS] *** RX DC: offQ %d => %d\n",offQold,meanQ); - } - offI = offInew; - offQ = offQnew; - - lms7->SetRxDCOFF(offI,offQ); - - for (i=0;i<NUMBUFF;i++) - trx_lms_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0); - - for (meanI=meanQ=i=j=0;i<RXDCLENGTH;i++) { - meanI+=calib_buff[j++]; - meanQ+=calib_buff[j++]; - } - meanI/=RXDCLENGTH; - meanQ/=RXDCLENGTH; - printf("[LMS] RX DC: (%d,%d) => (%d,%d)\n",offI,offQ,meanI,meanQ); - } - if (meanI*meanI < meanIold*meanIold) { - meanIold = meanI; - offIold = offI; - printf("[LMS] *** RX DC: offI %d => %d\n",offIold,meanI); - } - if (meanQ*meanQ < meanQold*meanQold) { - meanQold = meanQ; - offQold = offQ; - printf("[LMS] *** RX DC: offQ %d => %d\n",offQold,meanQ); - } - - printf("[LMS] RX DC: (%d,%d) => (%d,%d)\n",offIold,offQold,meanIold,meanQold); - - lms7->SetRxDCOFF(offIold,offQold); - - dcoffi = offIold; - dcoffq = offQold; - - lms7->Modify_SPI_Reg_bits(LMS7param(MAC), ch); - lms7->Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1); - lms7->Modify_SPI_Reg_bits(LMS7param(CAPSEL), 0); - - // TX LO leakage - offQold=offIold=127; - lms7->SPI_write(0x0204,(((int16_t)offIold)<<7)|offQold); - - { - uint16_t requiredRegs[] = { 0x0400, 0x040A, 0x010D, 0x040C }; - uint16_t requiredMask[] = { 0x6000, 0x3007, 0x0040, 0x00FF }; //CAPSEL, AGC_MODE, AGC_AVG, EN_DCOFF, Bypasses - uint16_t requiredValue[] = { 0x0000, 0x1007, 0x0040, 0x00BD }; - - lms7->Modify_SPI_Reg_mask(requiredRegs, requiredMask, requiredValue, 0, 3); - } - sel_band1_trf = (uint8_t)lms7->Get_SPI_Reg_bits(LMS7param(SEL_BAND1_TRF)); - sel_band2_trf = (uint8_t)lms7->Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF)); - //B - lms7->Modify_SPI_Reg_bits(0x0100, 0, 0, 1); //EN_G_TRF 1 - if (sel_band1_trf == 1) - { - lms7->Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_1_RFE), 0); //PD_RLOOPB_1_RFE 0 - lms7->Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB1_RFE), 0); //EN_INSHSW_LB1 0 - } - if (sel_band2_trf == 1) - { - lms7->Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_2_RFE), 0); //PD_RLOOPB_2_RFE 0 - lms7->Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB2_RFE), 0); // EN_INSHSW_LB2 0 - } - // FixRXSaturation(); - - lms7->Modify_SPI_Reg_bits(LMS7param(GFIR3_BYP_RXTSP), 0); //GFIR3_BYP 0 - lms7->Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 2); - lms7->Modify_SPI_Reg_bits(LMS7param(GFIR3_L_RXTSP), 7); - lms7->Modify_SPI_Reg_bits(LMS7param(GFIR3_N_RXTSP), 7); - - lms7->SetGFIRCoefficients(LMS7002M::Rx, 2, firCoefs, sizeof(firCoefs) / sizeof(int16_t)); - - for (i=0;i<NUMBUFF;i++) { - trx_lms_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0); - trx_lms_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0); - } - - write_output("calibrx.m","rxs",calib_buffp,RXDCLENGTH,1,1); - exit(-1); - for (meanIold=meanQold=i=j=0;i<RXDCLENGTH;i++) { - switch (i&3) { - case 0: - meanIold+=calib_buff[j++]; - break; - case 1: - meanQold+=calib_buff[j++]; - break; - case 2: - meanIold-=calib_buff[j++]; - break; - case 3: - meanQold-=calib_buff[j++]; - break; - } - } - // meanIold/=RXDCLENGTH; - // meanQold/=RXDCLENGTH; - printf("[LMS] TX DC (offI): %d => (%d,%d)\n",offIold,meanIold,meanQold); - - offI=-128; - lms7->SPI_write(0x0204,(((int16_t)offI)<<7)|offQold); - - for (i=0;i<NUMBUFF;i++) { - trx_lms_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0); - trx_lms_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0); - } - - for (meanI=meanQ=i=j=0;i<RXDCLENGTH;i++) { - switch (i&3) { - case 0: - meanI+=calib_buff[j++]; - break; - case 1: - meanQ+=calib_buff[j++]; - break; - case 2: - meanI-=calib_buff[j++]; - break; - case 3: - meanQ-=calib_buff[j++]; - break; - } - } - // meanI/=RXDCLENGTH; - // meanQ/=RXDCLENGTH; - printf("[LMS] TX DC (offI): %d => (%d,%d)\n",offI,meanI,meanQ); - cnt = 0; - while (cnt++ < 8) { - - offInew=(offIold+offI)>>1; - if (meanI*meanI+meanQ*meanQ < meanIold*meanIold +meanQold*meanQold) { - printf("[LMS] TX DC (offI): ([%d,%d]) => %d : %d\n",offIold,offI,offInew,meanI*meanI+meanQ*meanQ); - meanIold = meanI; - meanQold = meanQ; - offIold = offI; - } - offI = offInew; - lms7->SPI_write(0x0204,(((int16_t)offI)<<7)|offQold); - - for (i=0;i<NUMBUFF;i++) { - trx_lms_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0); - trx_lms_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0); - } - - for (meanI=meanQ=i=j=0;i<RXDCLENGTH;i++) { - switch (i&3) { - case 0: - meanI+=calib_buff[j++]; - break; - case 1: - meanQ+=calib_buff[j++]; - break; - case 2: - meanI-=calib_buff[j++]; - break; - case 3: - meanQ-=calib_buff[j++]; - break; - } - } - // meanI/=RXDCLENGTH; - // meanQ/=RXDCLENGTH; - // printf("[LMS] TX DC (offI): %d => (%d,%d)\n",offI,meanI,meanQ); - } - - - if (meanI*meanI+meanQ*meanQ < meanIold*meanIold +meanQold*meanQold) { - printf("[LMS] TX DC (offI): ([%d,%d]) => %d : %d\n",offIold,offI,offInew,meanI*meanI+meanQ*meanQ); - meanIold = meanI; - meanQold = meanQ; - offIold = offI; - } - offQ=-128; - lms7->SPI_write(0x0204,(((int16_t)offIold)<<7)|offQ); - - for (i=0;i<NUMBUFF;i++) { - trx_lms_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0); - trx_lms_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0); - } - - for (meanI=meanQ=i=j=0;i<RXDCLENGTH;i++) { - switch (i&3) { - case 0: - meanI+=calib_buff[j++]; - break; - case 1: - meanQ+=calib_buff[j++]; - break; - case 2: - meanI-=calib_buff[j++]; - break; - case 3: - meanQ-=calib_buff[j++]; - break; - } - } - // meanI/=RXDCLENGTH; - // meanQ/=RXDCLENGTH; - printf("[LMS] TX DC (offQ): %d => (%d,%d)\n",offQ,meanI,meanQ); - - cnt=0; - while (cnt++ < 8) { - - offQnew=(offQold+offQ)>>1; - if (meanI*meanI+meanQ*meanQ < meanIold*meanIold +meanQold*meanQold) { - printf("[LMS] TX DC (offQ): ([%d,%d]) => %d : %d\n",offQold,offQ,offQnew,meanI*meanI+meanQ*meanQ); - - meanIold = meanI; - meanQold = meanQ; - offQold = offQ; - } - offQ = offQnew; - lms7->SPI_write(0x0204,(((int16_t)offIold)<<7)|offQ); - - - for (i=0;i<NUMBUFF;i++) { - trx_lms_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0); - trx_lms_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0); - } - - for (meanI=meanQ=i=j=0;i<RXDCLENGTH;i++) { - switch (i&3) { - case 0: - meanI+=calib_buff[j++]; - break; - case 1: - meanQ+=calib_buff[j++]; - break; - case 2: - meanI-=calib_buff[j++]; - break; - case 3: - meanQ-=calib_buff[j++]; - break; - } - } - // meanI/=RXDCLENGTH; - // meanQ/=RXDCLENGTH; - // printf("[LMS] TX DC (offQ): %d => (%d,%d)\n",offQ,meanI,meanQ); - } - - LMS_RxStop(); - - printf("[LMS] TX DC: (%d,%d) => (%d,%d)\n",offIold,offQold,meanIold,meanQold); - - dccorri = offIold; - dccorrq = offQold; - - - lms7->RestoreAllRegisters(); - lms7->Modify_SPI_Reg_bits(LMS7param(MAC), ch); - - lms7->Modify_SPI_Reg_bits(LMS7param(DCOFFI_RFE), dcoffi); - lms7->Modify_SPI_Reg_bits(LMS7param(DCOFFQ_RFE), dcoffq); - lms7->Modify_SPI_Reg_bits(LMS7param(DCCORRI_TXTSP), dccorri); - lms7->Modify_SPI_Reg_bits(LMS7param(DCCORRQ_TXTSP), dccorrq); - // lms7->Modify_SPI_Reg_bits(LMS7param(GCORRI_TXTSP), gcorri); - // lms7->Modify_SPI_Reg_bits(LMS7param(GCORRQ_TXTSP), gcorrq); - // lms7->Modify_SPI_Reg_bits(LMS7param(IQCORR_TXTSP), iqcorr); - - // lms7->Modify_SPI_Reg_bits(LMS7param(DC_BYP_TXTSP), 0); //DC_BYP - lms7->Modify_SPI_Reg_bits(0x0208, 1, 0, 0); //GC_BYP PH_BYP - -} -*/ +/*! \brief Set Gains (TX/RX) on LMSSDR + * \param device the hardware to use + * \param openair0_cfg openair0 Config structure + * \returns 0 in success + */ int trx_lms_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) { @@ -589,6 +159,10 @@ int trx_lms_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) return(0); } +/*! \brief Start LMSSDR + * \param device the hardware to use + * \returns 0 on success + */ int trx_lms_start(openair0_device *device){ @@ -746,7 +320,10 @@ int trx_lms_start(openair0_device *device){ return 0; } - +/*! \brief Stop LMSSDR + * \param card Index of the RF card to use + * \returns 0 on success + */ int trx_lms_stop(int card) { /* LMS_DeviceClose(usbport); @@ -756,6 +333,12 @@ int trx_lms_stop(int card) { */ } +/*! \brief Set frequencies (TX/RX) + * \param device the hardware to use + * \param openair0_cfg openair0 Config structure (ignored. It is there to comply with RF common API) + * \param exmimo_dump_config (ignored) + * \returns 0 in success + */ int trx_lms_set_freq(openair0_device* device, openair0_config_t *openair0_cfg,int exmimo_dump_config) { //Control port must be connected @@ -768,6 +351,7 @@ int trx_lms_set_freq(openair0_device* device, openair0_config_t *openair0_cfg,in } // 31 = 19 dB => 105 dB total gain @ 2.6 GHz +/*! \brief calibration table for LMSSDR */ rx_gain_calib_table_t calib_table_sodera[] = { {3500000000.0,70.0}, {2660000000.0,80.0}, @@ -780,33 +364,30 @@ rx_gain_calib_table_t calib_table_sodera[] = { - - +/*! \brief Get LMSSDR Statistics + * \param device the hardware to use + * \returns 0 in success + */ int trx_lms_get_stats(openair0_device* device) { return(0); } +/*! \brief Reset LMSSDR Statistics + * \param device the hardware to use + * \returns 0 in success + */ int trx_lms_reset_stats(openair0_device* device) { return(0); } -int openair0_set_gains(openair0_device* device, - openair0_config_t *openair0_cfg) { - - return(0); -} - -int openair0_set_frequencies(openair0_device* device, openair0_config_t *openair0_cfg, int dummy) { - - return(0); -} - - +/*! \brief Terminate operation of the LMSSDR transceiver -- free all associated resources + * \param device the hardware to use + */ void trx_lms_end(openair0_device *device) { @@ -877,3 +458,4 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg){ return 0; } } +/*@}*/ diff --git a/targets/DOCS/Doxyfile b/targets/DOCS/Doxyfile index ac6ee99480063889df7bec664722b23229e47ff9..a060f6597ab894c046e427960ed42c2ba1084000 100644 --- a/targets/DOCS/Doxyfile +++ b/targets/DOCS/Doxyfile @@ -796,7 +796,8 @@ INPUT = $(OPENAIR1_DIR)/PHY/defs.h \ $(OPENAIR_TARGETS)/ARCH/COMMON/common_lib.h \ $(OPENAIR_TARGETS)/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp \ $(OPENAIR_TARGETS)/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c \ - $(OPENAIR_TARGETS)/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h + $(OPENAIR_TARGETS)/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h \ + $(OPENAIR_TARGETS)/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses