Commit 2a227faf authored by Francesco Mani's avatar Francesco Mani

first version of reworking scheduling function, including UL scheduling

parent 9dc99603
...@@ -288,6 +288,26 @@ void copy_nr_ulreq(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) ...@@ -288,6 +288,26 @@ void copy_nr_ulreq(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
} }
*/ */
void nr_schedule_ulsch(int Mod_idP,
int UE_id,
frame_t frameP,
sub_frame_t slotP) {
nfapi_nr_ul_tti_request_t *UL_tti_req = &RC.nrmac[Mod_idP]->UL_tti_req[0];
NR_UE_list_t *UE_list = &RC.nrmac[Mod_idP]->UE_list;
NR_sched_pusch *pusch = UE_list->UE_sched_ctrl[UE_id].sched_pusch;
if ((pusch->active == true) && (frameP == pusch->frame) && (slotP == pusch->slot)) {
UL_tti_req->SFN = pusch->frame;
UL_tti_req->Slot = pusch->slot;
UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE;
UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_pusch_pdu_t);
UL_tti_req->pdus_list[UL_tti_req->n_pdus].pusch_pdu = pusch->pusch_pdu;
UL_tti_req->n_pdus+=1;
pusch->active = false;
}
}
void nr_schedule_pucch(int Mod_idP, void nr_schedule_pucch(int Mod_idP,
int UE_id, int UE_id,
frame_t frameP, frame_t frameP,
...@@ -378,6 +398,9 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, ...@@ -378,6 +398,9 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
nr_ulmix_slots++; nr_ulmix_slots++;
if (slot_txP== 0 && (UE_list->fiveG_connected[UE_id] || get_softmodem_params()->phy_test)) { if (slot_txP== 0 && (UE_list->fiveG_connected[UE_id] || get_softmodem_params()->phy_test)) {
memset((void *) &UE_list->UE_sched_ctrl[UE_id].sched_pusch,
0,
sizeof(NR_sched_pusch));
for (int k=0; k<nr_ulmix_slots; k++) { for (int k=0; k<nr_ulmix_slots; k++) {
memset((void *) &UE_list->UE_sched_ctrl[UE_id].sched_pucch[k], memset((void *) &UE_list->UE_sched_ctrl[UE_id].sched_pucch[k],
0, 0,
...@@ -413,71 +436,92 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, ...@@ -413,71 +436,92 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
*ulsch_in_slot_bitmap = 0x00; *ulsch_in_slot_bitmap = 0x00;
} }
// Check if there are downlink symbols in the slot,
if (is_nr_DL_slot(cc->ServingCellConfigCommon,slot_txP)) {
memset(RC.nrmac[module_idP]->cce_list[bwp_id][0],0,MAX_NUM_CCE*sizeof(int)); // coreset0
memset(RC.nrmac[module_idP]->cce_list[bwp_id][1],0,MAX_NUM_CCE*sizeof(int)); // coresetid 1
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
//mbsfn_status[CC_id] = 0;
// clear vrb_maps memset(RC.nrmac[module_idP]->cce_list[bwp_id][0],0,MAX_NUM_CCE*sizeof(int)); // coreset0
memset(cc[CC_id].vrb_map, 0, 100); memset(RC.nrmac[module_idP]->cce_list[bwp_id][1],0,MAX_NUM_CCE*sizeof(int)); // coresetid 1
memset(cc[CC_id].vrb_map_UL, 0, 100); for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
//mbsfn_status[CC_id] = 0;
clear_nr_nfapi_information(RC.nrmac[module_idP], CC_id, frame_txP, slot_txP); // clear vrb_maps
} memset(cc[CC_id].vrb_map, 0, 100);
memset(cc[CC_id].vrb_map_UL, 0, 100);
// refresh UE list based on UEs dropped by PHY in previous subframe clear_nr_nfapi_information(RC.nrmac[module_idP], CC_id, frame_txP, slot_txP);
/* }
for (i = 0; i < MAX_MOBILES_PER_GNB; i++) {
if (UE_list->active[i]) {
nfapi_nr_config_request_t *cfg = &RC.nrmac[module_idP]->config[CC_id]; // refresh UE list based on UEs dropped by PHY in previous subframe
/*
rnti = 0;//UE_RNTI(module_idP, i); for (i = 0; i < MAX_MOBILES_PER_GNB; i++) {
CC_id = 0;//UE_PCCID(module_idP, i); if (UE_list->active[i]) {
} //END if (UE_list->active[i]) nfapi_nr_config_request_t *cfg = &RC.nrmac[module_idP]->config[CC_id];
} //END for (i = 0; i < MAX_MOBILES_PER_GNB; i++)
*/ rnti = 0;//UE_RNTI(module_idP, i);
CC_id = 0;//UE_PCCID(module_idP, i);
// This schedules MIB } //END if (UE_list->active[i])
if((slot_txP == 0) && (frame_txP & 7) == 0){ } //END for (i = 0; i < MAX_MOBILES_PER_GNB; i++)
schedule_nr_mib(module_idP, frame_txP, slot_txP); */
}
if (get_softmodem_params()->phy_test == 0) // This schedules MIB
nr_schedule_RA(module_idP, frame_txP, slot_txP); if((slot_txP == 0) && (frame_txP & 7) == 0){
else schedule_nr_mib(module_idP, frame_txP, slot_txP);
UE_list->fiveG_connected[UE_id] = true; }
// Phytest scheduling // This schedule PRACH if we are not in phy_test mode
if (get_softmodem_params()->phy_test == 0)
schedule_nr_prach(module_idP, (frame_rxP+1)&1023, slot_rxP);
if (get_softmodem_params()->phy_test) { // This schedule SR
// TODO
// TbD once RACH is available, start ta_timer when UE is connected // This schedule CSI
if (ue_sched_ctl->ta_timer) // TODO
ue_sched_ctl->ta_timer--;
if (ue_sched_ctl->ta_timer == 0) { // This schedule RA procedure if not in phy_test mode
gNB->ta_command = ue_sched_ctl->ta_update; // Otherwise already consider 5G already connected
/* if time is up, then set the timer to not send it for 5 frames if (get_softmodem_params()->phy_test == 0) {
// regardless of the TA value */ nr_schedule_RA(module_idP, frame_txP, slot_txP);
ue_sched_ctl->ta_timer = 100; nr_schedule_reception_msg3(module_idP, 0, frame_rxP, slot_rxP);
/* reset ta_update */ }
ue_sched_ctl->ta_update = 31; else
/* MAC CE flag indicating TA length */ UE_list->fiveG_connected[UE_id] = true;
gNB->ta_len = 2;
} if (get_softmodem_params()->phy_test) {
// TbD once RACH is available, start ta_timer when UE is connected
if (ue_sched_ctl->ta_timer)
ue_sched_ctl->ta_timer--;
if (ue_sched_ctl->ta_timer == 0) {
gNB->ta_command = ue_sched_ctl->ta_update;
/* if time is up, then set the timer to not send it for 5 frames
// regardless of the TA value */
ue_sched_ctl->ta_timer = 100;
/* reset ta_update */
ue_sched_ctl->ta_update = 31;
/* MAC CE flag indicating TA length */
gNB->ta_len = 2;
} }
}
if (UE_list->fiveG_connected[UE_id] && (is_xlsch_in_slot(*dlsch_in_slot_bitmap,slot_txP%num_slots_per_tdd))) {
ue_sched_ctl->current_harq_pid = slot_txP % num_slots_per_tdd; // This schedules the DCI for Uplink and subsequently PUSCH
nr_update_pucch_scheduling(module_idP, UE_id, frame_txP, slot_txP, num_slots_per_tdd,&pucch_sched); if (UE_list->fiveG_connected[UE_id]) {
nr_schedule_uss_dlsch_phytest(module_idP, frame_txP, slot_txP, &UE_list->UE_sched_ctrl[UE_id].sched_pucch[pucch_sched], NULL); int tda = 1; // time domain assignment hardcoded for now
// resetting ta flag schedule_fapi_ul_pdu(module_idP, frame_txP, slot_txP, num_slots_per_tdd, tda);
gNB->ta_len = 0; nr_schedule_ulsch(module_idP, UE_id, frame_rxP, slot_rxP);
} }
if (UE_list->fiveG_connected[UE_id] && (is_xlsch_in_slot(*dlsch_in_slot_bitmap,slot_txP%num_slots_per_tdd))) {
ue_sched_ctl->current_harq_pid = slot_txP % num_slots_per_tdd;
nr_update_pucch_scheduling(module_idP, UE_id, frame_txP, slot_txP, num_slots_per_tdd,&pucch_sched);
nr_schedule_uss_dlsch_phytest(module_idP, frame_txP, slot_txP, &UE_list->UE_sched_ctrl[UE_id].sched_pucch[pucch_sched], NULL);
// resetting ta flag
gNB->ta_len = 0;
}
if (UE_list->fiveG_connected[UE_id])
nr_schedule_pucch(module_idP, UE_id, frame_rxP, slot_rxP);
/* /*
// Allocate CCEs for good after scheduling is done // Allocate CCEs for good after scheduling is done
...@@ -485,24 +529,6 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, ...@@ -485,24 +529,6 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
allocate_CCEs(module_idP, CC_id, subframeP, 0); allocate_CCEs(module_idP, CC_id, subframeP, 0);
*/ */
} //is_nr_DL_slot
if (is_nr_UL_slot(cc->ServingCellConfigCommon,slot_rxP)) {
if (get_softmodem_params()->phy_test == 0) {
if (UE_list->fiveG_connected[UE_id])
nr_schedule_pucch(module_idP, UE_id, frame_rxP, slot_rxP);
schedule_nr_prach(module_idP, (frame_rxP+1)&1023, slot_rxP);
nr_schedule_reception_msg3(module_idP, 0, frame_rxP, slot_rxP);
}
if (get_softmodem_params()->phy_test){
nr_schedule_pucch(module_idP, UE_id, frame_rxP, slot_rxP);
if (is_xlsch_in_slot(*ulsch_in_slot_bitmap,slot_rxP%num_slots_per_tdd)){
nr_schedule_uss_ulsch_phytest(module_idP, frame_rxP, slot_rxP);
}
}
}
stop_meas(&RC.nrmac[module_idP]->eNB_scheduler); stop_meas(&RC.nrmac[module_idP]->eNB_scheduler);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_DLSCH_ULSCH_SCHEDULER,VCD_FUNCTION_OUT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_DLSCH_ULSCH_SCHEDULER,VCD_FUNCTION_OUT);
......
...@@ -54,115 +54,117 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, sub_frame_t slotP ...@@ -54,115 +54,117 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, sub_frame_t slotP
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
nfapi_nr_ul_tti_request_t *UL_tti_req = &RC.nrmac[module_idP]->UL_tti_req[0]; nfapi_nr_ul_tti_request_t *UL_tti_req = &RC.nrmac[module_idP]->UL_tti_req[0];
uint8_t config_index = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.prach_ConfigurationIndex; if (is_nr_UL_slot(scc,slotP)) {
uint8_t mu,N_dur,N_t_slot,start_symbol;
uint16_t format;
if (scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg1_SubcarrierSpacing) uint8_t config_index = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.prach_ConfigurationIndex;
mu = *scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg1_SubcarrierSpacing; uint8_t mu,N_dur,N_t_slot,start_symbol;
else uint16_t format;
mu = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
if (scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg1_SubcarrierSpacing)
// prach is scheduled according to configuration index and tables 6.3.3.2.2 to 6.3.3.2.4 mu = *scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg1_SubcarrierSpacing;
if ( get_nr_prach_info_from_index(config_index, else
(int)frameP, mu = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
(int)slotP,
scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA, // prach is scheduled according to configuration index and tables 6.3.3.2.2 to 6.3.3.2.4
mu, if ( get_nr_prach_info_from_index(config_index,
cc->frame_type, (int)frameP,
&format, (int)slotP,
&start_symbol, scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA,
&N_t_slot, mu,
&N_dur) ) { cc->frame_type,
&format,
int fdm = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FDM; &start_symbol,
uint16_t format0 = format&0xff; // first column of format from table &N_t_slot,
uint16_t format1 = (format>>8)&0xff; // second column of format from table &N_dur) ) {
UL_tti_req->SFN = frameP; int fdm = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FDM;
UL_tti_req->Slot = slotP; uint16_t format0 = format&0xff; // first column of format from table
for (int n=0; n<(1<<fdm); n++) { // one structure per frequency domain occasion uint16_t format1 = (format>>8)&0xff; // second column of format from table
UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE;
UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_prach_pdu_t); UL_tti_req->SFN = frameP;
nfapi_nr_prach_pdu_t *prach_pdu = &UL_tti_req->pdus_list[UL_tti_req->n_pdus].prach_pdu; UL_tti_req->Slot = slotP;
memset(prach_pdu,0,sizeof(nfapi_nr_prach_pdu_t)); for (int n=0; n<(1<<fdm); n++) { // one structure per frequency domain occasion
UL_tti_req->n_pdus+=1; UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE;
UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_prach_pdu_t);
// filling the prach fapi structure nfapi_nr_prach_pdu_t *prach_pdu = &UL_tti_req->pdus_list[UL_tti_req->n_pdus].prach_pdu;
prach_pdu->phys_cell_id = *scc->physCellId; memset(prach_pdu,0,sizeof(nfapi_nr_prach_pdu_t));
prach_pdu->num_prach_ocas = N_t_slot; UL_tti_req->n_pdus+=1;
prach_pdu->prach_start_symbol = start_symbol;
prach_pdu->num_ra = n; // filling the prach fapi structure
prach_pdu->num_cs = get_NCS(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.zeroCorrelationZoneConfig, prach_pdu->phys_cell_id = *scc->physCellId;
format0, prach_pdu->num_prach_ocas = N_t_slot;
scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->restrictedSetConfig); prach_pdu->prach_start_symbol = start_symbol;
// SCF PRACH PDU format field does not consider A1/B1 etc. possibilities prach_pdu->num_ra = n;
// We added 9 = A1/B1 10 = A2/B2 11 A3/B3 prach_pdu->num_cs = get_NCS(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.zeroCorrelationZoneConfig,
if (format1!=0xff) { format0,
switch(format0) { scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->restrictedSetConfig);
case 0xa1: // SCF PRACH PDU format field does not consider A1/B1 etc. possibilities
prach_pdu->prach_format = 9; // We added 9 = A1/B1 10 = A2/B2 11 A3/B3
break; if (format1!=0xff) {
case 0xa2: switch(format0) {
prach_pdu->prach_format = 10; case 0xa1:
break; prach_pdu->prach_format = 9;
case 0xa3: break;
prach_pdu->prach_format = 11; case 0xa2:
break; prach_pdu->prach_format = 10;
default: break;
AssertFatal(1==0,"Only formats A1/B1 A2/B2 A3/B3 are valid for dual format"); case 0xa3:
prach_pdu->prach_format = 11;
break;
default:
AssertFatal(1==0,"Only formats A1/B1 A2/B2 A3/B3 are valid for dual format");
}
} }
} else{
else{ switch(format0) {
switch(format0) { case 0xa1:
case 0xa1: prach_pdu->prach_format = 0;
prach_pdu->prach_format = 0; break;
break; case 0xa2:
case 0xa2: prach_pdu->prach_format = 1;
prach_pdu->prach_format = 1; break;
break; case 0xa3:
case 0xa3: prach_pdu->prach_format = 2;
prach_pdu->prach_format = 2; break;
break; case 0xb1:
case 0xb1: prach_pdu->prach_format = 3;
prach_pdu->prach_format = 3; break;
break; case 0xb2:
case 0xb2: prach_pdu->prach_format = 4;
prach_pdu->prach_format = 4; break;
break; case 0xb3:
case 0xb3: prach_pdu->prach_format = 5;
prach_pdu->prach_format = 5; break;
break; case 0xb4:
case 0xb4: prach_pdu->prach_format = 6;
prach_pdu->prach_format = 6; break;
break; case 0xc0:
case 0xc0: prach_pdu->prach_format = 7;
prach_pdu->prach_format = 7; break;
break; case 0xc2:
case 0xc2: prach_pdu->prach_format = 8;
prach_pdu->prach_format = 8; break;
break; case 0:
case 0: // long formats are handled @ PHY
// long formats are handled @ PHY break;
break; case 1:
case 1: // long formats are handled @ PHY
// long formats are handled @ PHY break;
break; case 2:
case 2: // long formats are handled @ PHY
// long formats are handled @ PHY break;
break; case 3:
case 3: // long formats are handled @ PHY
// long formats are handled @ PHY break;
break; default:
default: AssertFatal(1==0,"Invalid PRACH format");
AssertFatal(1==0,"Invalid PRACH format"); }
} }
} }
} }
} }
} }
void nr_schedule_msg2(uint16_t rach_frame, uint16_t rach_slot, void nr_schedule_msg2(uint16_t rach_frame, uint16_t rach_slot,
uint16_t *msg2_frame, uint16_t *msg2_slot, uint16_t *msg2_frame, uint16_t *msg2_slot,
NR_ServingCellConfigCommon_t *scc, NR_ServingCellConfigCommon_t *scc,
......
...@@ -1468,6 +1468,7 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP){ ...@@ -1468,6 +1468,7 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP){
0, 0,
sizeof(NR_UE_sched_ctrl_t)); sizeof(NR_UE_sched_ctrl_t));
UE_list->UE_sched_ctrl[UE_id].sched_pucch = (NR_sched_pucch *)malloc(num_slots_ul*sizeof(NR_sched_pucch)); UE_list->UE_sched_ctrl[UE_id].sched_pucch = (NR_sched_pucch *)malloc(num_slots_ul*sizeof(NR_sched_pucch));
UE_list->UE_sched_ctrl[UE_id].sched_pusch = (NR_sched_pusch *)malloc(sizeof(NR_sched_pusch));
LOG_I(MAC, "gNB %d] Add NR UE_id %d : rnti %x\n", LOG_I(MAC, "gNB %d] Add NR UE_id %d : rnti %x\n",
mod_idP, mod_idP,
UE_id, UE_id,
......
...@@ -153,9 +153,10 @@ void nr_schedule_uss_dlsch_phytest(module_id_t module_idP, ...@@ -153,9 +153,10 @@ void nr_schedule_uss_dlsch_phytest(module_id_t module_idP,
NR_sched_pucch *pucch_sched, NR_sched_pucch *pucch_sched,
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_config); nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_config);
void nr_schedule_uss_ulsch_phytest(int Mod_idP, void nr_schedule_ulsch(int Mod_idP,
frame_t frameP, int UE_id,
sub_frame_t slotP); frame_t frameP,
sub_frame_t slotP);
void nr_update_pucch_scheduling(int Mod_idP, void nr_update_pucch_scheduling(int Mod_idP,
int UE_id, int UE_id,
...@@ -287,6 +288,11 @@ void nr_generate_Msg2(module_id_t module_idP, ...@@ -287,6 +288,11 @@ void nr_generate_Msg2(module_id_t module_idP,
void nr_schedule_reception_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t slotP); void nr_schedule_reception_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t slotP);
void schedule_fapi_ul_pdu(int Mod_idP,
frame_t frameP,
sub_frame_t slotP,
int num_slots_per_tdd,
int time_domain_assignment);
void nr_process_mac_pdu( void nr_process_mac_pdu(
module_id_t module_idP, module_id_t module_idP,
...@@ -297,6 +303,8 @@ void nr_process_mac_pdu( ...@@ -297,6 +303,8 @@ void nr_process_mac_pdu(
int binomial(int n, int k); int binomial(int n, int k);
bool is_xlsch_in_slot(uint64_t bitmap, sub_frame_t slot);
/* \brief Function to indicate a received SDU on ULSCH. /* \brief Function to indicate a received SDU on ULSCH.
@param Mod_id Instance ID of gNB @param Mod_id Instance ID of gNB
......
...@@ -253,6 +253,13 @@ typedef struct NR_sched_pucch { ...@@ -253,6 +253,13 @@ typedef struct NR_sched_pucch {
uint8_t resource_indicator; uint8_t resource_indicator;
} NR_sched_pucch; } NR_sched_pucch;
typedef struct NR_sched_pusch {
int frame;
int slot;
bool active;
nfapi_nr_pusch_pdu_t pusch_pdu;
} NR_sched_pusch;
typedef struct NR_UE_harq { typedef struct NR_UE_harq {
uint8_t is_waiting; uint8_t is_waiting;
uint8_t ndi; uint8_t ndi;
...@@ -265,6 +272,7 @@ typedef struct { ...@@ -265,6 +272,7 @@ typedef struct {
uint64_t dlsch_in_slot_bitmap; // static bitmap signaling which slot in a tdd period contains dlsch uint64_t dlsch_in_slot_bitmap; // static bitmap signaling which slot in a tdd period contains dlsch
uint64_t ulsch_in_slot_bitmap; // static bitmap signaling which slot in a tdd period contains ulsch uint64_t ulsch_in_slot_bitmap; // static bitmap signaling which slot in a tdd period contains ulsch
NR_sched_pucch *sched_pucch; NR_sched_pucch *sched_pucch;
NR_sched_pusch *sched_pusch;
uint16_t ta_timer; uint16_t ta_timer;
int16_t ta_update; int16_t ta_update;
uint8_t current_harq_pid; uint8_t current_harq_pid;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment