From 80957a42a2ebd0d4a4518e4f4be3b326f91faf08 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 11 Feb 2015 15:34:47 +0000 Subject: [PATCH] git-svn-id: http://svn.eurecom.fr/openair4G/trunk@6522 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- .../PHY/LTE_ESTIMATION/lte_ue_measurements.c | 6 +- openair1/PHY/TOOLS/lte_phy_scope.c | 2 +- openair1/PHY/defs.h | 46 ++++-- openair1/PHY/impl_defs_top.h | 1 + openair1/SCHED/phy_procedures_lte_eNb.c | 135 +++++++++++++++--- 5 files changed, 153 insertions(+), 37 deletions(-) diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c index 6582e1d5fc..4c089f41ff 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c @@ -230,7 +230,7 @@ void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue, } } - LOG_D(PHY,"eNB: %d, RSRP_tmp: %d \n",eNB_offset,phy_vars_ue->PHY_measurements.rsrp[eNB_offset]); +// LOG_D(PHY,"eNB: %d, RSRP_tmp: %d \n",eNB_offset,phy_vars_ue->PHY_measurements.rsrp[eNB_offset]); // 2 RE per PRB phy_vars_ue->PHY_measurements.rsrp[eNB_offset]/=(24*phy_vars_ue->lte_frame_parms.N_RB_DL); @@ -256,7 +256,7 @@ void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue, } if (((phy_vars_ue->frame_rx %10) == 0) && (slot == 0)) { -#ifdef DEBUG_MEAS +//#ifdef DEBUG_MEAS if (eNB_offset == 0) LOG_D(PHY,"[UE %d] Frame %d, slot %d RRC Measurements => rssi %3.1f dBm (digital: %3.1f dB, gain %d)\n",phy_vars_ue->Mod_id, phy_vars_ue->frame_rx,slot,10*log10(phy_vars_ue->PHY_measurements.rssi)-phy_vars_ue->rx_total_gain_dB, @@ -274,7 +274,7 @@ void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue, //LOG_D(PHY,"RSRP_dB: %3.2f \n",(dB_fixed_times10(phy_vars_ue->PHY_measurements.rsrp[eNB_offset])/10.0)); //LOG_D(PHY,"gain_loss_dB: %d \n",phy_vars_ue->rx_total_gain_dB); //LOG_D(PHY,"gain_fixed_dB: %d \n",dB_fixed(phy_vars_ue->lte_frame_parms.N_RB_DL*12)); -#endif +//#endif } } } diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c index 6ef68e0d80..3fb0f8244c 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.c +++ b/openair1/PHY/TOOLS/lte_phy_scope.c @@ -414,7 +414,7 @@ FD_lte_phy_scope_ue *create_lte_phy_scope_ue( void ) { return fdui; } - + void phy_scope_UE(FD_lte_phy_scope_ue *form, PHY_VARS_UE *phy_vars_ue, int eNB_id, diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index c882f749f4..30f06e30d0 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -399,46 +399,66 @@ typedef enum { /// Top-level PHY Data Structure for UE typedef struct { - /// Module ID indicator for this instance + /// \brief Module ID indicator for this instance uint8_t Mod_id; + /// \brief Component carrier ID for this PHY instance uint8_t CC_id; - uint8_t local_flag; + //uint8_t local_flag; + /// \brief Indicator of current run mode of UE (normal_txrx, rx_calib_ue, no_L2_connect, debug_prach) + runmode_t mode; + /// \brief Indicator that UE should perform band scanning + int UE_scan; + /// \brief Indicator that UE is synchronized to an eNB int is_synchronized; + /// \brief Instance count of TX processing thread (-1 means ready, 0 means busy) int instance_cnt_tx; + /// \brief Instance count of RX processing thread (-1 means ready, 0 means busy) int instance_cnt_rx; + /// \brief Instance cound of initial synchronization thread (-1 means ready, 0 means busy) int instance_cnt_synch; + /// \brief Condition variable for TX processing thread pthread_cond_t cond_tx; + /// \brief Condition variable for RX processing thread pthread_cond_t cond_rx; + /// \brief Condition variable for initial synchronization thread pthread_cond_t cond_synch; + /// \brief Mutex for TX processing thread pthread_mutex_t mutex_tx; + /// \brief Mutex for RX processing thread pthread_mutex_t mutex_rx; + /// \brief Mutex for initial synchronization thread pthread_mutex_t mutex_synch; + /// \brief Pthread structure for RX processing thread pthread_t thread_rx; + /// \brief Pthread structure for TX processing thread pthread_t thread_tx; + /// \brief Pthread structure to RX processing thread pthread_t thread_synch; + /// \brief Total gain of the TX chain (16-bit baseband I/Q to antenna) uint32_t tx_total_gain_dB; - /// \brief This is a function of rx_gain_mode (and the corresponding gain) and the rx_gain of the card. + /// \brief Total gain of the RX chain (antenna to baseband I/Q) This is a function of rx_gain_mode (and the corresponding gain) and the rx_gain of the card. uint32_t rx_total_gain_dB; - /// \brief ?. - /// - first index: ? [0..3] (hard coded) + /// \brief Total gains with maximum RF gain stage (ExpressMIMO2/Lime) uint32_t rx_gain_max[4]; - /* - rx_gain_t rx_gain_mode[4];*/ - /// \brief ?. - /// - first index: ? [0..3] (hard coded) + /// \brief Total gains with medium RF gain stage (ExpressMIMO2/Lime) uint32_t rx_gain_med[4]; - /// \brief ?. - /// - first index: ? [0..3] (hard coded) + /// \brief Total gains with bypassed RF gain stage (ExpressMIMO2/Lime) uint32_t rx_gain_byp[4]; - /// \brief ?. + /// \brief Current transmit power int8_t tx_power_dBm; + /// \brief Total number of REs in current transmission int tx_total_RE; + /// \brief Maximum transmit power int8_t tx_power_max_dBm; - // uint32_t frame; + /// \brief Frame counters for TX and RX processing uint32_t frame_rx,frame_tx; + /// \brief Slot counters for TX and RX processing uint32_t slot_tx,slot_rx; + /// \brief Number of eNB seen by UE uint8_t n_connected_eNB; + /// \brief indicator that Handover procedure has been initiated uint8_t ho_initiated; + /// \brief indicator that Handover procedure has been triggered uint8_t ho_triggered; /// \brief Measurement variables. PHY_MEASUREMENTS PHY_measurements; diff --git a/openair1/PHY/impl_defs_top.h b/openair1/PHY/impl_defs_top.h index 43695d4693..2371749002 100755 --- a/openair1/PHY/impl_defs_top.h +++ b/openair1/PHY/impl_defs_top.h @@ -237,6 +237,7 @@ #define AMP 128 #else #define AMP 512//1024 //4096 +#define AMP_BPSK 724 #endif #define AMP_OVER_SQRT2 ((AMP*ONE_OVER_SQRT2_Q15)>>15) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index d9ce11c466..4243d720aa 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -523,32 +523,127 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e else rand = (rand%4)+5; */ + uint32_t bcch_pdu; DCI_pdu->Num_common_dci = 0; DCI_pdu->Num_ue_spec_dci=0; + + switch (subframe) { case 5: DCI_pdu->Num_common_dci = 1; - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_FDD_t; - else - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; DCI_pdu->dci_alloc[0].L = 2; DCI_pdu->dci_alloc[0].rnti = SI_RNTI; DCI_pdu->dci_alloc[0].format = format1A; DCI_pdu->dci_alloc[0].ra_flag = 0; - - BCCH_alloc_pdu.type = 1; - BCCH_alloc_pdu.vrb_type = 0; - BCCH_alloc_pdu.rballoc = computeRIV(25,10,3); - BCCH_alloc_pdu.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - BCCH_alloc_pdu.rv = 1; - BCCH_alloc_pdu.mcs = 1; - BCCH_alloc_pdu.harq_pid = 0; - BCCH_alloc_pdu.TPC = 1; // set to 3 PRB - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&BCCH_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t)); + switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) { + case 6: + if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_FDD_t; + ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->type = 1; + ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; + ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); + ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->rv = 1; + ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->mcs = 1; + ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; + ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_1_5MHz_TDD_1_6_t)); + } + else { + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t; + ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; + ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; + ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); + ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; + ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; + ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0; + ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_1_5MHz_TDD_1_6_t)); + } + break; + case 25: + default: + if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_FDD_t; + ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->type = 1; + ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; + ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); + ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->rv = 1; + ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->mcs = 1; + ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; + ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t)); + } + else { + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; + ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; + ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; + ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); + ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; + ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; + ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0; + ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t)); + } + break; + case 50: + if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_10MHz_FDD_t; + ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->type = 1; + ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; + ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); + ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rv = 1; + ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->mcs = 1; + ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; + ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_10MHz_TDD_1_6_t)); + } + else { + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t; + ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; + ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; + ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); + ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; + ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; + ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0; + ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_10MHz_TDD_1_6_t)); + } break; + case 100: + if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_10MHz_FDD_t; + ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->type = 1; + ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; + ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); + ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rv = 1; + ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->mcs = 1; + ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; + ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_20MHz_TDD_1_6_t)); + } + else { + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t; + ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; + ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; + ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); + ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; + ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; + ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0; + ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_20MHz_TDD_1_6_t)); + } + break; + } case 6: /* DCI_pdu->Num_ue_spec_dci = 1; @@ -1169,12 +1264,12 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e if (subframe == 0) { if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, + AMP_BPSK, &phy_vars_eNB->lte_frame_parms, (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 6 : 5, 0); generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, + AMP_BPSK, &phy_vars_eNB->lte_frame_parms, (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 5 : 4, 0); @@ -1293,7 +1388,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { // printf("Generating PSS (frame %d, subframe %d)\n",phy_vars_eNB->proc[sched_subframe].frame_tx,next_slot>>1); generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, + AMP_BPSK, &phy_vars_eNB->lte_frame_parms, 2, 2); @@ -1308,12 +1403,12 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, + AMP_BPSK, &phy_vars_eNB->lte_frame_parms, (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 6 : 5, 10); generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, + AMP_BPSK, &phy_vars_eNB->lte_frame_parms, (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 5 : 4, 10); @@ -1342,7 +1437,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { // printf("Generating PSS (frame %d, subframe %d)\n",phy_vars_eNB->proc[sched_subframe].frame_tx,next_slot>>1); generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, + AMP_BPSK, &phy_vars_eNB->lte_frame_parms, 2, 12);