Remove the usage of global mem for rach rx process
saves about 600MB of memory allocation Move the definition of PRACH items and the PRACH list to the defs_nr_commons.h file. Do not re-write the entire structure in nr_schedule_rx_prach(), as it is quite large now.
This commit is contained in:
committed by
Robert Schmidt
parent
fff95cc075
commit
1292cd68b7
@@ -387,7 +387,6 @@ void init_eNB_afterRU(void)
|
|||||||
int aa = 0;
|
int aa = 0;
|
||||||
for (int ru_id = 0; ru_id < gNB->num_RU; ru_id++) {
|
for (int ru_id = 0; ru_id < gNB->num_RU; ru_id++) {
|
||||||
AssertFatal(gNB->RU_list[ru_id]->common.rxdataF != NULL, "RU %d : common.rxdataF is NULL\n", gNB->RU_list[ru_id]->idx);
|
AssertFatal(gNB->RU_list[ru_id]->common.rxdataF != NULL, "RU %d : common.rxdataF is NULL\n", gNB->RU_list[ru_id]->idx);
|
||||||
AssertFatal(gNB->RU_list[ru_id]->prach_rxsigF != NULL, "RU %d : prach_rxsigF is NULL\n", gNB->RU_list[ru_id]->idx);
|
|
||||||
for (int i = 0; i < gNB->RU_list[ru_id]->nb_rx; aa++, i++) {
|
for (int i = 0; i < gNB->RU_list[ru_id]->nb_rx; aa++, i++) {
|
||||||
LOG_I(PHY, "Attaching RU %d antenna %d to gNB antenna %d\n", gNB->RU_list[ru_id]->idx, i, aa);
|
LOG_I(PHY, "Attaching RU %d antenna %d to gNB antenna %d\n", gNB->RU_list[ru_id]->idx, i, aa);
|
||||||
for (int b = 0; b < gNB->RU_list[ru_id]->num_beams_period; b++) {
|
for (int b = 0; b < gNB->RU_list[ru_id]->num_beams_period; b++) {
|
||||||
|
|||||||
+1
-2
@@ -1216,8 +1216,7 @@ void *ru_thread(void *param)
|
|||||||
prach_item_t *p = find_nr_prach(&gNB->prach_list, proc->frame_rx, proc->tti_rx, SEARCH_EXIST);
|
prach_item_t *p = find_nr_prach(&gNB->prach_list, proc->frame_rx, proc->tti_rx, SEARCH_EXIST);
|
||||||
if (p) {
|
if (p) {
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_RU_PRACH_RX, 1 );
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_RU_PRACH_RX, 1 );
|
||||||
// this fills ru->prach_rxsigF for processing by gNB
|
// need to extract RACH data for lqter processing by rx_nr_prach()
|
||||||
p->rxsigF = (c16_t ***)ru->prach_rxsigF;
|
|
||||||
rx_nr_prach_ru(p, ru->common.rxdata, ru->nr_frame_parms, ru->N_TA_offset);
|
rx_nr_prach_ru(p, ru->common.rxdata, ru->nr_frame_parms, ru->N_TA_offset);
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_RU_PRACH_RX, 0);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_RU_PRACH_RX, 0);
|
||||||
} // end if (prach_id >= 0)
|
} // end if (prach_id >= 0)
|
||||||
|
|||||||
@@ -112,25 +112,10 @@ void nr_phy_init_RU(RU_t *ru)
|
|||||||
LOG_D(PHY, "rxdataF[%d] %p for RU %d\n", i, ru->common.rxdataF[i], ru->idx);
|
LOG_D(PHY, "rxdataF[%d] %p for RU %d\n", i, ru->common.rxdataF[i], ru->idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* number of elements of an array X is computed as sizeof(X) / sizeof(X[0]) */
|
|
||||||
// AssertFatal(ru->nb_rx <= sizeof(ru->prach_rxsigF) / sizeof(ru->prach_rxsigF[0]),
|
|
||||||
// "nb_antennas_rx too large");
|
|
||||||
for (int j = 0; j < NUMBER_OF_NR_RU_PRACH_OCCASIONS_MAX; j++) {
|
|
||||||
ru->prach_rxsigF[j] = malloc(nb_rx_streams * sizeof(*ru->prach_rxsigF));
|
|
||||||
|
|
||||||
for (int i = 0; i < nb_rx_streams; i++) {
|
|
||||||
// largest size for PRACH FFT is 4x98304 (16*24576)
|
|
||||||
ru->prach_rxsigF[j][i] = malloc16_clear(4 * 98304 * 2 * sizeof(**ru->prach_rxsigF));
|
|
||||||
LOG_D(PHY, "[INIT] prach_vars->rxsigF[%d] = %p\n", i, ru->prach_rxsigF[j][i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AssertFatal(ru->num_gNB <= NUMBER_OF_gNB_MAX, "gNB instances %d > %d\n", ru->num_gNB,NUMBER_OF_gNB_MAX);
|
AssertFatal(ru->num_gNB <= NUMBER_OF_gNB_MAX, "gNB instances %d > %d\n", ru->num_gNB,NUMBER_OF_gNB_MAX);
|
||||||
|
|
||||||
LOG_D(PHY, "[INIT] %s() ru->num_gNB:%d \n", __FUNCTION__, ru->num_gNB);
|
LOG_D(PHY, "[INIT] %s() ru->num_gNB:%d \n", __FUNCTION__, ru->num_gNB);
|
||||||
} // !=IF5
|
} // !=IF5
|
||||||
|
|
||||||
init_prach_list(&ru->prach_list);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void nr_phy_free_RU(RU_t *ru)
|
void nr_phy_free_RU(RU_t *ru)
|
||||||
@@ -172,11 +157,6 @@ void nr_phy_free_RU(RU_t *ru)
|
|||||||
free_and_zero(ru->common.rxdataF[i]);
|
free_and_zero(ru->common.rxdataF[i]);
|
||||||
free_and_zero(ru->common.rxdataF);
|
free_and_zero(ru->common.rxdataF);
|
||||||
|
|
||||||
for (int j = 0; j < NUMBER_OF_NR_RU_PRACH_OCCASIONS_MAX; j++) {
|
|
||||||
for (int i = 0; i < nb_rx_streams; i++)
|
|
||||||
free_and_zero(ru->prach_rxsigF[j][i]);
|
|
||||||
free_and_zero(ru->prach_rxsigF[j]);
|
|
||||||
}
|
|
||||||
for(int i = 0; i < ru->num_beams_period; ++i)
|
for(int i = 0; i < ru->num_beams_period; ++i)
|
||||||
free_and_zero(ru->common.beam_id[i]);
|
free_and_zero(ru->common.beam_id[i]);
|
||||||
free_and_zero(ru->common.beam_id);
|
free_and_zero(ru->common.beam_id);
|
||||||
|
|||||||
@@ -88,7 +88,10 @@ prach_item_t *nr_fill_prach(PHY_VARS_gNB *gNB, int SFN, int Slot, nfapi_nr_prach
|
|||||||
}
|
}
|
||||||
const int fmt = prach_pdu->prach_format;
|
const int fmt = prach_pdu->prach_format;
|
||||||
NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
|
NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
|
||||||
*prach = (prach_item_t){.frame = SFN, .slot = Slot, .num_slots = (fmt < 4) ? get_long_prach_dur(fmt, fp->numerology_index) : 1};
|
// we set only elements as the whole structure has been cleaned when we release it
|
||||||
|
prach->frame = SFN;
|
||||||
|
prach->slot = Slot;
|
||||||
|
prach->num_slots = fmt < 4 ? get_long_prach_dur(fmt, fp->numerology_index) : 1;
|
||||||
if (gNB->common_vars.beam_id) {
|
if (gNB->common_vars.beam_id) {
|
||||||
int n_symb = get_nr_prach_duration(prach_pdu->prach_format);
|
int n_symb = get_nr_prach_duration(prach_pdu->prach_format);
|
||||||
AssertFatal(prach_pdu->beamforming.dig_bf_interface < NFAPI_MAX_NUM_BG_IF,
|
AssertFatal(prach_pdu->beamforming.dig_bf_interface < NFAPI_MAX_NUM_BG_IF,
|
||||||
@@ -123,16 +126,6 @@ prach_item_t *nr_fill_prach(PHY_VARS_gNB *gNB, int SFN, int Slot, nfapi_nr_prach
|
|||||||
return prach;
|
return prach;
|
||||||
}
|
}
|
||||||
|
|
||||||
void nr_fill_prach_ru(RU_t *ru, prach_item_t *gnb_prach)
|
|
||||||
{
|
|
||||||
prach_item_t *prach = find_nr_prach(&ru->prach_list, gnb_prach->frame, gnb_prach->slot, SEARCH_EXIST_OR_FREE);
|
|
||||||
if (!prach) {
|
|
||||||
LOG_E(PHY, "no prach memory found\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
*prach = *gnb_prach;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void rx_nr_prach_ru_internal(prach_item_t *p,
|
static void rx_nr_prach_ru_internal(prach_item_t *p,
|
||||||
int beam_id,
|
int beam_id,
|
||||||
int prachStartSymbol,
|
int prachStartSymbol,
|
||||||
|
|||||||
@@ -211,7 +211,6 @@ rx_prach_out_t rx_nr_prach(const prach_item_t *, int occasion);
|
|||||||
|
|
||||||
void rx_nr_prach_ru(prach_item_t *, int32_t **, NR_DL_FRAME_PARMS *frame_parms, int N_TA_offset);
|
void rx_nr_prach_ru(prach_item_t *, int32_t **, NR_DL_FRAME_PARMS *frame_parms, int N_TA_offset);
|
||||||
|
|
||||||
void nr_fill_prach_ru(RU_t *ru,prach_item_t * );
|
|
||||||
prach_item_t *find_nr_prach(prach_list_t *, int frame, int slot, find_type_t type);
|
prach_item_t *find_nr_prach(prach_list_t *, int frame, int slot, find_type_t type);
|
||||||
void nr_fill_pucch(PHY_VARS_gNB *gNB,
|
void nr_fill_pucch(PHY_VARS_gNB *gNB,
|
||||||
int frame,
|
int frame,
|
||||||
|
|||||||
@@ -190,7 +190,6 @@ typedef struct {
|
|||||||
task_ans_t *ans;
|
task_ans_t *ans;
|
||||||
} feptx_cmd_t;
|
} feptx_cmd_t;
|
||||||
|
|
||||||
#define NUMBER_OF_NR_RU_PRACH_OCCASIONS_MAX 12
|
|
||||||
#define RU_RX_SLOT_DEPTH 4
|
#define RU_RX_SLOT_DEPTH 4
|
||||||
typedef struct RU_proc_t_s {
|
typedef struct RU_proc_t_s {
|
||||||
/// Pointer to associated RU descriptor
|
/// Pointer to associated RU descriptor
|
||||||
@@ -592,7 +591,6 @@ typedef struct RU_t_s {
|
|||||||
int32_t *bw_list[NUMBER_OF_eNB_MAX+1];
|
int32_t *bw_list[NUMBER_OF_eNB_MAX+1];
|
||||||
/// beamforming weight vectors
|
/// beamforming weight vectors
|
||||||
int32_t **beam_weights[NUMBER_OF_eNB_MAX+1][15];
|
int32_t **beam_weights[NUMBER_OF_eNB_MAX+1][15];
|
||||||
prach_list_t prach_list;
|
|
||||||
/// received frequency-domain signal for PRACH (IF4p5 RRU)
|
/// received frequency-domain signal for PRACH (IF4p5 RRU)
|
||||||
int16_t **prach_rxsigF[NUMBER_OF_NR_RU_PRACH_OCCASIONS_MAX];
|
int16_t **prach_rxsigF[NUMBER_OF_NR_RU_PRACH_OCCASIONS_MAX];
|
||||||
/// received frequency-domain signal for PRACH BR (IF4p5 RRU)
|
/// received frequency-domain signal for PRACH BR (IF4p5 RRU)
|
||||||
|
|||||||
@@ -993,41 +993,14 @@ extern int sync_var;
|
|||||||
#define MBSFN_FDD_SF6 0x10
|
#define MBSFN_FDD_SF6 0x10
|
||||||
#define MBSFN_FDD_SF7 0x08
|
#define MBSFN_FDD_SF7 0x08
|
||||||
#define MBSFN_FDD_SF8 0x04
|
#define MBSFN_FDD_SF8 0x04
|
||||||
|
|
||||||
|
#define NUMBER_OF_NR_RU_PRACH_OCCASIONS_MAX 12
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
pthread_mutex_t mutex_failure;
|
pthread_mutex_t mutex_failure;
|
||||||
bool failed;
|
bool failed;
|
||||||
} decode_abort_t;
|
} decode_abort_t;
|
||||||
|
|
||||||
// TODO will be removed in a late commit
|
|
||||||
#include "nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h"
|
|
||||||
#define NUMBER_OF_NR_PRACH_MAX 8
|
|
||||||
typedef struct {
|
|
||||||
int frame;
|
|
||||||
int slot;
|
|
||||||
int num_slots; // prach duration in slots
|
|
||||||
int beams[NFAPI_MAX_NUM_BG_IF];
|
|
||||||
nfapi_nr_prach_pdu_t pdu;
|
|
||||||
int rootSequenceIndex;
|
|
||||||
int numrootSequenceIndex;
|
|
||||||
int msg1_frequencystart;
|
|
||||||
int mu;
|
|
||||||
int prach_sequence_length;
|
|
||||||
int restricted_set;
|
|
||||||
int numerology_index;
|
|
||||||
int nb_rx;
|
|
||||||
c16_t ***rxsigF;
|
|
||||||
c16_t (*Xu)[839];
|
|
||||||
time_stats_t *rx_prach;
|
|
||||||
} prach_item_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
/// prach commands
|
|
||||||
prach_item_t list[NUMBER_OF_NR_PRACH_MAX];
|
|
||||||
/// mutex for prach_list access
|
|
||||||
pthread_mutex_t prach_list_mutex;
|
|
||||||
} prach_list_t;
|
|
||||||
void init_prach_list(prach_list_t *);
|
|
||||||
|
|
||||||
static inline void init_abort(decode_abort_t *ab)
|
static inline void init_abort(decode_abort_t *ab)
|
||||||
{
|
{
|
||||||
int ret = pthread_mutex_init(&ab->mutex_failure, NULL);
|
int ret = pthread_mutex_init(&ab->mutex_failure, NULL);
|
||||||
|
|||||||
@@ -133,6 +133,34 @@ typedef struct {
|
|||||||
int resource_type;
|
int resource_type;
|
||||||
} nr_srs_info_t;
|
} nr_srs_info_t;
|
||||||
|
|
||||||
|
#define NUMBER_OF_NR_PRACH_MAX 8
|
||||||
|
typedef struct {
|
||||||
|
int frame;
|
||||||
|
int slot;
|
||||||
|
int num_slots; // prach duration in slots
|
||||||
|
int beams[NFAPI_MAX_NUM_BG_IF];
|
||||||
|
nfapi_nr_prach_pdu_t pdu;
|
||||||
|
int rootSequenceIndex;
|
||||||
|
int numrootSequenceIndex;
|
||||||
|
int msg1_frequencystart;
|
||||||
|
int mu;
|
||||||
|
int prach_sequence_length;
|
||||||
|
int restricted_set;
|
||||||
|
int numerology_index;
|
||||||
|
int nb_rx;
|
||||||
|
c16_t rxsigF[NUMBER_OF_NR_RU_PRACH_OCCASIONS_MAX][NB_ANTENNAS_RX][NR_PRACH_SEQ_LEN_L];
|
||||||
|
c16_t (*Xu)[839];
|
||||||
|
time_stats_t *rx_prach;
|
||||||
|
} prach_item_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/// prach commands
|
||||||
|
prach_item_t list[NUMBER_OF_NR_PRACH_MAX];
|
||||||
|
/// mutex for prach_list access
|
||||||
|
pthread_mutex_t prach_list_mutex;
|
||||||
|
} prach_list_t;
|
||||||
|
void init_prach_list(prach_list_t *);
|
||||||
|
|
||||||
typedef struct NR_DL_FRAME_PARMS NR_DL_FRAME_PARMS;
|
typedef struct NR_DL_FRAME_PARMS NR_DL_FRAME_PARMS;
|
||||||
|
|
||||||
typedef uint32_t (*get_samples_per_slot_t)(int slot, const NR_DL_FRAME_PARMS *fp);
|
typedef uint32_t (*get_samples_per_slot_t)(int slot, const NR_DL_FRAME_PARMS *fp);
|
||||||
|
|||||||
@@ -718,15 +718,6 @@ int main(int argc, char **argv){
|
|||||||
if (n_frames == 1)
|
if (n_frames == 1)
|
||||||
printf("slot %d, rx_prach_start %d\n", slot, rx_prach_start);
|
printf("slot %d, rx_prach_start %d\n", slot, rx_prach_start);
|
||||||
|
|
||||||
c16_t **rxsigF[NUMBER_OF_NR_RU_PRACH_OCCASIONS_MAX];
|
|
||||||
for (int j = 0; j < NUMBER_OF_NR_RU_PRACH_OCCASIONS_MAX; j++) {
|
|
||||||
rxsigF[j] = malloc(ru->nb_rx * sizeof(*rxsigF));
|
|
||||||
for (int i = 0; i < ru->nb_rx; i++) {
|
|
||||||
// largest size for PRACH FFT is 4x98304 (16*24576)
|
|
||||||
rxsigF[j][i] = malloc16_clear(4 * 98304 * sizeof(**rxsigF));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (SNR = snr0; SNR < snr1 && !stop; SNR += .1) {
|
for (SNR = snr0; SNR < snr1 && !stop; SNR += .1) {
|
||||||
for (ue_speed = ue_speed0; ue_speed < ue_speed1 && !stop; ue_speed += 10) {
|
for (ue_speed = ue_speed0; ue_speed < ue_speed1 && !stop; ue_speed += 10) {
|
||||||
delay_avg = 0.0;
|
delay_avg = 0.0;
|
||||||
@@ -792,7 +783,6 @@ int main(int argc, char **argv){
|
|||||||
.restricted_set = cfg->restricted_set_config.value,
|
.restricted_set = cfg->restricted_set_config.value,
|
||||||
.numerology_index = gNB->frame_parms.numerology_index,
|
.numerology_index = gNB->frame_parms.numerology_index,
|
||||||
.nb_rx = gNB->gNB_config.carrier_config.num_rx_ant.value,
|
.nb_rx = gNB->gNB_config.carrier_config.num_rx_ant.value,
|
||||||
.rxsigF = rxsigF,
|
|
||||||
.Xu = gNB->X_u,
|
.Xu = gNB->X_u,
|
||||||
.rx_prach = &gNB->rx_prach};
|
.rx_prach = &gNB->rx_prach};
|
||||||
rx_nr_prach_ru(&in, ru->common.rxdata, ru->nr_frame_parms, ru->N_TA_offset);
|
rx_nr_prach_ru(&in, ru->common.rxdata, ru->nr_frame_parms, ru->N_TA_offset);
|
||||||
@@ -824,7 +814,7 @@ int main(int argc, char **argv){
|
|||||||
LOG_M("rxsig0.m","rxs0", &ru->common.rxdata[0][subframe*frame_parms->samples_per_subframe], frame_parms->samples_per_subframe, 1, 1);
|
LOG_M("rxsig0.m","rxs0", &ru->common.rxdata[0][subframe*frame_parms->samples_per_subframe], frame_parms->samples_per_subframe, 1, 1);
|
||||||
LOG_M("ru_rxsig0.m","rxs0", &ru->common.rxdata[0][subframe*frame_parms->samples_per_subframe], frame_parms->samples_per_subframe, 1, 1);
|
LOG_M("ru_rxsig0.m","rxs0", &ru->common.rxdata[0][subframe*frame_parms->samples_per_subframe], frame_parms->samples_per_subframe, 1, 1);
|
||||||
LOG_M("ru_rxsigF0.m","rxsF0", ru->common.rxdataF[0], frame_parms->ofdm_symbol_size*frame_parms->symbols_per_slot, 1, 1);
|
LOG_M("ru_rxsigF0.m","rxsF0", ru->common.rxdataF[0], frame_parms->ofdm_symbol_size*frame_parms->symbols_per_slot, 1, 1);
|
||||||
LOG_M("ru_prach_rxsigF0.m", "rxsF0", rxsigF[0][0], N_ZC, 1, 1);
|
LOG_M("ru_prach_rxsigF0.m", "rxsF0", in.rxsigF[0][0], N_ZC, 1, 1);
|
||||||
LOG_M("prach_preamble.m","prachp", &gNB->X_u[0], N_ZC, 1, 1);
|
LOG_M("prach_preamble.m","prachp", &gNB->X_u[0], N_ZC, 1, 1);
|
||||||
LOG_M("ue_prach_preamble.m","prachp", &UE->X_u[0], N_ZC, 1, 1);
|
LOG_M("ue_prach_preamble.m","prachp", &UE->X_u[0], N_ZC, 1, 1);
|
||||||
#endif
|
#endif
|
||||||
@@ -844,14 +834,7 @@ int main(int argc, char **argv){
|
|||||||
}
|
}
|
||||||
if (input_fd)
|
if (input_fd)
|
||||||
break;
|
break;
|
||||||
} //SNR loop
|
} // SNR loop
|
||||||
for (int j = 0; j < NUMBER_OF_NR_RU_PRACH_OCCASIONS_MAX; j++) {
|
|
||||||
for (int i = 0; i < ru->nb_rx; i++) {
|
|
||||||
// largest size for PRACH FFT is 4x98304 (16*24576)
|
|
||||||
free(rxsigF[j][i]);
|
|
||||||
}
|
|
||||||
free(rxsigF[j]);
|
|
||||||
}
|
|
||||||
free_channel_desc_scm(UE2gNB);
|
free_channel_desc_scm(UE2gNB);
|
||||||
|
|
||||||
nr_phy_free_RU(ru);
|
nr_phy_free_RU(ru);
|
||||||
|
|||||||
@@ -184,12 +184,17 @@ static int read_prach_data(ru_info_t *ru, int frame, int slot)
|
|||||||
int nb_rx_per_ru = ru->nb_rx / fh_init->xran_ports;
|
int nb_rx_per_ru = ru->nb_rx / fh_init->xran_ports;
|
||||||
/* If it is PRACH slot, copy prach IQ from XRAN PRACH buffer to OAI PRACH buffer */
|
/* If it is PRACH slot, copy prach IQ from XRAN PRACH buffer to OAI PRACH buffer */
|
||||||
if (is_prach_slot) {
|
if (is_prach_slot) {
|
||||||
|
if (!ru->prach_buf) {
|
||||||
|
LOG_W(HW, "we get rach data from ru, but it is not scheduled %d.%d\n", frame, slot);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
for (sym_idx = 0; sym_idx < prach_sym; sym_idx++) {
|
for (sym_idx = 0; sym_idx < prach_sym; sym_idx++) {
|
||||||
for (int aa = 0; aa < ru->nb_rx; aa++) {
|
for (int aa = 0; aa < ru->nb_rx; aa++) {
|
||||||
int16_t *dst, *src;
|
int16_t *dst, *src;
|
||||||
int idx = 0;
|
int idx = 0;
|
||||||
oran_buf_list_t *bufs = get_xran_buffers(aa / nb_rx_per_ru);
|
oran_buf_list_t *bufs = get_xran_buffers(aa / nb_rx_per_ru);
|
||||||
dst = ru->prach_buf[aa]; // + (sym_idx*576));
|
// hardcoded to use only first prach occasion
|
||||||
|
dst = (int16_t *)ru->prach_buf[0][aa];
|
||||||
src = (int16_t *)bufs->prachdstdecomp[aa % nb_rx_per_ru][tti % XRAN_N_FE_BUF_LEN].pBuffers[sym_idx].pData;
|
src = (int16_t *)bufs->prachdstdecomp[aa % nb_rx_per_ru][tti % XRAN_N_FE_BUF_LEN].pBuffers[sym_idx].pData;
|
||||||
/* convert Network order to host order */
|
/* convert Network order to host order */
|
||||||
if (ru_conf->compMeth_PRACH == XRAN_COMPMETHOD_NONE) {
|
if (ru_conf->compMeth_PRACH == XRAN_COMPMETHOD_NONE) {
|
||||||
|
|||||||
+17
-13
@@ -31,6 +31,7 @@
|
|||||||
#include "common/utils/LOG/log.h"
|
#include "common/utils/LOG/log.h"
|
||||||
#include "common/utils/LOG/vcd_signal_dumper.h"
|
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||||
#include "openair1/PHY/defs_gNB.h"
|
#include "openair1/PHY/defs_gNB.h"
|
||||||
|
#include "openair1/PHY/NR_TRANSPORT/nr_transport_proto.h"
|
||||||
#include "oaioran.h"
|
#include "oaioran.h"
|
||||||
#include "oran-config.h"
|
#include "oran-config.h"
|
||||||
|
|
||||||
@@ -212,13 +213,15 @@ int trx_oran_ctlrecv(openair0_device *device, void *msg, ssize_t msg_len)
|
|||||||
|
|
||||||
void oran_fh_if4p5_south_in(RU_t *ru, int *frame, int *slot)
|
void oran_fh_if4p5_south_in(RU_t *ru, int *frame, int *slot)
|
||||||
{
|
{
|
||||||
ru_info_t ru_info;
|
prach_item_t *prach_id = find_nr_prach(&ru->gNB_list[0]->prach_list, *frame, *slot, SEARCH_EXIST);
|
||||||
ru_info.nb_rx = ru->nb_rx * ru->num_beams_period;
|
ru_info_t ru_info = {
|
||||||
ru_info.nb_tx = ru->nb_tx * ru->num_beams_period;
|
.nb_rx = ru->nb_rx * ru->num_beams_period,
|
||||||
ru_info.rxdataF = ru->common.rxdataF;
|
.nb_tx = ru->nb_tx * ru->num_beams_period,
|
||||||
ru_info.beam_id = ru->common.beam_id;
|
.rxdataF = ru->common.rxdataF,
|
||||||
ru_info.num_beams_period = ru->num_beams_period;
|
.beam_id = ru->common.beam_id,
|
||||||
ru_info.prach_buf = ru->prach_rxsigF[0]; // index: [prach_oca][ant_id]
|
.num_beams_period = ru->num_beams_period,
|
||||||
|
.prach_buf = prach_id ? prach_id->rxsigF : NULL,
|
||||||
|
};
|
||||||
|
|
||||||
RU_proc_t *proc = &ru->proc;
|
RU_proc_t *proc = &ru->proc;
|
||||||
int f, sl;
|
int f, sl;
|
||||||
@@ -269,12 +272,13 @@ void oran_fh_if4p5_south_in(RU_t *ru, int *frame, int *slot)
|
|||||||
void oran_fh_if4p5_south_out(RU_t *ru, int frame, int slot, uint64_t timestamp)
|
void oran_fh_if4p5_south_out(RU_t *ru, int frame, int slot, uint64_t timestamp)
|
||||||
{
|
{
|
||||||
start_meas(&ru->tx_fhaul);
|
start_meas(&ru->tx_fhaul);
|
||||||
ru_info_t ru_info;
|
ru_info_t ru_info = {
|
||||||
ru_info.nb_rx = ru->nb_rx * ru->num_beams_period;
|
.nb_rx = ru->nb_rx * ru->num_beams_period,
|
||||||
ru_info.nb_tx = ru->nb_tx * ru->num_beams_period;
|
.nb_tx = ru->nb_tx * ru->num_beams_period,
|
||||||
ru_info.txdataF_BF = ru->common.txdataF_BF;
|
.txdataF_BF = ru->common.txdataF_BF,
|
||||||
ru_info.beam_id = ru->common.beam_id;
|
.beam_id = ru->common.beam_id,
|
||||||
ru_info.num_beams_period = ru->num_beams_period;
|
.num_beams_period = ru->num_beams_period,
|
||||||
|
};
|
||||||
|
|
||||||
// printf("south_out:\tframe=%d\tslot=%d\ttimestamp=%ld\n",frame,slot,timestamp);
|
// printf("south_out:\tframe=%d\tslot=%d\ttimestamp=%ld\n",frame,slot,timestamp);
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,8 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "xran_fh_o_du.h"
|
#include "xran_fh_o_du.h"
|
||||||
|
#include "openair1/PHY/impl_defs_nr.h"
|
||||||
|
#include "openair1/PHY/TOOLS/tools_defs.h"
|
||||||
/*
|
/*
|
||||||
* Structure added to bear the information needed from OAI RU
|
* Structure added to bear the information needed from OAI RU
|
||||||
*/
|
*/
|
||||||
@@ -50,7 +51,7 @@ typedef struct ru_info_s {
|
|||||||
int num_beams_period;
|
int num_beams_period;
|
||||||
|
|
||||||
// Needed for Prach
|
// Needed for Prach
|
||||||
int16_t **prach_buf;
|
c16_t (*prach_buf)[NB_ANTENNAS_RX][NR_PRACH_SEQ_LEN_L];
|
||||||
} ru_info_t;
|
} ru_info_t;
|
||||||
|
|
||||||
/** @brief Reads RX data (PRACH/PUSCH) of next slot.
|
/** @brief Reads RX data (PRACH/PUSCH) of next slot.
|
||||||
|
|||||||
Reference in New Issue
Block a user