Added support to DCI format 0 with MCS>28
This commit is contained in:
parent
8b751e02fd
commit
a2d7edb285
8 changed files with 44 additions and 17 deletions
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue