bug fix for buffer setting in dlsch and wakeup_rxtx
This commit is contained in:
+11
-1
@@ -527,6 +527,8 @@ int wakeup_rxtx(PHY_VARS_gNB *gNB,RU_t *ru) {
|
|||||||
RU_proc_t *ru_proc=&ru->proc;
|
RU_proc_t *ru_proc=&ru->proc;
|
||||||
int ret;
|
int ret;
|
||||||
int i;
|
int i;
|
||||||
|
struct timespec abstime;
|
||||||
|
int time_ns = 10000;
|
||||||
|
|
||||||
AssertFatal((ret=pthread_mutex_lock(&proc->mutex_RU))==0,"mutex_lock returns %d\n",ret);
|
AssertFatal((ret=pthread_mutex_lock(&proc->mutex_RU))==0,"mutex_lock returns %d\n",ret);
|
||||||
for (i=0;i<gNB->num_RU;i++) {
|
for (i=0;i<gNB->num_RU;i++) {
|
||||||
@@ -547,14 +549,22 @@ int wakeup_rxtx(PHY_VARS_gNB *gNB,RU_t *ru) {
|
|||||||
AssertFatal((ret=pthread_mutex_unlock(&proc->mutex_RU))==0,"muex_unlock returns %d\n",ret);
|
AssertFatal((ret=pthread_mutex_unlock(&proc->mutex_RU))==0,"muex_unlock returns %d\n",ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clock_gettime(CLOCK_REALTIME, &abstime);
|
||||||
|
abstime.tv_nsec = abstime.tv_nsec + time_ns;
|
||||||
|
|
||||||
|
if (abstime.tv_nsec >= 1000*1000*1000) {
|
||||||
|
abstime.tv_nsec -= 1000*1000*1000;
|
||||||
|
abstime.tv_sec += 1;
|
||||||
|
}
|
||||||
|
|
||||||
// wake up TX for subframe n+sl_ahead
|
// wake up TX for subframe n+sl_ahead
|
||||||
// lock the TX mutex and make sure the thread is ready
|
// lock the TX mutex and make sure the thread is ready
|
||||||
AssertFatal((ret=pthread_mutex_lock(&L1_proc->mutex)) == 0,"mutex_lock returns %d\n", ret);
|
AssertFatal((ret=pthread_mutex_timedlock(&L1_proc->mutex, &abstime)) == 0,"mutex_lock returns %d\n", ret);
|
||||||
|
|
||||||
if (L1_proc->instance_cnt == 0) { // L1_thread is busy so abort the subframe
|
if (L1_proc->instance_cnt == 0) { // L1_thread is busy so abort the subframe
|
||||||
AssertFatal((ret=pthread_mutex_unlock( &L1_proc->mutex))==0,"muex_unlock return %d\n",ret);
|
AssertFatal((ret=pthread_mutex_unlock( &L1_proc->mutex))==0,"muex_unlock return %d\n",ret);
|
||||||
LOG_W(PHY,"L1_thread isn't ready in %d.%d, aborting RX processing\n",ru_proc->frame_rx,ru_proc->tti_rx);
|
LOG_W(PHY,"L1_thread isn't ready in %d.%d, aborting RX processing\n",ru_proc->frame_rx,ru_proc->tti_rx);
|
||||||
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
++L1_proc->instance_cnt;
|
++L1_proc->instance_cnt;
|
||||||
|
|||||||
@@ -220,17 +220,18 @@ ap, Wt[0], Wt[1], Wf[0], Wf[1], delta, l_prime[0], l0, dmrs_symbol);
|
|||||||
#endif
|
#endif
|
||||||
uint8_t k_prime=0;
|
uint8_t k_prime=0;
|
||||||
uint16_t m=0, n=0, dmrs_idx=0, k=0;
|
uint16_t m=0, n=0, dmrs_idx=0, k=0;
|
||||||
|
int txdataF_offset = (slot%2)*frame_parms->samples_per_slot_wCP;
|
||||||
|
|
||||||
for (int l=rel15->start_symbol; l<rel15->start_symbol+rel15->nb_symbols; l++) {
|
for (int l=rel15->start_symbol; l<rel15->start_symbol+rel15->nb_symbols; l++) {
|
||||||
k = start_sc;
|
k = start_sc;
|
||||||
for (int i=0; i<rel15->n_prb*NR_NB_SC_PER_RB; i++) {
|
for (int i=0; i<rel15->n_prb*NR_NB_SC_PER_RB; i++) {
|
||||||
if ((l == dmrs_symbol) && (k == ((start_sc+get_dmrs_freq_idx(n, k_prime, delta, dmrs_type))%(frame_parms->ofdm_symbol_size)))) {
|
if ((l == dmrs_symbol) && (k == ((start_sc+get_dmrs_freq_idx(n, k_prime, delta, dmrs_type))%(frame_parms->ofdm_symbol_size)))) {
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + ((slot%2)*frame_parms->samples_per_slot_wCP)] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[dmrs_idx<<1]) >> 15;
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[dmrs_idx<<1]) >> 15;
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + ((slot%2)*frame_parms->samples_per_slot_wCP)] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15;
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15;
|
||||||
#ifdef DEBUG_DLSCH_MAPPING
|
#ifdef DEBUG_DLSCH_MAPPING
|
||||||
printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n",
|
printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n",
|
||||||
dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + ((slot%2)*frame_parms->samples_per_slot_wCP)],
|
dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + ((slot%2)*frame_parms->samples_per_slot_wCP)]);
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
|
||||||
#endif
|
#endif
|
||||||
dmrs_idx++;
|
dmrs_idx++;
|
||||||
k_prime++;
|
k_prime++;
|
||||||
@@ -240,12 +241,12 @@ dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol
|
|||||||
|
|
||||||
else {
|
else {
|
||||||
|
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + ((slot%2)*frame_parms->samples_per_slot_wCP)] = (amp * tx_layers[ap][m<<1]) >> 15;
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (amp * tx_layers[ap][m<<1]) >> 15;
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + ((slot%2)*frame_parms->samples_per_slot_wCP)] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15;
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15;
|
||||||
#ifdef DEBUG_DLSCH_MAPPING
|
#ifdef DEBUG_DLSCH_MAPPING
|
||||||
printf("m %d\t l %d \t k %d \t txdataF: %d %d\n",
|
printf("m %d\t l %d \t k %d \t txdataF: %d %d\n",
|
||||||
m, l, k, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + ((slot%2)*frame_parms->samples_per_slot_wCP)],
|
m, l, k, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + ((slot%2)*frame_parms->samples_per_slot_wCP)]);
|
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
|
||||||
#endif
|
#endif
|
||||||
m++;
|
m++;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,6 +96,7 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int slot) {
|
|||||||
uint8_t *pbch_pdu=&gNB->pbch_pdu[0];
|
uint8_t *pbch_pdu=&gNB->pbch_pdu[0];
|
||||||
uint8_t ssb_index, n_hf;
|
uint8_t ssb_index, n_hf;
|
||||||
int ssb_start_symbol, rel_slot;
|
int ssb_start_symbol, rel_slot;
|
||||||
|
int txdataF_offset = (slot%2)*fp->samples_per_slot_wCP;
|
||||||
|
|
||||||
n_hf = cfg->sch_config.half_frame_index.value;
|
n_hf = cfg->sch_config.half_frame_index.value;
|
||||||
|
|
||||||
@@ -125,18 +126,18 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int slot) {
|
|||||||
|
|
||||||
// it is supposed that each logical antenna port correspont to a different beam so each SSB is stored into its own index of txdataF
|
// it is supposed that each logical antenna port correspont to a different beam so each SSB is stored into its own index of txdataF
|
||||||
LOG_D(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol);
|
LOG_D(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol);
|
||||||
nr_generate_pss(gNB->d_pss, &txdataF[ssb_index][((slot%2)*fp->samples_per_slot_wCP)], AMP, ssb_start_symbol, cfg, fp);
|
nr_generate_pss(gNB->d_pss, &txdataF[ssb_index][txdataF_offset], AMP, ssb_start_symbol, cfg, fp);
|
||||||
nr_generate_sss(gNB->d_sss, &txdataF[ssb_index][((slot%2)*fp->samples_per_slot_wCP)], AMP, ssb_start_symbol, cfg, fp);
|
nr_generate_sss(gNB->d_sss, &txdataF[ssb_index][txdataF_offset], AMP, ssb_start_symbol, cfg, fp);
|
||||||
|
|
||||||
if (fp->Lmax == 4)
|
if (fp->Lmax == 4)
|
||||||
nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[n_hf][ssb_index],&txdataF[ssb_index][((slot%2)*fp->samples_per_slot_wCP)], AMP, ssb_start_symbol, cfg, fp);
|
nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[n_hf][ssb_index],&txdataF[ssb_index][txdataF_offset], AMP, ssb_start_symbol, cfg, fp);
|
||||||
else
|
else
|
||||||
nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[0][ssb_index],&txdataF[ssb_index][((slot%2)*fp->samples_per_slot_wCP)], AMP, ssb_start_symbol, cfg, fp);
|
nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[0][ssb_index],&txdataF[ssb_index][txdataF_offset], AMP, ssb_start_symbol, cfg, fp);
|
||||||
|
|
||||||
nr_generate_pbch(&gNB->pbch,
|
nr_generate_pbch(&gNB->pbch,
|
||||||
pbch_pdu,
|
pbch_pdu,
|
||||||
gNB->nr_pbch_interleaver,
|
gNB->nr_pbch_interleaver,
|
||||||
&txdataF[ssb_index][((slot%2)*fp->samples_per_slot_wCP)],
|
&txdataF[ssb_index][txdataF_offset],
|
||||||
AMP,
|
AMP,
|
||||||
ssb_start_symbol,
|
ssb_start_symbol,
|
||||||
n_hf,fp->Lmax,ssb_index,
|
n_hf,fp->Lmax,ssb_index,
|
||||||
@@ -155,6 +156,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
|
|||||||
nfapi_nr_config_request_t *cfg = &gNB->gNB_config;
|
nfapi_nr_config_request_t *cfg = &gNB->gNB_config;
|
||||||
int offset = gNB->CC_id;
|
int offset = gNB->CC_id;
|
||||||
uint8_t ssb_frame_periodicity; // every how many frames SSB are generated
|
uint8_t ssb_frame_periodicity; // every how many frames SSB are generated
|
||||||
|
int txdataF_offset = (slot%2)*fp->samples_per_slot_wCP;
|
||||||
|
|
||||||
if (cfg->sch_config.ssb_periodicity.value < 20)
|
if (cfg->sch_config.ssb_periodicity.value < 20)
|
||||||
ssb_frame_periodicity = 1;
|
ssb_frame_periodicity = 1;
|
||||||
@@ -169,7 +171,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
// clear the transmit data array for the current subframe
|
// clear the transmit data array for the current subframe
|
||||||
for (aa=0; aa<fp->Lmax; aa++) {
|
for (aa=0; aa<fp->Lmax; aa++) {
|
||||||
memset(&gNB->common_vars.txdataF[aa][((slot%2)*fp->samples_per_slot_wCP)],0,fp->samples_per_slot_wCP*sizeof(int32_t));
|
memset(&gNB->common_vars.txdataF[aa][txdataF_offset],0,fp->samples_per_slot_wCP*sizeof(int32_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_COMMON_TX,1);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_COMMON_TX,1);
|
||||||
@@ -190,7 +192,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
|
|||||||
if (nfapi_mode == 0 || nfapi_mode == 1) {
|
if (nfapi_mode == 0 || nfapi_mode == 1) {
|
||||||
nr_generate_dci_top(gNB->pdcch_vars,
|
nr_generate_dci_top(gNB->pdcch_vars,
|
||||||
gNB->nr_gold_pdcch_dmrs[slot],
|
gNB->nr_gold_pdcch_dmrs[slot],
|
||||||
&gNB->common_vars.txdataF[0][((slot%2)*fp->samples_per_slot_wCP)], // hardcoded to beam 0
|
&gNB->common_vars.txdataF[0][txdataF_offset], // hardcoded to beam 0
|
||||||
AMP, *fp, *cfg);
|
AMP, *fp, *cfg);
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,0);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,0);
|
||||||
if (num_pdsch_rnti) {
|
if (num_pdsch_rnti) {
|
||||||
|
|||||||
@@ -565,24 +565,26 @@ int main(int argc, char **argv)
|
|||||||
phy_procedures_gNB_TX(gNB,frame,slot,0);
|
phy_procedures_gNB_TX(gNB,frame,slot,0);
|
||||||
|
|
||||||
//nr_common_signal_procedures (gNB,frame,subframe);
|
//nr_common_signal_procedures (gNB,frame,subframe);
|
||||||
|
int txdataF_offset = (slot%2) * frame_parms->samples_per_slot_wCP;
|
||||||
|
|
||||||
LOG_M("txsigF0.m","txsF0", gNB->common_vars.txdataF[0],frame_length_complex_samples_no_prefix,1,1);
|
LOG_M("txsigF0.m","txsF0", gNB->common_vars.txdataF[0],frame_length_complex_samples_no_prefix,1,1);
|
||||||
if (gNB->frame_parms.nb_antennas_tx>1)
|
if (gNB->frame_parms.nb_antennas_tx>1)
|
||||||
LOG_M("txsigF1.m","txsF1", gNB->common_vars.txdataF[1],frame_length_complex_samples_no_prefix,1,1);
|
LOG_M("txsigF1.m","txsF1", gNB->common_vars.txdataF[1],frame_length_complex_samples_no_prefix,1,1);
|
||||||
|
|
||||||
int tx_offset = slot*frame_parms->samples_per_slot;
|
int tx_offset = slot*frame_parms->samples_per_slot;
|
||||||
|
printf("samples_per_slot_wCP = %d\n", frame_parms->samples_per_slot_wCP);
|
||||||
|
|
||||||
//TODO: loop over slots
|
//TODO: loop over slots
|
||||||
for (aa=0; aa<gNB->frame_parms.nb_antennas_tx; aa++) {
|
for (aa=0; aa<gNB->frame_parms.nb_antennas_tx; aa++) {
|
||||||
if (gNB_config->subframe_config.dl_cyclic_prefix_type.value == 1) {
|
if (gNB_config->subframe_config.dl_cyclic_prefix_type.value == 1) {
|
||||||
PHY_ofdm_mod(gNB->common_vars.txdataF[aa],
|
PHY_ofdm_mod(&gNB->common_vars.txdataF[aa][txdataF_offset],
|
||||||
&txdata[aa][tx_offset],
|
&txdata[aa][tx_offset],
|
||||||
frame_parms->ofdm_symbol_size,
|
frame_parms->ofdm_symbol_size,
|
||||||
12,
|
12,
|
||||||
frame_parms->nb_prefix_samples,
|
frame_parms->nb_prefix_samples,
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
} else {
|
} else {
|
||||||
nr_normal_prefix_mod(gNB->common_vars.txdataF[aa],
|
nr_normal_prefix_mod(&gNB->common_vars.txdataF[aa][txdataF_offset],
|
||||||
&txdata[aa][tx_offset],
|
&txdata[aa][tx_offset],
|
||||||
14,
|
14,
|
||||||
frame_parms);
|
frame_parms);
|
||||||
|
|||||||
Reference in New Issue
Block a user