Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
zhangtu
openairinterface5G
Commits
f3745444
Commit
f3745444
authored
Aug 17, 2017
by
knopp
Browse files
eMTC extensions in L1/L2 after interoperability testing with COTS Cat-M device.
parent
fc283a32
Changes
9
Expand all
Hide whitespace changes
Inline
Side-by-side
openair1/PHY/INIT/lte_init.c
View file @
f3745444
...
...
@@ -222,7 +222,11 @@ void phy_config_request(PHY_Config_t *phy_config) {
fp
->
prach_emtc_config_common
.
prach_ConfigInfo
.
prach_starting_subframe_periodicity
[
0
]
=
cfg
->
emtc_config
.
prach_ce_level_0_starting_subframe_periodicity
.
value
;
fp
->
prach_emtc_config_common
.
prach_ConfigInfo
.
prach_numRepetitionPerPreambleAttempt
[
0
]
=
cfg
->
emtc_config
.
prach_ce_level_0_number_of_repetitions_per_attempt
.
value
;
AssertFatal
(
fp
->
prach_emtc_config_common
.
prach_ConfigInfo
.
prach_starting_subframe_periodicity
[
0
]
>=
fp
->
prach_emtc_config_common
.
prach_ConfigInfo
.
prach_numRepetitionPerPreambleAttempt
[
0
],
"prach_starting_subframe_periodicity[0] < prach_numPetitionPerPreambleAttempt[0]
\n
"
);
"prach_starting_subframe_periodicity[0] %d < prach_numPetitionPerPreambleAttempt[0] %d
\n
"
,
fp
->
prach_emtc_config_common
.
prach_ConfigInfo
.
prach_starting_subframe_periodicity
[
0
],
fp
->
prach_emtc_config_common
.
prach_ConfigInfo
.
prach_numRepetitionPerPreambleAttempt
[
0
]);
AssertFatal
(
fp
->
prach_emtc_config_common
.
prach_ConfigInfo
.
prach_numRepetitionPerPreambleAttempt
[
0
]
>
0
,
"prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[0]==0
\n
"
);
fp
->
prach_emtc_config_common
.
prach_ConfigInfo
.
prach_ConfigIndex
[
0
]
=
cfg
->
emtc_config
.
prach_ce_level_0_configuration_index
.
value
;
fp
->
prach_emtc_config_common
.
prach_ConfigInfo
.
prach_FreqOffset
[
0
]
=
cfg
->
emtc_config
.
prach_ce_level_0_frequency_offset
.
value
;
fp
->
prach_emtc_config_common
.
prach_ConfigInfo
.
prach_hopping_enable
[
0
]
=
cfg
->
emtc_config
.
prach_ce_level_0_hopping_enable
.
value
;
...
...
openair1/PHY/LTE_TRANSPORT/prach.c
View file @
f3745444
...
...
@@ -1117,6 +1117,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
uint8_t
restricted_set
;
uint8_t
n_ra_prb
;
int
frame
;
int
subframe
;
int16_t
*
prachF
=
NULL
;
int16_t
**
rxsigF
=
NULL
;
...
...
@@ -1153,9 +1154,9 @@ void rx_prach0(PHY_VARS_eNB *eNB,
int
prach_ifft_cnt
=
0
;
#endif
#ifdef PRACH_DEBUG
int
en
,
en0
=
0
;
int
en0
=
0
;
#endif
int
en
;
if
(
ru
)
{
fp
=
&
ru
->
frame_parms
;
nb_rx
=
ru
->
nb_rx
;
...
...
@@ -1204,17 +1205,31 @@ void rx_prach0(PHY_VARS_eNB *eNB,
#ifdef Rel14
if
(
br_flag
==
1
)
{
prach_ifftp
=
eNB
->
prach_vars_br
.
prach_ifft
[
ce_level
];
frame
=
eNB
->
proc
.
frame_prach_br
;
subframe
=
eNB
->
proc
.
subframe_prach_br
;
prachF
=
eNB
->
prach_vars_br
.
prachF
;
rxsigF
=
eNB
->
prach_vars_br
.
rxsigF
;
#ifdef PRACH_DEBUG
if
((
frame
&
1023
)
<
20
)
LOG_I
(
PHY
,
"PRACH (eNB) : running rx_prach (br_flag %d, ce_level %d) for frame %d subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d, rootSequenceIndex %d, repetition number %d,numRepetitionsPrePreambleAttempt %d
\n
"
,
br_flag
,
ce_level
,
frame
,
subframe
,
fp
->
prach_emtc_config_common
.
prach_ConfigInfo
.
prach_FreqOffset
[
ce_level
],
prach_ConfigIndex
,
rootSequenceIndex
,
eNB
->
prach_vars_br
.
repetition_number
[
ce_level
],
fp
->
prach_emtc_config_common
.
prach_ConfigInfo
.
prach_numRepetitionPerPreambleAttempt
[
ce_level
]);
#endif
}
else
#endif
{
prach_ifftp
=
eNB
->
prach_vars
.
prach_ifft
[
0
];
frame
=
eNB
->
proc
.
frame_prach
;
subframe
=
eNB
->
proc
.
subframe_prach
;
prachF
=
eNB
->
prach_vars
.
prachF
;
rxsigF
=
eNB
->
prach_vars
.
rxsigF
;
#ifdef PRACH_DEBUG
if
((
frame
&
1023
)
<
20
)
LOG_I
(
PHY
,
"PRACH (eNB) : running rx_prach for subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d , rootSequenceIndex %d
\n
"
,
subframe
,
fp
->
prach_config_common
.
prach_ConfigInfo
.
prach_FreqOffset
,
prach_ConfigIndex
,
rootSequenceIndex
);
#endif
}
}
else
{
...
...
@@ -1222,16 +1237,20 @@ void rx_prach0(PHY_VARS_eNB *eNB,
if
(
br_flag
==
1
)
{
subframe
=
ru
->
proc
.
subframe_prach_br
;
rxsigF
=
ru
->
prach_rxsigF_br
[
ce_level
];
LOG_D
(
PHY
,
"PRACH (RU) : running rx_prach for subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d
\n
"
,
subframe
,
fp
->
prach_emtc_config_common
.
prach_ConfigInfo
.
prach_FreqOffset
[
ce_level
],
prach_ConfigIndex
);
#ifdef PRACH_DEBUG
if
((
frame
&
1023
)
<
20
)
LOG_I
(
PHY
,
"PRACH (RU) : running rx_prach (br_flag %d, ce_level %d) for frame %d subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d
\n
"
,
br_flag
,
ce_level
,
frame
,
subframe
,
fp
->
prach_emtc_config_common
.
prach_ConfigInfo
.
prach_FreqOffset
[
ce_level
],
prach_ConfigIndex
);
#endif
}
else
#endif
{
subframe
=
ru
->
proc
.
subframe_prach
;
rxsigF
=
ru
->
prach_rxsigF
;
LOG_D
(
PHY
,
"PRACH (RU) : running rx_prach for subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d
\n
"
,
#ifdef PRACH_DEBUG
if
((
frame
&
1023
)
<
20
)
LOG_I
(
PHY
,
"PRACH (RU) : running rx_prach for subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d
\n
"
,
subframe
,
fp
->
prach_config_common
.
prach_ConfigInfo
.
prach_FreqOffset
,
prach_ConfigIndex
);
#endif
}
}
...
...
@@ -1242,7 +1261,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
if
(
ru
->
if_south
==
LOCAL_RF
)
{
// set the time-domain signal if we have to use it in this node
prach
[
aa
]
=
(
int16_t
*
)
&
ru
->
common
.
rxdata
[
aa
][(
subframe
*
fp
->
samples_per_tti
)
-
ru
->
N_TA_offset
];
#ifdef PRACH_DEBUG
LOG_
D
(
PHY
,
"RU %d, subframe %d, : prach %p (energy %d)
\n
"
,
ru
->
idx
,
subframe
,
prach
[
aa
],
dB_fixed
(
en0
=
signal_energy
(
prach
[
aa
],
fp
->
samples_per_tti
)));
if
((
frame
&
1023
)
<
20
)
LOG_
I
(
PHY
,
"RU %d,
br_flag %d ce_level %d frame %d
subframe %d, : prach %p (energy %d)
\n
"
,
ru
->
idx
,
br_flag
,
ce_level
,
frame
,
subframe
,
prach
[
aa
],
dB_fixed
(
en0
=
signal_energy
(
prach
[
aa
],
fp
->
samples_per_tti
)));
#endif
}
}
...
...
@@ -1453,24 +1472,12 @@ void rx_prach0(PHY_VARS_eNB *eNB,
#endif
send_IF4p5
(
ru
,
ru
->
proc
.
frame_prach
,
ru
->
proc
.
subframe_prach
,
IF4p5_PRACH
);
#if 0
if (dB_fixed(en0)>30) {
en = dB_fixed(signal_energy(&rxsigF[0][k],840));
// if (en>60)
printf("PRACH (if4p5), k %d, n_ra_prb %d: Frame %d, Subframe %d => %d dB\n",k,n_ra_prb,ru->proc.frame_rx,ru->proc.subframe_rx,en);
write_output("rxsigF.m","prach_rxF",rxsigF[0],12288,1,1);
exit(-1);
}
#endif
return
;
}
else
if
(
eNB
!=
NULL
)
{
#if 0
en
=
dB_fixed
(
signal_energy
(
&
rxsigF
[
0
][
0
],
840
));
/*if (en>60)*/
printf("PRACH
: Frame %d, Subframe %d => %d dB\n",eNB->proc.frame_rx,eNB->proc.subframe_rx,en);
#ifdef PRACH_DEBUG
if
((
en
>
60
)
&&
(
br_flag
==
1
))
LOG_I
(
PHY
,
"PRACH (br_flag %d,ce_level %d, n_ra_prb %d, k %d)
: Frame %d, Subframe %d => %d dB
\n
"
,
br_flag
,
ce_level
,
n_ra_prb
,
k
,
eNB
->
proc
.
frame_rx
,
eNB
->
proc
.
subframe_rx
,
en
);
#endif
}
...
...
@@ -1506,6 +1513,10 @@ void rx_prach0(PHY_VARS_eNB *eNB,
*
max_preamble_energy
=
0
;
for
(
preamble_index
=
0
;
preamble_index
<
64
;
preamble_index
++
)
{
#ifdef PRACH_DEBUG
if
(
en
>
60
)
LOG_I
(
PHY
,
"frame %d, subframe %d : Trying preamble %d (br_flag %d)
\n
"
,
frame
,
subframe
,
preamble_index
,
br_flag
);
#endif
if
(
restricted_set
==
0
)
{
// This is the relative offset in the root sequence table (5.7.2-4 from 36.211) for the given preamble index
preamble_offset
=
((
NCS
==
0
)
?
preamble_index
:
(
preamble_index
/
(
N_ZC
/
NCS
)));
...
...
@@ -1589,7 +1600,8 @@ void rx_prach0(PHY_VARS_eNB *eNB,
// Compute DFT of RX signal (conjugate input, results in conjugate output) for each new rootSequenceIndex
#ifdef PRACH_DEBUG
LOG_I
(
PHY
,
"preamble index %d: offset %d, preamble shift %d
\n
"
,
preamble_index
,
preamble_offset
,
preamble_shift
);
if
(
en
>
60
)
LOG_I
(
PHY
,
"frame %d, subframe %d : preamble index %d: offset %d, preamble shift %d (br_flag %d, en %d)
\n
"
,
frame
,
subframe
,
preamble_index
,
preamble_offset
,
preamble_shift
,
br_flag
,
en
);
#endif
log2_ifft_size
=
10
;
fft_size
=
6144
;
...
...
@@ -1651,25 +1663,6 @@ void rx_prach0(PHY_VARS_eNB *eNB,
#endif
// if (aa=1) write_output("prach_rxF_comp1.m","prach_rxF_comp1",prachF,1024,1,1);
}
// antennas_rx
#ifdef PRACH_DEBUG
if
(
en
>
40
)
{
k
=
(
12
*
n_ra_prb
)
-
6
*
fp
->
N_RB_UL
;
if
(
k
<
0
)
k
+=
fp
->
ofdm_symbol_size
;
k
*=
12
;
k
+=
13
;
k
*=
2
;
printf
(
"Dumping prach, k = %d (n_ra_prb %d)
\n
"
,
k
,
n_ra_prb
);
write_output
(
"rxsigF.m"
,
"prach_rxF"
,
&
rxsigF
[
0
][
0
],
12288
,
1
,
1
);
write_output
(
"prach_rxF_comp0.m"
,
"prach_rxF_comp0"
,
prachF
,
1024
,
1
,
1
);
write_output
(
"Xu.m"
,
"xu"
,
Xu
,
N_ZC
,
1
,
1
);
write_output
(
"prach_ifft0.m"
,
"prach_t0"
,
prach_ifft
[
0
][
0
],
1024
,
1
,
1
);
exit
(
-
1
);
}
#endif
}
// new dft
// check energy in nth time shift, for
...
...
@@ -1679,22 +1672,58 @@ void rx_prach0(PHY_VARS_eNB *eNB,
eNB
->
frame_parms
.
prach_emtc_config_common
.
prach_ConfigInfo
.
prach_numRepetitionPerPreambleAttempt
[
ce_level
]))
#endif
{
#ifdef PRACH_DEBUG
if
(
en
>
60
)
LOG_I
(
PHY
,
"frame %d, subframe %d: Checking for peak in time-domain (br_flag %d, en %d)
\n
"
,
frame
,
subframe
,
br_flag
,
en
);
#endif
preamble_shift2
=
((
preamble_shift
==
0
)
?
0
:
((
preamble_shift
<<
log2_ifft_size
)
/
N_ZC
));
for
(
i
=
0
;
i
<
NCS2
;
i
++
)
{
lev
=
(
int32_t
)
prach_ifft
[(
preamble_shift2
+
i
)
<<
1
];
lev
=
(
int32_t
)
prach_ifft
[(
preamble_shift2
+
i
)];
levdB
=
dB_fixed_times10
(
lev
);
if
(
levdB
>*
max_preamble_energy
)
{
*
max_preamble_energy
=
levdB
;
*
max_preamble_delay
=
((
i
*
fft_size
)
>>
log2_ifft_size
)
*
update_TA
/
update_TA2
;
*
max_preamble
=
preamble_index
;
//#ifdef PRACH_DEBUG
if
((
en
>
60
)
&&
(
br_flag
==
1
))
LOG_I
(
PHY
,
"frame %d, subframe %d : max_preamble_energy %d, max_preamble_delay %d, max_preamble %d (br_flag %d,ce_level %d, levdB %d, lev %d)
\n
"
,
frame
,
subframe
,
*
max_preamble_energy
,
*
max_preamble_delay
,
*
max_preamble
,
br_flag
,
ce_level
,
levdB
,
lev
);
//#endif
}
}
}
}
// preamble_index
#ifdef PRACH_DEBUG
if
(
en
>
60
)
{
k
=
(
12
*
n_ra_prb
)
-
6
*
fp
->
N_RB_UL
;
if
(
k
<
0
)
k
+=
fp
->
ofdm_symbol_size
;
k
*=
12
;
k
+=
13
;
k
*=
2
;
if
(
br_flag
==
0
)
{
/*
write_output("rxsigF.m","prach_rxF",&rxsigF[0][0],12288,1,1);
write_output("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1);
write_output("Xu.m","xu",Xu,N_ZC,1,1);
write_output("prach_ifft0.m","prach_t0",prach_ifft,1024,1,1);*/
}
else
{
printf
(
"Dumping prach (br_flag %d), k = %d (n_ra_prb %d)
\n
"
,
br_flag
,
k
,
n_ra_prb
);
write_output
(
"rxsigF_br.m"
,
"prach_rxF_br"
,
&
rxsigF
[
0
][
0
],
12288
,
1
,
1
);
write_output
(
"prach_rxF_comp0_br.m"
,
"prach_rxF_comp0_br"
,
prachF
,
1024
,
1
,
1
);
write_output
(
"Xu_br.m"
,
"xu_br"
,
Xu
,
N_ZC
,
1
,
1
);
write_output
(
"prach_ifft0_br.m"
,
"prach_t0_br"
,
prach_ifft
,
1024
,
1
,
1
);
exit
(
-
1
);
}
}
#endif
if
(
eNB
)
stop_meas
(
&
eNB
->
rx_prach
);
}
...
...
openair1/SCHED/phy_procedures_lte_eNb.c
View file @
f3745444
...
...
@@ -705,7 +705,7 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,
LTE_eNB_DLSCH_t
*
dlsch
,
LTE_eNB_DLSCH_t
*
dlsch1
,
LTE_eNB_UE_stats
*
ue_stats
,
int
ra_flag
){
int
ra_flag
)
{
int
frame
=
proc
->
frame_tx
;
int
subframe
=
proc
->
subframe_tx
;
...
...
@@ -715,7 +715,8 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,
int
i
;
if
(
frame
<
20
)
{
LOG_I
(
PHY
,
LOG_D
(
PHY
,
"[eNB %"
PRIu8
"][PDSCH %"
PRIx16
"/%"
PRIu8
"] Frame %d, subframe %d: Generating PDSCH/DLSCH with input size = %"
PRIu16
", pdsch_start %d, G %d, nb_rb %"
PRIu16
", rb0 %x, rb1 %x, TBS %"
PRIu16
", pmi_alloc %"
PRIx64
", rv %"
PRIu8
" (round %"
PRIu8
")
\n
"
,
eNB
->
Mod_id
,
dlsch
->
rnti
,
harq_pid
,
frame
,
subframe
,
input_buffer_length
,
dlsch_harq
->
pdsch_start
,
...
...
@@ -953,16 +954,15 @@ handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
#ifdef Rel14
dlsch0
->
sib1_br_flag
=
0
;
if
((
rel13
->
pdsch_payload_type
<
2
)
&&
(
rel13
->
ue_type
>
0
))
{
// this is a BR/CE UE and SIB1-BR/SI-BR
if
((
rel13
->
pdsch_payload_type
<
2
)
&&
(
rel13
->
ue_type
>
0
))
{
// this is a BR/CE UE and SIB1-BR/SI-BR
dlsch0
->
rnti
=
0xFFFF
;
dlsch0
->
Kmimo
=
1
;
dlsch0
->
Mdlharq
=
4
;
dlsch0
->
Mdlharq
=
4
;
dlsch0
->
Nsoft
=
25344
;
dlsch0
->
i0
=
rel13
->
initial_transmission_sf_io
;
dlsch0_harq
->
pdsch_start
=
rel10
->
pdsch_start
;
if
(
rel13
->
pdsch_payload_type
==
0
)
dlsch0
->
sib1_br_flag
=
1
;
// configure PDSCH
...
...
@@ -991,8 +991,8 @@ handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
}
dlsch0
->
active
=
1
;
dlsch0_harq
->
nb_rb
=
6
;
dlsch0_harq
->
nb_rb
=
6
;
dlsch0_harq
->
vrb_type
=
LOCALIZED
;
dlsch0_harq
->
rvidx
=
rel8
->
redundancy_version
;
dlsch0_harq
->
Nl
=
1
;
...
...
@@ -1003,7 +1003,6 @@ handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
dlsch0_harq
->
TBS
=
rel8
->
length
<<
3
;
dlsch0_harq
->
Qm
=
rel8
->
modulation
;
dlsch0_harq
->
codeword
=
0
;
}
else
{
...
...
@@ -1019,7 +1018,15 @@ handle_nfapi_ul_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
nfapi_ul_config_request_pdu_t
*
ul_config_pdu
)
{
nfapi_ul_config_ulsch_pdu_rel8_t
*
rel8
=
&
ul_config_pdu
->
ulsch_pdu
.
ulsch_pdu_rel8
;
uint16_t
*
RIV2nb_rb_LUT
,
*
RIV2first_rb_LUT
;
uint16_t
RIV_max
;
uint16_t
use_srs
=
0
;
int8_t
UE_id
;
LTE_eNB_ULSCH_t
*
ulsch
;
LTE_UL_eNB_HARQ_t
*
ulsch_harq
;
// check if we have received a dci for this ue and ulsch descriptor is configured
if
(
ul_config_pdu
==
NFAPI_UL_CONFIG_ULSCH_PDU_TYPE
)
{
...
...
@@ -1027,6 +1034,80 @@ handle_nfapi_ul_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
"No existing UE ULSCH for rnti %x
\n
"
,
rel8
->
rnti
);
AssertFatal
(
eNB
->
ulsch
[
UE_id
]
->
harq_mask
>
0
,
"ulsch for UE_id %d is not active
\n
"
,
UE_id
);
LOG_I
(
PHY
,
"Applying UL config for UE %d, rnti %x
\n
"
,
UE_id
,
rel8
->
rnti
);
/*
#ifdef Rel14
nfapi_ul_config_ulsch_pdu_rel13_t *rel13 = &ul_config_pdu->ulsch_pdu.ulsch_pdu_rel13;
int harq_pid = rel8->harq_process_number;
if (rel13->ue_type > 0) { // This is a BL/CE UE, retrieve PUSCH programming
ulsch = eNB->ulsch[UE_id];
ulsch_harq = ulsch->harq_processes[harq_pid];
switch (eNB->frame_parms.N_RB_DL) {
case 6:
RIV2nb_rb_LUT = &RIV2nb_rb_LUT6[0];
RIV2first_rb_LUT = &RIV2first_rb_LUT6[0];
RIV_max = RIV_max6;
break;
case 25:
RIV2nb_rb_LUT = &RIV2nb_rb_LUT25[0];
RIV2first_rb_LUT = &RIV2first_rb_LUT25[0];
RIV_max = RIV_max25;
break;
case 50:
RIV2nb_rb_LUT = &RIV2nb_rb_LUT50[0];
RIV2first_rb_LUT = &RIV2first_rb_LUT50[0];
RIV_max = RIV_max50;
break;
case 100:
RIV2nb_rb_LUT = &RIV2nb_rb_LUT100[0];
RIV2first_rb_LUT = &RIV2first_rb_LUT100[0];
RIV_max = RIV_max100;
break;
default:
DevParam(frame_parms->N_RB_DL, harq_pid, 0);
break;
}
ulsch_harq->first_rb = rel8->resource_block_start;
ulsch_harq->nb_rb = rel8->number_of_resource_blocks;
ulsch_harq->O_RI = 0;//1;
ulsch_harq->Or2 = 0;
ulsch_harq->Or1 = 0;
ulsch_harq->O_ACK = 0;//2;
ulsch->beta_offset_cqi_times8 = 18;
ulsch->beta_offset_ri_times8 = 10;
ulsch->beta_offset_harqack_times8 = 16;
ulsch->rnti = rel8->rnti;
ulsch->harq_mask = 1<<harq_pid;
if (ulsch_harq->round == 0) {
ulsch_harq->status = ACTIVE;
ulsch_harq->rvidx = 0;
//ulsch_harq->TBS = dlsch_tbs25[ulsch_harq->mcs][ulsch_harq->nb_rb-1];
ulsch_harq->TBS = TBStable[get_I_TBS_UL(ulsch_harq->mcs)][ulsch_harq->nb_rb-1];
ulsch_harq->Msc_initial = 12*ulsch_harq->nb_rb;
ulsch_harq->Nsymb_initial = 9;
ulsch_harq->round = 0;
} else {
ulsch_harq->rvidx = 0;
ulsch_harq->round++;
}
use_srs = is_srs_occasion_common(frame_parms,ulsch_harq->frame,ulsch_harq->subframe);
ulsch_harq->Nsymb_pusch = 12-(frame_parms->Ncp<<1)-(use_srs==0?0:1);
ulsch_harq->srs_active = use_srs;
}
#endif
*/
}
else
if
(
ul_config_pdu
==
NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE
)
{
AssertFatal
((
UE_id
=
find_uci
(
rel8
->
rnti
,
proc
->
frame_tx
,
proc
->
subframe_tx
,
eNB
,
SEARCH_EXIST
))
>=
0
,
...
...
@@ -1034,19 +1115,19 @@ handle_nfapi_ul_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
handle_uci_harq_pdu
(
eNB
,
proc
,
ul_config_pdu
);
}
else
if
(
ul_config_pdu
==
NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE
)
{
}
else
if
(
ul_config_pdu
==
NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE
)
{
}
else
if
(
ul_config_pdu
==
NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE
)
{
}
else
if
(
ul_config_pdu
==
NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE
)
{
}
else
if
(
ul_config_pdu
==
NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE
)
{
}
}
...
...
@@ -1152,7 +1233,7 @@ void schedule_response(Sched_Rsp_t *Sched_INFO) {
dl_config_pdu
->
dlsch_pdu
.
dlsch_pdu_rel8
.
transport_blocks
-
1
,
TX_req
->
tx_request_body
.
tx_pdu_list
[
dl_config_pdu
->
dlsch_pdu
.
dlsch_pdu_rel8
.
pdu_index
].
segments
[
0
].
segment_data
);
if
(
dl_config_pdu
->
dlsch_pdu
.
dlsch_pdu_rel8
.
rnti
==
eNB
->
preamble_list
[
0
].
preamble_rel8
.
rnti
)
{
// is RAR pdu
LOG_I
(
PHY
,
"Frame %d, Subframe %d: Received LTE RAR pdu, programming based on UL Grant
\n
"
);
generate_eNB_ulsch_params_from_rar
(
eNB
,
TX_req
->
tx_request_body
.
tx_pdu_list
[
dl_config_pdu
->
dlsch_pdu
.
dlsch_pdu_rel8
.
pdu_index
].
segments
[
0
].
segment_data
,
frame
,
...
...
@@ -1198,7 +1279,7 @@ void schedule_response(Sched_Rsp_t *Sched_INFO) {
for
(
i
=
0
;
i
<
number_ul_pdu
;
i
++
)
{
ul_config_pdu
=
&
UL_req
->
ul_config_request_body
.
ul_config_pdu_list
[
i
];
LOG_
D
(
PHY
,
"NFAPI: ul_pdu %d : type %d
\n
"
,
i
,
ul_config_pdu
->
pdu_type
);
LOG_
I
(
PHY
,
"NFAPI: ul_pdu %d : type %d
\n
"
,
i
,
ul_config_pdu
->
pdu_type
);
AssertFatal
(
ul_config_pdu
->
pdu_type
==
NFAPI_UL_CONFIG_ULSCH_PDU_TYPE
||
ul_config_pdu
->
pdu_type
==
NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE
,
"Optional UL_PDU type %d not supported
\n
"
,
ul_config_pdu
->
pdu_type
);
...
...
@@ -1604,7 +1685,6 @@ void process_HARQ_feedback(uint8_t UE_id,
dl_subframe
=
ul_ACK_subframe2_dl_subframe
(
fp
,
subframe
,
m
);
if
(
dlsch
->
subframe_tx
[
dl_subframe
]
==
1
)
{
if
(
pusch_flag
==
1
)
mp
++
;
...
...
@@ -1627,7 +1707,7 @@ void process_HARQ_feedback(uint8_t UE_id,
LOG_D
(
PHY
,
"[eNB %d][PDSCH %x/%d] subframe %d, status %d, round %d (rv %d, TBS %d)
\n
"
,
eNB
->
Mod_id
,
dlsch
->
rnti
,
dl_harq_pid
[
m
],
dl_subframe
,
dlsch_harq_proc
->
status
,
dlsch_harq_proc
->
round
,
dlsch
->
harq_processes
[
dl_harq_pid
[
m
]]
->
rvidx
,
dlsch
->
harq_processes
[
dl_harq_pid
[
m
]]
->
rvidx
,
dlsch
->
harq_processes
[
dl_harq_pid
[
m
]]
->
TBS
);
if
(
dlsch_harq_proc
->
status
==
DISABLED
)
...
...
@@ -1891,10 +1971,16 @@ void prach_procedures(PHY_VARS_eNB *eNB,
if
(
br_flag
==
1
)
{
subframe
=
eNB
->
proc
.
subframe_prach_br
;
frame
=
eNB
->
proc
.
frame_prach_br
;
pthread_mutex_lock
(
&
eNB
->
UL_INFO_mutex
);
eNB
->
UL_INFO
.
rach_ind_br
.
number_of_preambles
=
0
;
pthread_mutex_unlock
(
&
eNB
->
UL_INFO_mutex
);
}
else
#endif
{
pthread_mutex_lock
(
&
eNB
->
UL_INFO_mutex
);
eNB
->
UL_INFO
.
rach_ind
.
number_of_preambles
=
0
;
pthread_mutex_unlock
(
&
eNB
->
UL_INFO_mutex
);
subframe
=
eNB
->
proc
.
subframe_prach
;
frame
=
eNB
->
proc
.
frame_prach
;
}
...
...
@@ -1907,6 +1993,8 @@ void prach_procedures(PHY_VARS_eNB *eNB,
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX
,
1
);
for
(
i
=
0
;
i
<
eNB
->
num_RU
;
i
++
)
{
ru
=
eNB
->
RU_list
[
i
];
for
(
ru_aa
=
0
,
aa
=
0
;
ru_aa
<
ru
->
nb_rx
;
ru_aa
++
,
aa
++
)
{
...
...
@@ -1932,13 +2020,13 @@ void prach_procedures(PHY_VARS_eNB *eNB,
#endif
);
//
#ifdef DEBUG_PHY_PROC
LOG_
D
(
PHY
,
"[RAPROC] Frame %d, subframe %d : Most likely preamble %d, energy %d dB delay %d
\n
"
,
#ifdef DEBUG_PHY_PROC
LOG_
I
(
PHY
,
"[RAPROC] Frame %d, subframe %d : Most likely preamble %d, energy %d dB delay %d
\n
"
,
frame
,
subframe
,
max_preamble
[
0
],
max_preamble_energy
[
0
],
max_preamble_energy
[
0
]
/
10
,
max_preamble_delay
[
0
]);
//
#endif
#endif
#ifdef Rel14
if
(
br_flag
==
1
)
{
...
...
@@ -1949,30 +2037,46 @@ void prach_procedures(PHY_VARS_eNB *eNB,
prach_mask
=
is_prach_subframe
(
&
eNB
->
frame_parms
,
eNB
->
proc
.
frame_prach_br
,
eNB
->
proc
.
subframe_prach_br
);
eNB
->
UL_INFO
.
rach_ind_br
.
preamble_list
=
eNB
->
preamble_list_br
;
int
ind
=
0
;
int
ce_level
=
0
;
/* Save for later, it doesn't work
for (int ind=0,ce_level=0;ce_level<4;ce_level++) {
if
((
prach_mask
&
(
1
<<
(
1
+
ce_level
))
>
0
)
&&
// prach is active and CE level has finished its repetitions
if ((eNB->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[ce_level]==1)&&
(prach_mask&(1<<(1+ce_level)) > 0) && // prach is active and CE level has finished its repetitions
(eNB->prach_vars_br.repetition_number[ce_level]==
eNB->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[ce_level])) {
if
(
max_preamble_energy
[
ind
]
>
580
)
{
eNB
->
UL_INFO
.
rach_ind_br
.
number_of_preambles
++
;
eNB
->
preamble_list_br
[
ind
].
preamble_rel8
.
timing_advance
=
max_preamble_delay
[
ind
];
//
eNB
->
preamble_list_br
[
ind
].
preamble_rel8
.
preamble
=
max_preamble
[
ind
];
// note: fid is implicitly 0 here, this is the rule for eMTC RA-RNTI from 36.321, Section 5.1.4
eNB
->
preamble_list_br
[
ind
].
preamble_rel8
.
rnti
=
1
+
subframe
+
(
eNB
->
prach_vars_br
.
first_frame
[
ce_level
]
%
40
);
eNB
->
preamble_list_br
[
ind
].
instance_length
=
0
;
//don't know exactly what this is
eNB
->
preamble_list_br
[
ind
].
preamble_rel13
.
rach_resource_type
=
1
+
ce_level
;
// CE Level
}
*/
if
(
eNB
->
frame_parms
.
prach_emtc_config_common
.
prach_ConfigInfo
.
prach_CElevel_enable
[
0
]
==
1
){
if
(
max_preamble_energy
[
0
]
>
350
)
{
eNB
->
UL_INFO
.
rach_ind_br
.
number_of_preambles
++
;
eNB
->
preamble_list_br
[
ind
].
preamble_rel8
.
timing_advance
=
max_preamble_delay
[
ind
];
//
eNB
->
preamble_list_br
[
ind
].
preamble_rel8
.
preamble
=
max_preamble
[
ind
];
// note: fid is implicitly 0 here, this is the rule for eMTC RA-RNTI from 36.321, Section 5.1.4
eNB
->
preamble_list_br
[
ind
].
preamble_rel8
.
rnti
=
1
+
subframe
+
(
eNB
->
prach_vars_br
.
first_frame
[
ce_level
]
%
40
);
eNB
->
preamble_list_br
[
ind
].
instance_length
=
0
;
//don't know exactly what this is
eNB
->
preamble_list_br
[
ind
].
preamble_rel13
.
rach_resource_type
=
1
+
ce_level
;
// CE Level
LOG_I
(
PHY
,
"Filling NFAPI indication for RACH %d CELevel %d (mask %x) : TA %d, Preamble %d, rnti %x, rach_resource_type %d
\n
"
,
ind
,
ce_level
,
prach_mask
,
eNB
->
preamble_list_br
[
ind
].
preamble_rel8
.
timing_advance
,
eNB
->
preamble_list_br
[
ind
].
preamble_rel8
.
preamble
,
eNB
->
preamble_list_br
[
ind
].
preamble_rel8
.
rnti
,
eNB
->
preamble_list_br
[
ind
].
preamble_rel13
.
rach_resource_type
);
}
/*
ind++;
}
}
// ce_level
} */
// ce_level
}
}
else
#endif
{
if
(
max_preamble_energy
[
0
]
>
58
0
)
{
if
(
max_preamble_energy
[
0
]
>
1000
0
)
{
LOG_D
(
PHY
,
"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure with preamble %d, energy %d.%d dB, delay %d
\n
"
,
eNB
->
Mod_id
,
...
...
@@ -2002,10 +2106,15 @@ void prach_procedures(PHY_VARS_eNB *eNB,
eNB
->
preamble_list
[
0
].
preamble_rel8
.
rnti
=
1
+
subframe
;
// note: fid is implicitly 0 here
eNB
->
preamble_list
[
0
].
preamble_rel13
.
rach_resource_type
=
0
;
eNB
->
preamble_list
[
0
].
instance_length
=
0
;
//don't know exactly what this is
LOG_I
(
PHY
,
"Filling NFAPI indication for RACH : TA %d, Preamble %d, rnti %x, rach_resource_type %d
\n
"
,
eNB
->
preamble_list
[
0
].
preamble_rel8
.
timing_advance
,
eNB
->
preamble_list
[
0
].
preamble_rel8
.
preamble
,
eNB
->
preamble_list
[
0
].
preamble_rel8
.
rnti
,
eNB
->
preamble_list
[
0
].
preamble_rel13
.
rach_resource_type
);
pthread_mutex_unlock
(
&
eNB
->
UL_INFO_mutex
);
}
}
// max_preamble_energy > 5
8
0
}
// max_preamble_energy >
3
50
}
// else br_flag
/*
mac_xface->initiate_ra_proc(eNB->Mod_id,
...
...
@@ -2494,7 +2603,6 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const
LOG_D
(
PHY
,
"[eNB %d] Frame %d: Doing phy_procedures_eNB_uespec_RX(%d)
\n
"
,
eNB
->
Mod_id
,
frame
,
subframe
);
#endif
eNB
->
rb_mask_ul
[
0
]
=
0
;
eNB
->
rb_mask_ul
[
1
]
=
0
;
eNB
->
rb_mask_ul
[
2
]
=
0
;
...
...
openair2/LAYER2/MAC/defs.h
View file @
f3745444
...
...
@@ -752,6 +752,15 @@ typedef struct {
#ifdef LOCALIZATION
eNB_UE_estimated_distances
distance
;
#endif
#ifdef Rel14
uint8_t
rach_resource_type
;
uint16_t
mpdcch_repetition_cnt
;
struct
PhysicalConfigDedicated
*
physicalConfigDedicated
;
frame_t
Msg2_frame
;
sub_frame_t
Msg2_subframe
;
#endif
}
UE_TEMPLATE
;
/*! \brief scheduling control information set through an API (not used)*/
...
...
@@ -852,6 +861,12 @@ typedef struct {
int16_t
timing_offset
;
/// Timeout for RRC connection
int16_t
RRC_timer
;
/// Msg3 first RB
uint8_t
msg3_first_rb
;
/// Msg3 number of RB
uint8_t
msg3_nb_rb
;
/// Msg3 MCS
uint8_t
msg3_mcs
;
/// Round of Msg3 HARQ
uint8_t
msg3_round
;
/// TBS used for Msg4
...
...
openair2/LAYER2/MAC/eNB_scheduler_RA.c
View file @
f3745444
This diff is collapsed.
Click to expand it.
openair2/LAYER2/MAC/eNB_scheduler_bch.c
View file @
f3745444
...
...
@@ -121,16 +121,16 @@ schedule_SIB1_BR(