Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lizhongxiao
OpenXG-RAN
Commits
3c63a009
Commit
3c63a009
authored
Oct 25, 2023
by
francescomani
Committed by
laurent
Feb 23, 2024
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mr2510 uci on pusch at MAC UE
parent
9d9916aa
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
98 additions
and
16 deletions
+98
-16
nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
+1
-0
openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
+1
-1
openair2/LAYER2/NR_MAC_UE/mac_proto.h
openair2/LAYER2/NR_MAC_UE/mac_proto.h
+2
-2
openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+94
-13
No files found.
nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
View file @
3c63a009
...
...
@@ -342,6 +342,7 @@ typedef struct
uint8_t
nr_of_symbols
;
uint32_t
tbslbrm
;
uint8_t
ldpcBaseGraph
;
uint8_t
ulsch_indicator
;
//Optional Data only included if indicated in pduBitmap
nfapi_nr_ue_pusch_data_t
pusch_data
;
nfapi_nr_ue_pusch_uci_t
pusch_uci
;
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
View file @
3c63a009
...
...
@@ -135,7 +135,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
AssertFatal
(
pusch_pdu
->
pusch_uci
.
harq_ack_bit_length
==
0
&&
pusch_pdu
->
pusch_uci
.
csi_part1_bit_length
==
0
&&
pusch_pdu
->
pusch_uci
.
csi_part2_bit_length
==
0
,
"UCI on PUSCH not supported
\n
"
);
"UCI on PUSCH not supported
at PHY
\n
"
);
int
start_symbol
=
pusch_pdu
->
start_symbol_index
;
uint16_t
ul_dmrs_symb_pos
=
pusch_pdu
->
ul_dmrs_symb_pos
;
...
...
openair2/LAYER2/NR_MAC_UE/mac_proto.h
View file @
3c63a009
...
...
@@ -210,7 +210,7 @@ void release_mac_configuration(NR_UE_MAC_INST_t *mac);
\param ul_info UL indication*/
void
nr_ue_ul_scheduler
(
NR_UE_MAC_INST_t
*
mac
,
nr_uplink_indication_t
*
ul_info
);
void
nr_ue_dl_scheduler
(
NR_UE_MAC_INST_t
*
mac
,
nr_downlink_indication_t
*
dl_info
);
csi_payload_t
nr_ue_aperiodic_csi_reporting
(
NR_UE_MAC_INST_t
*
mac
,
dci_field_t
csi_request
,
int
tda
,
long
*
K2
);
/*! \fn int8_t nr_ue_get_SR(NR_UE_MAC_INST_t *mac, frame_t frameP, slot_t slotP);
\brief Called by PHY to get sdu for PUSCH transmission. It performs the following operations: Checks BSR for DCCH, DCCH1 and
DTCH corresponding to previous values computed either in SR or BSR procedures. It gets rlc status indications on DCCH,DCCH1 and
...
...
@@ -394,7 +394,7 @@ and fills the PRACH PDU per each FD occasion.
@param slotP Slot index
@returns void
*/
void
nr_ue_pucch_scheduler
(
NR_UE_MAC_INST_t
*
mac
,
frame_t
frameP
,
int
slotP
,
void
*
phy_data
);
void
nr_ue_pucch_scheduler
(
NR_UE_MAC_INST_t
*
mac
,
frame_t
frameP
,
int
slotP
);
void
nr_schedule_csirs_reception
(
NR_UE_MAC_INST_t
*
mac
,
int
frame
,
int
slot
);
void
nr_schedule_csi_for_im
(
NR_UE_MAC_INST_t
*
mac
,
int
frame
,
int
slot
);
...
...
openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
View file @
3c63a009
...
...
@@ -546,7 +546,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
pusch_config_pdu
->
tbslbrm
=
0
;
}
else
if
(
dci
)
{
pusch_config_pdu
->
ulsch_indicator
=
dci
->
ulsch_indicator
;
if
(
dci
->
csi_request
.
nbits
>
0
&&
dci
->
csi_request
.
val
>
0
)
{
AssertFatal
(
csi_report
,
"CSI report needs to be present in case of CSI request
\n
"
);
pusch_config_pdu
->
pusch_uci
.
csi_part1_bit_length
=
csi_report
->
p1_bits
;
...
...
@@ -1163,6 +1163,10 @@ void nr_ue_ul_scheduler(NR_UE_MAC_INST_t *mac, nr_uplink_indication_t *ul_info)
ulcfg_pdu
++
;
}
release_ul_config
(
ulcfg_pdu
,
false
);
if
(
mac
->
state
>=
UE_PERFORMING_RA
)
nr_ue_pucch_scheduler
(
mac
,
frame_tx
,
slot_tx
);
if
(
mac
->
if_module
!=
NULL
&&
mac
->
if_module
->
scheduled_response
!=
NULL
)
{
LOG_D
(
NR_MAC
,
"3# scheduled_response transmitted,%d, %d
\n
"
,
frame_tx
,
slot_tx
);
nr_scheduled_response_t
scheduled_response
=
{.
ul_config
=
mac
->
ul_config_request
+
slot_tx
,
...
...
@@ -1218,9 +1222,6 @@ void nr_ue_ul_scheduler(NR_UE_MAC_INST_t *mac, nr_uplink_indication_t *ul_info)
mac
->
BSR_reporting_active
|=
NR_BSR_TRIGGER_REGULAR
;
LOG_D
(
NR_MAC
,
"[UE %d][BSR] Regular BSR Triggered Frame %d slot %d SR for PUSCH is pending
\n
"
,
mac
->
ue_id
,
frame_tx
,
slot_tx
);
}
if
(
mac
->
state
>=
UE_PERFORMING_RA
)
nr_ue_pucch_scheduler
(
mac
,
frame_tx
,
slot_tx
,
ul_info
->
phy_data
);
}
bool
nr_update_bsr
(
NR_UE_MAC_INST_t
*
mac
,
frame_t
frameP
,
slot_t
slotP
,
uint8_t
gNB_index
)
...
...
@@ -2175,7 +2176,89 @@ void build_ssb_to_ro_map(NR_UE_MAC_INST_t *mac)
LOG_D
(
NR_MAC
,
"Map SSB to RO done
\n
"
);
}
void
nr_ue_pucch_scheduler
(
NR_UE_MAC_INST_t
*
mac
,
frame_t
frameP
,
int
slotP
,
void
*
phy_data
)
static
bool
schedule_uci_on_pusch
(
NR_UE_MAC_INST_t
*
mac
,
frame_t
frame_tx
,
int
slot_tx
,
PUCCH_sched_t
*
pucch
)
{
fapi_nr_ul_config_request_pdu_t
*
ulcfg_pdu
=
lockGet_ul_iterator
(
mac
,
frame_tx
,
slot_tx
);
if
(
!
ulcfg_pdu
)
return
NULL
;
nfapi_nr_ue_pusch_pdu_t
*
pusch_pdu
=
NULL
;
while
(
ulcfg_pdu
->
pdu_type
!=
FAPI_NR_END
)
{
if
(
ulcfg_pdu
->
pdu_type
==
FAPI_NR_UL_CONFIG_TYPE_PUSCH
)
{
int
start_pusch
=
ulcfg_pdu
->
pusch_config_pdu
.
start_symbol_index
;
int
nsymb_pusch
=
ulcfg_pdu
->
pusch_config_pdu
.
nr_of_symbols
;
int
end_pusch
=
start_pusch
+
nsymb_pusch
;
NR_PUCCH_Resource_t
*
pucchres
=
pucch
->
pucch_resource
;
int
nr_of_symbols
=
0
;
int
start_symbol_index
=
0
;
switch
(
pucchres
->
format
.
present
)
{
case
NR_PUCCH_Resource__format_PR_format0
:
nr_of_symbols
=
pucchres
->
format
.
choice
.
format0
->
nrofSymbols
;
start_symbol_index
=
pucchres
->
format
.
choice
.
format0
->
startingSymbolIndex
;
break
;
case
NR_PUCCH_Resource__format_PR_format1
:
nr_of_symbols
=
pucchres
->
format
.
choice
.
format1
->
nrofSymbols
;
start_symbol_index
=
pucchres
->
format
.
choice
.
format1
->
startingSymbolIndex
;
break
;
case
NR_PUCCH_Resource__format_PR_format2
:
nr_of_symbols
=
pucchres
->
format
.
choice
.
format2
->
nrofSymbols
;
start_symbol_index
=
pucchres
->
format
.
choice
.
format2
->
startingSymbolIndex
;
break
;
case
NR_PUCCH_Resource__format_PR_format3
:
nr_of_symbols
=
pucchres
->
format
.
choice
.
format3
->
nrofSymbols
;
start_symbol_index
=
pucchres
->
format
.
choice
.
format3
->
startingSymbolIndex
;
break
;
case
NR_PUCCH_Resource__format_PR_format4
:
nr_of_symbols
=
pucchres
->
format
.
choice
.
format4
->
nrofSymbols
;
start_symbol_index
=
pucchres
->
format
.
choice
.
format4
->
startingSymbolIndex
;
break
;
default
:
AssertFatal
(
false
,
"Undefined PUCCH format
\n
"
);
}
int
final_symbol
=
nr_of_symbols
+
start_symbol_index
;
// PUCCH overlapping in time with PUSCH
if
(
start_symbol_index
<
end_pusch
&&
final_symbol
>
start_pusch
)
{
pusch_pdu
=
&
ulcfg_pdu
->
pusch_config_pdu
;
break
;
}
}
ulcfg_pdu
++
;
}
if
(
!
pusch_pdu
)
{
release_ul_config
(
ulcfg_pdu
,
false
);
return
false
;
}
// If a UE would transmit on a serving cell a PUSCH without UL-SCH that overlaps with a PUCCH transmission
// on a serving cell that includes positive SR information, the UE does not transmit the PUSCH.
if
(
pusch_pdu
&&
pusch_pdu
->
ulsch_indicator
==
0
&&
pucch
->
sr_payload
==
1
)
{
release_ul_config
(
ulcfg_pdu
,
false
);
return
false
;
}
// - UE multiplexes only HARQ-ACK information, if any, from the UCI in the PUSCH transmission
// and does not transmit the PUCCH if the UE multiplexes aperiodic or semi-persistent CSI reports in the PUSCH
// - UE multiplexes only HARQ-ACK information and CSI reports, if any, from the UCI in the PUSCH transmission
// and does not transmit the PUCCH if the UE does not multiplex aperiodic or semi-persistent CSI reports in the PUSCH
bool
mux_done
=
false
;
if
(
pucch
->
n_harq
>
0
)
{
pusch_pdu
->
pusch_uci
.
harq_ack_bit_length
=
pucch
->
n_harq
;
pusch_pdu
->
pusch_uci
.
harq_payload
=
pucch
->
ack_payload
;
mux_done
=
true
;
}
if
(
pusch_pdu
->
pusch_uci
.
csi_part1_bit_length
==
0
&&
pusch_pdu
->
pusch_uci
.
csi_part2_bit_length
==
0
)
{
// To support this we would need to shift some bits into CSI part2 -> need to change the logic
AssertFatal
(
pucch
->
n_csi
==
0
,
"Multiplexing periodic CSI on PUSCH not supported
\n
"
);
}
release_ul_config
(
ulcfg_pdu
,
false
);
// only use PUSCH if any mux is done otherwise send PUCCH
return
mux_done
;
}
void
nr_ue_pucch_scheduler
(
NR_UE_MAC_INST_t
*
mac
,
frame_t
frameP
,
int
slotP
)
{
PUCCH_sched_t
pucch
[
3
]
=
{
0
};
// TODO the size might change in the future in case of multiple SR or multiple CSI in a slot
...
...
@@ -2212,6 +2295,7 @@ void nr_ue_pucch_scheduler(NR_UE_MAC_INST_t *mac, frame_t frameP, int slotP, voi
if
(
num_res
>
1
)
multiplex_pucch_resource
(
mac
,
pucch
,
num_res
);
for
(
int
j
=
0
;
j
<
num_res
;
j
++
)
{
if
(
pucch
[
j
].
n_harq
+
pucch
[
j
].
n_sr
+
pucch
[
j
].
n_csi
!=
0
)
{
LOG_D
(
NR_MAC
,
...
...
@@ -2224,6 +2308,11 @@ void nr_ue_pucch_scheduler(NR_UE_MAC_INST_t *mac, frame_t frameP, int slotP, voi
mac
->
nr_ue_emul_l1
.
num_srs
=
pucch
[
j
].
n_sr
;
mac
->
nr_ue_emul_l1
.
num_harqs
=
pucch
[
j
].
n_harq
;
mac
->
nr_ue_emul_l1
.
num_csi_reports
=
pucch
[
j
].
n_csi
;
// checking if we need to schedule pucch[j] on PUSCH
if
(
schedule_uci_on_pusch
(
mac
,
frameP
,
slotP
,
&
pucch
[
j
]))
continue
;
fapi_nr_ul_config_request_pdu_t
*
pdu
=
lockGet_ul_config
(
mac
,
frameP
,
slotP
,
FAPI_NR_UL_CONFIG_TYPE_PUCCH
);
if
(
!
pdu
)
{
LOG_E
(
NR_MAC
,
"Error in pucch allocation
\n
"
);
...
...
@@ -2239,14 +2328,6 @@ void nr_ue_pucch_scheduler(NR_UE_MAC_INST_t *mac, frame_t frameP, int slotP, voi
remove_ul_config_last_item
(
pdu
);
release_ul_config
(
pdu
,
false
);
}
if
(
mac
->
if_module
!=
NULL
&&
mac
->
if_module
->
scheduled_response
!=
NULL
)
{
nr_scheduled_response_t
scheduled_response
=
{.
ul_config
=
mac
->
ul_config_request
+
slotP
,
.
mac
=
mac
,
.
module_id
=
mac
->
ue_id
,
.
CC_id
=
0
/*TBR fix*/
,
.
phy_data
=
phy_data
};
mac
->
if_module
->
scheduled_response
(
&
scheduled_response
);
}
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment