mirror of https://github.com/PentHertz/srsLTE.git
Added support to DCI format 0 with MCS>28
This commit is contained in:
parent
8b751e02fd
commit
a2d7edb285
|
@ -105,7 +105,8 @@ SRSLTE_API int srslte_dci_msg_to_ul_grant(srslte_dci_msg_t *msg,
|
||||||
uint32_t nof_prb,
|
uint32_t nof_prb,
|
||||||
uint32_t n_rb_ho,
|
uint32_t n_rb_ho,
|
||||||
srslte_ra_ul_dci_t *ul_dci,
|
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,
|
SRSLTE_API int srslte_dci_rar_to_ul_grant(srslte_dci_rar_grant_t *rar,
|
||||||
uint32_t nof_prb,
|
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,
|
SRSLTE_API int srslte_ra_ul_dci_to_grant(srslte_ra_ul_dci_t *dci,
|
||||||
uint32_t nof_prb,
|
uint32_t nof_prb,
|
||||||
uint32_t n_rb_ho,
|
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_API void srslte_ra_ul_grant_to_nbits(srslte_ra_ul_grant_t *grant,
|
||||||
srslte_cp_t cp,
|
srslte_cp_t cp,
|
||||||
|
|
|
@ -84,6 +84,7 @@ typedef struct SRSLTE_API {
|
||||||
|
|
||||||
uint16_t current_rnti;
|
uint16_t current_rnti;
|
||||||
uint32_t last_n_cce;
|
uint32_t last_n_cce;
|
||||||
|
srslte_dci_location_t last_location;
|
||||||
|
|
||||||
srslte_dci_msg_t pending_ul_dci_msg;
|
srslte_dci_msg_t pending_ul_dci_msg;
|
||||||
uint16_t pending_ul_dci_rnti;
|
uint16_t pending_ul_dci_rnti;
|
||||||
|
|
|
@ -80,6 +80,7 @@ typedef struct SRSLTE_API {
|
||||||
bool cfo_en;
|
bool cfo_en;
|
||||||
|
|
||||||
float current_cfo;
|
float current_cfo;
|
||||||
|
srslte_pucch_format_t last_pucch_format;
|
||||||
|
|
||||||
srslte_pusch_cfg_t pusch_cfg;
|
srslte_pusch_cfg_t pusch_cfg;
|
||||||
srslte_refsignal_ul_t signals;
|
srslte_refsignal_ul_t signals;
|
||||||
|
@ -186,6 +187,15 @@ SRSLTE_API float srslte_ue_ul_pusch_power(srslte_ue_ul_t *q,
|
||||||
float PL,
|
float PL,
|
||||||
float p0_preamble);
|
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 */
|
/* Other static functions for UL PHY procedures defined in 36.213 */
|
||||||
|
|
||||||
SRSLTE_API int srslte_ue_ul_sr_send_tti(uint32_t I_sr,
|
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,
|
srslte_ra_type2_from_riv(riv, &ul_dci->type2_alloc.L_crb, &ul_dci->type2_alloc.RB_start,
|
||||||
nof_prb, nof_prb);
|
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");
|
fprintf(stderr, "Error computing resource allocation\n");
|
||||||
return SRSLTE_ERROR;
|
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,
|
int srslte_dci_msg_to_ul_grant(srslte_dci_msg_t *msg, uint32_t nof_prb,
|
||||||
uint32_t n_rb_ho,
|
uint32_t n_rb_ho,
|
||||||
srslte_ra_ul_dci_t *ul_dci,
|
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;
|
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;
|
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");
|
fprintf(stderr, "Error computing resource allocation\n");
|
||||||
return ret;
|
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;
|
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;
|
int tbs = -1;
|
||||||
// 8.6.2 First paragraph
|
// 8.6.2 First paragraph
|
||||||
if (dci->mcs_idx <= 28) {
|
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) {
|
if (dci->mcs_idx < 11) {
|
||||||
grant->mcs.mod = SRSLTE_MOD_QPSK;
|
grant->mcs.mod = SRSLTE_MOD_QPSK;
|
||||||
tbs = srslte_ra_tbs_from_idx(dci->mcs_idx, grant->L_prb);
|
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) {
|
} else if (dci->mcs_idx < 21) {
|
||||||
grant->mcs.mod = SRSLTE_MOD_16QAM;
|
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) {
|
} else if (dci->mcs_idx < 29) {
|
||||||
grant->mcs.mod = SRSLTE_MOD_64QAM;
|
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 {
|
} else {
|
||||||
fprintf(stderr, "Invalid MCS index %d\n", dci->mcs_idx);
|
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) {
|
} else if (dci->mcs_idx == 29 && dci->cqi_request && grant->L_prb <= 4) {
|
||||||
// 8.6.1 and 8.6.2 36.213 second paragraph
|
// 8.6.1 and 8.6.2 36.213 second paragraph
|
||||||
grant->mcs.mod = SRSLTE_MOD_QPSK;
|
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 if (dci->mcs_idx >= 29) {
|
||||||
// Else use last TBS/Modulation and use mcs to obtain rv_idx
|
// Else use last TBS/Modulation and use mcs to obtain rv_idx
|
||||||
tbs = 0;
|
tbs = srslte_ra_tbs_from_idx(last_tbs_idx[harq_pid%8], grant->L_prb);
|
||||||
grant->mcs.mod = last_mod;
|
grant->mcs.mod = last_mod[harq_pid%8];
|
||||||
dci->rv_idx = dci->mcs_idx - 28;
|
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) {
|
if (tbs < 0) {
|
||||||
fprintf(stderr, "Error computing TBS\n");
|
fprintf(stderr, "Error computing TBS\n");
|
||||||
return SRSLTE_ERROR;
|
return SRSLTE_ERROR;
|
||||||
} else {
|
} else {
|
||||||
last_mod = grant->mcs.mod;
|
|
||||||
grant->mcs.tbs = (uint32_t) tbs;
|
grant->mcs.tbs = (uint32_t) tbs;
|
||||||
return SRSLTE_SUCCESS;
|
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 */
|
/** 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
|
// Compute PRB allocation
|
||||||
if (!srslte_ul_dci_to_grant_prb_allocation(dci, grant, n_rb_ho, nof_prb)) {
|
if (!srslte_ul_dci_to_grant_prb_allocation(dci, grant, n_rb_ho, nof_prb)) {
|
||||||
|
|
||||||
// Compute MCS
|
// 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
|
// Fill rest of grant structure
|
||||||
grant->mcs.idx = dci->mcs_idx;
|
grant->mcs.idx = dci->mcs_idx;
|
||||||
|
|
|
@ -134,7 +134,7 @@ int main(int argc, char **argv) {
|
||||||
dci.mcs_idx = mcs_idx;
|
dci.mcs_idx = mcs_idx;
|
||||||
|
|
||||||
srslte_ra_ul_grant_t grant;
|
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");
|
fprintf(stderr, "Error computing resource allocation\n");
|
||||||
return ret;
|
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) {
|
if (rnti) {
|
||||||
/* Do not search if an UL DCI is already pending */
|
/* Do not search if an UL DCI is already pending */
|
||||||
|
|
||||||
if (q->pending_ul_dci_rnti == rnti) {
|
if (q->pending_ul_dci_rnti == rnti) {
|
||||||
q->pending_ul_dci_rnti = 0;
|
q->pending_ul_dci_rnti = 0;
|
||||||
memcpy(dci_msg, &q->pending_ul_dci_msg, sizeof(srslte_dci_msg_t));
|
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;
|
crc_rem = 0;
|
||||||
}
|
}
|
||||||
DEBUG("Decoded DCI message RNTI: 0x%x\n", crc_rem);
|
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) {
|
if (crc_rem == rnti) {
|
||||||
return 1;
|
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");
|
fprintf(stderr, "Error decoding DCI msg\n");
|
||||||
return SRSLTE_ERROR;
|
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) {
|
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() */
|
/* Save Format 0 msg. Recovered next call to srslte_ue_dl_find_ul_dci() */
|
||||||
q->pending_ul_dci_rnti = crc_rem;
|
q->pending_ul_dci_rnti = crc_rem;
|
||||||
|
|
Loading…
Reference in New Issue