diff --git a/srslte/include/srslte/phch/dci.h b/srslte/include/srslte/phch/dci.h index a666369ba..0b4814334 100644 --- a/srslte/include/srslte/phch/dci.h +++ b/srslte/include/srslte/phch/dci.h @@ -105,7 +105,8 @@ SRSLTE_API int srslte_dci_msg_to_ul_grant(srslte_dci_msg_t *msg, uint32_t nof_prb, uint32_t n_rb_ho, srslte_ra_ul_dci_t *ul_dci, - srslte_ra_ul_grant_t *grant); + srslte_ra_ul_grant_t *grant, + uint32_t harq_pid); SRSLTE_API int srslte_dci_rar_to_ul_grant(srslte_dci_rar_grant_t *rar, uint32_t nof_prb, diff --git a/srslte/include/srslte/phch/ra.h b/srslte/include/srslte/phch/ra.h index 6b002c9ed..e8bb3f087 100644 --- a/srslte/include/srslte/phch/ra.h +++ b/srslte/include/srslte/phch/ra.h @@ -207,7 +207,8 @@ SRSLTE_API uint32_t srslte_ra_dl_grant_nof_re(srslte_ra_dl_grant_t *grant, SRSLTE_API int srslte_ra_ul_dci_to_grant(srslte_ra_ul_dci_t *dci, uint32_t nof_prb, uint32_t n_rb_ho, - srslte_ra_ul_grant_t *grant); + srslte_ra_ul_grant_t *grant, + uint32_t harq_pid); SRSLTE_API void srslte_ra_ul_grant_to_nbits(srslte_ra_ul_grant_t *grant, srslte_cp_t cp, diff --git a/srslte/include/srslte/ue/ue_dl.h b/srslte/include/srslte/ue/ue_dl.h index 804147bb3..e783baa8a 100644 --- a/srslte/include/srslte/ue/ue_dl.h +++ b/srslte/include/srslte/ue/ue_dl.h @@ -84,6 +84,7 @@ typedef struct SRSLTE_API { uint16_t current_rnti; uint32_t last_n_cce; + srslte_dci_location_t last_location; srslte_dci_msg_t pending_ul_dci_msg; uint16_t pending_ul_dci_rnti; diff --git a/srslte/include/srslte/ue/ue_ul.h b/srslte/include/srslte/ue/ue_ul.h index 1bc24de5b..4fc417c2f 100644 --- a/srslte/include/srslte/ue/ue_ul.h +++ b/srslte/include/srslte/ue/ue_ul.h @@ -80,7 +80,8 @@ typedef struct SRSLTE_API { bool cfo_en; float current_cfo; - + srslte_pucch_format_t last_pucch_format; + srslte_pusch_cfg_t pusch_cfg; srslte_refsignal_ul_t signals; srslte_refsignal_ul_dmrs_pregen_t pregen_drms; @@ -186,6 +187,15 @@ SRSLTE_API float srslte_ue_ul_pusch_power(srslte_ue_ul_t *q, float PL, float p0_preamble); +SRSLTE_API float srslte_ue_ul_pucch_power(srslte_ue_ul_t *q, + float PL, + srslte_pucch_format_t format, + uint32_t n_cqi, + uint32_t n_harq); + +SRSLTE_API float srslte_ue_ul_srs_power(srslte_ue_ul_t *q, + float PL); + /* Other static functions for UL PHY procedures defined in 36.213 */ SRSLTE_API int srslte_ue_ul_sr_send_tti(uint32_t I_sr, diff --git a/srslte/lib/phch/src/dci.c b/srslte/lib/phch/src/dci.c index 5c8cd9b7c..a7666577e 100644 --- a/srslte/lib/phch/src/dci.c +++ b/srslte/lib/phch/src/dci.c @@ -126,7 +126,7 @@ int srslte_dci_rar_to_ul_grant(srslte_dci_rar_grant_t *rar, uint32_t nof_prb, srslte_ra_type2_from_riv(riv, &ul_dci->type2_alloc.L_crb, &ul_dci->type2_alloc.RB_start, nof_prb, nof_prb); - if (srslte_ra_ul_dci_to_grant(ul_dci, nof_prb, n_rb_ho, grant)) { + if (srslte_ra_ul_dci_to_grant(ul_dci, nof_prb, n_rb_ho, grant, 0)) { fprintf(stderr, "Error computing resource allocation\n"); return SRSLTE_ERROR; } @@ -164,7 +164,7 @@ void srslte_dci_rar_grant_fprint(FILE *stream, srslte_dci_rar_grant_t *rar) { int srslte_dci_msg_to_ul_grant(srslte_dci_msg_t *msg, uint32_t nof_prb, uint32_t n_rb_ho, srslte_ra_ul_dci_t *ul_dci, - srslte_ra_ul_grant_t *grant) + srslte_ra_ul_grant_t *grant, uint32_t harq_pid) { int ret = SRSLTE_ERROR_INVALID_INPUTS; @@ -181,7 +181,7 @@ int srslte_dci_msg_to_ul_grant(srslte_dci_msg_t *msg, uint32_t nof_prb, return ret; } - if (srslte_ra_ul_dci_to_grant(ul_dci, nof_prb, n_rb_ho, grant)) { + if (srslte_ra_ul_dci_to_grant(ul_dci, nof_prb, n_rb_ho, grant, harq_pid)) { fprintf(stderr, "Error computing resource allocation\n"); return ret; } diff --git a/srslte/lib/phch/src/ra.c b/srslte/lib/phch/src/ra.c index 573f724e3..a8222c31f 100644 --- a/srslte/lib/phch/src/ra.c +++ b/srslte/lib/phch/src/ra.c @@ -170,9 +170,10 @@ int srslte_ul_dci_to_grant_prb_allocation(srslte_ra_ul_dci_t *dci, srslte_ra_ul_ return SRSLTE_SUCCESS; } -static srslte_mod_t last_mod; +srslte_mod_t last_mod[8]; +uint32_t last_tbs_idx[8]; -static int ul_dci_to_grant_mcs(srslte_ra_ul_dci_t *dci, srslte_ra_ul_grant_t *grant) { +static int ul_dci_to_grant_mcs(srslte_ra_ul_dci_t *dci, srslte_ra_ul_grant_t *grant, uint32_t harq_pid) { int tbs = -1; // 8.6.2 First paragraph if (dci->mcs_idx <= 28) { @@ -180,30 +181,35 @@ static int ul_dci_to_grant_mcs(srslte_ra_ul_dci_t *dci, srslte_ra_ul_grant_t *gr if (dci->mcs_idx < 11) { grant->mcs.mod = SRSLTE_MOD_QPSK; tbs = srslte_ra_tbs_from_idx(dci->mcs_idx, grant->L_prb); + last_tbs_idx[harq_pid%8] = dci->mcs_idx; } else if (dci->mcs_idx < 21) { grant->mcs.mod = SRSLTE_MOD_16QAM; - tbs = srslte_ra_tbs_from_idx(dci->mcs_idx - 1, grant->L_prb); + tbs = srslte_ra_tbs_from_idx(dci->mcs_idx-1, grant->L_prb); + last_tbs_idx[harq_pid%8] = dci->mcs_idx-1; } else if (dci->mcs_idx < 29) { grant->mcs.mod = SRSLTE_MOD_64QAM; - tbs = srslte_ra_tbs_from_idx(dci->mcs_idx - 2, grant->L_prb); + tbs = srslte_ra_tbs_from_idx(dci->mcs_idx-2, grant->L_prb); + last_tbs_idx[harq_pid%8] = dci->mcs_idx-2; } else { fprintf(stderr, "Invalid MCS index %d\n", dci->mcs_idx); } + last_mod[harq_pid%8] = grant->mcs.mod; } else if (dci->mcs_idx == 29 && dci->cqi_request && grant->L_prb <= 4) { // 8.6.1 and 8.6.2 36.213 second paragraph grant->mcs.mod = SRSLTE_MOD_QPSK; - tbs = 0; + tbs = srslte_ra_tbs_from_idx(last_tbs_idx[harq_pid%8], grant->L_prb); } else if (dci->mcs_idx >= 29) { // Else use last TBS/Modulation and use mcs to obtain rv_idx - tbs = 0; - grant->mcs.mod = last_mod; + tbs = srslte_ra_tbs_from_idx(last_tbs_idx[harq_pid%8], grant->L_prb); + grant->mcs.mod = last_mod[harq_pid%8]; dci->rv_idx = dci->mcs_idx - 28; + DEBUG("TTI=%d, harq_pid=%d, mcs_idx=%d, tbs=%d, mod=%d, rv=%d\n", + harq_pid, harq_pid%8, dci->mcs_idx, tbs/8, grant->mcs.mod, dci->rv_idx); } if (tbs < 0) { fprintf(stderr, "Error computing TBS\n"); return SRSLTE_ERROR; } else { - last_mod = grant->mcs.mod; grant->mcs.tbs = (uint32_t) tbs; return SRSLTE_SUCCESS; } @@ -217,14 +223,15 @@ void srslte_ra_ul_grant_to_nbits(srslte_ra_ul_grant_t *grant, srslte_cp_t cp, ui } /** Compute PRB allocation for Uplink as defined in 8.1 and 8.4 of 36.213 */ -int srslte_ra_ul_dci_to_grant(srslte_ra_ul_dci_t *dci, uint32_t nof_prb, uint32_t n_rb_ho, srslte_ra_ul_grant_t *grant) +int srslte_ra_ul_dci_to_grant(srslte_ra_ul_dci_t *dci, uint32_t nof_prb, uint32_t n_rb_ho, srslte_ra_ul_grant_t *grant, + uint32_t harq_pid) { // Compute PRB allocation if (!srslte_ul_dci_to_grant_prb_allocation(dci, grant, n_rb_ho, nof_prb)) { // Compute MCS - if (!ul_dci_to_grant_mcs(dci, grant)) { + if (!ul_dci_to_grant_mcs(dci, grant, harq_pid)) { // Fill rest of grant structure grant->mcs.idx = dci->mcs_idx; diff --git a/srslte/lib/phch/test/pusch_test.c b/srslte/lib/phch/test/pusch_test.c index 3b2eede43..9d86559bd 100644 --- a/srslte/lib/phch/test/pusch_test.c +++ b/srslte/lib/phch/test/pusch_test.c @@ -134,7 +134,7 @@ int main(int argc, char **argv) { dci.mcs_idx = mcs_idx; srslte_ra_ul_grant_t grant; - if (srslte_ra_ul_dci_to_grant(&dci, cell.nof_prb, 0, &grant)) { + if (srslte_ra_ul_dci_to_grant(&dci, cell.nof_prb, 0, &grant, 0)) { fprintf(stderr, "Error computing resource allocation\n"); return ret; } diff --git a/srslte/lib/ue/src/ue_dl.c b/srslte/lib/ue/src/ue_dl.c index e08d9b320..ceff72d8a 100644 --- a/srslte/lib/ue/src/ue_dl.c +++ b/srslte/lib/ue/src/ue_dl.c @@ -263,6 +263,7 @@ int srslte_ue_dl_find_ul_dci(srslte_ue_dl_t *q, srslte_dci_msg_t *dci_msg, uint3 if (rnti) { /* Do not search if an UL DCI is already pending */ + if (q->pending_ul_dci_rnti == rnti) { q->pending_ul_dci_rnti = 0; memcpy(dci_msg, &q->pending_ul_dci_msg, sizeof(srslte_dci_msg_t)); @@ -278,6 +279,9 @@ int srslte_ue_dl_find_ul_dci(srslte_ue_dl_t *q, srslte_dci_msg_t *dci_msg, uint3 crc_rem = 0; } DEBUG("Decoded DCI message RNTI: 0x%x\n", crc_rem); + if (crc_rem == rnti) { + memcpy(&q->last_location, &locations[i], sizeof(srslte_dci_location_t)); + } } if (crc_rem == rnti) { return 1; @@ -337,6 +341,9 @@ int srslte_ue_dl_find_dl_dci_type(srslte_ue_dl_t *q, srslte_dci_msg_t *dci_msg, fprintf(stderr, "Error decoding DCI msg\n"); return SRSLTE_ERROR; } + if (crc_rem == rnti) { + memcpy(&q->last_location, &locations[i], sizeof(srslte_dci_location_t)); + } if (crc_rem == rnti && formats[f] == SRSLTE_DCI_FORMAT1A && dci_msg->data[0] != 1) { /* Save Format 0 msg. Recovered next call to srslte_ue_dl_find_ul_dci() */ q->pending_ul_dci_rnti = crc_rem;