Compare commits

...

8 Commits

Author SHA1 Message Date
Raymond Knopp
d20cd64159 patches for FR2 2024-02-29 20:09:14 +01:00
Raymond Knopp
1354d9ad68 Merge remote-tracking branch 'origin/develop' into fr2_testing 2024-03-01 22:33:50 +01:00
Raymond Knopp
0533d34c0e Merge remote-tracking branch 'origin/develop' into fr2_testing 2024-02-14 14:41:50 +01:00
Raymond Knopp
39c555e937 changes in radio/fhi_72 for FR2 support. Mostly related to frame
parameters and numerologies which were hard-coded for 100 MHz FR1 30kHz
2024-01-28 18:04:45 +01:00
Raymond Knopp
796061903e Merge remote-tracking branch 'origin/fix_computing_ssb_subcarrier_offset' into fr2_testing 2024-01-26 19:10:48 +01:00
Raymond Knopp
c5909cf64c this limits PUCCH payload to 11 bits, 7 CSI + 3 ACKNACK + 1 SR maximum. 2024-01-24 22:06:12 +01:00
francescomani
89769ad94e adding assertion for cset0 start prb 2024-01-22 16:35:11 +01:00
francescomani
02cdc17989 fix for computing ssb subcarrier offset 2024-01-22 16:35:11 +01:00
10 changed files with 85 additions and 13 deletions

View File

@@ -83,6 +83,12 @@ typedef enum {
nr_FR2
} nr_frequency_range_e;
typedef struct {
int subcarrier_offset;
uint32_t absolute_diff;
int scaling;
} nr_sco_info_t;
typedef struct nr_bandentry_s {
int16_t band;
uint64_t ul_min;

View File

@@ -228,7 +228,8 @@ int nr_generate_pbch(nfapi_nr_dl_tti_ssb_pdu *ssb_pdu,
uint8_t n_hf,
int sfn,
nfapi_nr_config_request_scf_t *config,
NR_DL_FRAME_PARMS *frame_parms) {
NR_DL_FRAME_PARMS *frame_parms)
{
int k,l,m;
//int16_t a;
int16_t mod_pbch_e[NR_POLAR_PBCH_E];

View File

@@ -72,11 +72,29 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_
// setting the first subcarrier
const int scs = cfg->ssb_config.scs_common.value;
const int prb_offset = (fp->freq_range == nr_FR1) ? ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA>>scs : ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA>>(scs-2);
const int sc_offset = (fp->freq_range == nr_FR1) ? ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset >> scs
: ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset >> (scs - 2);
// const int prb_offset = (fp->freq_range == nr_FR1) ? ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA>>scs : ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA>>(scs-2);
//const int sc_offset = (fp->freq_range == nr_FR1) ? ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset >> scs
// : ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset >> (scs - 2);
const int prb_offset = (fp->freq_range == nr_FR1) ? ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA >> scs
: ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA >> (scs - 2);
const int sc_offset =
(fp->freq_range == nr_FR1) ? ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset >> scs : ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset;
fp->ssb_start_subcarrier = (12 * prb_offset + sc_offset);
LOG_D(PHY, "SSB first subcarrier %d (%d,%d)\n", fp->ssb_start_subcarrier, prb_offset, sc_offset);
// LOG_D(PHY, "SSB first subcarrier %d (%d,%d)\n", fp->ssb_start_subcarrier, prb_offset, sc_offset);
LOG_D(PHY,
"ssbOffsetPointA %d SSB SsbSubcarrierOffset %d prb_offset %d sc_offset %d scs %d ssb_start_subcarrier %d\n",
ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA,
ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset,
prb_offset,
sc_offset,
scs,
fp->ssb_start_subcarrier);
LOG_D(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol);
nr_generate_pss(&txdataF[0][txdataF_offset], gNB->TX_AMP, ssb_start_symbol, cfg, fp);

View File

@@ -545,6 +545,7 @@ void nr_initiate_ra_proc(module_id_t module_idP,
uint8_t symbol,
int16_t timing_offset)
{
timing_offset = 4;
gNB_MAC_INST *nr_mac = RC.nrmac[module_idP];
NR_SCHED_LOCK(&nr_mac->sched_lock);
@@ -1670,10 +1671,25 @@ static void nr_generate_Msg4(module_id_t module_idP,
NR_COMMON_channels_t *cc = &nr_mac->common_channels[CC_id];
NR_UE_DL_BWP_t *dl_bwp = &ra->DL_BWP;
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
const NR_TDD_UL_DL_Pattern_t *tdd = scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL;
// lenght of tdd period in slots
const int n_slots_frame = nr_slots_per_frame[dl_bwp->scs];
int tdd_period_slot =n_slots_frame;
if (tdd) {
tdd_period_slot = n_slots_frame/get_nb_periods_per_frame(tdd->dl_UL_TransmissionPeriodicity);
}
else{
if(cc->frame_type == TDD)
AssertFatal(cc->frame_type == FDD, "Dynamic TDD not handled yet\n");
}
// FR2 schedule Msg4 in slot 2 of TDD period
if (dl_bwp->scs >= 3 &&(!(slotP%tdd_period_slot == 4 || slotP%tdd_period_slot == 4 || slotP%tdd_period_slot == 2))) return;
LOG_I(NR_MAC, "frame %d and slot %d\n", frameP, slotP );
// if it is a DL slot, if the RA is in MSG4 state
if (is_xlsch_in_slot(nr_mac->dlsch_slot_bitmap[slotP / 64], slotP)) {
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
NR_SearchSpace_t *ss = ra->ra_ss;
NR_ControlResourceSet_t *coreset = ra->coreset;
@@ -1912,7 +1928,7 @@ static void nr_generate_Msg4(module_id_t module_idP,
}
ra->state = WAIT_Msg4_ACK;
LOG_I(NR_MAC,"UE %04x Generate msg4: feedback at %4d.%2d, payload %d bytes, next state WAIT_Msg4_ACK\n", ra->rnti, pucch->frame, pucch->ul_slot, harq->tb_size);
LOG_I(NR_MAC,"UE %04x Generate msg4 in %d.%d: feedback at %4d.%2d, payload %d bytes, next state WAIT_Msg4_ACK\n", ra->rnti, frameP, slotP, pucch->frame, pucch->ul_slot, harq->tb_size);
}
}

View File

@@ -88,6 +88,7 @@ static void schedule_ssb(frame_t frame,
dl_config_pdu->ssb_pdu.ssb_pdu_rel15.precoding_and_beamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = beam_index;
dl_req->nPDUs++;
LOG_D(MAC," Scheduling SSB %d with offsetPointA %d and Kssb %d\n", i_ssb, offset_pointa, scoffset);
LOG_D(MAC,"Scheduling ssb %d at frame %d and slot %d\n",i_ssb,frame,slot);
}

View File

@@ -926,6 +926,11 @@ void nr_schedule_ue_spec(module_id_t module_id,
AssertFatal(pthread_mutex_trylock(&gNB_mac->sched_lock) == EBUSY,
"this function should be called with the scheduler mutex locked\n");
// if (!((slot > 0 && slot <= 10)||(slot >= 20 && slot <= 30)||(slot >= 40 && slot <= 50)))
// return;
if (!is_xlsch_in_slot(gNB_mac->dlsch_slot_bitmap[slot / 64], slot))
return;

View File

@@ -2069,6 +2069,10 @@ nr_pp_impl_ul nr_init_fr1_ulsch_preprocessor(int CC_id)
void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot, nfapi_nr_ul_dci_request_t *ul_dci_req)
{
gNB_MAC_INST *nr_mac = RC.nrmac[module_id];
// if (!(((slot/10)%2==0 && slot%10==3)||((slot/10)%2==0 && slot%10==4)||((slot/10)%2==0 && slot%10==5)))
// return;
/* already mutex protected: held in gNB_dlsch_ulsch_scheduler() */
NR_SCHED_ENSURE_LOCKED(&nr_mac->sched_lock);

View File

@@ -199,19 +199,36 @@ static int get_ssb_arfcn(const f1ap_served_cell_info_t *cell_info, const NR_MIB_
int band = get_dl_band(cell_info);
// FR1 includes frequency bands from 410 MHz (ARFCN 82000) to 7125 MHz (ARFCN 875000)
// FR2 includes frequency bands from 24.25 GHz (ARFCN 2016667) to 71.0 GHz (ARFCN 2795832)
uint64_t scaling = 0;
uint64_t freqpointa = from_nrarfcn(band, scs, dl_arfcn);
uint64_t freqssb = 0;
// 3GPP TS 38.211 sections 7.4.3.1 and 4.4.4.2
// for FR1 offsetToPointA and k_SSB are expressed in terms of 15 kHz SCS
// for FR2 offsetToPointA is expressed in terms of 60 kHz SCS and k_SSB expressed in terms of the subcarrier spacing provided
// by the higher-layer parameter subCarrierSpacingCommon
// FR1 includes frequency bands from 410 MHz (ARFCN 82000) to 7125 MHz (ARFCN 875000)
// FR2 includes frequency bands from 24.25 GHz (ARFCN 2016667) to 71.0 GHz (ARFCN 2795832)
// uint64_t scaling = 0;
if (dl_arfcn >= 82000 && dl_arfcn < 875000)
scaling = 1;
// scaling = 1;
freqssb = freqpointa + 15000 * (offsetToPointA * 12 + kssb + 1) + 10ll * 12 * (1 << scs) * 15000;
else if (dl_arfcn >= 2016667 && dl_arfcn < 2795832)
scaling = 4;
// scaling = 4;
freqssb = freqpointa + 60000 * offsetToPointA * 12 + (1 << scs) * 15000 * (kssb + 10ll * 12);
else
AssertFatal(false, "Invalid absoluteFrequencyPointA: %d\n", dl_arfcn);
uint64_t freqpointa = from_nrarfcn(band, scs, dl_arfcn);
// uint64_t freqpointa = from_nrarfcn(band, scs, dl_arfcn);
// offsetToPointA and kSSB are both on 15kHz SCS for FR1 and 60kHz SCS for FR2 (see 38.211 sections 7.4.3.1 and 4.4.4.2)
// SSB uses the SCS of the cell and is 20 RBs wide, so use 10
uint64_t freqssb = freqpointa + scaling * 15000 * (offsetToPointA * 12 + kssb) + 10ll * 12 * (1 << scs) * 15000;
//uint64_t freqssb = freqpointa + scaling * 15000 * (offsetToPointA * 12 + kssb) + 10ll * 12 * (1 << scs) * 15000;
int bw_index = get_supported_band_index(scs, band, get_dl_bw(cell_info));
int band_size_hz = get_supported_bw_mhz(band > 256 ? FR2 : FR1, bw_index) * 1000 * 1000;
uint32_t ssb_arfcn = to_nrarfcn(band, freqssb, scs, band_size_hz);
@@ -1065,7 +1082,8 @@ static void rrc_handle_RRCSetupRequest(gNB_RRC_INST *rrc, sctp_assoc_t assoc_id,
*/
if ((ue_context_p = rrc_gNB_ue_context_random_exist(rrc, random_value))) {
LOG_W(NR_RRC, "new UE rnti (coming with random value) is already there, removing UE %x from MAC/PHY\n", msg->crnti);
AssertFatal(false, "not implemented\n");
//AssertFatal(false, "not implemented\n");
return;
}
ue_context_p = rrc_gNB_create_ue_context(assoc_id, msg->crnti, rrc, random_value, msg->gNB_DU_ue_id);

View File

@@ -91,6 +91,7 @@ void oai_xran_fh_rx_callback(void *pCallbackTag, xran_status_t status)
tti = xran_get_slot_idx_from_tti(rx_tti, &frame, &subframe, &slot, &second);
rx_sym = callback_tag->symbol;
uint32_t ru_id = callback_tag->oXuId;
if (rx_sym == 7) {
if (first_call_set) {

View File

@@ -670,6 +670,8 @@ static enum xran_cp_filterindex get_prach_filterindex_fr1(duplex_mode_t mode, in
return XRAN_FILTERINDEX_STANDARD;
}
// PRACH guard interval. Raymond: "[it] is not in the configuration, (i.e. it
// is deterministic depending on others). LiteON must hard-code this in the
// O-RU itself, benetel doesn't (as O-RAN specifies). So we will need to tell