periodic cqi procedures
This commit is contained in:
@@ -742,7 +742,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);
|
||||||
@@ -852,6 +853,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) {
|
||||||
@@ -868,6 +894,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,21 @@ 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,
|
||||||
|
uint8_t shortened_format,
|
||||||
|
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,
|
||||||
|
|||||||
@@ -460,10 +460,13 @@ inline void pucch2x_modulation(uint8_t *btilde,int16_t *d,int16_t 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],
|
||||||
@@ -471,7 +474,7 @@ void generate_pucch2x(int32_t **txdataF,
|
|||||||
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
|
||||||
uint16_t n2_pucch,
|
uint16_t n2_pucch,
|
||||||
uint8_t shortened_format,
|
uint8_t shortened_format,
|
||||||
uint32_t *payload,
|
uint16_t *payload,
|
||||||
int A,
|
int A,
|
||||||
int B2,
|
int B2,
|
||||||
int16_t amp,
|
int16_t amp,
|
||||||
@@ -559,10 +562,13 @@ void generate_pucch2x(int32_t **txdataF,
|
|||||||
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;
|
||||||
|
if (shortened_format == 1)
|
||||||
|
N_UL_symb--;
|
||||||
|
}
|
||||||
|
|
||||||
//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++) {
|
||||||
@@ -631,6 +637,10 @@ void generate_pucch2x(int32_t **txdataF,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//#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)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -418,16 +418,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.
|
||||||
|
|||||||
@@ -437,6 +437,8 @@ int8_t pucch_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t subframe,ui
|
|||||||
*/
|
*/
|
||||||
void pusch_power_cntl(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t j, uint8_t abstraction_flag);
|
void pusch_power_cntl(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t j, 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
|
||||||
@@ -452,6 +454,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,112 @@ uint8_t is_SR_TXOp(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id)
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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-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;
|
||||||
|
}
|
||||||
|
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-316;
|
||||||
|
}
|
||||||
|
else if (cqi_PMI_ConfigIndex <= 413) { // 64 ms CQI_PMI period
|
||||||
|
cqirep->Npd = 64;
|
||||||
|
cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-349;
|
||||||
|
}
|
||||||
|
else if (cqi_PMI_ConfigIndex <= 541) { // 128 ms CQI_PMI period
|
||||||
|
cqirep->Npd = 128;
|
||||||
|
cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-413;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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_D(PHY,"[UE %d][SR %x] Frame %d subframe %d Checking for CQI TXOp (cqi_ConfigIndex %d)\n",
|
||||||
|
ue->Mod_id,ue->pdcch_vars[eNB_id]->crnti,frame,subframe,
|
||||||
|
cqirep->cqi_PMI_ConfigIndex);
|
||||||
|
|
||||||
|
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_D(PHY,"[UE %d][SR %x] Frame %d subframe %d Checking for RI TXOp (ri_ConfigIndex %d)\n",
|
||||||
|
ue->Mod_id,ue->pdcch_vars[eNB_id]->crnti,frame,subframe,
|
||||||
|
cqirep->ri_ConfigIndex);
|
||||||
|
|
||||||
|
if (((10*frame + subframe + cqirep->N_OFFSET_CQI - N_OFFSET_RI) % (cqirep->Npd<<log2Mri)) == 0)
|
||||||
|
return(1);
|
||||||
|
else
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
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,
|
||||||
@@ -1079,14 +1185,42 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
@@ -1210,7 +1344,7 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
} else if (SR_payload==1) { // no ACK/NAK but SR is triggered by MAC
|
} else if (SR_payload==1) { // no ACK/NAK but SR is triggered by MAC
|
||||||
|
|
||||||
if (ue->mac_enabled == 1) {
|
if (ue->mac_enabled == 1) {
|
||||||
Po_PUCCH = pucch_power_cntl(ue,proc,subframe_tx,eNB_id,pucch_format1);
|
Po_PUCCH = pucch_power_cntl(ue,proc,subframe_tx,eNB_id,pucch_format1);
|
||||||
}
|
}
|
||||||
@@ -1258,6 +1392,107 @@ 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][SR %x] Frame %d subframe %d Generating PUCCH 2 (CQI), n2_pucch %d, Po_PUCCH %d\n",
|
||||||
|
Mod_id,
|
||||||
|
ue->dlsch[eNB_id][0]->rnti,
|
||||||
|
frame_tx, subframe_tx,
|
||||||
|
n2_pucch,
|
||||||
|
Po_PUCCH);
|
||||||
|
|
||||||
|
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,
|
||||||
|
1, // shortened format
|
||||||
|
&CQI_payload,
|
||||||
|
len, // A
|
||||||
|
0, // B2 not needed
|
||||||
|
tx_amp,
|
||||||
|
subframe_tx,
|
||||||
|
ue->pdcch_vars[eNB_id]->crnti);
|
||||||
|
|
||||||
|
}
|
||||||
|
// 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][SR %x] Frame %d subframe %d Generating PUCCH 2 (RI), n2_pucch %d, Po_PUCCH %d\n",
|
||||||
|
Mod_id,
|
||||||
|
ue->dlsch[eNB_id][0]->rnti,
|
||||||
|
frame_tx, subframe_tx,
|
||||||
|
n2_pucch,
|
||||||
|
Po_PUCCH);
|
||||||
|
|
||||||
|
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,
|
||||||
|
1, // shortened format
|
||||||
|
&RI_payload,
|
||||||
|
1, // A
|
||||||
|
0, // B2 not needed
|
||||||
|
tx_amp,
|
||||||
|
subframe_tx,
|
||||||
|
ue->pdcch_vars[eNB_id]->crnti);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
||||||
@@ -1299,7 +1534,10 @@ void phy_procedures_UE_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,ui
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ue->UE_mode[eNB_id] == PUSCH) { // check if we need to use PUCCH 1a/1b
|
if (ue->UE_mode[eNB_id] == PUSCH) { // check if we need to use PUCCH 1a/1b
|
||||||
ue_pucch_procedures(ue,proc,eNB_id,abstraction_flag);
|
|
||||||
|
ue_pucch_procedures(ue,proc,eNB_id,abstraction_flag);
|
||||||
|
|
||||||
|
|
||||||
} // UE_mode==PUSCH
|
} // UE_mode==PUSCH
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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