mirror of https://github.com/pvnis/srsRAN_4G.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
7.0 KiB
C
172 lines
7.0 KiB
C
/**
|
|
* Copyright 2013-2023 Software Radio Systems Limited
|
|
*
|
|
* This file is part of srsRAN.
|
|
*
|
|
* srsRAN is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License as
|
|
* published by the Free Software Foundation, either version 3 of
|
|
* the License, or (at your option) any later version.
|
|
*
|
|
* srsRAN is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Affero General Public License for more details.
|
|
*
|
|
* A copy of the GNU Affero General Public License can be found in
|
|
* the LICENSE file in the top-level directory of this distribution
|
|
* and at http://www.gnu.org/licenses/.
|
|
*
|
|
*/
|
|
|
|
/******************************************************************************
|
|
* File: pdcch.h
|
|
*
|
|
* Description: Physical downlink control channel for NR.
|
|
*
|
|
* Reference: 3GPP TS 38.211 version 15.10.0
|
|
*****************************************************************************/
|
|
|
|
#ifndef SRSRAN_PDCCH_NR_H
|
|
#define SRSRAN_PDCCH_NR_H
|
|
|
|
#include "dci_nr.h"
|
|
#include "srsran/phy/ch_estimation/dmrs_pdcch.h"
|
|
#include "srsran/phy/common/phy_common_nr.h"
|
|
#include "srsran/phy/fec/crc.h"
|
|
#include "srsran/phy/fec/polar/polar_code.h"
|
|
#include "srsran/phy/fec/polar/polar_decoder.h"
|
|
#include "srsran/phy/fec/polar/polar_encoder.h"
|
|
#include "srsran/phy/fec/polar/polar_rm.h"
|
|
#include "srsran/phy/modem/evm.h"
|
|
#include "srsran/phy/modem/modem_table.h"
|
|
|
|
/**
|
|
* @brief PDCCH configuration initialization arguments
|
|
*/
|
|
typedef struct {
|
|
bool disable_simd;
|
|
bool measure_evm;
|
|
bool measure_time;
|
|
} srsran_pdcch_nr_args_t;
|
|
|
|
/**
|
|
* @brief PDCCH Attributes and objects required to encode/decode NR PDCCH
|
|
*/
|
|
typedef struct SRSRAN_API {
|
|
bool is_tx;
|
|
srsran_polar_code_t code;
|
|
srsran_polar_encoder_t encoder;
|
|
srsran_polar_decoder_t decoder;
|
|
srsran_polar_rm_t rm;
|
|
srsran_carrier_nr_t carrier;
|
|
srsran_coreset_t coreset;
|
|
srsran_crc_t crc24c;
|
|
uint8_t* c; // Message bits with attached CRC
|
|
uint8_t* d; // encoded bits
|
|
uint8_t* f; // bits at the Rate matching output
|
|
uint8_t* allocated; // Allocated polar bit buffer, encoder input, decoder output
|
|
cf_t* symbols;
|
|
srsran_modem_table_t modem_table;
|
|
srsran_evm_buffer_t* evm_buffer;
|
|
bool meas_time_en;
|
|
uint32_t meas_time_us;
|
|
uint32_t K;
|
|
uint32_t M;
|
|
uint32_t E;
|
|
} srsran_pdcch_nr_t;
|
|
|
|
/**
|
|
* @brief NR PDCCH decoder result
|
|
*/
|
|
typedef struct SRSRAN_API {
|
|
float evm;
|
|
bool crc;
|
|
} srsran_pdcch_nr_res_t;
|
|
|
|
/**
|
|
* @brief Function for generating NR PDCCH candidate locations n_cce for a given CORESET, search space, aggregation
|
|
* level and slot.
|
|
*
|
|
* @see srsran_pdcch_ue_locations_ncce
|
|
* @see srsran_pdcch_common_locations_ncce
|
|
*
|
|
* @param coreset is the coreset configuration provided from higher layers
|
|
* @param search_space is the Search Space configuration provided from higher layers
|
|
* @param RNTI UE temporal identifier, unused for common search spaces
|
|
* @param aggregation_level aggregation level in logarithm range (0,1,2,3,4)
|
|
* @param slot_idx Slot index within the radio frame
|
|
* @param locations is the destination array with the possible candidate locations n_cce
|
|
*/
|
|
int srsran_pdcch_nr_locations_coreset(const srsran_coreset_t* coreset,
|
|
const srsran_search_space_t* search_space,
|
|
uint16_t rnti,
|
|
uint32_t aggregation_level,
|
|
uint32_t slot_idx,
|
|
uint32_t locations[SRSRAN_SEARCH_SPACE_MAX_NOF_CANDIDATES_NR]);
|
|
|
|
SRSRAN_API int srsran_pdcch_nr_max_candidates_coreset(const srsran_coreset_t* coreset, uint32_t aggregation_level);
|
|
|
|
/**
|
|
* @brief Function for generating a RB mask indicating the CCE-to-REG mapping
|
|
* @param coreset A given CORESET
|
|
* @param dci_location The DCI location for the PDCCH transmission
|
|
* @param[out] rb_mask The resultant mask indicating the locations of PDCCH payload
|
|
* @return SRSRAN_SUCCESS if the provided parameters are valid, SRSRAN_ERROR code otherwise
|
|
*/
|
|
SRSRAN_API int srsran_pdcch_nr_cce_to_reg_mapping(const srsran_coreset_t* coreset,
|
|
const srsran_dci_location_t* dci_location,
|
|
bool rb_mask[SRSRAN_MAX_PRB_NR]);
|
|
|
|
SRSRAN_API int srsran_pdcch_nr_init_tx(srsran_pdcch_nr_t* q, const srsran_pdcch_nr_args_t* args);
|
|
|
|
SRSRAN_API int srsran_pdcch_nr_init_rx(srsran_pdcch_nr_t* q, const srsran_pdcch_nr_args_t* args);
|
|
|
|
SRSRAN_API void srsran_pdcch_nr_free(srsran_pdcch_nr_t* q);
|
|
|
|
/**
|
|
* @brief Sets carrier and CORESET configuration for a given PDCCH object
|
|
* @note This function shall not allocate, free memory or perform any heavy computations
|
|
* @param[in,out] q PDCCH encoder/decoder object
|
|
* @param[in] carrier New carrier configuration
|
|
* @param[in] coreset New CORESET configuration
|
|
* @return SRSRAN_SUCCESS if the configurations are valid, otherwise it returns an SRSRAN_ERROR code
|
|
*/
|
|
SRSRAN_API int
|
|
srsran_pdcch_nr_set_carrier(srsran_pdcch_nr_t* q, const srsran_carrier_nr_t* carrier, const srsran_coreset_t* coreset);
|
|
|
|
SRSRAN_API int srsran_pdcch_nr_encode(srsran_pdcch_nr_t* q, const srsran_dci_msg_nr_t* dci_msg, cf_t* slot_symbols);
|
|
|
|
/**
|
|
* @brief Decodes a DCI
|
|
*
|
|
* @param[in,out] q provides PDCCH encoder/decoder object
|
|
* @param[in] slot_symbols provides slot resource grid
|
|
* @param[in] ce provides channel estimated resource elements
|
|
* @param[in,out] dci_msg Provides with the DCI message location, RNTI, RNTI type and so on. Also, the message data
|
|
* buffer
|
|
* @param[out] res Provides the PDCCH result information
|
|
* @return SRSRAN_SUCCESS if the configurations are valid, otherwise it returns an SRSRAN_ERROR code
|
|
*/
|
|
SRSRAN_API int srsran_pdcch_nr_decode(srsran_pdcch_nr_t* q,
|
|
cf_t* slot_symbols,
|
|
srsran_dmrs_pdcch_ce_t* ce,
|
|
srsran_dci_msg_nr_t* dci_msg,
|
|
srsran_pdcch_nr_res_t* res);
|
|
|
|
/**
|
|
* @brief Stringifies NR PDCCH decoding information from the latest encoded/decoded transmission
|
|
*
|
|
* @param[in] q provides PDCCH encoder/decoder object
|
|
* @param[in] res Optional PDCCH decode result
|
|
* @param[out] str Destination string
|
|
* @param[out] str_len Maximum destination string length
|
|
* @return The number of characters written in the string
|
|
*/
|
|
SRSRAN_API uint32_t srsran_pdcch_nr_info(const srsran_pdcch_nr_t* q,
|
|
const srsran_pdcch_nr_res_t* res,
|
|
char* str,
|
|
uint32_t str_len);
|
|
|
|
#endif // SRSRAN_PDCCH_NR_H
|