diff --git a/lib/include/srsran/phy/ch_estimation/csi_rs_cfg.h b/lib/include/srsran/phy/ch_estimation/csi_rs_cfg.h index 1be7edf90..b63ba7403 100644 --- a/lib/include/srsran/phy/ch_estimation/csi_rs_cfg.h +++ b/lib/include/srsran/phy/ch_estimation/csi_rs_cfg.h @@ -128,6 +128,10 @@ typedef struct SRSRAN_API { uint32_t count; ///< Number of resources in the set } srsran_csi_rs_zp_set_t; -SRSRAN_API bool srsran_csi_rs_resource_mapping_is_valid(const srsran_csi_rs_resource_mapping_t *res); +SRSRAN_API bool srsran_csi_rs_resource_mapping_is_valid(const srsran_csi_rs_resource_mapping_t* res); + +SRSRAN_API uint32_t srsran_csi_rs_resource_mapping_info(const srsran_csi_rs_resource_mapping_t* res, + char* str, + uint32_t str_len); #endif // SRSRAN_CSI_RS_CFG_H diff --git a/lib/src/phy/ch_estimation/csi_rs.c b/lib/src/phy/ch_estimation/csi_rs.c index c4a77c78d..e6ea23c0c 100644 --- a/lib/src/phy/ch_estimation/csi_rs.c +++ b/lib/src/phy/ch_estimation/csi_rs.c @@ -28,6 +28,13 @@ */ #define CSI_RS_MAX_SYMBOLS_SLOT 4 +#define RESOURCE_ERROR(R) \ + do { \ + char res_info_str[256]; \ + srsran_csi_rs_resource_mapping_info(R, res_info_str, (uint32_t)sizeof(res_info_str)); \ + ERROR("Unhandled configuration %s", res_info_str); \ + } while (false) + static int csi_rs_location_f(const srsran_csi_rs_resource_mapping_t* resource, uint32_t i) { uint32_t count = 0; @@ -60,7 +67,8 @@ static int csi_rs_location_f(const srsran_csi_rs_resource_mapping_t* resource, u } } - ERROR("Unhandled configuration"); + // Inform about an unhandled configuration + RESOURCE_ERROR(resource); return SRSRAN_ERROR; } @@ -113,7 +121,8 @@ static int csi_rs_location_get_k_list(const srsran_csi_rs_resource_mapping_t* re } } - ERROR("Unhandled configuration"); + // Inform about an unhandled configuration + RESOURCE_ERROR(resource); return SRSRAN_ERROR; } @@ -163,7 +172,8 @@ static int csi_rs_location_get_l_list(const srsran_csi_rs_resource_mapping_t* re } } - ERROR("Unhandled configuration"); + // Inform about an unhandled configuration + RESOURCE_ERROR(resource); return SRSRAN_ERROR; } @@ -216,7 +226,8 @@ static int csi_rs_nof_cdm_groups(const srsran_csi_rs_resource_mapping_t* resourc return 2; } - ERROR("Unhandled configuration"); + // Inform about an unhandled configuration + RESOURCE_ERROR(resource); return SRSRAN_ERROR; } @@ -243,6 +254,89 @@ bool srsran_csi_rs_resource_mapping_is_valid(const srsran_csi_rs_resource_mappin return true; } +uint32_t srsran_csi_rs_resource_mapping_info(const srsran_csi_rs_resource_mapping_t* res, char* str, uint32_t str_len) +{ + uint32_t len = 0; + + const char* row_str = "invalid"; + uint32_t nof_freq_domain = 0; + switch (res->row) { + case srsran_csi_rs_resource_mapping_row_1: + row_str = "1"; + nof_freq_domain = SRSRAN_CSI_RS_NOF_FREQ_DOMAIN_ALLOC_ROW1; + break; + case srsran_csi_rs_resource_mapping_row_2: + row_str = "2"; + nof_freq_domain = SRSRAN_CSI_RS_NOF_FREQ_DOMAIN_ALLOC_ROW2; + break; + case srsran_csi_rs_resource_mapping_row_4: + row_str = "4"; + nof_freq_domain = SRSRAN_CSI_RS_NOF_FREQ_DOMAIN_ALLOC_ROW4; + break; + case srsran_csi_rs_resource_mapping_row_other: + row_str = "other"; + nof_freq_domain = SRSRAN_CSI_RS_NOF_FREQ_DOMAIN_ALLOC_OTHER; + break; + } + + const char* cdm_str = "invalid"; + switch (res->cdm) { + case srsran_csi_rs_cdm_nocdm: + cdm_str = "nocdm"; + break; + case srsran_csi_rs_cdm_fd_cdm2: + cdm_str = "FD-CDM2"; + break; + case srsran_csi_rs_cdm_cdm4_fd2_td2: + cdm_str = "CDM4-FD2-TD2"; + break; + case srsran_csi_rs_cdm_cdm8_fd2_td4: + cdm_str = "CDM8-FD2-TD4"; + break; + } + + const char* density_str = "invalid"; + switch (res->density) { + case srsran_csi_rs_resource_mapping_density_three: + density_str = "3"; + break; + case srsran_csi_rs_resource_mapping_density_dot5_even: + density_str = ".5 (even)"; + break; + case srsran_csi_rs_resource_mapping_density_dot5_odd: + density_str = ".5 (odd)"; + break; + case srsran_csi_rs_resource_mapping_density_one: + density_str = "1"; + break; + case srsran_csi_rs_resource_mapping_density_spare: + density_str = "spare"; + break; + } + + char frequency_domain_alloc[SRSRAN_CSI_RS_NOF_FREQ_DOMAIN_ALLOC_MAX + 1]; + srsran_vec_sprint_bin(frequency_domain_alloc, + SRSRAN_CSI_RS_NOF_FREQ_DOMAIN_ALLOC_MAX + 1, + (uint8_t*)res->frequency_domain_alloc, + nof_freq_domain); + + len = srsran_print_check(str, + str_len, + len, + "row=%s freq=%s nof_ports=%d fist_symb=%d fist_symb2=%d cdm=%s density=%s rb=(%d:%d)", + row_str, + frequency_domain_alloc, + res->nof_ports, + res->first_symbol_idx, + res->first_symbol_idx2, + cdm_str, + density_str, + res->freq_band.start_rb, + res->freq_band.start_rb + res->freq_band.nof_rb - 1); + + return len; +} + uint32_t csi_rs_count(srsran_csi_rs_density_t density, uint32_t nprb) { switch (density) { @@ -668,6 +762,7 @@ int srsran_csi_rs_nzp_measure_trs(const srsran_carrier_nr_t* carrier, int ret = csi_rs_nzp_measure_set(carrier, slot_cfg, set, grid, measurements); if (ret < SRSRAN_SUCCESS) { ERROR("Error performing measurements"); + return SRSRAN_ERROR; } uint32_t count = (uint32_t)ret; @@ -763,6 +858,7 @@ int srsran_csi_rs_nzp_measure_channel(const srsran_carrier_nr_t* carrier int ret = csi_rs_nzp_measure_set(carrier, slot_cfg, set, grid, measurements); if (ret < SRSRAN_SUCCESS) { ERROR("Error performing measurements"); + return SRSRAN_ERROR; } uint32_t count = (uint32_t)ret;