diff --git a/targets/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp b/targets/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp index 3133742cd44592ee37ec10dcf4342202024b21a4..7abdf65498acf4c4eff9064481b2961f4ec07fe1 100644 --- a/targets/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp +++ b/targets/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp @@ -1,7 +1,8 @@ /** iris_lib.cpp * - * \author: Rahman Doost-Mohammady : doost@rice.edu + * \authors: Rahman Doost-Mohammady : doost@rice.edu + * Clay Shepard : cws@rice.edu */ #include <string.h> @@ -30,6 +31,7 @@ # include <immintrin.h> #endif +#define MOVE_DC #define SAMPLE_RATE_DOWN 1 /*! \brief Iris Configuration */ @@ -595,7 +597,8 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { } for (r = 0; r < s->device_num; r++) { - switch ((int) openair0_cfg[0].sample_rate) { + //this is unnecessary -- it will set the correct master clock based on sample rate + /*switch ((int) openair0_cfg[0].sample_rate) { case 1920000: s->iris[r]->setMasterClockRate(256 * openair0_cfg[0].sample_rate); break; @@ -615,54 +618,34 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { printf("Error: unknown sampling rate %f\n", openair0_cfg[0].sample_rate); exit(-1); break; - } - // display Iris settings - printf("Actual master clock: %fMHz...\n", (s->iris[r]->getMasterClockRate() / 1e6)); - - /* Setting TX/RX BW after streamers are created due to iris calibration issue */ - for (i = 0; i < s->tx_num_channels; i++) { - if (i < s->iris[r]->getNumChannels(SOAPY_SDR_TX)) { - if (s->iris[r]->getHardwareInfo()["frontend"].compare(devFE) != 0) - s->iris[r]->setBandwidth(SOAPY_SDR_TX, i, 30e6); - else - s->iris[r]->setBandwidth(SOAPY_SDR_TX, i, openair0_cfg[0].tx_bw); - - printf("Setting tx bandwidth on channel %lu/%lu: BW %f (readback %f)\n", i, - s->iris[r]->getNumChannels(SOAPY_SDR_TX), openair0_cfg[0].tx_bw / 1e6, - s->iris[r]->getBandwidth(SOAPY_SDR_TX, i) / 1e6); - } - } - for (i = 0; i < s->rx_num_channels; i++) { - if (i < s->iris[r]->getNumChannels(SOAPY_SDR_RX)) { - if (s->iris[r]->getHardwareInfo()["frontend"].compare(devFE) != 0) - s->iris[r]->setBandwidth(SOAPY_SDR_TX, i, 30e6); - else - s->iris[r]->setBandwidth(SOAPY_SDR_RX, i, openair0_cfg[0].rx_bw); - printf("Setting rx bandwidth on channel %lu/%lu : BW %f (readback %f)\n", i, - s->iris[r]->getNumChannels(SOAPY_SDR_RX), openair0_cfg[0].rx_bw / 1e6, - s->iris[r]->getBandwidth(SOAPY_SDR_RX, i) / 1e6); - } - } + }*/ for (i = 0; i < s->iris[r]->getNumChannels(SOAPY_SDR_RX); i++) { if (i < s->rx_num_channels) { s->iris[r]->setSampleRate(SOAPY_SDR_RX, i, openair0_cfg[0].sample_rate / SAMPLE_RATE_DOWN); +#ifdef MOVE_DC + printf("Moving DC out of main carrier for rx...\n"); + s->iris[r]->setFrequency(SOAPY_SDR_RX, i, "RF", openair0_cfg[0].rx_freq[i]-.75*openair0_cfg[0].sample_rate); + s->iris[r]->setFrequency(SOAPY_SDR_RX, i, "BB", .75*openair0_cfg[0].sample_rate); +#else s->iris[r]->setFrequency(SOAPY_SDR_RX, i, "RF", openair0_cfg[0].rx_freq[i]); +#endif set_rx_gain_offset(&openair0_cfg[0], i, bw_gain_adjust); //s->iris[r]->setGain(SOAPY_SDR_RX, i, openair0_cfg[0].rx_gain[i] - openair0_cfg[0].rx_gain_offset[i]); + printf("rx gain offset: %f, rx_gain: %f, tx_tgain: %f\n", openair0_cfg[0].rx_gain_offset[i], openair0_cfg[0].rx_gain[i], openair0_cfg[0].tx_gain[i]); if (s->iris[r]->getHardwareInfo()["frontend"].compare(devFE) != 0) { s->iris[r]->setGain(SOAPY_SDR_RX, i, "LNA", openair0_cfg[0].rx_gain[i] - openair0_cfg[0].rx_gain_offset[i]); //s->iris[r]->setGain(SOAPY_SDR_RX, i, "LNA", 0); s->iris[r]->setGain(SOAPY_SDR_RX, i, "LNA1", 30); s->iris[r]->setGain(SOAPY_SDR_RX, i, "LNA2", 17); - s->iris[r]->setGain(SOAPY_SDR_RX, i, "TIA", 0); - s->iris[r]->setGain(SOAPY_SDR_RX, i, "PGA", 0); + s->iris[r]->setGain(SOAPY_SDR_RX, i, "TIA", 7); + s->iris[r]->setGain(SOAPY_SDR_RX, i, "PGA", 18); s->iris[r]->setGain(SOAPY_SDR_RX, i, "ATTN", 0); } else { s->iris[r]->setGain(SOAPY_SDR_RX, i, "LNA", openair0_cfg[0].rx_gain[i] - openair0_cfg[0].rx_gain_offset[i]); // [0,30] - s->iris[r]->setGain(SOAPY_SDR_RX, i, "TIA", 0); // [0,12,6] - s->iris[r]->setGain(SOAPY_SDR_RX, i, "PGA", 0); // [-12,19,1] + s->iris[r]->setGain(SOAPY_SDR_RX, i, "TIA", 7); // [0,12,6] + s->iris[r]->setGain(SOAPY_SDR_RX, i, "PGA", 18); // [-12,19,1] //s->iris[r]->setGain(SOAPY_SDR_RX, i, 50); // [-12,19,1] } @@ -673,22 +656,29 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { for (i = 0; i < s->iris[r]->getNumChannels(SOAPY_SDR_TX); i++) { if (i < s->tx_num_channels) { s->iris[r]->setSampleRate(SOAPY_SDR_TX, i, openair0_cfg[0].sample_rate / SAMPLE_RATE_DOWN); +#ifdef MOVE_DC + printf("Moving DC out of main carrier for tx...\n"); + s->iris[r]->setFrequency(SOAPY_SDR_TX, i, "RF", openair0_cfg[0].tx_freq[i]-.75*openair0_cfg[0].sample_rate); + s->iris[r]->setFrequency(SOAPY_SDR_TX, i, "BB", .75*openair0_cfg[0].sample_rate); +#else s->iris[r]->setFrequency(SOAPY_SDR_TX, i, "RF", openair0_cfg[0].tx_freq[i]); +#endif if (s->iris[r]->getHardwareInfo()["frontend"].compare(devFE) == 0) { - //s->iris[r]->setGain(SOAPY_SDR_TX, i, "PAD", openair0_cfg[0].tx_gain[i]); - s->iris[r]->setGain(SOAPY_SDR_TX, i, "PAD", 52); + s->iris[r]->setGain(SOAPY_SDR_TX, i, "PAD", openair0_cfg[0].tx_gain[i]); + //s->iris[r]->setGain(SOAPY_SDR_TX, i, "PAD", 50); s->iris[r]->setGain(SOAPY_SDR_TX, i, "IAMP", 12); //s->iris[r]->writeSetting("TX_ENABLE_DELAY", "0"); //s->iris[r]->writeSetting("TX_DISABLE_DELAY", "100"); } else { + s->iris[r]->setGain(SOAPY_SDR_TX, i, "PAD", openair0_cfg[0].tx_gain[i]); s->iris[r]->setGain(SOAPY_SDR_TX, i, "ATTN", 0); // [-18, 0, 6] dB - s->iris[r]->setGain(SOAPY_SDR_TX, i, "IAMP", 9); // [-12, 12, 1] dB - s->iris[r]->setGain(SOAPY_SDR_TX, i, "PAD", 52); //openair0_cfg[0].tx_gain[i]); + s->iris[r]->setGain(SOAPY_SDR_TX, i, "IAMP", 6); // [-12, 12, 1] dB + //s->iris[r]->setGain(SOAPY_SDR_TX, i, "PAD", 44); //openair0_cfg[0].tx_gain[i]); //s->iris[r]->setGain(SOAPY_SDR_TX, i, "PAD", 35); // [0, 52, 1] dB - s->iris[r]->setGain(SOAPY_SDR_TX, i, "PA1", 9); // 17 ??? dB + //s->iris[r]->setGain(SOAPY_SDR_TX, i, "PA1", 17); // 17 ??? dB s->iris[r]->setGain(SOAPY_SDR_TX, i, "PA2", 0); // [0, 17, 17] dB - s->iris[r]->setGain(SOAPY_SDR_TX, i, "PA3", 20); // 33 ??? dB + //s->iris[r]->setGain(SOAPY_SDR_TX, i, "PA3", 20); // 33 ??? dB s->iris[r]->writeSetting("TX_ENABLE_DELAY", "0"); s->iris[r]->writeSetting("TX_DISABLE_DELAY", "100"); } @@ -702,32 +692,47 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { } - for (i = 0; i < s->iris[r]->getNumChannels(SOAPY_SDR_RX); i++) { - if (i < s->rx_num_channels) { - - //if (s->iris[r]->getHardwareInfo()["frontend"].compare(devFE) != 0) { - // printf("\nUsing SKLK calibration...\n"); - // s->iris[r]->writeSetting(SOAPY_SDR_RX, i, "CALIBRATE", "SKLK"); - //} else { - // s->iris[r]->writeSetting(SOAPY_SDR_RX, i, "CALIBRATE", ""); - // printf("\nUsing LMS calibration...\n"); + + printf("Actual master clock: %fMHz...\n", (s->iris[r]->getMasterClockRate() / 1e6)); - //} + int tx_filt_bw = openair0_cfg[0].tx_bw; + int rx_filt_bw = openair0_cfg[0].rx_bw; +#ifdef MOVE_DC //the filter is centered around the carrier, so we have to expand it if we have moved the DC tone. + tx_filt_bw *= 3; + rx_filt_bw *= 3; +#endif + /* Setting TX/RX BW */ + for (i = 0; i < s->tx_num_channels; i++) { + if (i < s->iris[r]->getNumChannels(SOAPY_SDR_TX)) { + s->iris[r]->setBandwidth(SOAPY_SDR_TX, i, tx_filt_bw); + printf("Setting tx bandwidth on channel %lu/%lu: BW %f (readback %f)\n", i, + s->iris[r]->getNumChannels(SOAPY_SDR_TX), tx_filt_bw / 1e6, + s->iris[r]->getBandwidth(SOAPY_SDR_TX, i) / 1e6); + } + } + for (i = 0; i < s->rx_num_channels; i++) { + if (i < s->iris[r]->getNumChannels(SOAPY_SDR_RX)) { + s->iris[r]->setBandwidth(SOAPY_SDR_RX, i, rx_filt_bw); + printf("Setting rx bandwidth on channel %lu/%lu : BW %f (readback %f)\n", i, + s->iris[r]->getNumChannels(SOAPY_SDR_RX), rx_filt_bw / 1e6, + s->iris[r]->getBandwidth(SOAPY_SDR_RX, i) / 1e6); } - } for (i = 0; i < s->iris[r]->getNumChannels(SOAPY_SDR_TX); i++) { if (i < s->tx_num_channels) { + printf("\nUsing SKLK calibration...\n"); + s->iris[r]->writeSetting(SOAPY_SDR_TX, i, "CALIBRATE", "SKLK"); - if (s->iris[r]->getHardwareInfo()["frontend"].compare(devFE) != 0) { - printf("\nUsing SKLK calibration...\n"); - s->iris[r]->writeSetting(SOAPY_SDR_TX, i, "CALIBRATE", "SKLK"); + } + + } + + for (i = 0; i < s->iris[r]->getNumChannels(SOAPY_SDR_RX); i++) { + if (i < s->rx_num_channels) { + printf("\nUsing SKLK calibration...\n"); + s->iris[r]->writeSetting(SOAPY_SDR_RX, i, "CALIBRATE", "SKLK"); - } else { - printf("\nUsing LMS calibration...\n"); - s->iris[r]->writeSetting(SOAPY_SDR_TX, i, "CALIBRATE", ""); - } } } diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band42.tm1.25PRB.iris030.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band42.tm1.25PRB.iris030.conf new file mode 100644 index 0000000000000000000000000000000000000000..764d7886e2a62a37b34c7e31dcb59384fa9b41b5 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band42.tm1.25PRB.iris030.conf @@ -0,0 +1,264 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + + plmn_list = ( { mcc = 208; mnc = 92; mnc_length = 2; } ); + + tr_s_preference = "local_mac" + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "TDD"; + tdd_config = 1; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 42; + downlink_frequency = 3500000000L; + uplink_frequency_offset = 0; + Nid_cell = 10; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 48; # [~50 for DEV-FE, ~30 for CBRS-FE] + rx_gain = 80; # [115 for DEV-FE, 90 for CBRS-FE] + pbch_repetition = "FALSE"; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -30; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -70; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -96; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + ue_TransmissionMode = 1; + + //Parameters for SIB18 + rxPool_sc_CP_Len = "normal"; + rxPool_sc_Period = "sf40"; + rxPool_data_CP_Len = "normal"; + rxPool_ResourceConfig_prb_Num = 20; + rxPool_ResourceConfig_prb_Start = 5; + rxPool_ResourceConfig_prb_End = 44; + rxPool_ResourceConfig_offsetIndicator_present = "prSmall"; + rxPool_ResourceConfig_offsetIndicator_choice = 0; + rxPool_ResourceConfig_subframeBitmap_present = "prBs40"; + rxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "00000000000000000000"; + rxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5; + rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0; +/* rxPool_dataHoppingConfig_hoppingParameter = 0; + rxPool_dataHoppingConfig_numSubbands = "ns1"; + rxPool_dataHoppingConfig_rbOffset = 0; + rxPool_commTxResourceUC-ReqAllowed = "TRUE"; +*/ + // Parameters for SIB19 + discRxPool_cp_Len = "normal" + discRxPool_discPeriod = "rf32" + discRxPool_numRetx = 1; + discRxPool_numRepetition = 2; + discRxPool_ResourceConfig_prb_Num = 5; + discRxPool_ResourceConfig_prb_Start = 3; + discRxPool_ResourceConfig_prb_End = 21; + discRxPool_ResourceConfig_offsetIndicator_present = "prSmall"; + discRxPool_ResourceConfig_offsetIndicator_choice = 0; + discRxPool_ResourceConfig_subframeBitmap_present = "prBs40"; + discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "f0ffffffff"; + discRxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5; + discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0; + + } + ); + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "127.0.0.20"; + ipv6 = "fe80::d65d:dfff:fe1d:f4d4"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eno1"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.10/8"; + ENB_INTERFACE_NAME_FOR_S1U = "enp5s0"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.10/8"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "127.0.0.10/8"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 + }; + } +); + +MACRLCs = ( + { + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + phy_test_mode = 0; + puSch10xSnr = 200; + puCch10xSnr = 200; + } +); + +L1s = ( + { + num_cc = 1; + tr_n_preference = "local_mac"; + } +); + +RUs = ( + { + local_rf = "yes" + nb_tx = 1; + nb_rx = 1; + att_tx = 44; #apparently this is being used as tx_gain... + att_rx = 0; #apparently max_rxgain - att_rx -83 is what is used for rx_gain (at least for 5 MHz) + bands = [7]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 107; + eNB_instances = [0]; + #sdr_addrs = "RF3E000025"; + } +); + +NETWORK_CONTROLLER : +{ + FLEXRAN_ENABLED = "no"; + FLEXRAN_INTERFACE_NAME = "lo"; + FLEXRAN_IPV4_ADDRESS = "127.0.0.1"; + FLEXRAN_PORT = 2210; + FLEXRAN_CACHE = "/mnt/oai_agent_cache"; + FLEXRAN_AWAIT_RECONF = "no"; +}; + +THREAD_STRUCT = ( + { + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_RU_L1_TRX_SPLIT"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; + } +); + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; +