From bb34f0786bb2b686e745161d2e67ec0c9c73c275 Mon Sep 17 00:00:00 2001 From: Raymond Knopp <raymond.knopp@eurecom.fr> Date: Wed, 10 Jun 2015 18:11:06 +0000 Subject: [PATCH] git-svn-id: http://svn.eurecom.fr/openair4G/trunk@7550 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- openair1/PHY/LTE_TRANSPORT/dci_tools.c | 4 +- openair1/PHY/LTE_TRANSPORT/prach.c | 2 +- openair1/PHY/defs.h | 2 +- openair1/SCHED/defs.h | 2 +- openair1/SCHED/phy_procedures_lte_ue.c | 184 ++++++++++++++++--------- 5 files changed, 125 insertions(+), 69 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index 571549d2251..60f56f3b556 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -3708,10 +3708,10 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, } // change the mcs limit from 7 to 8, supported by MAC - if (mcs > 10) { + /* if (mcs > 10) { LOG_E(PHY,"Format 1A: subframe %d unlikely mcs for format 1A (%d), TPC %d rv %d\n",subframe,mcs,TPC,rv); return(-1); - } + }*/ if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)) { // if (dlsch0_harq->round == 4) { diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index 73c3957b6d1..c824433ce9f 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -592,7 +592,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra #ifdef BIT8_TX prach_start = ((subframe*phy_vars_ue->lte_frame_parms.samples_per_tti)<<1)-phy_vars_ue->N_TA_offset; #else -#ifdef EXMIMO +#if defined(EXMIMO) || defined(OAI_USRP) prach_start = (phy_vars_ue->rx_offset+subframe*phy_vars_ue->lte_frame_parms.samples_per_tti-openair_daq_vars.timing_advance-phy_vars_ue->N_TA_offset); if (prach_start<0) diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index e90f6ba435f..6cde667765e 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -127,7 +127,7 @@ static inline void* malloc16_clear( size_t size ) #define NB_BANDS_MAX 8 -typedef enum {normal_txrx=0,rx_calib_ue=1,rx_calib_ue_med=2,rx_calib_ue_byp=3,debug_prach=4,no_L2_connect=5} runmode_t; +typedef enum {normal_txrx=0,rx_calib_ue=1,rx_calib_ue_med=2,rx_calib_ue_byp=3,debug_prach=4,no_L2_connect=5,calib_prach_tx=6} runmode_t; enum transmission_access_mode { NO_ACCESS=0, diff --git a/openair1/SCHED/defs.h b/openair1/SCHED/defs.h index e779dd6564f..3f0da65030f 100644 --- a/openair1/SCHED/defs.h +++ b/openair1/SCHED/defs.h @@ -431,7 +431,7 @@ int32_t remove_ue(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_ void process_timing_advance(module_id_t Mod_id,uint8_t CC_id,int16_t timing_advance); void process_timing_advance_rar(PHY_VARS_UE *phy_vars_ue,uint16_t timing_advance); -unsigned int get_tx_amp(int gain_dBm, int gain_max_dBm); +unsigned int get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb); void phy_reset_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index); diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 7c19144c45c..3db2bf62a42 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -194,20 +194,67 @@ void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) } #if defined(EXMIMO) || defined(OAI_USRP) -unsigned int prach_gain_table[31] = {100,112,126,141,158,178,200,224,251,282,316,359,398,447,501,562,631,708,794,891,1000,1122,1258,1412,1585,1778,1995,2239,2512,2818,3162}; - -unsigned int get_tx_amp(int power_dBm, int power_max_dBm) +//unsigned int gain_table[31] = {100,112,126,141,158,178,200,224,251,282,316,359,398,447,501,562,631,708,794,891,1000,1122,1258,1412,1585,1778,1995,2239,2512,2818,3162}; +/* +unsigned int get_tx_amp_prach(int power_dBm, int power_max_dBm, int N_RB_UL) { int gain_dB = power_dBm - power_max_dBm; + int amp_x_100; + switch (N_RB_UL) { + case 6: + amp_x_100 = AMP; // PRACH is 6 PRBS so no scale + break; + case 15: + amp_x_100 = 158*AMP; // 158 = 100*sqrt(15/6) + break; + case 25: + amp_x_100 = 204*AMP; // 204 = 100*sqrt(25/6) + break; + case 50: + amp_x_100 = 286*AMP; // 286 = 100*sqrt(50/6) + break; + case 75: + amp_x_100 = 354*AMP; // 354 = 100*sqrt(75/6) + break; + case 100: + amp_x_100 = 408*AMP; // 408 = 100*sqrt(100/6) + break; + default: + LOG_E(PHY,"Unknown PRB size %d\n",N_RB_UL); + mac_xface->macphy_exit(""); + break; + } if (gain_dB < -30) { - return(AMP/32); + return(amp_x_100/3162); } else if (gain_dB>0) - return(AMP); + return(amp_x_100); else - return(100*AMP/prach_gain_table[-gain_dB]); + return(amp_x_100/gain_table[-gain_dB]); // 245 corresponds to the factor sqrt(25/6) +} +*/ + +unsigned int get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb) +{ + + int gain_dB = power_dBm - power_max_dBm; + double gain_lin; + + if (gain_dB < -30) + return(AMP/32); + + gain_lin = pow(10,.1*gain_dB); + if ((nb_rb >0) && (nb_rb <= N_RB_UL)) { + return((int)(AMP*sqrt(gain_lin*N_RB_UL/(double)nb_rb))); + } + else { + LOG_E(PHY,"Illegal nb_rb/N_RB_UL combination (%d/%d)\n",nb_rb,N_RB_UL); + mac_xface->macphy_exit(""); + } + return(0); } + #endif void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) @@ -628,6 +675,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra #ifndef OPENAIR2 int i; #endif + int tx_amp; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX,VCD_FUNCTION_IN); @@ -927,38 +975,33 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra #else phy_vars_ue->tx_power_dBm = UE_TX_POWER; #endif - phy_vars_ue->tx_total_RE = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->nb_rb*12; - - LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d, generating PUSCH, Po_PUSCH: %d dBm, amp %d\n", - Mod_id,harq_pid,frame_tx,subframe_tx,phy_vars_ue->tx_power_dBm, + phy_vars_ue->tx_total_RE = nb_rb*12; + #if defined(EXMIMO) || defined(OAI_USRP) - get_tx_amp(phy_vars_ue->tx_power_dBm,phy_vars_ue->tx_power_max_dBm) + tx_amp = get_tx_amp(phy_vars_ue->tx_power_dBm, + phy_vars_ue->tx_power_max_dBm, + phy_vars_ue->lte_frame_parms.N_RB_UL, + nb_rb); #else - AMP + tx_amp = AMP; #endif - ); + LOG_I(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d, generating PUSCH, Po_PUSCH: %d dBm, amp %d\n", + Mod_id,harq_pid,frame_tx,subframe_tx,phy_vars_ue->tx_power_dBm, tx_amp); start_meas(&phy_vars_ue->ulsch_modulation_stats); ulsch_modulation(phy_vars_ue->lte_ue_common_vars.txdataF, -#if defined(EXMIMO) || defined(OAI_USRP) - get_tx_amp(phy_vars_ue->tx_power_dBm,phy_vars_ue->tx_power_max_dBm), -#else - AMP, -#endif + tx_amp, frame_tx, subframe_tx, &phy_vars_ue->lte_frame_parms, phy_vars_ue->ulsch_ue[eNB_id]); -#if defined(EXMIMO) || defined(OAI_USRP) - - for (aa=0; aa<1/*frame_parms->nb_antennas_tx*/; aa++) - generate_drs_pusch(phy_vars_ue,eNB_id,get_tx_amp(phy_vars_ue->tx_power_dBm,phy_vars_ue->tx_power_max_dBm),subframe_tx,first_rb,nb_rb,aa); - -#else - for (aa=0; aa<1/*frame_parms->nb_antennas_tx*/; aa++) - generate_drs_pusch(phy_vars_ue,eNB_id,AMP,subframe_tx,first_rb,nb_rb,aa); - -#endif + generate_drs_pusch(phy_vars_ue, + eNB_id, + tx_amp, + subframe_tx, + first_rb, + nb_rb, + aa); stop_meas(&phy_vars_ue->ulsch_modulation_stats); } @@ -1030,38 +1073,37 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra #endif phy_vars_ue->tx_total_RE = 12; +#if defined(EXMIMO) || defined(OAI_USRP) + tx_amp = get_tx_amp(Po_PUCCH, + phy_vars_ue->tx_power_max_dBm, + phy_vars_ue->lte_frame_parms.N_RB_UL, + 1); +#else + tx_amp = AMP; +#endif + if (SR_payload>0) { - LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d Generating PUCCH 1a/1b payload %d,%d (with SR for PUSCH), n1_pucch %d, Po_PUCCH, amp %d\n", + LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d Generating PUCCH 1a/1b payload %d,%d (with SR for PUSCH), n1_pucch %d, Po_PUCCH, amp %d\n", Mod_id, phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, frame_tx, subframe_tx, pucch_ack_payload[0],pucch_ack_payload[1], phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex, - Po_PUCCH, -#if defined(EXMIMO) || defined(OAI_USRP) - get_tx_amp(Po_PUCCH,phy_vars_ue->tx_power_max_dBm) -#else - AMP -#endif - ); + Po_PUCCH, + tx_amp); } else { LOG_D(PHY,"[UE %d][PDSCH %x] Frame %d subframe %d Generating PUCCH 1a/1b, n1_pucch %d, b[0]=%d,b[1]=%d (SR_Payload %d), Po_PUCCH %d, amp %d\n", Mod_id, phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, - frame_tx, subframe_tx, + frame_tx, subframe_tx, n1_pucch,pucch_ack_payload[0],pucch_ack_payload[1],SR_payload, Po_PUCCH, -#if defined(EXMIMO) || defined(OAI_USRP) - get_tx_amp(Po_PUCCH,phy_vars_ue->tx_power_max_dBm) -#else - AMP -#endif - ); - } + tx_amp); + } if (abstraction_flag == 0) { - generate_pucch(phy_vars_ue->lte_ue_common_vars.txdataF, + generate_pucch(phy_vars_ue->lte_ue_common_vars.txdataF, &phy_vars_ue->lte_frame_parms, phy_vars_ue->ncs_cell, format, @@ -1070,12 +1112,8 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra 0, // n2_pucch 1, // shortened format pucch_ack_payload, -#if defined(EXMIMO) || defined(OAI_USRP) - get_tx_amp(Po_PUCCH,phy_vars_ue->tx_power_max_dBm), -#else - AMP, -#endif - subframe_tx); + tx_amp, + subframe_tx); } else { #ifdef PHY_ABSTRACTION @@ -1098,6 +1136,14 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra #endif phy_vars_ue->tx_total_RE = 12; +#if defined(EXMIMO) || defined(OAI_USRP) + tx_amp = get_tx_amp(Po_PUCCH, + phy_vars_ue->tx_power_max_dBm, + phy_vars_ue->lte_frame_parms.N_RB_UL, + 1); +#else + tx_amp = AMP; +#endif LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d Generating PUCCH 1 (SR for PUSCH), n1_pucch %d, Po_PUCCH %d\n", Mod_id, phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, @@ -1116,11 +1162,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra 0, // n2_pucch 1, // shortened format pucch_ack_payload, // this is ignored anyway, we just need a pointer -#if defined(EXMIMO) || defined(OAI_USRP) - get_tx_amp(Po_PUCCH,phy_vars_ue->tx_power_max_dBm), -#else - AMP, -#endif + tx_amp, subframe_tx); } else { LOG_D(PHY,"Calling generate_pucch_emul ...\n"); @@ -1323,7 +1365,6 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra subframe_tx); // LOG_I(PHY,"Got prach_resources for eNB %d address %d, RRCCommon %d\n",eNB_id,phy_vars_ue->prach_resources[eNB_id],UE_mac_inst[Mod_id].radioResourceConfigCommon); } - #endif if (phy_vars_ue->prach_resources[eNB_id]!=NULL) { @@ -1338,7 +1379,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra #endif if (abstraction_flag == 0) { - LOG_D(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d : Generating PRACH, preamble %d, TARGET_RECEIVED_POWER %d dBm, PRACH TDD Resource index %d, RA-RNTI %d\n", + LOG_I(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d : Generating PRACH, preamble %d, TARGET_RECEIVED_POWER %d dBm, PRACH TDD Resource index %d, RA-RNTI %d\n", Mod_id, frame_tx, subframe_tx, @@ -1348,7 +1389,12 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra phy_vars_ue->prach_resources[eNB_id]->ra_RNTI); #ifdef OPENAIR2 - phy_vars_ue->tx_power_dBm = phy_vars_ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(Mod_id,CC_id,eNB_id); + if (mode != calib_prach_tx) + phy_vars_ue->tx_power_dBm = phy_vars_ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(Mod_id,CC_id,eNB_id); + else { + phy_vars_ue->tx_power_dBm = phy_vars_ue->tx_power_max_dBm; + phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex = 19; + } #else phy_vars_ue->tx_power_dBm = UE_TX_POWER; #endif @@ -1356,12 +1402,17 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra phy_vars_ue->tx_total_RE = 96; #if defined(EXMIMO) || defined(OAI_USRP) - phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp = get_tx_amp(phy_vars_ue->tx_power_dBm,phy_vars_ue->tx_power_max_dBm); + phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp = get_tx_amp(phy_vars_ue->tx_power_dBm, + phy_vars_ue->tx_power_max_dBm, + phy_vars_ue->lte_frame_parms.N_RB_UL, + 6); #else phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp = AMP; #endif - LOG_D(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d : PRACH TX power %d dBm, amp %d\n",Mod_id,phy_vars_ue->frame_rx,phy_vars_ue->slot_tx>>1,phy_vars_ue->tx_power_dBm, - phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp); + if ((mode == calib_prach_tx) && (((phy_vars_ue->frame_tx&0xfffe)%100)==0)) + LOG_I(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d : PRACH TX power %d dBm, amp %d\n",Mod_id,phy_vars_ue->frame_rx,phy_vars_ue->slot_tx>>1,phy_vars_ue->tx_power_dBm, + phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp); + // start_meas(&phy_vars_ue->tx_prach); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_IN); @@ -1391,8 +1442,12 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra phy_vars_ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(Mod_id,CC_id,eNB_id), get_PL(Mod_id,CC_id,eNB_id)); - } + } + } + // if we're calibrating the PRACH kill the pointer to its resources so that the RA protocol doesn't continue + if (mode == calib_prach_tx) + phy_vars_ue->prach_resources[eNB_id]=NULL; LOG_D(PHY,"[UE %d] frame %d subframe %d : generate_prach %d, prach_cnt %d\n", Mod_id,frame_tx,subframe_tx,phy_vars_ue->generate_prach,phy_vars_ue->prach_cnt); @@ -1450,7 +1505,7 @@ void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t // exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[0].exmimo_config_ptr; // int aa; #endif - int Mod_id=phy_vars_ue->Mod_id; + int slot_rx = phy_vars_ue->slot_rx; int subframe_rx = slot_rx>>1; @@ -2180,6 +2235,7 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst else if ((phy_vars_ue->prach_resources[eNB_id]) && (dci_alloc_rx[i].rnti == phy_vars_ue->prach_resources[eNB_id]->ra_RNTI) && (dci_alloc_rx[i].format == format1A)) { + #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d][RAPROC] subframe %d: Found RA rnti %x, format 1A, dci_cnt %d\n",phy_vars_ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,i); -- GitLab