UE: Add DCI_IND in phy_procedures_nr_ue. Fill type0-pdcch in scheduled_response
This commit is contained in:
@@ -37,9 +37,9 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define NR_BCCH_DL_SCH 3 // SI
|
||||
#define NR_BCCH_DL_SCH 3 // SI
|
||||
|
||||
#define NR_BCCH_BCH 5 // MIB
|
||||
#define NR_BCCH_BCH 5 // MIB
|
||||
|
||||
/*!\brief UE layer 2 status */
|
||||
typedef enum {
|
||||
@@ -49,5 +49,32 @@ typedef enum {
|
||||
PHY_HO_PRACH
|
||||
} NR_UE_L2_STATE_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t LCID:6; // octet 1 [5:0]
|
||||
uint8_t F:1; // octet 1 [6]
|
||||
uint8_t R:1; // octet 1 [7]
|
||||
uint8_t L:8; // octet 2 [7:0]
|
||||
} __attribute__ ((__packed__)) NR_MAC_SUBHEADER_SHORT;
|
||||
|
||||
typedef struct {
|
||||
uint8_t LCID:6; // octet 1 [5:0]
|
||||
uint8_t F:1; // octet 1 [6]
|
||||
uint8_t R:1; // octet 1 [7]
|
||||
uint8_t L1:8; // octet 2 [7:0]
|
||||
uint8_t L2:8; // octet 3 [7:0]
|
||||
} __attribute__ ((__packed__)) NR_MAC_SUBHEADER_LONG;
|
||||
|
||||
typedef struct {
|
||||
uint8_t LCID:5; // octet 1 [5:0]
|
||||
uint8_t R:2; // octet 1 [7:6]
|
||||
} __attribute__ ((__packed__)) NR_MAC_SUBHEADER_FIXED;
|
||||
|
||||
#define DL_SCH_LCID_CCCH 0x0
|
||||
#define DL_SCH_LCID_R_BITRATE 0x2f
|
||||
#define DL_SCH_LCID_L_DRX 0x3b
|
||||
#define DL_SCH_LCID_DRX 0x3c
|
||||
#define DL_SCH_LCID_TA 0x3d
|
||||
#define DL_SCH_LCID_CONTENTION_RESOLUTION_ID 0x3e
|
||||
#define DL_SCH_LCID_PADDING 0x3f
|
||||
|
||||
#endif /*__LAYER2_MAC_DEFS_H__ */
|
||||
|
||||
@@ -81,6 +81,7 @@ typedef struct {
|
||||
uint32_t type0_pdcch_ss_mux_pattern;
|
||||
SFN_C_TYPE type0_pdcch_ss_sfn_c;
|
||||
uint32_t type0_pdcch_ss_n_c;
|
||||
uint32_t type0_pdcch_consecutive_slots;
|
||||
|
||||
/// Random access parameter
|
||||
uint16_t ra_rnti;
|
||||
|
||||
@@ -80,4 +80,4 @@ extern const float table_38213_13_12_c1[16];
|
||||
extern const int32_t table_38213_13_12_c2[16];
|
||||
extern const float table_38213_13_12_c3[16];
|
||||
|
||||
extern const int32_t table_38213_10_1_1_c2[3];
|
||||
extern const int32_t table_38213_10_1_1_c2[5];
|
||||
@@ -113,7 +113,7 @@ uint32_t ue_get_SR(module_id_t module_idP, int CC_id, frame_t frameP,
|
||||
uint8_t eNB_id, rnti_t rnti, sub_frame_t subframe);
|
||||
|
||||
|
||||
int8_t nr_ue_decode_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fapi_nr_dci_pdu_rel15_t *dci, uint16_t rnti, uint32_t dci_type);
|
||||
int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fapi_nr_dci_pdu_rel15_t *dci, uint16_t rnti, uint32_t dci_type);
|
||||
|
||||
uint32_t get_ssb_frame(void);
|
||||
uint32_t get_ssb_slot(uint32_t ssb_index);
|
||||
|
||||
@@ -88,4 +88,4 @@ const float table_38213_13_12_c1[16] = { 0, 0, 2.5f, 2.5f, 5, 5, 0, 2.5f, 5, 7
|
||||
const int32_t table_38213_13_12_c2[16] = { 1, 2, 1, 2, 1, 2, 2, 2, 2, 1, 2, 2, 1, 1, reserved, reserved}; // index 14-15 reserved
|
||||
const float table_38213_13_12_c3[16] = { 1, 0.5f, 1, 0.5f, 1, 0.5f, 0.5f, 0.5f, 0.5f, 1, 0.5f, 0.5f, 1, 1, reserved, reserved}; // M, index 14-15 reserved
|
||||
|
||||
const int32_t table_38213_10_1_1_c2[3] = { 4, 2, 1 };
|
||||
const int32_t table_38213_10_1_1_c2[5] = { 0, 0, 4, 2, 1 };
|
||||
Executable → Regular
+68
-9
@@ -401,9 +401,11 @@ const uint32_t num_slot_per_frame = 20;
|
||||
|
||||
coreset_duration = num_symbols * number_of_search_space_per_slot;
|
||||
|
||||
mac->type0_pdcch_dci_config.number_of_candidates[2] = table_38213_10_1_1_c2[0]; // CCE aggregation level = 4
|
||||
mac->type0_pdcch_dci_config.number_of_candidates[3] = table_38213_10_1_1_c2[1]; // CCE aggregation level = 8
|
||||
mac->type0_pdcch_dci_config.number_of_candidates[4] = table_38213_10_1_1_c2[2]; // CCE aggregation level = 16
|
||||
mac->type0_pdcch_dci_config.number_of_candidates[0] = table_38213_10_1_1_c2[0];
|
||||
mac->type0_pdcch_dci_config.number_of_candidates[1] = table_38213_10_1_1_c2[1];
|
||||
mac->type0_pdcch_dci_config.number_of_candidates[2] = table_38213_10_1_1_c2[2]; // CCE aggregation level = 4
|
||||
mac->type0_pdcch_dci_config.number_of_candidates[3] = table_38213_10_1_1_c2[3]; // CCE aggregation level = 8
|
||||
mac->type0_pdcch_dci_config.number_of_candidates[4] = table_38213_10_1_1_c2[4]; // CCE aggregation level = 16
|
||||
mac->type0_pdcch_dci_config.duration = search_space_duration;
|
||||
mac->type0_pdcch_dci_config.coreset.duration = coreset_duration; // coreset
|
||||
mac->type0_pdcch_dci_config.monitoring_symbols_within_slot = (0x3fff << first_symbol_index) & (0x3fff >> (14-coreset_duration-first_symbol_index)) & 0x3fff;
|
||||
@@ -462,9 +464,11 @@ NR_UE_L2_STATE_t nr_ue_scheduler(
|
||||
// 38.213 chapter 13
|
||||
if((mac->type0_pdcch_ss_sfn_c == SFN_C_MOD_2_EQ_0) && !(rx_frame & 0x1) && (rx_slot == mac->type0_pdcch_ss_n_c)){
|
||||
search_space_mask = search_space_mask | type0_pdcch;
|
||||
mac->type0_pdcch_consecutive_slots = mac->type0_pdcch_dci_config.duration;
|
||||
}
|
||||
if((mac->type0_pdcch_ss_sfn_c == SFN_C_MOD_2_EQ_1) && (rx_frame & 0x1) && (rx_slot == mac->type0_pdcch_ss_n_c)){
|
||||
search_space_mask = search_space_mask | type0_pdcch;
|
||||
mac->type0_pdcch_consecutive_slots = mac->type0_pdcch_dci_config.duration;
|
||||
}
|
||||
//if((mac->type0_pdcch_ss_sfn_c == SFN_C_EQ_SFN_SSB) && ( get_ssb_frame() )){
|
||||
// search_space_mask = search_space_mask | type0_pdcch;
|
||||
@@ -474,12 +478,14 @@ NR_UE_L2_STATE_t nr_ue_scheduler(
|
||||
// 38.213 Table 13-13, 13-14
|
||||
if((rx_frame == get_ssb_frame()) && (rx_slot == mac->type0_pdcch_ss_n_c)){
|
||||
search_space_mask = search_space_mask | type0_pdcch;
|
||||
mac->type0_pdcch_consecutive_slots = mac->type0_pdcch_dci_config.duration;
|
||||
}
|
||||
}
|
||||
if(mac->type0_pdcch_ss_mux_pattern == 3){
|
||||
// 38.213 Table 13-15
|
||||
if((rx_frame == get_ssb_frame()) && (rx_slot == mac->type0_pdcch_ss_n_c)){
|
||||
search_space_mask = search_space_mask | type0_pdcch;
|
||||
mac->type0_pdcch_consecutive_slots = mac->type0_pdcch_dci_config.duration;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -498,13 +504,14 @@ NR_UE_L2_STATE_t nr_ue_scheduler(
|
||||
uint8_t format_2_3_number_of_candidates;
|
||||
#endif
|
||||
fapi_nr_dl_config_request_t *dl_config = &mac->dl_config_request;
|
||||
if(search_space_mask & type0_pdcch){
|
||||
if((search_space_mask & type0_pdcch) || ( mac->type0_pdcch_consecutive_slots != 0 )){
|
||||
mac->type0_pdcch_consecutive_slots = mac->type0_pdcch_consecutive_slots - 1;
|
||||
|
||||
dl_config->dl_config_request_body[dl_config->number_pdus].dci_pdu.dci_config_rel15 = mac->type0_pdcch_dci_config;
|
||||
dl_config->dl_config_request_body[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DCI;
|
||||
dl_config->dl_config_list[dl_config->number_pdus].dci_pdu.dci_config_rel15 = mac->type0_pdcch_dci_config;
|
||||
dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DCI;
|
||||
dl_config->number_pdus = dl_config->number_pdus + 1;
|
||||
|
||||
dl_config->dl_config_request_body[dl_config->number_pdus].dci_pdu.dci_config_rel15.rnti = 0xaaaa; // to be set
|
||||
dl_config->dl_config_list[dl_config->number_pdus].dci_pdu.dci_config_rel15.rnti = 0xaaaa; // to be set
|
||||
}
|
||||
|
||||
if(search_space_mask & type0a_pdcch){
|
||||
@@ -526,7 +533,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(
|
||||
return CONNECTION_OK;
|
||||
}
|
||||
|
||||
int8_t nr_ue_decode_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fapi_nr_dci_pdu_rel15_t *dci, uint16_t rnti, uint32_t dci_type){
|
||||
int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fapi_nr_dci_pdu_rel15_t *dci, uint16_t rnti, uint32_t dci_type){
|
||||
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
|
||||
|
||||
@@ -550,4 +557,56 @@ int8_t nr_ue_decode_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fap
|
||||
int8_t nr_ue_get_SR(module_id_t module_idP, int CC_id, frame_t frameP, uint8_t eNB_id, uint16_t rnti, sub_frame_t subframe){
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void nr_ue_process_mac_pdu(
|
||||
module_id_t module_idP,
|
||||
uint8_t CC_id,
|
||||
uint8_t *pduP,
|
||||
uint16_t pdu_len,
|
||||
uint8_t eNB_index){
|
||||
|
||||
uint8_t *pdu_ptr = pduP;
|
||||
uint8_t sub_pdu_len;
|
||||
|
||||
// variable-size MAC CE(known by LCID), padding, MSG3, MAC SDU
|
||||
// |0|1|2|3|4|5|6|7| bit-wise
|
||||
// |R|F| LCID |
|
||||
// | L |
|
||||
|
||||
// variable-size MAC CE(known by LCID), padding, MSG3, MAC SDU
|
||||
// |0|1|2|3|4|5|6|7| bit-wise
|
||||
// |R|F| LCID |
|
||||
// | L |
|
||||
// | L |
|
||||
|
||||
// fixed-size MAC CE(known by LCID), padding, MSG3
|
||||
// |0|1|2|3|4|5|6|7| bit-wise
|
||||
// |R|R| LCID |
|
||||
|
||||
// LCID: The Logical Channel ID field identifies the logical channel instance of the corresponding MAC SDU or the type of the corresponding MAC CE or padding as described in Tables 6.2.1-1 and 6.2.1-2 for the DL-SCH and UL-SCH respectively. There is one LCID field per MAC subheader. The LCID field size is 6 bits;
|
||||
// L: The Length field indicates the length of the corresponding MAC SDU or variable-sized MAC CE in bytes. There is one L field per MAC subheader except for subheaders corresponding to fixed-sized MAC CEs and padding. The size of the L field is indicated by the F field;
|
||||
// F: lenght of L is 8 or 16 bits wide
|
||||
// R: Reserved bit, set to zero.
|
||||
|
||||
|
||||
while (!done) {
|
||||
|
||||
switch(((NR_MAC_SUBHEADER_FIXED *)pdu_ptr)->LCID){
|
||||
// Control element
|
||||
case DL_SCH_LCID_PADDING:
|
||||
done = 1;
|
||||
// end of MAC PDU, there is nothing right after padding
|
||||
break;
|
||||
|
||||
// MAC SDU
|
||||
|
||||
default:
|
||||
printf("[MAC] get lcid: %d which not support yet\n", ((NR_MAC_SUBHEADER_FIXED *)buf_ptr)->LCID);
|
||||
break;
|
||||
}
|
||||
pdu_ptr += sub_pdu_len;
|
||||
}
|
||||
}
|
||||
|
||||
Executable → Regular
+4
-4
@@ -62,7 +62,7 @@ int8_t handle_bcch_dlsch(module_id_t module_id, int cc_id, uint8_t gNB_index, ui
|
||||
// L2 Abstraction Layer
|
||||
int8_t handle_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fapi_nr_dci_pdu_rel15_t *dci, uint16_t rnti, uint32_t dci_type){
|
||||
|
||||
return nr_ue_decode_dci(module_id, cc_id, gNB_index, dci, rnti, dci_type);
|
||||
return nr_ue_process_dci(module_id, cc_id, gNB_index, dci, rnti, dci_type);
|
||||
|
||||
}
|
||||
|
||||
@@ -157,10 +157,10 @@ int8_t nr_ue_dl_indication(nr_downlink_indication_t *dl_info){
|
||||
|
||||
case FAPI_NR_DCI_TYPE_1_0:
|
||||
|
||||
dl_config->dl_config_request_body[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DLSCH;
|
||||
dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DLSCH;
|
||||
|
||||
// mapping into DL_CONFIG_REQ for DL-SCH
|
||||
fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu = &dl_config->dl_config_request_body[dl_config->number_pdus].dlsch_pdu.dlsch_config_rel15;
|
||||
fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu = &dl_config->dl_config_list[dl_config->number_pdus].dlsch_pdu.dlsch_config_rel15;
|
||||
dlsch_config_pdu->format_indicator = dci->dci_format;
|
||||
dlsch_config_pdu->frequency_domain_assignment = dci->frequency_domain_resouce_assignment;
|
||||
dlsch_config_pdu->time_domain_assignment = dci->time_domain_resource_assignment;
|
||||
@@ -174,7 +174,7 @@ int8_t nr_ue_dl_indication(nr_downlink_indication_t *dl_info){
|
||||
dlsch_config_pdu->pucch_resource_indicator = dci->pucch_resource_indicator;
|
||||
dlsch_config_pdu->pdsch_to_harq_feedback_timing_indicator = dci->pdsch_to_harq_feedback_timing_indicator;
|
||||
|
||||
dl_config->dl_config_request_body[dl_config->number_pdus].dlsch_pdu.dlsch_config_rel15.rnti = 0x0000; // TX RNTI: UE-spec
|
||||
dl_config->dl_config_list[dl_config->number_pdus].dlsch_pdu.dlsch_config_rel15.rnti = 0x0000; // TX RNTI: UE-spec
|
||||
dl_config->number_pdus = dl_config->number_pdus + 1;
|
||||
|
||||
ret_mask |= (handle_dci(
|
||||
|
||||
Reference in New Issue
Block a user