From 261b586e26b3227d6bd3695c627071d903633fb8 Mon Sep 17 00:00:00 2001 From: Guy De Souza Date: Mon, 3 Sep 2018 11:06:30 +0200 Subject: [PATCH] Time domain alloc type DLSCH --- .../nfapi/public_inc/nfapi_nr_interface.h | 16 +- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 31 ++++ openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 35 +++++ openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c | 75 +++++++++ openair1/PHY/defs_gNB.h | 145 +++++++++++++++++- openair1/SCHED_NR/phy_procedures_nr_common.c | 2 + targets/RT/USER/nr-softmodem.c | 4 +- 7 files changed, 301 insertions(+), 7 deletions(-) create mode 100644 openair1/PHY/NR_TRANSPORT/nr_dlsch.c create mode 100644 openair1/PHY/NR_TRANSPORT/nr_dlsch.h create mode 100644 openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h index b195b69f38..5b687e46e6 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h @@ -278,6 +278,13 @@ typedef enum { NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC } nfapi_nr_search_space_type_e; +typedef enum { + NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_0=0, + NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_0A, + NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_1, + NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_2 +} nfapi_nr_common_search_space_type_e; + typedef enum { NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1=0, NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE2, @@ -299,6 +306,12 @@ typedef enum { NFAPI_NR_CSET_ALL_CONTIGUOUS_RBS } nfapi_nr_coreset_precoder_granularity_type_e; +typedef enum { + NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A=0, + NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_B, + NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_C +} nfapi_nr_pdsch_time_domain_alloc_type_e; + // P7 Sub Structures typedef struct { @@ -406,7 +419,8 @@ typedef struct { uint8_t rnti_type; uint8_t dci_format; uint8_t config_type; - uint8_t search_space_type; + uint8_t search_space_type; + uint8_t common_search_space_type; uint8_t aggregation_level; uint8_t n_rb; uint8_t n_symb; diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c new file mode 100644 index 0000000000..5171527d87 --- /dev/null +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -0,0 +1,31 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file PHY/LTE_TRANSPORT/dlsch_decoding.c +* \brief Top-level routines for decoding Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 +* \author R. Knopp +* \date 2011 +* \version 0.1 +* \company Eurecom +* \email: knopp@eurecom.fr +* \note +* \warning +*/ diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h new file mode 100644 index 0000000000..1125a33c1a --- /dev/null +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -0,0 +1,35 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file PHY/LTE_TRANSPORT/defs.h +* \brief data structures for PDSCH/DLSCH/PUSCH/ULSCH physical and transport channel descriptors (TX/RX) +* \author R. Knopp +* \date 2011 +* \version 0.1 +* \company Eurecom +* \email: raymond.knopp@eurecom.fr, florian.kaltenberger@eurecom.fr, oscar.tonelli@yahoo.it +* \note +* \warning +*/ + +#include "PHY/defs_gNB.h" + + diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c new file mode 100644 index 0000000000..0e143db019 --- /dev/null +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c @@ -0,0 +1,75 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file PHY/LTE_TRANSPORT/dlsch_decoding.c +* \brief Top-level routines for decoding Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 +* \author R. Knopp +* \date 2011 +* \version 0.1 +* \company Eurecom +* \email: knopp@eurecom.fr +* \note +* \warning +*/ + +#include "nr_dlsch.h" + +void nr_get_time_domain_allocation_type(nfapi_nr_config_request_t config, + NR_gNB_DCI_ALLOC_t dci_alloc, + NR_gNB_DLSCH_t* dlsch) { + + nfapi_nr_ssb_and_cset_mux_pattern_type_e mux_pattern = dci_alloc.mux_pattern; + + switch(dci_alloc.rnti_type) { + + case NFAPI_NR_RNTI_SI: + AssertFatal(dci_alloc.pdcch_params.common_search_space_type == NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_0, + "Invalid common search space type %d for SI RNTI, expected %d\n", + dci_alloc.pdcch_params.common_search_space_type, NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_0); + dlsch->time_alloc_type = (mux_pattern == NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1)?NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A : + (mux_pattern == NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE2)?NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_B : + (mux_pattern == NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE3)?NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_C; + break; + + case NFAPI_NR_RNTI_RA: + case NFAPI_NR_RNTI_TC: + /*AssertFatal(dci_alloc.pdcch_params.common_search_space_type == NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_1, + "Invalid common search space type %d for RNTI %d, expected %d\n",dci_alloc.pdcch_params.common_search_space_type, + NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_1, dci_alloc.rnti_type);*/ + if (!dlsch->time_alloc_list_flag) + dlsch->time_alloc_type = NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A; + break; + + case NFAPI_NR_RNTI_P: + break; + + case NFAPI_NR_RNTI_C: + case NFAPI_NR_RNTI_CS: + if () + break; + + case + + + } +} + + diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 116e940c71..9c36535a94 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -64,6 +64,143 @@ typedef struct { NR_gNB_DCI_ALLOC_t dci_alloc[256]; } NR_gNB_PDCCH; + +typedef struct { +/* /// Status Flag indicating for this DLSCH (idle,active,disabled) + //SCH_status_t status; + /// Transport block size + uint32_t TBS; + /// pointer to pdu from MAC interface (this is "a" in 36.212) + uint8_t *pdu; + /// The payload + CRC size in bits, "B" from 36-212 + uint32_t B; + /// Pointer to the payload + uint8_t *b; + /// Pointers to transport block segments + uint8_t *c[MAX_NUM_DLSCH_SEGMENTS]; + /// RTC values for each segment (for definition see 36-212 V8.6 2009-03, p.15) + uint32_t RTC[MAX_NUM_DLSCH_SEGMENTS]; + /// Frame where current HARQ round was sent + uint32_t frame; + /// Subframe where current HARQ round was sent + uint32_t subframe; + /// Index of current HARQ round for this DLSCH + uint8_t round; + /// Modulation order + uint8_t Qm; + /// MCS + uint8_t mcs; + /// Redundancy-version of the current sub-frame + uint8_t rvidx; + /// MIMO mode for this DLSCH + MIMO_mode_t mimo_mode; + /// Current RB allocation + uint32_t rb_alloc[4]; + /// distributed/localized flag + vrb_t vrb_type; + /// Current subband PMI allocation + uint16_t pmi_alloc; + /// Current subband RI allocation + uint32_t ri_alloc; + /// Current subband CQI1 allocation + uint32_t cqi_alloc1; + /// Current subband CQI2 allocation + uint32_t cqi_alloc2; + /// Current Number of RBs + uint16_t nb_rb; + /// Current NDI + uint8_t ndi; + /// downlink power offset field + uint8_t dl_power_off; + /// start symbold of pdsch + uint8_t pdsch_start; + /// Concatenated "e"-sequences (for definition see 36-212 V8.6 2009-03, p.17-18) + uint8_t e[MAX_NUM_CHANNEL_BITS] __attribute__((aligned(32))); + /// Turbo-code outputs (36-212 V8.6 2009-03, p.12 + uint8_t *d[MAX_NUM_DLSCH_SEGMENTS];//[(96+3+(3*6144))]; + /// Sub-block interleaver outputs (36-212 V8.6 2009-03, p.16-17) + uint8_t w[MAX_NUM_DLSCH_SEGMENTS][3*6144]; + /// Number of code segments (for definition see 36-212 V8.6 2009-03, p.9) + uint32_t C; + /// Number of "small" code segments (for definition see 36-212 V8.6 2009-03, p.10) + uint32_t Cminus; + /// Number of "large" code segments (for definition see 36-212 V8.6 2009-03, p.10) + uint32_t Cplus; + /// Number of bits in "small" code segments (<6144) (for definition see 36-212 V8.6 2009-03, p.10) + uint32_t Kminus; + /// Number of bits in "large" code segments (<6144) (for definition see 36-212 V8.6 2009-03, p.10) + uint32_t Kplus; + /// Number of "Filler" bits (for definition see 36-212 V8.6 2009-03, p.10) + uint32_t F; + /// Number of MIMO layers (streams) (for definition see 36-212 V8.6 2009-03, p.17, TM3-4) + uint8_t Nl; + /// Number of layers for this PDSCH transmission (TM8-10) + uint8_t Nlayers; + /// First layer for this PSCH transmission + uint8_t first_layer; + /// codeword this transport block is mapped to + uint8_t codeword;*/ +} NR_DL_gNB_HARQ_t; + + +typedef struct { + + /// Pointers to 8 HARQ processes for the DLSCH + LTE_DL_eNB_HARQ_t *harq_processes[8]; + nfapi_nr_pdsch_time_domain_alloc_type_e time_alloc_type; + uint8_t time_alloc_list_flag; + + +//LTE remainders to be removed +/* /// TX buffers for UE-spec transmission (antenna ports 5 or 7..14, prior to precoding) + int32_t *txdataF[8]; + /// beamforming weights for UE-spec transmission (antenna ports 5 or 7..14), for each codeword, maximum 4 layers? + int32_t **ue_spec_bf_weights[4]; + /// dl channel estimates (estimated from ul channel estimates) + int32_t **calib_dl_ch_estimates; + /// Allocated RNTI (0 means DLSCH_t is not currently used) + uint16_t rnti; + /// Active flag for baseband transmitter processing + uint8_t active; + /// HARQ process mask, indicates which processes are currently active + uint16_t harq_mask; + /// Indicator of TX activation per subframe. Used during PUCCH detection for ACK/NAK. + uint8_t subframe_tx[10]; + /// First CCE of last PDSCH scheduling per subframe. Again used during PUCCH detection for ACK/NAK. + uint8_t nCCE[10]; + /// Process ID's per subframe. Used to associate received ACKs on PUSCH/PUCCH to DLSCH harq process ids + uint8_t harq_ids[10]; + /// Window size (in outgoing transport blocks) for fine-grain rate adaptation + uint8_t ra_window_size; + /// First-round error threshold for fine-grain rate adaptation + uint8_t error_threshold; + + /// Number of soft channel bits + uint32_t G; + /// Codebook index for this dlsch (0,1,2,3) + uint8_t codebook_index; + /// Maximum number of HARQ processes (for definition see 36-212 V8.6 2009-03, p.17) + uint8_t Mdlharq; + /// Maximum number of HARQ rounds + uint8_t Mlimit; + /// MIMO transmission mode indicator for this sub-frame (for definition see 36-212 V8.6 2009-03, p.17) + uint8_t Kmimo; + /// Nsoft parameter related to UE Category + uint32_t Nsoft; + /// amplitude of PDSCH (compared to RS) in symbols without pilots + int16_t sqrt_rho_a; + /// amplitude of PDSCH (compared to RS) in symbols containing pilots + int16_t sqrt_rho_b; +#ifdef Rel14 + /// indicator that this DLSCH corresponds to SIB1-BR, needed for c_init for scrambling + uint8_t sib1_br_flag; + /// initial absolute subframe (see 36.211 Section 6.3.1), needed for c_init for scrambling + uint16_t i0; + CEmode_t CEmode; +#endif*/ +} NR_gNB_DLSCH_t; + + typedef struct { /// \brief Pointers (dynamic) to the received data in the time domain. /// - first index: rx antenna [0..nb_antennas_rx[ @@ -295,11 +432,11 @@ typedef struct PHY_VARS_gNB_s { LTE_eNB_SRS srs_vars[NUMBER_OF_UE_MAX]; LTE_eNB_PUSCH *pusch_vars[NUMBER_OF_UE_MAX]; LTE_eNB_PRACH prach_vars; - LTE_eNB_DLSCH_t *dlsch[NUMBER_OF_UE_MAX][2]; // Nusers times two spatial streams + NR_gNB_DLSCH_t *dlsch[NUMBER_OF_UE_MAX][2]; // Nusers times two spatial streams LTE_eNB_ULSCH_t *ulsch[NUMBER_OF_UE_MAX+1]; // Nusers + number of RA - LTE_eNB_DLSCH_t *dlsch_SI,*dlsch_ra,*dlsch_p; - LTE_eNB_DLSCH_t *dlsch_MCH; - LTE_eNB_DLSCH_t *dlsch_PCH; + NR_gNB_DLSCH_t *dlsch_SI,*dlsch_ra,*dlsch_p; + NR_gNB_DLSCH_t *dlsch_MCH; + NR_gNB_DLSCH_t *dlsch_PCH; LTE_eNB_UE_stats UE_stats[NUMBER_OF_UE_MAX]; LTE_eNB_UE_stats *UE_stats_ptr[NUMBER_OF_UE_MAX]; diff --git a/openair1/SCHED_NR/phy_procedures_nr_common.c b/openair1/SCHED_NR/phy_procedures_nr_common.c index ad73457cb3..44f56a22b0 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_common.c +++ b/openair1/SCHED_NR/phy_procedures_nr_common.c @@ -166,6 +166,8 @@ void nr_configure_css_dci_from_mib(nfapi_nr_dl_config_pdcch_parameters_rel15_t* AssertFatal(1==0, "Invalid SSB and coreset multiplexing pattern %d\n", pdcch_params->mux_pattern); } pdcch_params->config_type = NFAPI_NR_CSET_CONFIG_MIB_SIB1; + pdcch_params->search_space_type = NFAPI_NR_SEARCH_SPACE_TYPE_COMMON; + pdcch_params->common_search_space_type = NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_0; pdcch_params->cr_mapping_type = NFAPI_NR_CCE_REG_MAPPING_INTERLEAVED; pdcch_params->precoder_granularity = NFAPI_NR_CSET_SAME_AS_REG_BUNDLE; pdcch_params->reg_bundle_size = 6; diff --git a/targets/RT/USER/nr-softmodem.c b/targets/RT/USER/nr-softmodem.c index 992ca65981..57d5c30d15 100644 --- a/targets/RT/USER/nr-softmodem.c +++ b/targets/RT/USER/nr-softmodem.c @@ -351,11 +351,11 @@ void reset_stats(FL_OBJECT *button, long arg) for (i=0; idlsch[i][0]->Mlimit; j++) { +/* for (j=0; jdlsch[i][0]->Mlimit; j++) { phy_vars_gNB->UE_stats[i].dlsch_NAK[k][j]=0; phy_vars_gNB->UE_stats[i].dlsch_ACK[k][j]=0; phy_vars_gNB->UE_stats[i].dlsch_trials[k][j]=0; - } + }*/ phy_vars_gNB->UE_stats[i].dlsch_l2_errors[k]=0; phy_vars_gNB->UE_stats[i].ulsch_errors[k]=0;