|
|
@ -27,6 +27,7 @@
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include "phy/phch_worker.h"
|
|
|
|
#include "phy/phch_worker.h"
|
|
|
|
|
|
|
|
#include "srslte/srslte.h"
|
|
|
|
#include "srslte/interfaces/ue_interfaces.h"
|
|
|
|
#include "srslte/interfaces/ue_interfaces.h"
|
|
|
|
#include "srslte/asn1/liblte_rrc.h"
|
|
|
|
#include "srslte/asn1/liblte_rrc.h"
|
|
|
|
|
|
|
|
|
|
|
@ -40,8 +41,6 @@
|
|
|
|
#ifdef ENABLE_GUI
|
|
|
|
#ifdef ENABLE_GUI
|
|
|
|
#include "srsgui/srsgui.h"
|
|
|
|
#include "srsgui/srsgui.h"
|
|
|
|
#include <semaphore.h>
|
|
|
|
#include <semaphore.h>
|
|
|
|
#include "srslte/srslte.h"
|
|
|
|
|
|
|
|
#include "srslte/interfaces/ue_interfaces.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void init_plots(srsue::phch_worker *worker);
|
|
|
|
void init_plots(srsue::phch_worker *worker);
|
|
|
|
pthread_t plot_thread;
|
|
|
|
pthread_t plot_thread;
|
|
|
@ -323,9 +322,9 @@ void phch_worker::work_imp()
|
|
|
|
ul_action.tti_offset = HARQ_DELAY_MS;
|
|
|
|
ul_action.tti_offset = HARQ_DELAY_MS;
|
|
|
|
|
|
|
|
|
|
|
|
/* Send UL grant or HARQ information (from PHICH) to MAC */
|
|
|
|
/* Send UL grant or HARQ information (from PHICH) to MAC */
|
|
|
|
if (ul_grant_available && ul_ack_available) {
|
|
|
|
if (ul_grant_available && ul_ack_available && ul_mac_grant.phy_grant.ul.mcs.idx < 29) {
|
|
|
|
phy->mac->new_grant_ul_ack(ul_mac_grant, ul_ack, &ul_action);
|
|
|
|
phy->mac->new_grant_ul_ack(ul_mac_grant, ul_ack, &ul_action);
|
|
|
|
} else if (ul_grant_available && !ul_ack_available) {
|
|
|
|
} else if (ul_grant_available && (!ul_ack_available || ul_mac_grant.phy_grant.ul.mcs.idx < 29)) {
|
|
|
|
phy->mac->new_grant_ul(ul_mac_grant, &ul_action);
|
|
|
|
phy->mac->new_grant_ul(ul_mac_grant, &ul_action);
|
|
|
|
} else if (!ul_grant_available && ul_ack_available) {
|
|
|
|
} else if (!ul_grant_available && ul_ack_available) {
|
|
|
|
phy->mac->harq_recv(tti, ul_ack, &ul_action);
|
|
|
|
phy->mac->harq_recv(tti, ul_ack, &ul_action);
|
|
|
@ -480,11 +479,15 @@ bool phch_worker::decode_pdcch_dl(srsue::mac_interface_phy::mac_grant_t* grant)
|
|
|
|
|
|
|
|
|
|
|
|
grant->pid = ASYNC_DL_SCHED?dci_unpacked.harq_process:(tti%(2*HARQ_DELAY_MS));
|
|
|
|
grant->pid = ASYNC_DL_SCHED?dci_unpacked.harq_process:(tti%(2*HARQ_DELAY_MS));
|
|
|
|
|
|
|
|
|
|
|
|
// Set last TBS for this TB (pid) in case of mcs>29 (7.1.7.2 of 36.213)
|
|
|
|
// Set last TBS for this TB (pid) in case of mcs>28 (7.1.7.2 of 36.213)
|
|
|
|
for (int i=0;i<SRSLTE_MAX_CODEWORDS;i++) {
|
|
|
|
for (int i=0;i<SRSLTE_MAX_CODEWORDS;i++) {
|
|
|
|
if (grant->phy_grant.dl.mcs[i].tbs < 0) {
|
|
|
|
if (grant->phy_grant.dl.mcs[i].idx > 28) {
|
|
|
|
grant->phy_grant.dl.mcs[i].tbs = last_dl_tbs[grant->pid%(2*HARQ_DELAY_MS)][i];
|
|
|
|
grant->phy_grant.dl.mcs[i].tbs = last_dl_tbs[grant->pid%(2*HARQ_DELAY_MS)][i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(grant->phy_grant.dl.mcs[i].tbs < 0) {
|
|
|
|
|
|
|
|
Info("Invalid TBS size for PDSCH grant\n");
|
|
|
|
|
|
|
|
grant->phy_grant.dl.mcs[i].tbs = 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
// save it
|
|
|
|
// save it
|
|
|
|
last_dl_tbs[grant->pid%(2*HARQ_DELAY_MS)][i] = grant->phy_grant.dl.mcs[i].tbs;
|
|
|
|
last_dl_tbs[grant->pid%(2*HARQ_DELAY_MS)][i] = grant->phy_grant.dl.mcs[i].tbs;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -539,10 +542,15 @@ int phch_worker::decode_pdsch(srslte_ra_dl_grant_t *grant, uint8_t *payload[SRSL
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint32_t nof_tb = SRSLTE_RA_DL_GRANT_NOF_TB(grant);
|
|
|
|
switch(phy->config->dedicated.antenna_info_explicit_value.tx_mode) {
|
|
|
|
switch(phy->config->dedicated.antenna_info_explicit_value.tx_mode) {
|
|
|
|
/* Implemented Tx Modes */
|
|
|
|
/* Implemented Tx Modes */
|
|
|
|
case LIBLTE_RRC_TRANSMISSION_MODE_1:
|
|
|
|
case LIBLTE_RRC_TRANSMISSION_MODE_1:
|
|
|
|
mimo_type = SRSLTE_MIMO_TYPE_SINGLE_ANTENNA;
|
|
|
|
mimo_type = SRSLTE_MIMO_TYPE_SINGLE_ANTENNA;
|
|
|
|
|
|
|
|
if (nof_tb != 1) {
|
|
|
|
|
|
|
|
Error("Wrong number of transport blocks (%d) for single antenna.", nof_tb);
|
|
|
|
|
|
|
|
valid_config = false;
|
|
|
|
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case LIBLTE_RRC_TRANSMISSION_MODE_2:
|
|
|
|
case LIBLTE_RRC_TRANSMISSION_MODE_2:
|
|
|
|
if (cell.nof_ports > 1) {
|
|
|
|
if (cell.nof_ports > 1) {
|
|
|
@ -550,26 +558,30 @@ int phch_worker::decode_pdsch(srslte_ra_dl_grant_t *grant, uint8_t *payload[SRSL
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
mimo_type = SRSLTE_MIMO_TYPE_SINGLE_ANTENNA;
|
|
|
|
mimo_type = SRSLTE_MIMO_TYPE_SINGLE_ANTENNA;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (nof_tb != 1) {
|
|
|
|
|
|
|
|
Error("Wrong number of transport blocks (%d) for transmit diversity.", nof_tb);
|
|
|
|
|
|
|
|
valid_config = false;
|
|
|
|
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case LIBLTE_RRC_TRANSMISSION_MODE_3:
|
|
|
|
case LIBLTE_RRC_TRANSMISSION_MODE_3:
|
|
|
|
if (SRSLTE_RA_DL_GRANT_NOF_TB(grant) == 1) {
|
|
|
|
if (nof_tb == 1) {
|
|
|
|
mimo_type = SRSLTE_MIMO_TYPE_TX_DIVERSITY;
|
|
|
|
mimo_type = SRSLTE_MIMO_TYPE_TX_DIVERSITY;
|
|
|
|
} else if (ue_dl.nof_rx_antennas > 1 && SRSLTE_RA_DL_GRANT_NOF_TB(grant) == 2) {
|
|
|
|
} else if (ue_dl.nof_rx_antennas > 1 && nof_tb == 2) {
|
|
|
|
mimo_type = SRSLTE_MIMO_TYPE_CDD;
|
|
|
|
mimo_type = SRSLTE_MIMO_TYPE_CDD;
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
Error("Wrong combination of antennas (%d) or transport blocks (%d) for TM3\n", ue_dl.nof_rx_antennas,
|
|
|
|
Error("Wrong combination of antennas (%d) or transport blocks (%d) for TM3\n", ue_dl.nof_rx_antennas,
|
|
|
|
SRSLTE_RA_DL_GRANT_NOF_TB(grant));
|
|
|
|
nof_tb);
|
|
|
|
valid_config = false;
|
|
|
|
valid_config = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case LIBLTE_RRC_TRANSMISSION_MODE_4:
|
|
|
|
case LIBLTE_RRC_TRANSMISSION_MODE_4:
|
|
|
|
if (SRSLTE_RA_DL_GRANT_NOF_TB(grant) == 1) {
|
|
|
|
if (nof_tb == 1) {
|
|
|
|
mimo_type = (grant->pinfo == 0) ? SRSLTE_MIMO_TYPE_TX_DIVERSITY : SRSLTE_MIMO_TYPE_SPATIAL_MULTIPLEX;
|
|
|
|
mimo_type = (grant->pinfo == 0) ? SRSLTE_MIMO_TYPE_TX_DIVERSITY : SRSLTE_MIMO_TYPE_SPATIAL_MULTIPLEX;
|
|
|
|
} else if (ue_dl.nof_rx_antennas > 1 && SRSLTE_RA_DL_GRANT_NOF_TB(grant) == 2) {
|
|
|
|
} else if (ue_dl.nof_rx_antennas > 1 && nof_tb == 2) {
|
|
|
|
mimo_type = SRSLTE_MIMO_TYPE_SPATIAL_MULTIPLEX;
|
|
|
|
mimo_type = SRSLTE_MIMO_TYPE_SPATIAL_MULTIPLEX;
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
Error("Wrong combination of antennas (%d) or transport blocks (%d) for TM3\n", ue_dl.nof_rx_antennas,
|
|
|
|
Error("Wrong combination of antennas (%d) or transport blocks (%d) for TM3\n", ue_dl.nof_rx_antennas,
|
|
|
|
SRSLTE_RA_DL_GRANT_NOF_TB(grant));
|
|
|
|
nof_tb);
|
|
|
|
valid_config = false;
|
|
|
|
valid_config = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
break;
|
|
|
@ -734,16 +746,17 @@ bool phch_worker::decode_pdcch_ul(mac_interface_phy::mac_grant_t* grant)
|
|
|
|
if (ret) {
|
|
|
|
if (ret) {
|
|
|
|
|
|
|
|
|
|
|
|
// Use last TBS for this TB in case of mcs>28
|
|
|
|
// Use last TBS for this TB in case of mcs>28
|
|
|
|
if (grant->phy_grant.ul.mcs.tbs < 0) {
|
|
|
|
if (grant->phy_grant.ul.mcs.idx > 28) {
|
|
|
|
grant->phy_grant.ul.mcs.tbs = last_ul_tbs[tti%(2*HARQ_DELAY_MS)];
|
|
|
|
grant->phy_grant.ul.mcs.tbs = last_ul_tbs[TTI_RX(tti)%(2*HARQ_DELAY_MS)];
|
|
|
|
|
|
|
|
Info("RETX: mcs=%d, old_tbs=%d pid=%d\n", grant->phy_grant.ul.mcs.idx, grant->phy_grant.ul.mcs.tbs, TTI_TX(tti)%(2*HARQ_DELAY_MS));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
last_ul_tbs[tti%(2*HARQ_DELAY_MS)] = grant->phy_grant.ul.mcs.tbs;
|
|
|
|
last_ul_tbs[TTI_RX(tti)%(2*HARQ_DELAY_MS)] = grant->phy_grant.ul.mcs.tbs;
|
|
|
|
|
|
|
|
|
|
|
|
if (grant->phy_grant.ul.mcs.mod == SRSLTE_MOD_LAST) {
|
|
|
|
if (grant->phy_grant.ul.mcs.mod == SRSLTE_MOD_LAST) {
|
|
|
|
grant->phy_grant.ul.mcs.mod = last_ul_mod[tti%(2*HARQ_DELAY_MS)];
|
|
|
|
grant->phy_grant.ul.mcs.mod = last_ul_mod[TTI_RX(tti)%(2*HARQ_DELAY_MS)];
|
|
|
|
grant->phy_grant.ul.Qm = srslte_mod_bits_x_symbol(grant->phy_grant.ul.mcs.mod);
|
|
|
|
grant->phy_grant.ul.Qm = srslte_mod_bits_x_symbol(grant->phy_grant.ul.mcs.mod);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
last_ul_mod[tti%(2*HARQ_DELAY_MS)] = grant->phy_grant.ul.mcs.mod;
|
|
|
|
last_ul_mod[TTI_RX(tti)%(2*HARQ_DELAY_MS)] = grant->phy_grant.ul.mcs.mod;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Limit UL modulation if not supported by the UE or disabled by higher layers */
|
|
|
|
/* Limit UL modulation if not supported by the UE or disabled by higher layers */
|
|
|
|