diff --git a/configuration/bladeRF/enb-band7-5mhz.conf b/configuration/bladeRF/enb-band7-5mhz.conf new file mode 100644 index 0000000000000000000000000000000000000000..6e07b8d9499e8cfb2ca60f0d3da91d3dbb92348a --- /dev/null +++ b/configuration/bladeRF/enb-band7-5mhz.conf @@ -0,0 +1,274 @@ +Active_eNBs = ( "eNB-Eurecom-LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + # real_time choice in {hard, rt-preempt, no} + real_time = "no"; + ////////// 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; + nb_antenna_ports = 1; + ue_TransmissionMode = 1; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2680000000L; + uplink_frequency_offset = -120000000; + + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + prach_root = 0; + tx_gain = 90; + rx_gain = 115; + pbch_repetition = "FALSE"; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 0; + pucch_nCS_AN = 0; + pucch_n1_AN = 0; + pdsch_referenceSignalPower = -29; + 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 = -96; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -108; + 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 = -108; + 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; + + //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 = "192.168.12.148"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth1"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.196/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth1"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.196/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.196/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 + }; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="high"; + 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 ="debug"; + rlc_log_verbosity ="high"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="high"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + + } +); + +MACRLCs = ( + { + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + phy_test_mode = 0; + puSch10xSnr = 210; + puCch10xSnr = 210; + } +); + +THREAD_STRUCT = ( + { + parallel_config = "PARALLEL_RU_L1_TRX_SPLITaaaaaa"; + worker_config = "ENABLE"; + } +); + +L1s = ( + { + num_cc = 1; + tr_n_preference = "local_mac"; + } +); + +RUs = ( + { + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 73 + att_rx = 0; + bands = [7]; + max_pdschReferenceSignalPower = -28; + max_rxgain = 96; + eNB_instances = [0]; + + } +); + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="high"; + 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 ="high"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="high"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; diff --git a/targets/ARCH/BLADERF/README b/targets/ARCH/BLADERF/README new file mode 100644 index 0000000000000000000000000000000000000000..c93c938bafcde213308ca785e48a391489fd2d1c --- /dev/null +++ b/targets/ARCH/BLADERF/README @@ -0,0 +1,138 @@ +BladeRF documentation +===================== + +As of 2018-11-06, the bladeRF support is not fully automatic and requires +some manual settings before use. This documentation is the ultimate source +of information. If something described in this file does not work or does +not correspond to the reality, then contact us so we can fix the problems +and update this documentation. + +1. Install bladeRF 2.0 libraries. + + As of now, it's better to install from source. + So, do not run: ./build_oai -I -w BLADERF + (That is: do not include '-w BLADERF'.) + + Instead, follow the instructions at: https://github.com/Nuand/bladeRF + + If you already had some bladeRF software installed using automatic + methods, first remove it by hand ('apt-get purge bladeRF' or something + similar, you can get the list of installed bladeRF packages by running + 'dpkg -l|grep -i blade', remove them all). + +2. Update the device. + + Download the latest FX3 firmware and FPGA images from Nuand's website. + As of writing, this is: + + https://github.com/Nuand/bladeRF/wiki + + That points to the following pages. + For FX3: + + http://www.nuand.com/fx3_images/ + + For FPGA: + + http://www.nuand.com/fpga_images/ + + Install FX3 firmware: + + sudo bladeRF-cli -f bladeRF_fw_latest.img + + Install FPGA image (this is for BladeRF x40): + + sudo bladeRF-cli -L hostedx40-latest.rbf + + Retrieve calibration information: + + sudo bladeRF-cli -i + info + + That outputs the serial number of your device. + + Go to: + + https://www.nuand.com/calibration + + And enter your serial number. + The website tells you to run something like: + + sudo bladeRF-cli -i + flash_init_cal 40 0x9271 + + Actual values depend on your device and serial number. + +3. Calibrate the bladeRF device. + + We will work with band 7 on 2.68GHz with a bandwidth of 5 MHz (25 RBs). + + Plug the bladeRF device, then run: + + sudo bladeRF-cli -i + set frequency tx 2680000000 + set frequency rx 2560000000 + set gain rx 60 + set gain tx 60 + set bandwidth 5000000 + set samplerate 7680000 + cal lms + cal lms + cal lms + cal dc rxtx + cal dc rxtx + cal dc rxtx + +4. Tune the RX gain using the enb tracer. + + Run the softmodem and the 'enb' tracer. For instructions, see: + + https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/T/basic + + In the enb window, check the 'input signal'. You should see some blue + signal as seen at: + + https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/T/enb + + (the 'Time signal power' plot). + + The level should be around 30. + + If it's not around 30 then edit your configuration file and modify + the value 'max_rxgain' in the section 'RUs'. + + The configuration file to use is: + + configuration/bladeRF/enb-band7-5mhz.conf + + In the configuration file, you also need to set the correct values for: + + - tracking_area_code + - plmn_list: mcc, mnc, mnc_length + - mme_ip_address: this is the IP address used by the computer running + the softmodem to connect to the EPC + - NETWORK_INTERFACES: all the ENB*ADDRESS* variables have to point + to the IP address of the EPC machine + +5. You're good to go. + + You can now connect a UE and pass some traffic. If everything is well + configured you can expect more than 16 Mb/s of throughput in the downlink + using iperf and more than 8 Mb/s in the uplink. Looking at the logs, you + should find lines containing 'PHR 40' and 'CQI 15'. If your values are + lower then your setup may need some adjustments. + +6. In case of problems. + + If the performance of the softmodem is very bad, you can stop it and + run the calibration again, without setting the parameters (frequencies, + gains, etc.). Just run: + + sudo bladeRF-cli -i + cal lms + cal dc rxtx + + That may help. + + Be sure to use proper radio equipment (duplexer, antennas, clean + environment without interferences). diff --git a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c index 75a7825669d2320c062ded059aa1ced9c05987bf..e5966af267047b0285583bab64d2e75370b65385 100644 --- a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c +++ b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c @@ -116,15 +116,6 @@ int trx_brf_start(openair0_device *device) { abort(); } - if ((status=bladerf_calibrate_dc(brf->dev, BLADERF_MODULE_TX)) != 0) { - fprintf(stderr,"Failed to calibrate TX DC: %s\n", bladerf_strerror(status)); - abort(); - } - if ((status=bladerf_calibrate_dc(brf->dev, BLADERF_MODULE_RX)) != 0) { - fprintf(stderr,"Failed to calibrate RX DC: %s\n", bladerf_strerror(status)); - abort(); - } - return 0; } @@ -235,8 +226,6 @@ static int trx_brf_read(openair0_device *device, openair0_timestamp *ptimestamp, * \param device the hardware to use */ void trx_brf_end(openair0_device *device) { -abort(); - int status; brf_state_t *brf = (brf_state_t*)device->priv; // Disable RX module, shutting down our underlying RX stream @@ -247,6 +236,7 @@ abort(); fprintf(stderr, "Failed to disable TX module: %s\n", bladerf_strerror(status)); } bladerf_close(brf->dev); + exit(1); } /*! \brief print the BladeRF statistics @@ -362,6 +352,8 @@ void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index) { */ void calibrate_rf(openair0_device *device) { + /* TODO: this function does not seem to work. Disabled until fixed. */ + return; brf_state_t *brf = (brf_state_t *)device->priv; openair0_timestamp ptimestamp; @@ -1005,6 +997,12 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { // RX // Example of CLI output: RX Frequency: 2539999999Hz + + if ((status=bladerf_set_gain_mode(brf->dev, BLADERF_MODULE_RX, BLADERF_GAIN_MGC))) { + fprintf(stderr, "[BRF] Failed to disable AGC\n"); + brf_error(status); + } + if ((status=bladerf_set_frequency(brf->dev, BLADERF_MODULE_RX, (unsigned int) openair0_cfg->rx_freq[0])) != 0){ fprintf(stderr,"Failed to set RX frequency: %s\n",bladerf_strerror(status)); brf_error(status); @@ -1096,17 +1094,14 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { // calibrate - if ((status=bladerf_calibrate_dc(brf->dev, BLADERF_MODULE_TX)) != 0) { - fprintf(stderr,"Failed to calibrate TX DC: %s\n", bladerf_strerror(status)); + if ((status=bladerf_calibrate_dc(brf->dev, BLADERF_DC_CAL_LPF_TUNING)) != 0 || + (status=bladerf_calibrate_dc(brf->dev, BLADERF_DC_CAL_TX_LPF)) != 0 || + (status=bladerf_calibrate_dc(brf->dev, BLADERF_DC_CAL_RX_LPF)) != 0 || + (status=bladerf_calibrate_dc(brf->dev, BLADERF_DC_CAL_RXVGA2)) != 0) { + fprintf(stderr, "[BRF] error calibrating\n"); brf_error(status); - } else - printf("[BRF] TX module calibrated DC \n"); - - if ((status=bladerf_calibrate_dc(brf->dev, BLADERF_MODULE_RX)) != 0) { - fprintf(stderr,"Failed to calibrate RX DC: %s\n", bladerf_strerror(status)); - brf_error(status); - }else - printf("[BRF] RX module calibrated DC \n"); + } else + printf("[BRF] calibration OK\n"); bladerf_log_set_verbosity(get_brf_log_level(openair0_cfg->log_level)); @@ -1146,8 +1141,8 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { * \returns 0 on success */ int brf_error(int status) { - - //exit(-1); + fprintf(stderr, "[BRF] brf_error: %s\n", bladerf_strerror(status)); + exit(-1); return status; // or status error code } @@ -1190,7 +1185,7 @@ struct bladerf * open_bladerf_from_serial(const char *serial) { int get_brf_log_level(int log_level){ int level=BLADERF_LOG_LEVEL_INFO; - return BLADERF_LOG_LEVEL_DEBUG; // BLADERF_LOG_LEVEL_VERBOSE;// BLADERF_LOG_LEVEL_DEBUG; // + return BLADERF_LOG_LEVEL_INFO; switch(log_level) { case LOG_DEBUG: level=BLADERF_LOG_LEVEL_DEBUG;