[OAI-UE] - PUCCH Format2 Periodic CQI/RI reporting
Handle SRS TX in case of CQI / SR / AN simultaneous transmission
This commit is contained in:
@@ -762,7 +762,8 @@ void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
|
|||||||
phy_vars_ue->dlsch_received_last[eNB_id]=0;
|
phy_vars_ue->dlsch_received_last[eNB_id]=0;
|
||||||
phy_vars_ue->dlsch_fer[eNB_id]=0;
|
phy_vars_ue->dlsch_fer[eNB_id]=0;
|
||||||
|
|
||||||
|
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex = -1;
|
||||||
|
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex = -1;
|
||||||
|
|
||||||
if (physicalConfigDedicated) {
|
if (physicalConfigDedicated) {
|
||||||
LOG_D(PHY,"[UE %d] Received physicalConfigDedicated from eNB %d\n",Mod_id, eNB_id);
|
LOG_D(PHY,"[UE %d] Received physicalConfigDedicated from eNB %d\n",Mod_id, eNB_id);
|
||||||
@@ -894,6 +895,31 @@ void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (physicalConfigDedicated->cqi_ReportConfig) {
|
||||||
|
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportModeAperiodic) {
|
||||||
|
// configure PUSCH CQI reporting
|
||||||
|
phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic = *physicalConfigDedicated->cqi_ReportConfig->cqi_ReportModeAperiodic;
|
||||||
|
if ((phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic != rm12) &&
|
||||||
|
(phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic != rm30) &&
|
||||||
|
(phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic != rm31))
|
||||||
|
LOG_E(PHY,"Unsupported Aperiodic CQI Feedback Mode : %d\n",phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic);
|
||||||
|
}
|
||||||
|
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic) {
|
||||||
|
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->present == CQI_ReportPeriodic_PR_setup) {
|
||||||
|
// configure PUCCH CQI reporting
|
||||||
|
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PUCCH_ResourceIndex = physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_PUCCH_ResourceIndex;
|
||||||
|
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex = physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_pmi_ConfigIndex;
|
||||||
|
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.ri_ConfigIndex)
|
||||||
|
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex = *physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.ri_ConfigIndex;
|
||||||
|
}
|
||||||
|
else if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->present == CQI_ReportPeriodic_PR_release) {
|
||||||
|
// handle release
|
||||||
|
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex = -1;
|
||||||
|
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CBA
|
#ifdef CBA
|
||||||
|
|
||||||
if (physicalConfigDedicated->pusch_CBAConfigDedicated_vlola) {
|
if (physicalConfigDedicated->pusch_CBAConfigDedicated_vlola) {
|
||||||
@@ -910,6 +936,9 @@ void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fill cqi parameters for periodic CQI reporting
|
||||||
|
get_cqipmiri_params(phy_vars_ue,eNB_id);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void phy_config_cba_rnti (module_id_t Mod_id,int CC_id,eNB_flag_t eNB_flag, uint8_t index, rnti_t cba_rnti, uint8_t cba_group_id, uint8_t num_active_cba_groups)
|
void phy_config_cba_rnti (module_id_t Mod_id,int CC_id,eNB_flag_t eNB_flag, uint8_t index, rnti_t cba_rnti, uint8_t cba_group_id, uint8_t num_active_cba_groups)
|
||||||
|
|||||||
@@ -1445,6 +1445,9 @@ int32_t generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue,
|
|||||||
uint8_t eNB_id);
|
uint8_t eNB_id);
|
||||||
double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue,
|
double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue,
|
||||||
uint8_t eNB_id);
|
uint8_t eNB_id);
|
||||||
|
|
||||||
|
uint8_t sinr2cqi(double sinr,uint8_t trans_mode);
|
||||||
|
|
||||||
int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *PHY_vars_eNB,
|
int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *PHY_vars_eNB,
|
||||||
eNB_rxtx_proc_t *proc,
|
eNB_rxtx_proc_t *proc,
|
||||||
void *dci_pdu,
|
void *dci_pdu,
|
||||||
@@ -1712,6 +1715,20 @@ void generate_pucch1x(int32_t **txdataF,
|
|||||||
int16_t amp,
|
int16_t amp,
|
||||||
uint8_t subframe);
|
uint8_t subframe);
|
||||||
|
|
||||||
|
void generate_pucch2x(int32_t **txdataF,
|
||||||
|
LTE_DL_FRAME_PARMS *fp,
|
||||||
|
uint8_t ncs_cell[20][7],
|
||||||
|
PUCCH_FMT_t fmt,
|
||||||
|
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
||||||
|
uint16_t n2_pucch,
|
||||||
|
uint16_t *payload,
|
||||||
|
int A,
|
||||||
|
int B2,
|
||||||
|
int16_t amp,
|
||||||
|
uint8_t subframe,
|
||||||
|
uint16_t rnti);
|
||||||
|
|
||||||
|
|
||||||
void generate_pucch_emul(PHY_VARS_UE *phy_vars_ue,
|
void generate_pucch_emul(PHY_VARS_UE *phy_vars_ue,
|
||||||
UE_rxtx_proc_t *proc,
|
UE_rxtx_proc_t *proc,
|
||||||
PUCCH_FMT_t format,
|
PUCCH_FMT_t format,
|
||||||
|
|||||||
@@ -442,7 +442,7 @@ inline void pucch2x_scrambling(LTE_DL_FRAME_PARMS *fp,int subframe,uint16_t rnti
|
|||||||
int i;
|
int i;
|
||||||
uint8_t c;
|
uint8_t c;
|
||||||
|
|
||||||
x2 = (rnti<<14) + ((1+subframe)<<16)*(1+(fp->Nid_cell<<1)); //this is c_init in 36.211 Sec 6.3.1
|
x2 = (rnti) + ((uint32_t)(1+subframe)<<16)*(1+(fp->Nid_cell<<1)); //this is c_init in 36.211 Sec 6.3.1
|
||||||
s = lte_gold_generic(&x1, &x2, 1);
|
s = lte_gold_generic(&x1, &x2, 1);
|
||||||
for (i=0;i<19;i++) {
|
for (i=0;i<19;i++) {
|
||||||
c = (uint8_t)((s>>i)&1);
|
c = (uint8_t)((s>>i)&1);
|
||||||
@@ -456,22 +456,24 @@ inline void pucch2x_modulation(uint8_t *btilde,int16_t *d,int16_t amp) {
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i=0;i<20;i++)
|
for (i=0;i<20;i++)
|
||||||
d[i] = btilde[i] == 1 ? amp : -amp;
|
d[i] = btilde[i] == 1 ? -amp : amp;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
uint32_t pucch_code[13] = {0xFFFFF,0x5A933,0x10E5A,0x6339C,0x73CE0,
|
uint32_t pucch_code[13] = {0xFFFFF,0x5A933,0x10E5A,0x6339C,0x73CE0,
|
||||||
0xFFC00,0xD8E64,0x4F6B0,0x218EC,0x1B746,
|
0xFFC00,0xD8E64,0x4F6B0,0x218EC,0x1B746,
|
||||||
0x0FFFF,0x33FFF,0x3FFFC};
|
0x0FFFF,0x33FFF,0x3FFFC};
|
||||||
|
|
||||||
|
|
||||||
void generate_pucch2x(int32_t **txdataF,
|
void generate_pucch2x(int32_t **txdataF,
|
||||||
LTE_DL_FRAME_PARMS *fp,
|
LTE_DL_FRAME_PARMS *fp,
|
||||||
uint8_t ncs_cell[20][7],
|
uint8_t ncs_cell[20][7],
|
||||||
PUCCH_FMT_t fmt,
|
PUCCH_FMT_t fmt,
|
||||||
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
||||||
uint16_t n2_pucch,
|
uint16_t n2_pucch,
|
||||||
uint8_t shortened_format,
|
uint16_t *payload,
|
||||||
uint32_t *payload,
|
|
||||||
int A,
|
int A,
|
||||||
int B2,
|
int B2,
|
||||||
int16_t amp,
|
int16_t amp,
|
||||||
@@ -486,13 +488,14 @@ void generate_pucch2x(int32_t **txdataF,
|
|||||||
uint8_t NRB2 = fp->pucch_config_common.nRB_CQI;
|
uint8_t NRB2 = fp->pucch_config_common.nRB_CQI;
|
||||||
uint8_t Ncs1 = fp->pucch_config_common.nCS_AN;
|
uint8_t Ncs1 = fp->pucch_config_common.nCS_AN;
|
||||||
|
|
||||||
uint32_t u0 = (fp->Nid_cell + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[subframe<<1]) % 30;
|
uint32_t u0 = fp->pucch_config_common.grouphop[subframe<<1];
|
||||||
uint32_t u1 = (fp->Nid_cell + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[1+(subframe<<1)]) % 30;
|
uint32_t u1 = fp->pucch_config_common.grouphop[1+(subframe<<1)];
|
||||||
uint32_t v0 = fp->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[subframe<<1];
|
uint32_t v0 = fp->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[subframe<<1];
|
||||||
uint32_t v1 = fp->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)];
|
uint32_t v1 = fp->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)];
|
||||||
|
|
||||||
uint32_t z[12*14],*zptr;
|
uint32_t z[12*14],*zptr;
|
||||||
uint32_t u,v,n;
|
uint32_t u,v,n;
|
||||||
uint8_t ns,N_UL_symb,nsymb;
|
uint8_t ns,N_UL_symb,nsymb_slot0,nsymb_pertti;
|
||||||
uint32_t nprime,l,n_cs;
|
uint32_t nprime,l,n_cs;
|
||||||
int alpha_ind,data_ind;
|
int alpha_ind,data_ind;
|
||||||
int16_t ref_re,ref_im;
|
int16_t ref_re,ref_im;
|
||||||
@@ -509,7 +512,6 @@ void generate_pucch2x(int32_t **txdataF,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// pucch2x_encoding
|
// pucch2x_encoding
|
||||||
for (i=0;i<A;i++)
|
for (i=0;i<A;i++)
|
||||||
if ((*payload & (1<<i)) > 0)
|
if ((*payload & (1<<i)) > 0)
|
||||||
@@ -545,50 +547,51 @@ void generate_pucch2x(int32_t **txdataF,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
zptr = z;
|
|
||||||
|
|
||||||
#ifdef DEBUG_PUCCH_TX
|
#ifdef DEBUG_PUCCH_TX
|
||||||
printf("[PHY] PUCCH2x: n2_pucch %d\n",n2_pucch);
|
printf("[PHY] PUCCH2x: n2_pucch %d\n",n2_pucch);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
N_UL_symb = (fp->Ncp==0) ? 7 : 6;
|
N_UL_symb = (fp->Ncp==0) ? 7 : 6;
|
||||||
|
data_ind = 0;
|
||||||
|
zptr = z;
|
||||||
for (ns=(subframe<<1),u=u0,v=v0; ns<(2+(subframe<<1)); ns++,u=u1,v=v1) {
|
for (ns=(subframe<<1),u=u0,v=v0; ns<(2+(subframe<<1)); ns++,u=u1,v=v1) {
|
||||||
|
|
||||||
if ((ns&1) == 0)
|
if ((ns&1) == 0)
|
||||||
nprime = (n2_pucch < 12*NRB2) ?
|
nprime = (n2_pucch < 12*NRB2) ?
|
||||||
n2_pucch % 12 :
|
n2_pucch % 12 :
|
||||||
(n2_pucch+Ncs1 + 1)%12;
|
(n2_pucch+Ncs1 + 1)%12;
|
||||||
else
|
else {
|
||||||
nprime = (n2_pucch < 12*NRB2) ?
|
nprime = (n2_pucch < 12*NRB2) ?
|
||||||
((12*(nprime+1)) % 13)-1 :
|
((12*(nprime+1)) % 13)-1 :
|
||||||
(10-n2_pucch)%12;
|
(10-n2_pucch)%12;
|
||||||
|
}
|
||||||
//loop over symbols in slot
|
//loop over symbols in slot
|
||||||
for (l=0; l<N_UL_symb; l++) {
|
for (l=0; l<N_UL_symb; l++) {
|
||||||
// Compute n_cs (36.211 p. 18)
|
// Compute n_cs (36.211 p. 18)
|
||||||
n_cs = (ncs_cell[ns][l]+nprime)%12;
|
n_cs = (ncs_cell[ns][l]+nprime)%12;
|
||||||
|
|
||||||
alpha_ind = n_cs;
|
alpha_ind = 0;
|
||||||
data_ind = 0;
|
|
||||||
|
|
||||||
for (n=0; n<12; n++) {
|
for (n=0; n<12; n++) {
|
||||||
|
|
||||||
// this is r_uv^alpha(n)
|
// this is r_uv^alpha(n)
|
||||||
ref_re = (int16_t)(((int32_t)alpha_re[alpha_ind] * ul_ref_sigs[u][v][0][n<<1] - (int32_t)alpha_im[alpha_ind] * ul_ref_sigs[u][v][0][1+(n<<1)])>>15);
|
ref_re = (int16_t)(((int32_t)alpha_re[alpha_ind] * ul_ref_sigs[u][v][0][n<<1] - (int32_t)alpha_im[alpha_ind] * ul_ref_sigs[u][v][0][1+(n<<1)])>>15);
|
||||||
ref_im = (int16_t)(((int32_t)alpha_re[alpha_ind] * ul_ref_sigs[u][v][0][1+(n<<1)] + (int32_t)alpha_im[alpha_ind] * ul_ref_sigs[u][v][0][n<<1])>>15);
|
ref_im = (int16_t)(((int32_t)alpha_re[alpha_ind] * ul_ref_sigs[u][v][0][1+(n<<1)] + (int32_t)alpha_im[alpha_ind] * ul_ref_sigs[u][v][0][n<<1])>>15);
|
||||||
|
|
||||||
if ((l<2)||(l>=(N_UL_symb-2))) { //these are PUCCH data symbols
|
if ((l!=1)&&(l!=5)) { //these are PUCCH data symbols
|
||||||
((int16_t *)&zptr[n])[0] = ((int32_t)d[data_ind]*ref_re - (int32_t)d[data_ind+1]*ref_im)>>15;
|
((int16_t *)&zptr[n])[0] = ((int32_t)d[data_ind]*ref_re - (int32_t)d[data_ind+1]*ref_im)>>15;
|
||||||
((int16_t *)&zptr[n])[1] = ((int32_t)d[data_ind]*ref_im + (int32_t)d[data_ind+1]*ref_re)>>15;
|
((int16_t *)&zptr[n])[1] = ((int32_t)d[data_ind]*ref_im + (int32_t)d[data_ind+1]*ref_re)>>15;
|
||||||
|
//LOG_I(PHY,"slot %d ofdm# %d ==> d[%d,%d] \n",ns,l,data_ind,n);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
((int16_t *)&zptr[n])[0] = ref_re;
|
((int16_t *)&zptr[n])[0] = ((int32_t)amp*ref_re>>15);
|
||||||
((int16_t *)&zptr[n])[1] = ref_im;
|
((int16_t *)&zptr[n])[1] = ((int32_t)amp*ref_im>>15);
|
||||||
|
//LOG_I(PHY,"slot %d ofdm# %d ==> dmrs[%d] \n",ns,l,n);
|
||||||
}
|
}
|
||||||
|
alpha_ind = (alpha_ind + n_cs)%12;
|
||||||
} // n
|
} // n
|
||||||
if ((l<2)||(l>=(N_UL_symb-2))) //these are PUCCH data symbols so increment data index
|
zptr+=12;
|
||||||
|
|
||||||
|
if ((l!=1)&&(l!=5)) //these are PUCCH data symbols so increment data index
|
||||||
data_ind+=2;
|
data_ind+=2;
|
||||||
} // l
|
} // l
|
||||||
} //ns
|
} //ns
|
||||||
@@ -596,15 +599,20 @@ void generate_pucch2x(int32_t **txdataF,
|
|||||||
m = n2_pucch/12;
|
m = n2_pucch/12;
|
||||||
|
|
||||||
#ifdef DEBUG_PUCCH_TX
|
#ifdef DEBUG_PUCCH_TX
|
||||||
printf("[PHY] PUCCH: m %d\n",m);
|
LOG_D(PHY,"[PHY] PUCCH: n2_pucch %d m %d\n",n2_pucch,m);
|
||||||
#endif
|
#endif
|
||||||
nsymb = N_UL_symb<<1;
|
|
||||||
|
nsymb_slot0 = ((fp->Ncp==0) ? 7 : 6);
|
||||||
|
nsymb_pertti = nsymb_slot0 << 1;
|
||||||
|
|
||||||
|
//nsymb = nsymb_slot0<<1;
|
||||||
|
|
||||||
//for (j=0,l=0;l<(nsymb-1);l++) {
|
//for (j=0,l=0;l<(nsymb-1);l++) {
|
||||||
for (j=0,l=0; l<(nsymb); l++) {
|
for (j=0,l=0; l<(nsymb_pertti); l++) {
|
||||||
if ((l<(nsymb>>1)) && ((m&1) == 0))
|
|
||||||
|
if ((l<nsymb_slot0) && ((m&1) == 0))
|
||||||
re_offset = (m*6) + fp->first_carrier_offset;
|
re_offset = (m*6) + fp->first_carrier_offset;
|
||||||
else if ((l<(nsymb>>1)) && ((m&1) == 1))
|
else if ((l<nsymb_slot0) && ((m&1) == 1))
|
||||||
re_offset = fp->first_carrier_offset + (fp->N_RB_DL - (m>>1) - 1)*12;
|
re_offset = fp->first_carrier_offset + (fp->N_RB_DL - (m>>1) - 1)*12;
|
||||||
else if ((m&1) == 0)
|
else if ((m&1) == 0)
|
||||||
re_offset = fp->first_carrier_offset + (fp->N_RB_DL - (m>>1) - 1)*12;
|
re_offset = fp->first_carrier_offset + (fp->N_RB_DL - (m>>1) - 1)*12;
|
||||||
@@ -614,23 +622,33 @@ void generate_pucch2x(int32_t **txdataF,
|
|||||||
if (re_offset > fp->ofdm_symbol_size)
|
if (re_offset > fp->ofdm_symbol_size)
|
||||||
re_offset -= (fp->ofdm_symbol_size);
|
re_offset -= (fp->ofdm_symbol_size);
|
||||||
|
|
||||||
symbol_offset = (unsigned int)fp->ofdm_symbol_size*(l+(subframe*nsymb));
|
|
||||||
|
|
||||||
|
symbol_offset = (unsigned int)fp->ofdm_symbol_size*(l+(subframe*nsymb_pertti));
|
||||||
txptr = &txdataF[0][symbol_offset];
|
txptr = &txdataF[0][symbol_offset];
|
||||||
|
|
||||||
|
//LOG_I(PHY,"ofdmSymb %d/%d, firstCarrierOffset %d, symbolOffset[sfn %d] %d, reOffset %d, &txptr: %x \n", l, nsymb, fp->first_carrier_offset, subframe, symbol_offset, re_offset, &txptr[0]);
|
||||||
|
|
||||||
for (i=0; i<12; i++,j++) {
|
for (i=0; i<12; i++,j++) {
|
||||||
txptr[re_offset++] = z[j];
|
txptr[re_offset] = z[j];
|
||||||
|
|
||||||
|
re_offset++;
|
||||||
|
|
||||||
if (re_offset==fp->ofdm_symbol_size)
|
if (re_offset==fp->ofdm_symbol_size)
|
||||||
re_offset = 0;
|
re_offset -= (fp->ofdm_symbol_size);
|
||||||
|
|
||||||
#ifdef DEBUG_PUCCH_TX
|
#ifdef DEBUG_PUCCH_TX
|
||||||
printf("[PHY] PUCCH subframe %d (%d,%d,%d,%d) => %d,%d\n",subframe,l,i,re_offset-1,m,((int16_t *)&z[j])[0],((int16_t *)&z[j])[1]);
|
LOG_D(PHY,"[PHY] PUCCH subframe %d (%d,%d,%d,%d) => %d,%d\n",subframe,l,i,re_offset-1,m,((int16_t *)&z[j])[0],((int16_t *)&z[j])[1]);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//#define Amax 13
|
||||||
|
//void init_pucch2x_rx() {};
|
||||||
|
|
||||||
|
|
||||||
uint32_t rx_pucch(PHY_VARS_eNB *eNB,
|
uint32_t rx_pucch(PHY_VARS_eNB *eNB,
|
||||||
PUCCH_FMT_t fmt,
|
PUCCH_FMT_t fmt,
|
||||||
uint8_t UE_id,
|
uint8_t UE_id,
|
||||||
|
|||||||
@@ -836,3 +836,5 @@ void print_CQI(void *o,UCI_format_t uci_format,unsigned char eNB_id,int N_RB_DL)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -429,16 +429,20 @@ typedef struct {
|
|||||||
|
|
||||||
/// CQI-ReportPeriodic
|
/// CQI-ReportPeriodic
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/// Parameter: \f$n^{(2)}_\text{PUCCH}\f$, see TS 36.213 (7.2). \vr{[0..1185]}
|
/// Parameter: \f$n^{(2)}_\text{PUCCH}\f$, see TS 36.213 (7.2). \vr{[0..1185]}, -1 indicates inactivity
|
||||||
uint16_t cqi_PUCCH_ResourceIndex;
|
int16_t cqi_PUCCH_ResourceIndex;
|
||||||
/// Parameter: CQI/PMI Periodicity and Offset Configuration Index \f$I_\text{CQI/PMI}\f$, see TS 36.213 (tables 7.2.2-1A and 7.2.2-1C). \vr{[0..1023]}
|
/// Parameter: CQI/PMI Periodicity and Offset Configuration Index \f$I_\text{CQI/PMI}\f$, see TS 36.213 (tables 7.2.2-1A and 7.2.2-1C). \vr{[0..1023]}
|
||||||
uint16_t cqi_PMI_ConfigIndex;
|
int16_t cqi_PMI_ConfigIndex;
|
||||||
/// Parameter: K, see 36.213 (4.2.2). \vr{[1..4]}
|
/// Parameter: K, see 36.213 (4.2.2). \vr{[1..4]}
|
||||||
uint8_t K;
|
uint8_t K;
|
||||||
/// Parameter: RI Config Index \f$I_\text{RI}\f$, see TS 36.213 (7.2.2-1B). \vr{[0..1023]}
|
/// Parameter: RI Config Index \f$I_\text{RI}\f$, see TS 36.213 (7.2.2-1B). \vr{[0..1023]}, -1 indicates inactivity
|
||||||
uint16_t ri_ConfigIndex;
|
int16_t ri_ConfigIndex;
|
||||||
/// Parameter: Simultaneous-AN-and-CQI, see TS 36.213 (10.1). \vr{[0..1]} 1 indicates that simultaneous transmission of ACK/NACK and CQI is allowed.
|
/// Parameter: Simultaneous-AN-and-CQI, see TS 36.213 (10.1). \vr{[0..1]} 1 indicates that simultaneous transmission of ACK/NACK and CQI is allowed.
|
||||||
uint8_t simultaneousAckNackAndCQI;
|
uint8_t simultaneousAckNackAndCQI;
|
||||||
|
/// parameter computed from Tables 7.2.2-1A and 7.2.2-1C
|
||||||
|
uint16_t Npd;
|
||||||
|
/// parameter computed from Tables 7.2.2-1A and 7.2.2-1C
|
||||||
|
uint16_t N_OFFSET_CQI;
|
||||||
} CQI_REPORTPERIODIC;
|
} CQI_REPORTPERIODIC;
|
||||||
|
|
||||||
/// Enumeration for parameter reporting mode \ref CQI_REPORT_CONFIG::cqi_ReportModeAperiodic.
|
/// Enumeration for parameter reporting mode \ref CQI_REPORT_CONFIG::cqi_ReportModeAperiodic.
|
||||||
|
|||||||
@@ -446,6 +446,8 @@ void pusch_power_cntl(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_
|
|||||||
*/
|
*/
|
||||||
void srs_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t *pnb_rb_srs, uint8_t abstraction_flag);
|
void srs_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t *pnb_rb_srs, uint8_t abstraction_flag);
|
||||||
|
|
||||||
|
void get_cqipmiri_params(PHY_VARS_UE *ue,uint8_t eNB_id);
|
||||||
|
|
||||||
int8_t get_PHR(uint8_t Mod_id, uint8_t CC_id, uint8_t eNB_index);
|
int8_t get_PHR(uint8_t Mod_id, uint8_t CC_id, uint8_t eNB_index);
|
||||||
|
|
||||||
#ifdef LOCALIZATION
|
#ifdef LOCALIZATION
|
||||||
@@ -461,6 +463,8 @@ double aggregate_eNB_UE_localization_stats(PHY_VARS_eNB *phy_vars_eNB, int8_t UE
|
|||||||
#endif
|
#endif
|
||||||
LTE_eNB_UE_stats* get_UE_stats(uint8_t Mod_id, uint8_t CC_id,uint16_t rnti);
|
LTE_eNB_UE_stats* get_UE_stats(uint8_t Mod_id, uint8_t CC_id,uint16_t rnti);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
LTE_DL_FRAME_PARMS *get_lte_frame_parms(module_id_t Mod_id, uint8_t CC_id);
|
LTE_DL_FRAME_PARMS *get_lte_frame_parms(module_id_t Mod_id, uint8_t CC_id);
|
||||||
|
|
||||||
MU_MIMO_mode* get_mu_mimo_mode (module_id_t Mod_id, uint8_t CC_id, rnti_t rnti);
|
MU_MIMO_mode* get_mu_mimo_mode (module_id_t Mod_id, uint8_t CC_id, rnti_t rnti);
|
||||||
|
|||||||
@@ -377,6 +377,43 @@ uint8_t is_SR_TXOp(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id)
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t is_cqi_TXOp(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id)
|
||||||
|
{
|
||||||
|
int subframe = proc->subframe_tx;
|
||||||
|
int frame = proc->frame_tx;
|
||||||
|
CQI_REPORTPERIODIC *cqirep = &ue->cqi_report_config[eNB_id].CQI_ReportPeriodic;
|
||||||
|
|
||||||
|
//LOG_I(PHY,"[UE %d][CRNTI %x] AbsSubFrame %d.%d Checking for CQI TXOp (cqi_ConfigIndex %d) isCQIOp %d\n",
|
||||||
|
// ue->Mod_id,ue->pdcch_vars[eNB_id]->crnti,frame,subframe,
|
||||||
|
// cqirep->cqi_PMI_ConfigIndex,
|
||||||
|
// (((10*frame + subframe) % cqirep->Npd) == cqirep->N_OFFSET_CQI));
|
||||||
|
|
||||||
|
if (((10*frame + subframe) % cqirep->Npd) == cqirep->N_OFFSET_CQI)
|
||||||
|
return(1);
|
||||||
|
else
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
uint8_t is_ri_TXOp(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
int subframe = proc->subframe_tx;
|
||||||
|
int frame = proc->frame_tx;
|
||||||
|
CQI_REPORTPERIODIC *cqirep = &ue->cqi_report_config[eNB_id].CQI_ReportPeriodic;
|
||||||
|
int log2Mri = cqirep->ri_ConfigIndex/161;
|
||||||
|
int N_OFFSET_RI = cqirep->ri_ConfigIndex % 161;
|
||||||
|
|
||||||
|
//LOG_I(PHY,"[UE %d][CRNTI %x] AbsSubFrame %d.%d Checking for RI TXOp (ri_ConfigIndex %d) isRIOp %d\n",
|
||||||
|
// ue->Mod_id,ue->pdcch_vars[eNB_id]->crnti,frame,subframe,
|
||||||
|
// cqirep->ri_ConfigIndex,
|
||||||
|
// (((10*frame + subframe + cqirep->N_OFFSET_CQI - N_OFFSET_RI) % (cqirep->Npd<<log2Mri)) == 0));
|
||||||
|
|
||||||
|
if (((10*frame + subframe + cqirep->N_OFFSET_CQI - N_OFFSET_RI) % (cqirep->Npd<<log2Mri)) == 0)
|
||||||
|
return(1);
|
||||||
|
else
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
void compute_srs_pos(lte_frame_type_t frameType,uint16_t isrs,uint16_t *psrsPeriodicity,uint16_t *psrsOffset)
|
void compute_srs_pos(lte_frame_type_t frameType,uint16_t isrs,uint16_t *psrsPeriodicity,uint16_t *psrsOffset)
|
||||||
{
|
{
|
||||||
if(TDD == frameType)
|
if(TDD == frameType)
|
||||||
@@ -484,6 +521,9 @@ void ue_compute_srs_occasion(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id
|
|||||||
int subframe_tx = proc->subframe_tx;
|
int subframe_tx = proc->subframe_tx;
|
||||||
uint8_t isSubframeSRS = 0; // SRS Cell Occasion
|
uint8_t isSubframeSRS = 0; // SRS Cell Occasion
|
||||||
|
|
||||||
|
uint8_t is_pucch2_subframe = 0;
|
||||||
|
uint8_t is_sr_an_subframe = 0;
|
||||||
|
|
||||||
SOUNDINGRS_UL_CONFIG_DEDICATED *pSoundingrs_ul_config_dedicated=&ue->soundingrs_ul_config_dedicated[eNB_id];
|
SOUNDINGRS_UL_CONFIG_DEDICATED *pSoundingrs_ul_config_dedicated=&ue->soundingrs_ul_config_dedicated[eNB_id];
|
||||||
|
|
||||||
// check for SRS opportunity
|
// check for SRS opportunity
|
||||||
@@ -541,22 +581,141 @@ void ue_compute_srs_occasion(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id
|
|||||||
// - UE is configured to transmit SRS
|
// - UE is configured to transmit SRS
|
||||||
// - SRS are configured in current subframe
|
// - SRS are configured in current subframe
|
||||||
// - UE is configured to send SRS in this subframe
|
// - UE is configured to send SRS in this subframe
|
||||||
// - CQI is not scheduled in PUCCH transmission - TO BE ADDED
|
|
||||||
// - simultaneous transmission of SRS and ACKNACK is authorised - TO BE CHECKED
|
// 36.213 8.2
|
||||||
|
// 1- A UE shall not transmit SRS whenever SRS and PUCCH format 2/2a/2b transmissions happen to coincide in the same subframe
|
||||||
|
// 2- A UE shall not transmit SRS whenever SRS transmit
|
||||||
|
// on and PUCCH transmission carrying ACK/NACK and/or
|
||||||
|
// positive SR happen to coincide in the same subframe if the parameter
|
||||||
|
// Simultaneous-AN-and-SRS is FALSE
|
||||||
|
|
||||||
|
// check PUCCH format 2/2a/2b transmissions
|
||||||
|
is_pucch2_subframe = is_cqi_TXOp(ue,proc,eNB_id) && (ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex>0);
|
||||||
|
is_pucch2_subframe = (is_ri_TXOp(ue,proc,eNB_id) && (ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex>0)) || is_pucch2_subframe;
|
||||||
|
|
||||||
|
// check ACK/SR transmission
|
||||||
|
if(frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission == FALSE)
|
||||||
|
{
|
||||||
|
if(is_SR_TXOp(ue,proc,eNB_id))
|
||||||
|
{
|
||||||
|
uint32_t SR_payload = 0;
|
||||||
|
if (ue->mac_enabled==1)
|
||||||
|
{
|
||||||
|
int Mod_id = ue->Mod_id;
|
||||||
|
int CC_id = ue->CC_id;
|
||||||
|
SR_payload = mac_xface->ue_get_SR(Mod_id,
|
||||||
|
CC_id,
|
||||||
|
frame_tx,
|
||||||
|
eNB_id,
|
||||||
|
ue->pdcch_vars[eNB_id]->crnti,
|
||||||
|
subframe_tx); // subframe used for meas gap
|
||||||
|
|
||||||
|
if (SR_payload > 0)
|
||||||
|
is_sr_an_subframe = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t pucch_ack_payload[2];
|
||||||
|
if (get_ack(&ue->frame_parms,
|
||||||
|
ue->dlsch[eNB_id][0]->harq_ack,
|
||||||
|
subframe_tx,pucch_ack_payload) > 0)
|
||||||
|
{
|
||||||
|
is_sr_an_subframe = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// check SRS UE opportunity
|
||||||
if( isSubframeSRS &&
|
if( isSubframeSRS &&
|
||||||
(((10*frame_tx+subframe_tx) % srsPeriodicity) == srsOffset)
|
(((10*frame_tx+subframe_tx) % srsPeriodicity) == srsOffset)
|
||||||
//(! is_pucch_per_cqi_report))
|
|
||||||
)
|
)
|
||||||
|
{
|
||||||
|
if ((is_pucch2_subframe == 0) && (is_sr_an_subframe == 0))
|
||||||
{
|
{
|
||||||
pSoundingrs_ul_config_dedicated->srsUeSubframe = 1;
|
pSoundingrs_ul_config_dedicated->srsUeSubframe = 1;
|
||||||
ue->ulsch[eNB_id]->srs_active = 1;
|
ue->ulsch[eNB_id]->srs_active = 1;
|
||||||
ue->ulsch[eNB_id]->Nsymb_pusch = 12-(frame_parms->Ncp<<1)- ue->ulsch[eNB_id]->srs_active;
|
ue->ulsch[eNB_id]->Nsymb_pusch = 12-(frame_parms->Ncp<<1)- ue->ulsch[eNB_id]->srs_active;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_I(PHY,"DROP UE-SRS-TX for this subframe %d.%d: collision with PUCCH2 or SR/AN: PUCCH2-occasion: %d, SR-AN-occasion[simSRS-SR-AN %d]: %d \n", frame_tx, subframe_tx, is_pucch2_subframe, frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission, is_sr_an_subframe);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
LOG_D(PHY," srsCellSubframe: %d, srsUeSubframe: %d, Nsymb-pusch: %d \n", pSoundingrs_ul_config_dedicated->srsCellSubframe, pSoundingrs_ul_config_dedicated->srsUeSubframe, ue->ulsch[eNB_id]->Nsymb_pusch);
|
LOG_D(PHY," srsCellSubframe: %d, srsUeSubframe: %d, Nsymb-pusch: %d \n", pSoundingrs_ul_config_dedicated->srsCellSubframe, pSoundingrs_ul_config_dedicated->srsUeSubframe, ue->ulsch[eNB_id]->Nsymb_pusch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void get_cqipmiri_params(PHY_VARS_UE *ue,uint8_t eNB_id)
|
||||||
|
{
|
||||||
|
|
||||||
|
CQI_REPORTPERIODIC *cqirep = &ue->cqi_report_config[eNB_id].CQI_ReportPeriodic;
|
||||||
|
int cqi_PMI_ConfigIndex = cqirep->cqi_PMI_ConfigIndex;
|
||||||
|
|
||||||
|
if (ue->frame_parms.frame_type == FDD) {
|
||||||
|
if (cqi_PMI_ConfigIndex <= 1) { // 2 ms CQI_PMI period
|
||||||
|
cqirep->Npd = 2;
|
||||||
|
cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex;
|
||||||
|
} else if (cqi_PMI_ConfigIndex <= 6) { // 5 ms CQI_PMI period
|
||||||
|
cqirep->Npd = 5;
|
||||||
|
cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-2;
|
||||||
|
} else if (cqi_PMI_ConfigIndex <=16) { // 10ms CQI_PMI period
|
||||||
|
cqirep->Npd = 10;
|
||||||
|
cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-7;
|
||||||
|
} else if (cqi_PMI_ConfigIndex <= 36) { // 20 ms CQI_PMI period
|
||||||
|
cqirep->Npd = 20;
|
||||||
|
cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-17;
|
||||||
|
} else if (cqi_PMI_ConfigIndex <= 76) { // 40 ms CQI_PMI period
|
||||||
|
cqirep->Npd = 40;
|
||||||
|
cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-37;
|
||||||
|
} else if (cqi_PMI_ConfigIndex <= 156) { // 80 ms CQI_PMI period
|
||||||
|
cqirep->Npd = 80;
|
||||||
|
cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-77;
|
||||||
|
} else if (cqi_PMI_ConfigIndex <= 316) { // 160 ms CQI_PMI period
|
||||||
|
cqirep->Npd = 160;
|
||||||
|
cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-157;
|
||||||
|
}
|
||||||
|
else if (cqi_PMI_ConfigIndex > 317) {
|
||||||
|
|
||||||
|
if (cqi_PMI_ConfigIndex <= 349) { // 32 ms CQI_PMI period
|
||||||
|
cqirep->Npd = 32;
|
||||||
|
cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-318;
|
||||||
|
}
|
||||||
|
else if (cqi_PMI_ConfigIndex <= 413) { // 64 ms CQI_PMI period
|
||||||
|
cqirep->Npd = 64;
|
||||||
|
cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-350;
|
||||||
|
}
|
||||||
|
else if (cqi_PMI_ConfigIndex <= 541) { // 128 ms CQI_PMI period
|
||||||
|
cqirep->Npd = 128;
|
||||||
|
cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-414;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else { // TDD
|
||||||
|
if (cqi_PMI_ConfigIndex == 0) { // all UL subframes
|
||||||
|
cqirep->Npd = 1;
|
||||||
|
cqirep->N_OFFSET_CQI = 0;
|
||||||
|
} else if (cqi_PMI_ConfigIndex <= 6) { // 5 ms CQI_PMI period
|
||||||
|
cqirep->Npd = 5;
|
||||||
|
cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-1;
|
||||||
|
} else if (cqi_PMI_ConfigIndex <=16) { // 10ms CQI_PMI period
|
||||||
|
cqirep->Npd = 10;
|
||||||
|
cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-6;
|
||||||
|
} else if (cqi_PMI_ConfigIndex <= 36) { // 20 ms CQI_PMI period
|
||||||
|
cqirep->Npd = 20;
|
||||||
|
cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-16;
|
||||||
|
} else if (cqi_PMI_ConfigIndex <= 76) { // 40 ms CQI_PMI period
|
||||||
|
cqirep->Npd = 40;
|
||||||
|
cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-36;
|
||||||
|
} else if (cqi_PMI_ConfigIndex <= 156) { // 80 ms CQI_PMI period
|
||||||
|
cqirep->Npd = 80;
|
||||||
|
cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-76;
|
||||||
|
} else if (cqi_PMI_ConfigIndex <= 316) { // 160 ms CQI_PMI period
|
||||||
|
cqirep->Npd = 160;
|
||||||
|
cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-156;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t get_n1_pucch(PHY_VARS_UE *ue,
|
uint16_t get_n1_pucch(PHY_VARS_UE *ue,
|
||||||
UE_rxtx_proc_t *proc,
|
UE_rxtx_proc_t *proc,
|
||||||
uint8_t eNB_id,
|
uint8_t eNB_id,
|
||||||
@@ -1309,14 +1468,42 @@ void ue_srs_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int16_t get_pucch2_cqi(PHY_VARS_UE *ue,int eNB_id,int *len) {
|
||||||
|
|
||||||
|
if ((ue->transmission_mode[eNB_id]<4)||
|
||||||
|
(ue->transmission_mode[eNB_id]==7)) { // Mode 1-0 feedback
|
||||||
|
// 4-bit CQI message
|
||||||
|
*len=4;
|
||||||
|
return(sinr2cqi((double)ue->measurements.wideband_cqi_avg[eNB_id],
|
||||||
|
ue->transmission_mode[eNB_id]));
|
||||||
|
}
|
||||||
|
else { // Mode 1-1 feedback, later
|
||||||
|
*len=0;
|
||||||
|
// 2-antenna ports RI=1, 6 bits (2 PMI, 4 CQI)
|
||||||
|
|
||||||
|
// 2-antenna ports RI=2, 8 bits (1 PMI, 7 CQI/DIFF CQI)
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int16_t get_pucch2_ri(PHY_VARS_UE *ue,int eNB_id) {
|
||||||
|
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag) {
|
void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag) {
|
||||||
|
|
||||||
|
|
||||||
uint8_t pucch_ack_payload[2];
|
uint8_t pucch_ack_payload[2];
|
||||||
uint8_t n1_pucch;
|
uint8_t n1_pucch,n2_pucch;
|
||||||
ANFBmode_t bundling_flag;
|
ANFBmode_t bundling_flag;
|
||||||
PUCCH_FMT_t format;
|
PUCCH_FMT_t format;
|
||||||
|
|
||||||
uint8_t SR_payload;
|
uint8_t SR_payload;
|
||||||
|
uint16_t CQI_payload;
|
||||||
|
uint16_t RI_payload;
|
||||||
|
|
||||||
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
||||||
int frame_tx=proc->frame_tx;
|
int frame_tx=proc->frame_tx;
|
||||||
int subframe_tx=proc->subframe_tx;
|
int subframe_tx=proc->subframe_tx;
|
||||||
@@ -1326,6 +1513,12 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
|
|||||||
int8_t Po_PUCCH;
|
int8_t Po_PUCCH;
|
||||||
|
|
||||||
SOUNDINGRS_UL_CONFIG_DEDICATED *pSoundingrs_ul_config_dedicated=&ue->soundingrs_ul_config_dedicated[eNB_id];
|
SOUNDINGRS_UL_CONFIG_DEDICATED *pSoundingrs_ul_config_dedicated=&ue->soundingrs_ul_config_dedicated[eNB_id];
|
||||||
|
|
||||||
|
// 36.213 8.2
|
||||||
|
/*if ackNackSRS_SimultaneousTransmission == TRUE and in the cell specific SRS subframes UE shall transmit
|
||||||
|
ACK/NACK and SR using the shortened PUCCH format. This shortened PUCCH format shall be used in a cell
|
||||||
|
specific SRS subframe even if the UE does not transmit SRS in that subframe
|
||||||
|
*/
|
||||||
uint8_t isShortenPucch = (pSoundingrs_ul_config_dedicated->srsCellSubframe && frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission);
|
uint8_t isShortenPucch = (pSoundingrs_ul_config_dedicated->srsCellSubframe && frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission);
|
||||||
|
|
||||||
bundling_flag = ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode;
|
bundling_flag = ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode;
|
||||||
@@ -1497,6 +1690,111 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
|
|||||||
|
|
||||||
}
|
}
|
||||||
} // SR_Payload==1
|
} // SR_Payload==1
|
||||||
|
|
||||||
|
// PUCCH 2x
|
||||||
|
|
||||||
|
if (ue->generate_ul_signal[eNB_id] == 0) { // we have not generated ACK/NAK/SR in this subframe
|
||||||
|
|
||||||
|
n2_pucch = ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PUCCH_ResourceIndex;
|
||||||
|
// only use format2 for now, i.e. now ACK/NAK - CQI multiplexing
|
||||||
|
format = pucch_format2;
|
||||||
|
|
||||||
|
// Periodic CQI report
|
||||||
|
if ((ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex>0)&&
|
||||||
|
(is_cqi_TXOp(ue,proc,eNB_id)==1)){
|
||||||
|
|
||||||
|
if (ue->mac_enabled == 1) {
|
||||||
|
Po_PUCCH = pucch_power_cntl(ue,proc,subframe_tx,eNB_id,format);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Po_PUCCH = ue->tx_power_max_dBm;
|
||||||
|
}
|
||||||
|
ue->tx_power_dBm[subframe_tx] = Po_PUCCH;
|
||||||
|
ue->tx_total_RE[subframe_tx] = 12;
|
||||||
|
|
||||||
|
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||||
|
tx_amp = get_tx_amp(Po_PUCCH,
|
||||||
|
ue->tx_power_max_dBm,
|
||||||
|
ue->frame_parms.N_RB_UL,
|
||||||
|
1);
|
||||||
|
#else
|
||||||
|
tx_amp = AMP;
|
||||||
|
#endif
|
||||||
|
LOG_D(PHY,"[UE %d][RNTI %x] AbsSubFrame %d.%d Generating PUCCH 2 (CQI), n2_pucch %d, Po_PUCCH %d, isShortenPucch %d, amp %d\n",
|
||||||
|
Mod_id,
|
||||||
|
ue->dlsch[eNB_id][0]->rnti,
|
||||||
|
frame_tx, subframe_tx,
|
||||||
|
n2_pucch,
|
||||||
|
Po_PUCCH,
|
||||||
|
isShortenPucch,
|
||||||
|
tx_amp);
|
||||||
|
|
||||||
|
int len;
|
||||||
|
// get the payload : < 12 bits, returned in len
|
||||||
|
CQI_payload = get_pucch2_cqi(ue,eNB_id,&len);
|
||||||
|
generate_pucch2x(ue->common_vars.txdataF,
|
||||||
|
&ue->frame_parms,
|
||||||
|
ue->ncs_cell,
|
||||||
|
format,
|
||||||
|
&ue->pucch_config_dedicated[eNB_id],
|
||||||
|
n2_pucch,
|
||||||
|
&CQI_payload,
|
||||||
|
len, // A
|
||||||
|
0, // B2 not needed
|
||||||
|
tx_amp,
|
||||||
|
subframe_tx,
|
||||||
|
ue->pdcch_vars[eNB_id]->crnti);
|
||||||
|
|
||||||
|
ue->generate_ul_signal[eNB_id] = 1;
|
||||||
|
}
|
||||||
|
// Periodic RI report
|
||||||
|
else if ((ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex>0) &&
|
||||||
|
(is_ri_TXOp(ue,proc,eNB_id)==1)){
|
||||||
|
|
||||||
|
if (ue->mac_enabled == 1) {
|
||||||
|
Po_PUCCH = pucch_power_cntl(ue,proc,subframe_tx,eNB_id,format);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Po_PUCCH = ue->tx_power_max_dBm;
|
||||||
|
}
|
||||||
|
ue->tx_power_dBm[subframe_tx] = Po_PUCCH;
|
||||||
|
ue->tx_total_RE[subframe_tx] = 12;
|
||||||
|
|
||||||
|
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
|
||||||
|
tx_amp = get_tx_amp(Po_PUCCH,
|
||||||
|
ue->tx_power_max_dBm,
|
||||||
|
ue->frame_parms.N_RB_UL,
|
||||||
|
1);
|
||||||
|
#else
|
||||||
|
tx_amp = AMP;
|
||||||
|
#endif
|
||||||
|
LOG_D(PHY,"[UE %d][RNTI %x] AbsSubFrame %d.%d Generating PUCCH 2 (RI), n2_pucch %d, Po_PUCCH %d, isShortenPucch %d, amp %d\n",
|
||||||
|
Mod_id,
|
||||||
|
ue->dlsch[eNB_id][0]->rnti,
|
||||||
|
frame_tx, subframe_tx,
|
||||||
|
n2_pucch,
|
||||||
|
Po_PUCCH,
|
||||||
|
isShortenPucch,
|
||||||
|
tx_amp);
|
||||||
|
|
||||||
|
RI_payload = get_pucch2_ri(ue,eNB_id);
|
||||||
|
|
||||||
|
generate_pucch2x(ue->common_vars.txdataF,
|
||||||
|
&ue->frame_parms,
|
||||||
|
ue->ncs_cell,
|
||||||
|
format,
|
||||||
|
&ue->pucch_config_dedicated[eNB_id],
|
||||||
|
n2_pucch,
|
||||||
|
&RI_payload,
|
||||||
|
1, // A
|
||||||
|
0, // B2 not needed
|
||||||
|
tx_amp,
|
||||||
|
subframe_tx,
|
||||||
|
ue->pdcch_vars[eNB_id]->crnti);
|
||||||
|
|
||||||
|
ue->generate_ul_signal[eNB_id] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void phy_procedures_UE_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type) {
|
void phy_procedures_UE_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type) {
|
||||||
|
|||||||
@@ -1006,7 +1006,7 @@ void dump_CCE_table(int *CCE_table,const int nCCE,const unsigned short rnti,cons
|
|||||||
for (i=0;i<nCCE;i++) {
|
for (i=0;i<nCCE;i++) {
|
||||||
printf("%1d.",CCE_table[i]);
|
printf("%1d.",CCE_table[i]);
|
||||||
if ((i&7) == 7)
|
if ((i&7) == 7)
|
||||||
printf("\n CCE %d: ");
|
printf("\n CCE %d: ",i);
|
||||||
}
|
}
|
||||||
|
|
||||||
Yk = (unsigned int)rnti;
|
Yk = (unsigned int)rnti;
|
||||||
|
|||||||
Reference in New Issue
Block a user