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
4171dcc0
Commit
4171dcc0
authored
Jan 03, 2023
by
Maud Tribaudeau
Committed by
Laurent THOMAS
Dec 06, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add full tdd 6 - cleanup not used function
parent
c5aeaf03
Changes
14
Show whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
1965 additions
and
1013 deletions
+1965
-1013
openair1/PHY/INIT/lte_init.c
openair1/PHY/INIT/lte_init.c
+2
-2
openair1/PHY/LTE_TRANSPORT/dci_tools_common.c
openair1/PHY/LTE_TRANSPORT/dci_tools_common.c
+148
-104
openair1/PHY/LTE_TRANSPORT/phich.c
openair1/PHY/LTE_TRANSPORT/phich.c
+39
-22
openair1/PHY/LTE_TRANSPORT/phich_common.c
openair1/PHY/LTE_TRANSPORT/phich_common.c
+54
-80
openair1/SCHED/phy_procedures_lte_common.c
openair1/SCHED/phy_procedures_lte_common.c
+1198
-528
openair1/SCHED_UE/phy_procedures_lte_ue.c
openair1/SCHED_UE/phy_procedures_lte_ue.c
+58
-0
openair2/LAYER2/MAC/eNB_scheduler_RA.c
openair2/LAYER2/MAC/eNB_scheduler_RA.c
+3
-2
openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
+39
-3
openair2/LAYER2/MAC/eNB_scheduler_fairRR.c
openair2/LAYER2/MAC/eNB_scheduler_fairRR.c
+5
-0
openair2/LAYER2/MAC/eNB_scheduler_primitives.c
openair2/LAYER2/MAC/eNB_scheduler_primitives.c
+378
-263
openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
+27
-1
openair2/LAYER2/MAC/mac_proto.h
openair2/LAYER2/MAC/mac_proto.h
+0
-8
openair2/RRC/LTE/MESSAGES/asn1_msg.c
openair2/RRC/LTE/MESSAGES/asn1_msg.c
+8
-0
openair2/RRC/LTE/rrc_eNB.c
openair2/RRC/LTE/rrc_eNB.c
+6
-0
No files found.
openair1/PHY/INIT/lte_init.c
View file @
4171dcc0
...
...
@@ -414,8 +414,8 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
eNB
->
Mod_id
,
fp
->
N_RB_DL
,
fp
->
phich_config_common
.
phich_resource
,
fp
->
phich_config_common
.
phich_duration
);
crcTableInit
();
lte_gold
(
fp
,
eNB
->
lte_gold_table
,
fp
->
Nid_cell
);
generate_pcfich_reg_mapping
(
fp
);
generate_phich_reg_mapping
(
fp
);
generate_pcfich_reg_mapping
(
fp
);
generate_phich_reg_mapping
(
fp
);
init_sss
();
init_fde
();
...
...
openair1/PHY/LTE_TRANSPORT/dci_tools_common.c
View file @
4171dcc0
...
...
@@ -864,70 +864,90 @@ uint32_t get_rballoc(vrb_t vrb_type,uint16_t rb_alloc_dci)
}
// In TDD modes 1-5, each HarqPID is associated with a unique subframe and the number of harq processes equals the
// number of UL subframes. Modes 0 and 6 have more processes than UL subframes so HarqPID depends on sfn
uint8_t
subframe2harq_pid
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
uint32_t
frame
,
uint8_t
subframe
)
{
uint8_t
ret
=
255
;
if
(
frame_parms
->
frame_type
==
FDD
)
{
ret
=
(((
frame
*
10
)
+
subframe
)
&
7
);
ret
=
(((
frame
*
10
)
+
subframe
)
&
7
);
}
else
{
switch
(
frame_parms
->
tdd_config
)
{
uint32_t
cycle_idx
;
case
0
:
cycle_idx
=
7
-
frame
%
7
;
if
(
subframe
<
5
)
{
ret
=
(
cycle_idx
+
subframe
-
2
)
%
7
;
break
;
}
else
{
ret
=
(
cycle_idx
+
subframe
-
4
)
%
7
;
break
;
}
case
1
:
switch
(
subframe
)
{
case
2
:
case
3
:
ret
=
(
subframe
-
2
);
ret
=
(
subframe
-
2
);
break
;
case
7
:
case
8
:
ret
=
(
subframe
-
5
);
ret
=
(
subframe
-
5
);
break
;
default:
LOG_E
(
PHY
,
"subframe2_harq_pid, Illegal subframe %d for TDD mode %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
ret
=
(
255
);
LOG_E
(
PHY
,
"subframe2harq_pid, Illegal subframe %d for TDD mode %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
break
;
}
break
;
case
2
:
if
((
subframe
!=
2
)
&&
(
subframe
!=
7
))
{
LOG_E
(
PHY
,
"subframe2_
harq_pid, Illegal subframe %d for TDD mode %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
ret
=
255
;
}
else
ret
=
(
subframe
/
7
);
if
((
subframe
!=
2
)
&&
(
subframe
!=
7
))
{
LOG_E
(
PHY
,
"subframe2
harq_pid, Illegal subframe %d for TDD mode %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
break
;
}
else
ret
=
(
subframe
/
7
);
break
;
case
3
:
if
((
subframe
<
2
)
||
(
subframe
>
4
))
{
LOG_E
(
PHY
,
"subframe2_harq_pid, Illegal subframe %d for TDD mode %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
ret
=
(
255
)
;
}
else
ret
=
(
subframe
-
2
);
if
((
subframe
<
2
)
||
(
subframe
>
4
))
{
LOG_E
(
PHY
,
"subframe2harq_pid, Illegal subframe %d for TDD mode %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
break
;
}
else
ret
=
(
subframe
-
2
);
break
;
case
4
:
if
((
subframe
<
2
)
||
(
subframe
>
3
))
{
LOG_E
(
PHY
,
"subframe2_harq_pid, Illegal subframe %d for TDD mode %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
ret
=
(
255
)
;
}
else
ret
=
(
subframe
-
2
);
if
((
subframe
<
2
)
||
(
subframe
>
3
))
{
LOG_E
(
PHY
,
"subframe2harq_pid, Illegal subframe %d for TDD mode %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
break
;
}
else
ret
=
(
subframe
-
2
);
break
;
case
5
:
if
(
subframe
!=
2
)
{
LOG_E
(
PHY
,
"subframe2_harq_pid, Illegal subframe %d for TDD mode %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
ret
=
(
255
)
;
}
else
ret
=
(
subframe
-
2
);
if
(
subframe
!=
2
)
{
LOG_E
(
PHY
,
"subframe2harq_pid, Illegal subframe %d for TDD mode %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
break
;
}
else
ret
=
(
subframe
-
2
);
break
;
case
6
:
cycle_idx
=
6
-
frame
%
6
;
if
(
subframe
<
5
)
{
ret
=
(
cycle_idx
+
subframe
-
2
)
%
6
;
break
;
}
else
{
ret
=
(
cycle_idx
+
subframe
-
4
)
%
6
;
break
;
}
default:
LOG_E
(
PHY
,
"subframe2_harq_pid, Unsupported TDD mode %d
\n
"
,
frame_parms
->
tdd_config
);
ret
=
(
255
)
;
LOG_E
(
PHY
,
"subframe2harq_pid, Unsupported TDD mode %d
\n
"
,
frame_parms
->
tdd_config
);
break
;
}
}
...
...
@@ -935,78 +955,102 @@ uint8_t subframe2harq_pid(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame,uint8_t
return
ret
;
}
uint8_t
pdcch_alloc2ul_subframe
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
uint8_t
n
)
// Application of K factor from 3GPP TS 36213, Table 8-2 for TDD. For FDD K = 4
uint8_t
pdcch_alloc2ul_subframe
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
uint8_t
subframe
)
{
uint8_t
ul_subframe
=
255
;
if
((
frame_parms
->
frame_type
==
TDD
)
&&
(
frame_parms
->
tdd_config
==
1
))
{
if
((
n
==
1
)
||
(
n
==
6
))
{
// tdd_config 0,1 SF 1,5
ul_subframe
=
((
n
+
6
)
%
10
);
}
else
if
((
n
==
4
)
||
(
n
==
9
))
{
ul_subframe
=
((
n
+
4
)
%
10
);
}
}
else
if
((
frame_parms
->
frame_type
==
TDD
)
&&
(
frame_parms
->
tdd_config
==
6
)
&&
((
n
==
0
)
||
(
n
==
1
)
||
(
n
==
5
)
||
(
n
==
6
)))
ul_subframe
=
((
n
+
7
)
%
10
);
else
if
((
frame_parms
->
frame_type
==
TDD
)
&&
(
frame_parms
->
tdd_config
==
6
)
&&
(
n
==
9
))
// tdd_config 6 SF 9
ul_subframe
=
((
n
+
5
)
%
10
);
else
ul_subframe
=
((
n
+
4
)
%
10
);
if
(
frame_parms
->
frame_type
==
TDD
)
{
switch
(
frame_parms
->
tdd_config
)
{
case
1
:
// TDD config 1 - DL subframes to grant PUSCH 1,6,4 and 9
if
((
subframe
==
1
)
||
(
subframe
==
6
))
{
ul_subframe
=
((
subframe
+
6
)
%
10
);
}
else
if
((
subframe
==
4
)
||
(
subframe
==
9
))
{
ul_subframe
=
((
subframe
+
4
)
%
10
);
}
break
;
case
6
:
// TDD config 6 - DL subframes to grant PUSCH 0,1,5,6 and 9
if
((
subframe
==
0
)
||
(
subframe
==
1
)
||
(
subframe
==
5
)
||
(
subframe
==
6
))
{
ul_subframe
=
((
subframe
+
7
)
%
10
);
}
else
if
(
subframe
==
9
)
{
ul_subframe
=
((
subframe
+
5
)
%
10
);
}
default:
break
;
}
}
else
// FDD
ul_subframe
=
((
subframe
+
4
)
%
10
);
if
(
(
subframe_select
(
frame_parms
,
ul_subframe
)
!=
SF_UL
)
&&
(
frame_parms
->
frame_type
==
TDD
))
return
(
255
);
if
((
subframe_select
(
frame_parms
,
ul_subframe
)
!=
SF_UL
)
&&
(
frame_parms
->
frame_type
==
TDD
))
return
(
255
);
LOG_D
(
PHY
,
"subframe %d: PUSCH subframe = %d
\n
"
,
n
,
ul_subframe
);
LOG_D
(
PHY
,
"subframe %d: PUSCH subframe = %d
\n
"
,
subframe
,
ul_subframe
);
return
ul_subframe
;
}
uint8_t
ul_subframe2pdcch_alloc_subframe
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
uint8_t
n
)
uint8_t
ul_subframe2pdcch_alloc_subframe
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
uint8_t
subframe
)
{
if
((
frame_parms
->
frame_type
==
TDD
)
&&
(
frame_parms
->
tdd_config
==
1
))
{
if
((
n
==
7
)
||
(
n
==
2
))
{
// tdd_config 0,1 SF 1,5
return
((
n
==
7
)
?
1
:
6
);
}
else
if
((
n
==
3
)
||
(
n
==
8
))
{
return
((
n
==
3
)
?
9
:
4
);
}
}
else
if
((
frame_parms
->
frame_type
==
TDD
)
&&
(
frame_parms
->
tdd_config
==
6
)
&&
((
n
==
7
)
||
(
n
==
8
)
||
(
n
==
2
)
||
(
n
==
3
)))
return
((
n
+
3
)
%
10
);
else
if
((
frame_parms
->
frame_type
==
TDD
)
&&
(
frame_parms
->
tdd_config
==
6
)
&&
(
n
==
4
))
// tdd_config 6 SF 9
return
(
9
);
else
return
((
n
+
6
)
%
10
);
if
(
frame_parms
->
frame_type
==
TDD
)
{
switch
(
frame_parms
->
tdd_config
)
{
case
0
:
// TDD config 0 - UL subframes where PUSCH has been allocated are 2,3,4,7,8 and 9
if
((
subframe
==
7
)
||
(
subframe
==
8
)
||
(
subframe
==
2
)
||
(
subframe
==
3
))
return
((
subframe
+
3
)
%
10
);
else
if
((
subframe
==
4
)
||
(
subframe
==
9
))
return
((
subframe
==
4
)
?
9
:
5
);
break
;
LOG_E
(
PHY
,
"%s %s:%i pdcch allocation error
\n
"
,
__FUNCTION__
,
__FILE__
,
__LINE__
);
case
1
:
// TDD config 1 - UL subframes where PUSCH has been allocated are 2,3,7 and 8
if
((
subframe
==
7
)
||
(
subframe
==
2
))
return
((
subframe
==
7
)
?
1
:
6
);
else
if
((
subframe
==
3
)
||
(
subframe
==
8
))
return
((
subframe
==
3
)
?
9
:
4
);
break
;
case
6
:
// TDD config 6 - UL subframes where PUSCH has been allocated are 2,3,4, 7 and 8
if
((
subframe
==
7
)
||
(
subframe
==
8
)
||
(
subframe
==
2
)
||
(
subframe
==
3
))
return
((
subframe
+
3
)
%
10
);
else
if
(
subframe
==
4
)
return
(
9
);
break
;
default:
break
;
}
}
else
// FDD
return
((
subframe
+
6
)
%
10
);
AssertFatal
(
false
,
"pdcch allocation error
\n
"
);
return
0
;
}
uint32_t
pdcch_alloc2ul_frame
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
uint32_t
frame
,
uint8_t
n
)
// Find frame (current or next one) for PUSCH allocation from DL subframe
uint32_t
pdcch_alloc2ul_frame
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
uint32_t
frame
,
uint8_t
subframe
)
{
uint32_t
ul_frame
;
uint32_t
ul_frame
=
0
;
if
(
frame_parms
->
frame_type
==
TDD
)
{
switch
(
frame_parms
->
tdd_config
)
{
case
1
:
// TDD config 1 - For DL subframes 6 and 9 we do to next Frame to allocate PUSCH
if
((
subframe
==
1
)
||
(
subframe
==
6
)
||
(
subframe
==
4
)
||
(
subframe
==
9
))
{
ul_frame
=
(
frame
+
(
subframe
<
5
?
0
:
1
));
}
break
;
if
((
frame_parms
->
frame_type
==
TDD
)
&&
(
frame_parms
->
tdd_config
==
1
)
&&
((
n
==
1
)
||
(
n
==
6
)
||
(
n
==
4
)
||
(
n
==
9
)))
{
// tdd_config 0,1 SF 1,5
ul_frame
=
(
frame
+
(
n
<
5
?
0
:
1
));
}
else
if
((
frame_parms
->
frame_type
==
TDD
)
&&
(
frame_parms
->
tdd_config
==
6
)
&&
((
n
==
0
)
||
(
n
==
1
)
||
(
n
==
5
)
||
(
n
==
6
)))
ul_frame
=
(
frame
+
(
n
>=
5
?
1
:
0
)
);
else
if
((
frame_parms
->
frame_type
==
TDD
)
&&
(
frame_parms
->
tdd_config
==
6
)
&&
(
n
==
9
))
// tdd_config 6 SF 9
ul_frame
=
(
frame
+
1
);
else
ul_frame
=
(
frame
+
(
n
>=
6
?
1
:
0
)
);
case
6
:
// TDD config 6 - For DL subframes 5, 6 and 9 we do to next Frame to allocate PUSCH
if
((
subframe
==
0
)
||
(
subframe
==
1
)
||
(
subframe
==
5
)
||
(
subframe
==
6
)
||
(
subframe
==
9
))
{
ul_frame
=
(
frame
+
(
subframe
>=
5
?
1
:
0
));
}
break
;
default:
AssertFatal
(
1
==
0
,
"TDD mode not supported %d"
,
frame_parms
->
tdd_config
);
break
;
}
}
else
// FDD
ul_frame
=
(
frame
+
(
subframe
>=
6
?
1
:
0
)
);
LOG_D
(
PHY
,
"frame %d subframe %d: PUSCH frame = %d
\n
"
,
frame
,
subframe
,
ul_frame
);
LOG_D
(
PHY
,
"frame %d subframe %d: PUSCH frame = %d
\n
"
,
frame
,
n
,
ul_frame
);
return
ul_frame
%
1024
;
}
...
...
openair1/PHY/LTE_TRANSPORT/phich.c
View file @
4171dcc0
...
...
@@ -723,6 +723,9 @@ void generate_phich_top(PHY_VARS_eNB *eNB,
if
(((
frame_parms
->
phich_config_common
.
phich_resource
*
frame_parms
->
N_RB_DL
)
%
48
)
>
0
)
Ngroup_PHICH
++
;
uint8_t
mi
=
get_mi
(
frame_parms
,
subframe
);
Ngroup_PHICH
*=
mi
;
if
(
frame_parms
->
Ncp
==
1
)
NSF_PHICH
=
2
;
...
...
@@ -750,23 +753,37 @@ void generate_phich_top(PHY_VARS_eNB *eNB,
LOG_E
(
PHY
,
"FATAL ERROR: illegal harq_pid, returning
\n
"
);
return
;
}
LOG_D
(
PHY
,
"[eNB %d][PUSCH %d] Frame %d subframe %d Generating PHICH, AMP %d ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d)
\n
"
,
eNB
->
Mod_id
,
harq_pid
,
proc
->
frame_tx
,
subframe
,
amp
,
ngroup_PHICH
,
Ngroup_PHICH
,
nseq_PHICH
,
LOG_D
(
PHY
,
"[eNB %d][PUSCH %d] Frame %d subframe %d Generating PHICH for PUSCH slot %d, AMP %d ngroup_PHICH %d/%d, nseq_PHICH %d : HI "
"%d, first_rb %d)
\n
"
,
eNB
->
Mod_id
,
harq_pid
,
proc
->
frame_tx
,
subframe
,
pusch_subframe
,
amp
,
ngroup_PHICH
,
Ngroup_PHICH
,
nseq_PHICH
,
phich
->
hi
,
phich
->
first_rb
);
T
(
T_ENB_PHY_PHICH
,
T_INT
(
eNB
->
Mod_id
),
T_INT
(
proc
->
frame_tx
),
T_INT
(
subframe
),
T
(
T_ENB_PHY_PHICH
,
T_INT
(
eNB
->
Mod_id
),
T_INT
(
proc
->
frame_tx
),
T_INT
(
subframe
),
T_INT
(
-
1
/* TODO: rnti */
),
T_INT
(
harq_pid
),
T_INT
(
Ngroup_PHICH
),
T_INT
(
NSF_PHICH
),
T_INT
(
ngroup_PHICH
),
T_INT
(
nseq_PHICH
),
T_INT
(
Ngroup_PHICH
),
T_INT
(
NSF_PHICH
),
T_INT
(
ngroup_PHICH
),
T_INT
(
nseq_PHICH
),
T_INT
(
phich
->
hi
),
T_INT
(
phich
->
first_rb
),
T_INT
(
phich
->
n_DMRS
));
generate_phich
(
frame_parms
,
amp
,
//
amp*2,
amp
,
//
amp*2,
nseq_PHICH
,
ngroup_PHICH
,
phich
->
hi
,
...
...
openair1/PHY/LTE_TRANSPORT/phich_common.c
View file @
4171dcc0
...
...
@@ -32,13 +32,12 @@
#include "PHY/defs_eNB.h"
// Refer to Table PHICH factor for TDD transmissions - 3GPP 36211, Table 6.9-1
uint8_t
get_mi
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
uint8_t
subframe
)
{
// for FeMBMS
if
(
frame_parms
->
FeMBMS_active
!=
0
){
return
(
0
);
}
if
(
frame_parms
->
FeMBMS_active
!=
0
)
return
(
0
);
// for FDD
if
(
frame_parms
->
frame_type
==
FDD
)
...
...
@@ -47,9 +46,12 @@ uint8_t get_mi(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe)
// for TDD
switch
(
frame_parms
->
tdd_config
)
{
case
0
:
if
((
subframe
==
0
)
||
(
subframe
==
5
))
return
(
2
);
else
return
(
1
);
if
((
subframe
==
0
)
||
(
subframe
==
5
))
{
return
2
;
}
else
if
((
subframe
==
1
)
||
(
subframe
==
6
))
{
return
1
;
}
else
return
0
;
break
;
...
...
@@ -89,7 +91,10 @@ uint8_t get_mi(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe)
break
;
case
6
:
return
(
1
);
if
((
subframe
==
0
)
||
(
subframe
==
1
)
||
(
subframe
==
5
)
||
(
subframe
==
6
)
||
(
subframe
==
9
))
return
1
;
else
return
0
;
break
;
default:
...
...
@@ -97,82 +102,51 @@ uint8_t get_mi(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe)
}
}
unsigned
char
subframe2_ul_harq
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
unsigned
char
subframe
)
{
if
(
frame_parms
->
frame_type
==
FDD
)
return
(
subframe
&
7
);
// Refer to 3GPP TS 36213, Table 8.3-1
// In therory, Frame is not needed for other TDD modes than 0 and 6
int
phich_frame2_pusch_frame
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
int
frame
,
int
subframe
)
{
int
pusch_frame
=
frame
;
if
(
frame_parms
->
frame_type
==
FDD
)
{
pusch_frame
=
subframe
<
4
?
frame
+
1023
:
frame
;
}
else
{
switch
(
frame_parms
->
tdd_config
)
{
case
0
:
if
((
subframe
==
0
)
||
(
subframe
==
5
)
||
(
subframe
==
7
))
pusch_frame
=
frame
+
1023
;
break
;
case
1
:
if
(
subframe
==
6
)
{
return
(
0
);
}
else
if
(
subframe
==
9
){
return
(
1
);
}
else
if
(
subframe
==
1
){
return
(
2
);
}
else
if
(
subframe
==
4
){
return
(
3
);
}
else
{
LOG_E
(
PHY
,
"phich.c: subframe2_ul_harq, illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
return
(
0
);
}
if
((
subframe
==
1
)
||
(
subframe
==
4
))
pusch_frame
=
frame
+
1023
;
break
;
case
2
:
if
(
subframe
==
3
)
{
return
(
1
);
}
else
if
(
subframe
==
8
){
return
(
0
);
}
else
{
LOG_E
(
PHY
,
"phich.c: subframe2_ul_harq, illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
return
(
0
);
}
if
(
subframe
==
3
)
pusch_frame
=
frame
+
1023
;
break
;
case
3
:
if
(
(
subframe
==
8
)
||
(
subframe
==
9
)
)
{
return
(
subframe
-
8
);
}
else
if
(
subframe
==
0
)
return
(
2
);
else
{
LOG_E
(
PHY
,
"phich.c: subframe2_ul_harq, illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
return
(
0
);
}
if
(
subframe
==
0
)
pusch_frame
=
frame
+
1023
;
break
;
case
4
:
if
(
(
subframe
==
8
)
||
(
subframe
==
9
)
)
{
return
(
subframe
-
8
);
}
else
{
LOG_E
(
PHY
,
"phich.c: subframe2_ul_harq, illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
return
(
0
);
}
break
;
case
5
:
break
;
case
6
:
if
((
subframe
==
0
)
||
(
subframe
==
1
)
||
(
subframe
==
5
))
pusch_frame
=
frame
+
1023
;
break
;
}
return
(
0
);
}
int
phich_frame2_pusch_frame
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
int
frame
,
int
subframe
)
{
int
pusch_frame
;
if
(
frame_parms
->
frame_type
==
FDD
)
{
pusch_frame
=
subframe
<
4
?
frame
+
1024
-
1
:
frame
;
}
else
{
// Note this is not true, but it doesn't matter, the frame number is irrelevant for TDD!
pusch_frame
=
(
frame
);
}
//LOG_D(PHY, "
frame %d subframe %d: PUSCH frame = %d\n", frame, subframe, pusch_frame);
LOG_D
(
PHY
,
"phich_frame2_pusch_frame
frame %d subframe %d: PUSCH frame = %d
\n
"
,
frame
,
subframe
,
pusch_frame
);
return
pusch_frame
%
1024
;
}
uint8_t
phich_subframe2_pusch_subframe
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
uint8_t
subframe
)
{
// Refer to 3GPP TS 36213, Table 8.3-1 - K factor application to find which PUSCH
// the PHICH will ACK/NACK
uint8_t
phich_subframe2_pusch_subframe
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
uint8_t
subframe
)
{
uint8_t
pusch_subframe
=
255
;
if
(
frame_parms
->
frame_type
==
FDD
)
...
...
@@ -181,13 +155,13 @@ uint8_t phich_subframe2_pusch_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t s
switch
(
frame_parms
->
tdd_config
)
{
case
0
:
if
(
subframe
==
0
)
pusch_subframe
=
(
3
)
;
pusch_subframe
=
4
;
else
if
(
subframe
==
5
)
{
pusch_subframe
=
(
8
)
;
pusch_subframe
=
9
;
}
else
if
(
subframe
==
6
)
pusch_subframe
=
(
2
)
;
pusch_subframe
=
2
;
else
if
(
subframe
==
1
)
pusch_subframe
=
(
7
)
;
pusch_subframe
=
7
;
else
{
AssertFatal
(
1
==
0
,
"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
...
...
openair1/SCHED/phy_procedures_lte_common.c
View file @
4171dcc0
...
...
@@ -40,22 +40,18 @@ void get_Msg3_alloc(LTE_DL_FRAME_PARMS *frame_parms,
unsigned
int
*
frame
,
unsigned
char
*
subframe
)
{
// Fill in other TDD Configuration!!!!
if
(
frame_parms
->
frame_type
==
FDD
)
{
*
subframe
=
current_subframe
+
6
;
*
subframe
=
current_subframe
+
6
;
if
(
*
subframe
>
9
)
{
*
subframe
=
*
subframe
-
10
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
if
(
*
subframe
>
9
)
{
*
subframe
=
*
subframe
-
10
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
}
else
{
*
frame
=
current_frame
;
*
frame
=
current_frame
;
}
}
else
{
// TDD
if
(
frame_parms
->
tdd_config
==
1
)
{
switch
(
current_subframe
)
{
case
0
:
*
subframe
=
7
;
*
frame
=
current_frame
;
...
...
@@ -63,82 +59,127 @@ void get_Msg3_alloc(LTE_DL_FRAME_PARMS *frame_parms,
case
4
:
*
subframe
=
2
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
break
;
case
5
:
*
subframe
=
2
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
break
;
case
9
:
*
subframe
=
7
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
break
;
}
}
else
if
(
frame_parms
->
tdd_config
==
3
)
{
}
else
if
(
frame_parms
->
tdd_config
==
2
)
{
switch
(
current_subframe
)
{
case
0
:
case
3
:
*
subframe
=
2
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
break
;
case
4
:
case
5
:
case
8
:
*
subframe
=
7
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
break
;
case
9
:
*
subframe
=
2
;
*
frame
=
(
current_frame
+
2
)
&
1023
;
break
;
}
}
else
if
(
frame_parms
->
tdd_config
==
3
)
{
switch
(
current_subframe
)
{
case
0
:
case
5
:
case
6
:
*
subframe
=
2
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
break
;
case
7
:
*
subframe
=
3
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
break
;
case
8
:
*
subframe
=
4
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
break
;
case
9
:
*
subframe
=
2
;
*
frame
=
(
current_frame
+
2
)
&
1023
;
*
frame
=
(
current_frame
+
2
)
&
1023
;
break
;
}
}
else
if
(
frame_parms
->
tdd_config
==
4
)
{
switch
(
current_subframe
)
{
case
0
:
case
4
:
case
5
:
case
6
:
*
subframe
=
2
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
break
;
case
7
:
*
subframe
=
3
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
break
;
case
8
:
case
9
:
*
subframe
=
2
;
*
frame
=
(
current_frame
+
2
)
&
1023
;
*
frame
=
(
current_frame
+
2
)
&
1023
;
break
;
}
}
else
if
(
frame_parms
->
tdd_config
==
5
)
{
switch
(
current_subframe
)
{
case
0
:
case
4
:
case
5
:
case
6
:
*
subframe
=
2
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
break
;
case
7
:
case
8
:
case
9
:
*
subframe
=
2
;
*
frame
=
(
current_frame
+
2
)
&
1023
;
*
frame
=
(
current_frame
+
2
)
&
1023
;
break
;
}
}
else
if
(
frame_parms
->
tdd_config
==
0
)
{
switch
(
current_subframe
)
{
case
0
:
*
subframe
=
7
;
*
frame
=
current_frame
;
break
;
case
5
:
*
subframe
=
2
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
break
;
}
}
else
if
(
frame_parms
->
tdd_config
==
6
)
{
switch
(
current_subframe
)
{
case
0
:
*
subframe
=
7
;
*
frame
=
current_frame
;
break
;
case
5
:
*
subframe
=
2
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
break
;
case
9
:
*
subframe
=
7
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
break
;
}
}
...
...
@@ -167,19 +208,62 @@ void get_Msg3_alloc_ret(LTE_DL_FRAME_PARMS *frame_parms,
// original PUSCH in 3, PHICH in 9, ret in 3
// original PUSCH in 7, PHICH in 1 (S), ret in 7
// original PUSCH in 8, PHICH in 4, ret in 8
*
frame
=
(
current_frame
+
1
)
&
1023
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
}
else
if
(
frame_parms
->
tdd_config
==
2
)
{
// original PUSCH in 2, PHICH in 8, ret in 2 next frame
// original PUSCH in 7, PHICH in 3, ret in 7 next frame
*
frame
=
(
current_frame
+
1
)
&
1023
;
}
else
if
(
frame_parms
->
tdd_config
==
3
)
{
// original PUSCH in 2, PHICH in 8, ret in 2 next frame
// original PUSCH in 3, PHICH in 9, ret in 3 next frame
// original PUSCH in 4, PHICH in 0, ret in 4 next frame
*
frame
=
(
current_frame
+
1
)
&
1023
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
}
else
if
(
frame_parms
->
tdd_config
==
4
)
{
// original PUSCH in 2, PHICH in 8, ret in 2 next frame
// original PUSCH in 3, PHICH in 9, ret in 3 next frame
*
frame
=
(
current_frame
+
1
)
&
1023
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
}
else
if
(
frame_parms
->
tdd_config
==
5
)
{
// original PUSCH in 2, PHICH in 8, ret in 2 next frame
*
frame
=
(
current_frame
+
1
)
&
1023
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
}
else
if
(
frame_parms
->
tdd_config
==
0
)
{
// original PUSCH in 2, PHICH in 6 ,ret in 2 next frame
// original PUSCH in 3, PHICH in 0 , ret in 4 next frame
// original PUSCH in 4, PHICH in 0 , ret in 4 next frame
// original PUSCH in 7, PHICH in 1 (S) ret in 7 next frame
// original PUSCH in 8, PHICH in 5 , ret in 9 next frame
// original PUSCH in 9, PHICH in 5, ret in 9 next frame
*
frame
=
(
current_frame
+
1
)
&
1023
;
if
((
*
subframe
==
3
)
||
(
*
subframe
==
8
))
{
*
subframe
=
((
*
subframe
==
3
)
?
4
:
9
);
}
}
else
if
(
frame_parms
->
tdd_config
==
6
)
{
// original PUSCH in 2, PHICH in 6 (S), ret in 3
// original PUSCH in 3, PHICH in 9, ret in 4
// original PUSCH in 4, PHICH in 0, ret in 7
// original PUSCH in 7, PHICH in 1 (S), ret in 8
// original PUSCH in 8, PHICH in 5, ret in 2 in two frames
*
frame
=
(
current_frame
+
1
)
&
1023
;
switch
(
*
subframe
)
{
case
2
:
*
subframe
=
3
;
break
;
case
3
:
*
subframe
=
4
;
break
;
case
4
:
*
subframe
=
7
;
break
;
case
7
:
*
subframe
=
8
;
break
;
case
8
:
*
subframe
=
2
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
break
;
default:
break
;
}
}
}
}
...
...
@@ -188,18 +272,31 @@ uint8_t get_Msg3_harq_pid(LTE_DL_FRAME_PARMS *frame_parms,
uint32_t
frame
,
unsigned
char
current_subframe
)
{
uint8_t
ul_subframe
=
0
;
uint32_t
ul_frame
=
0
;
uint8_t
ul_subframe
=
0
;
uint32_t
ul_frame
=
0
;
if
(
frame_parms
->
frame_type
==
FDD
)
{
ul_subframe
=
(
current_subframe
>
3
)
?
(
current_subframe
-
4
)
:
(
current_subframe
+
6
);
ul_frame
=
(
current_subframe
>
3
)
?
((
frame
+
1
)
&
1023
)
:
frame
;
if
(
frame_parms
->
frame_type
==
FDD
)
{
ul_subframe
=
(
current_subframe
>
3
)
?
(
current_subframe
-
4
)
:
(
current_subframe
+
6
);
ul_frame
=
(
current_subframe
>
3
)
?
((
frame
+
1
)
&
1023
)
:
frame
;
}
else
{
switch
(
frame_parms
->
tdd_config
)
{
case
1
:
case
0
:
switch
(
current_subframe
)
{
case
0
:
ul_subframe
=
7
;
ul_frame
=
frame
;
break
;
case
5
:
ul_subframe
=
2
;
ul_frame
=
(
frame
+
1
)
&
1023
;
break
;
}
break
;
case
1
:
switch
(
current_subframe
)
{
case
9
:
case
0
:
ul_subframe
=
7
;
...
...
@@ -209,14 +306,25 @@ uint8_t get_Msg3_harq_pid(LTE_DL_FRAME_PARMS *frame_parms,
case
7
:
ul_subframe
=
2
;
break
;
}
break
;
case
2
:
switch
(
current_subframe
)
{
case
8
:
ul_subframe
=
7
;
break
;
case
3
:
ul_subframe
=
2
;
break
;
}
break
;
case
3
:
switch
(
current_subframe
)
{
case
0
:
case
5
:
case
6
:
...
...
@@ -240,7 +348,6 @@ uint8_t get_Msg3_harq_pid(LTE_DL_FRAME_PARMS *frame_parms,
case
4
:
switch
(
current_subframe
)
{
case
0
:
case
5
:
case
6
:
...
...
@@ -257,174 +364,326 @@ uint8_t get_Msg3_harq_pid(LTE_DL_FRAME_PARMS *frame_parms,
break
;
case
5
:
ul_subframe
=
2
;
ul_subframe
=
2
;
break
;
default:
LOG_E
(
PHY
,
"get_Msg3_harq_pid: Unsupported TDD configuration %d
\n
"
,
frame_parms
->
tdd_config
);
AssertFatal
(
1
==
0
,
"get_Msg3_harq_pid: Unsupported TDD configuration"
);
case
6
:
switch
(
current_subframe
)
{
case
9
:
ul_subframe
=
7
;
ul_frame
=
(
frame
+
1
)
&
1023
;
break
;
case
0
:
ul_subframe
=
7
;
ul_frame
=
frame
;
break
;
case
5
:
ul_frame
=
(
frame
+
1
)
&
1023
;
ul_subframe
=
2
;
break
;
}
}
return
(
subframe2harq_pid
(
frame_parms
,
ul_frame
,
ul_subframe
))
;
break
;
default:
LOG_E
(
PHY
,
"get_Msg3_harq_pid: Unsupported TDD configuration %d
\n
"
,
frame_parms
->
tdd_config
);
return
255
;
}
}
return
(
subframe2harq_pid
(
frame_parms
,
ul_frame
,
ul_subframe
));
}
unsigned
char
ul_ACK_subframe2_dl_subframe
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
unsigned
char
subframe
,
unsigned
char
ACK_index
)
// Refer to Table Downlink association set index for TDD - 3GPP TS 36213, Table 10.1.3.1-1
// K factor application - subrame(UL) - K = DL subframe ACKed/NACKed
unsigned
char
ul_ACK_subframe2_dl_subframe
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
unsigned
char
subframe
,
unsigned
char
ACK_index
)
{
if
(
frame_parms
->
frame_type
==
FDD
)
{
return
((
subframe
<
4
)
?
subframe
+
6
:
subframe
-
4
);
return
((
subframe
<
4
)
?
subframe
+
6
:
subframe
-
4
);
}
else
{
switch
(
frame_parms
->
tdd_config
)
{
case
0
:
if
(
subframe
==
2
)
{
// ACK subframe 6
return
6
;
}
else
if
(
subframe
==
4
)
{
// ACK subframe 0
return
0
;
}
else
if
(
subframe
==
7
)
{
// ACK subframe 1
return
1
;
}
else
if
(
subframe
==
9
)
{
// ACK subframe 5
return
5
;
}
else
{
AssertFatal
(
1
==
0
,
"phy_procedures_lte_common.c/ul_ACK_subframe2_dl_subframe: illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
}
break
;
case
2
:
if
(
subframe
==
7
)
{
if
(
ACK_index
==
0
)
return
9
;
else
if
(
ACK_index
==
1
)
return
0
;
else
if
(
ACK_index
==
2
)
return
3
;
else
if
(
ACK_index
==
3
)
return
1
;
}
else
if
(
subframe
==
2
)
{
if
(
ACK_index
==
0
)
return
4
;
else
if
(
ACK_index
==
1
)
return
5
;
else
if
(
ACK_index
==
2
)
return
8
;
else
if
(
ACK_index
==
3
)
return
6
;
}
else
{
LOG_E
(
PHY
,
"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
return
0
;
}
break
;
case
3
:
if
(
subframe
==
2
)
{
// ACK subframes 5 and 6
if
(
ACK_index
==
2
)
return
(
1
)
;
if
(
ACK_index
==
2
)
return
1
;
return
(
5
+
ACK_index
);
return
(
5
+
ACK_index
);
}
else
if
(
subframe
==
3
)
{
// ACK subframes 7 and 8
return
(
7
+
ACK_index
);
// To be updated
return
(
7
+
ACK_index
);
// To be updated
}
else
if
(
subframe
==
4
)
{
// ACK subframes 9 and 0
return
((
9
+
ACK_index
)
%
10
);
return
((
9
+
ACK_index
)
%
10
);
}
else
{
LOG_E
(
PHY
,
"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
return
(
0
);
LOG_E
(
PHY
,
"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
return
0
;
}
break
;
case
4
:
if
(
subframe
==
2
)
{
// ACK subframes 0, 4 and 5
//
if (ACK_index==2)
//
if (ACK_index==2)
// return(1); TBC
if
(
ACK_index
==
2
)
return
(
0
)
;
if
(
ACK_index
==
2
)
return
0
;
return
(
4
+
ACK_index
);
return
(
4
+
ACK_index
);
}
else
if
(
subframe
==
3
)
{
// ACK subframes 6, 7 8 and 9
return
(
6
+
ACK_index
);
// To be updated
return
(
6
+
ACK_index
);
// To be updated
}
else
{
LOG_E
(
PHY
,
"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
return
(
0
);
LOG_E
(
PHY
,
"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
return
0
;
}
break
;
case
1
:
if
(
subframe
==
2
)
{
// ACK subframes 5 and 6
return
(
5
+
ACK_index
);
return
(
5
+
ACK_index
);
}
else
if
(
subframe
==
3
)
{
// ACK subframe 9
return
(
9
);
// To be updated
return
9
;
// To be updated
}
else
if
(
subframe
==
7
)
{
// ACK subframes 0 and 1
return
(
ACK_index
);
// To be updated
return
(
ACK_index
);
// To be updated
}
else
if
(
subframe
==
8
)
{
// ACK subframe 4
return
(
4
);
// To be updated
return
4
;
// To be updated
}
else
{
LOG_E
(
PHY
,
"phy_procedures_lte_common.c/ul_ACK_subframe2_dl_subframe: illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
return
(
0
);
AssertFatal
(
1
==
0
,
"phy_procedures_lte_common.c/ul_ACK_subframe2_dl_subframe: illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
}
break
;
case
6
:
if
(
subframe
==
2
)
{
// ACK subframe 5
return
5
;
}
else
if
(
subframe
==
3
)
{
// ACK subframe 6
return
6
;
}
else
if
(
subframe
==
4
)
{
// ACK subframe 9
return
9
;
}
else
if
(
subframe
==
7
)
{
// ACK subframe 0
return
0
;
}
else
if
(
subframe
==
8
)
{
// ACK subframe 1
return
1
;
}
else
{
AssertFatal
(
1
==
0
,
"phy_procedures_lte_common.c/ul_ACK_subframe2_dl_subframe: illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
}
break
;
}
}
return
(
0
)
;
return
0
;
}
int
ul_ACK_subframe2_dl_frame
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
int
frame
,
unsigned
char
subframe
,
unsigned
char
subframe_tx
)
// Refer to Table Downlink association set index for TDD - 3GPP TS 36213, Table 10.1.3.1-1
// Depending on subframe, we will return current frame or previous one
int
ul_ACK_subframe2_dl_frame
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
int
frame
,
unsigned
char
subframe
,
unsigned
char
subframe_tx
)
{
if
(
frame_parms
->
frame_type
==
FDD
)
{
return
(((
subframe_tx
>
subframe
)
?
frame
-
1
:
frame
)
+
1024
)
%
1024
;
return
(((
subframe_tx
>
subframe
)
?
frame
-
1
:
frame
)
+
1024
)
%
1024
;
}
else
{
switch
(
frame_parms
->
tdd_config
)
{
case
0
:
case
1
:
return
(((
subframe_tx
>
subframe
)
?
frame
-
1
:
frame
)
+
1024
)
%
1024
;
case
2
:
case
6
:
return
(((
subframe_tx
>
subframe
)
?
frame
-
1
:
frame
)
+
1024
)
%
1024
;
break
;
case
3
:
//TODO
if
((
subframe
==
4
)
&&
(
subframe_tx
==
0
))
return
(
frame
+
1024
)
%
1024
;
else
return
(
frame
-
1
+
1024
)
%
1024
;
break
;
case
4
:
//TODO
return
(
frame
-
1
+
1024
)
%
1024
;
break
;
case
5
:
if
((
subframe
==
2
)
&&
(
subframe_tx
==
9
))
return
(
frame
-
2
+
1024
)
%
1024
;
else
return
(
frame
-
1
+
1024
)
%
1024
;
break
;
}
}
return
(
0
);
return
0
;
}
unsigned
char
ul_ACK_subframe2_M
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
unsigned
char
subframe
)
// Return number of possible ACKed/NACKed cadidates in the subframe(UL)
unsigned
char
ul_ACK_subframe2_M
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
unsigned
char
subframe
)
{
if
(
frame_parms
->
frame_type
==
FDD
)
{
return
(
1
)
;
return
1
;
}
else
{
switch
(
frame_parms
->
tdd_config
)
{
case
0
:
return
1
;
// don't ACK special subframe for now
if
(
subframe
==
2
)
{
// ACK subframe 6
return
1
;
}
else
if
(
subframe
==
4
)
{
// ACK subframe 0
return
1
;
}
else
if
(
subframe
==
7
)
{
// ACK subframe 1*
printf
(
"%s:%d: TO BE UPDATED!!!!!!!
\n
"
,
__FILE__
,
__LINE__
);
return
0
;
// To be updated
}
else
if
(
subframe
==
9
)
{
// ACK subframe 5
return
1
;
}
else
{
AssertFatal
(
1
==
0
,
"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
return
0
;
}
break
;
case
6
:
if
(
subframe
==
2
||
subframe
==
3
||
subframe
==
4
||
subframe
==
7
||
subframe
==
8
)
{
return
1
;
}
else
{
AssertFatal
(
1
==
0
,
"phy_procedures_lte_common.c/ul_ACK_subframe2_M: illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
}
break
;
case
1
:
return
1
;
// don't ACK special subframe for now
if
(
subframe
==
2
)
{
// ACK subframes 5 and 6
return
(
2
)
;
return
2
;
}
else
if
(
subframe
==
3
)
{
// ACK subframe 9
return
(
1
);
// To be updated
return
1
;
// To be updated
}
else
if
(
subframe
==
7
)
{
// ACK subframes 0 and 1
return
(
2
);
// To be updated
return
2
;
// To be updated
}
else
if
(
subframe
==
8
)
{
// ACK subframe 4
return
(
1
);
// To be updated
return
1
;
// To be updated
}
else
{
AssertFatal
(
1
==
0
,
"phy_procedures_lte_common.c/ul_ACK_subframe2_M: illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
return
0
;
}
break
;
case
2
:
if
(
subframe
==
2
)
{
// ACK subframes 5 and 6
return
3
;
// To be updated
}
else
if
(
subframe
==
7
)
{
// ACK subframes 0 and 1
return
3
;
// To be updated
}
else
{
LOG_E
(
PHY
,
"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
return
(
0
);
AssertFatal
(
1
==
0
,
"phy_procedures_lte_common.c/ul_ACK_subframe2_M: illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
return
0
;
}
break
;
case
3
:
if
(
subframe
==
2
)
{
// ACK subframes 5 and 6
return
(
2
)
;
// should be 3
return
2
;
// should be 3
}
else
if
(
subframe
==
3
)
{
// ACK subframes 7 and 8
return
(
2
);
// To be updated
return
2
;
// To be updated
}
else
if
(
subframe
==
4
)
{
// ACK subframes 9 and 0
return
(
2
)
;
return
2
;
}
else
{
LOG_E
(
PHY
,
"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
return
(
0
);
AssertFatal
(
1
==
0
,
"phy_procedures_lte_common.c/ul_ACK_subframe2_M: illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
return
0
;
}
break
;
case
4
:
if
(
subframe
==
2
)
{
// ACK subframes 0,4 and 5
return
(
3
)
;
// should be 4
return
3
;
// should be 4
}
else
if
(
subframe
==
3
)
{
// ACK subframes 6,7,8 and 9
return
(
4
)
;
return
4
;
}
else
{
LOG_E
(
PHY
,
"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
return
(
0
);
AssertFatal
(
1
==
0
,
"phy_procedures_lte_common.c/ul_ACK_subframe2_M: illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
return
0
;
}
break
;
case
5
:
if
(
subframe
==
2
)
{
// ACK subframes 0,3,4,5,6,7,8 and 9
return
(
8
)
;
// should be 3
return
8
;
// should be 3
}
else
{
LOG_E
(
PHY
,
"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
return
(
0
);
AssertFatal
(
1
==
0
,
"phy_procedures_lte_common.c/ul_ACK_subframe2_M: illegal subframe %d for tdd_config %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
return
0
;
}
break
;
}
}
return
(
0
)
;
return
0
;
}
// This function implements table 10.1-1 of 36-213, p. 69
...
...
@@ -438,62 +697,142 @@ uint8_t get_reset_ack(LTE_DL_FRAME_PARMS *frame_parms,
uint8_t
cw_idx
,
uint8_t
do_reset
)
// 1 to reset ACK/NACK status : 0 otherwise
{
uint8_t
status
=
0
;
uint8_t
subframe_ul
=
0xff
,
subframe_dl0
=
0xff
,
subframe_dl1
=
0xff
,
subframe_dl2
=
0xff
,
subframe_dl3
=
0xff
;
uint8_t
status
=
0
;
uint8_t
subframe_ul
=
0xff
,
subframe_dl
[
4
]
=
{
0xff
,
0xff
,
0xff
,
0xff
}
;
// printf("get_ack: SF %d\n",subframe);
if
(
frame_parms
->
frame_type
==
FDD
)
{
if
(
subframe_tx
<
4
)
subframe_dl
0
=
subframe_tx
+
6
;
subframe_dl
[
0
]
=
subframe_tx
+
6
;
else
subframe_dl
0
=
subframe_tx
-
4
;
subframe_dl
[
0
]
=
subframe_tx
-
4
;
o_ACK
[
cw_idx
]
=
harq_ack
[
subframe_dl
0
].
ack
;
status
=
harq_ack
[
subframe_dl
0
].
send_harq_status
;
o_ACK
[
cw_idx
]
=
harq_ack
[
subframe_dl
[
0
]
].
ack
;
status
=
harq_ack
[
subframe_dl
[
0
]
].
send_harq_status
;
LOG_D
(
PHY
,
"dl subframe %d send_harq_status %d cw_idx %d, reset %d
\n
"
,
subframe_dl0
,
status
,
cw_idx
,
do_reset
);
if
(
do_reset
)
harq_ack
[
subframe_dl0
].
send_harq_status
=
0
;
//printf("get_ack: Getting ACK/NAK for PDSCH (subframe %d) => %d\n",subframe_dl,o_ACK[0]);
LOG_D
(
PHY
,
"dl subframe %d send_harq_status %d cw_idx %d, reset %d
\n
"
,
subframe_dl
[
0
]
,
status
,
cw_idx
,
do_reset
);
if
(
do_reset
)
harq_ack
[
subframe_dl
[
0
]
].
send_harq_status
=
0
;
//
printf("get_ack: Getting ACK/NAK for PDSCH (subframe %d) => %d\n",subframe_dl,o_ACK[0]);
}
else
{
switch
(
frame_parms
->
tdd_config
)
{
case
0
:
if
(
subframe_tx
==
2
)
{
// ACK subframe 6
subframe_ul
=
2
;
subframe_dl
[
0
]
=
6
;
subframe_dl
[
1
]
=
0xff
;
}
else
if
(
subframe_tx
==
3
)
{
// nothing
subframe_ul
=
0xff
;
subframe_dl
[
0
]
=
0xff
;
// invalid subframe number indicates ACK/NACK is not needed
subframe_dl
[
1
]
=
0xff
;
}
else
if
(
subframe_tx
==
4
)
{
// ACK subframe 0
subframe_ul
=
4
;
subframe_dl
[
0
]
=
0
;
subframe_dl
[
1
]
=
0xff
;
}
else
if
(
subframe_tx
==
7
)
{
// ACK subframes 1
subframe_ul
=
7
;
subframe_dl
[
0
]
=
1
;
subframe_dl
[
1
]
=
0xff
;
}
else
if
(
subframe_tx
==
8
)
{
// nothing
subframe_ul
=
0xff
;
subframe_dl
[
0
]
=
0xff
;
// invalid subframe number indicates ACK/NACK is not needed
subframe_dl
[
1
]
=
0xff
;
}
else
if
(
subframe_tx
==
9
)
{
// ACK subframes 5
subframe_ul
=
9
;
subframe_dl
[
0
]
=
5
;
subframe_dl
[
1
]
=
0xff
;
}
else
{
LOG_E
(
PHY
,
"phy_procedures_lte.c: get_ack, illegal subframe_tx %d for tdd_config %d
\n
"
,
subframe_tx
,
frame_parms
->
tdd_config
);
return
0
;
}
// report ACK/NACK status
o_ACK
[
cw_idx
]
=
1
;
status
=
0
;
if
((
subframe_dl
[
0
]
<
10
)
&&
(
harq_ack
[
subframe_dl
[
0
]].
send_harq_status
))
{
o_ACK
[
cw_idx
]
&=
harq_ack
[
subframe_dl
[
0
]].
ack
;
status
+=
harq_ack
[
subframe_dl
[
0
]].
send_harq_status
;
}
if
((
subframe_dl
[
1
]
<
10
)
&&
(
harq_ack
[
subframe_dl
[
1
]].
send_harq_status
))
{
o_ACK
[
cw_idx
]
&=
harq_ack
[
subframe_dl
[
1
]].
ack
;
status
+=
harq_ack
[
subframe_dl
[
1
]].
send_harq_status
;
}
// report status = Nbundled
if
(
!
status
)
{
o_ACK
[
cw_idx
]
=
0
;
}
else
{
if
(
harq_ack
[
subframe_ul
].
vDAI_UL
<
0xff
)
{
status
+=
harq_ack
[
subframe_ul
].
vDAI_UL
;
}
}
// reset ACK/NACK status
if
(
do_reset
)
{
LOG_D
(
PHY
,
"ul-sf#%d ACK/NACK status resetting @ dci0-sf#%d, dci1x/2x-sf#%d, dci1x/2x-sf#%d
\n
"
,
subframe_tx
,
subframe_ul
,
subframe_dl
[
0
],
subframe_dl
[
1
]);
if
(
subframe_ul
<
10
)
{
harq_ack
[
subframe_ul
].
vDAI_UL
=
0xff
;
}
if
(
subframe_dl
[
0
]
<
10
)
{
harq_ack
[
subframe_dl
[
0
]].
vDAI_DL
=
0xff
;
harq_ack
[
subframe_dl
[
0
]].
ack
=
2
;
harq_ack
[
subframe_dl
[
0
]].
send_harq_status
=
0
;
}
if
(
subframe_dl
[
1
]
<
10
)
{
harq_ack
[
subframe_dl
[
1
]].
vDAI_DL
=
0xff
;
harq_ack
[
subframe_dl
[
1
]].
ack
=
2
;
harq_ack
[
subframe_dl
[
1
]].
send_harq_status
=
0
;
}
}
break
;
case
1
:
if
(
subframe_tx
==
2
)
{
// ACK subframes 5,6
subframe_ul
=
6
;
subframe_dl0
=
5
;
subframe_dl1
=
6
;
subframe_dl
[
0
]
=
5
;
subframe_dl
[
1
]
=
6
;
}
else
if
(
subframe_tx
==
3
)
{
// ACK subframe 9
subframe_ul
=
9
;
subframe_dl0
=
9
;
subframe_dl1
=
0xff
;
subframe_dl
[
0
]
=
9
;
subframe_dl
[
1
]
=
0xff
;
}
else
if
(
subframe_tx
==
4
)
{
// nothing
subframe_ul
=
0xff
;
subframe_dl0
=
0xff
;
// invalid subframe number indicates ACK/NACK is not needed
subframe_dl1
=
0xff
;
subframe_dl
[
0
]
=
0xff
;
// invalid subframe number indicates ACK/NACK is not needed
subframe_dl
[
1
]
=
0xff
;
}
else
if
(
subframe_tx
==
7
)
{
// ACK subframes 0,1
subframe_ul
=
1
;
subframe_dl0
=
0
;
subframe_dl1
=
1
;
subframe_dl
[
0
]
=
0
;
subframe_dl
[
1
]
=
1
;
}
else
if
(
subframe_tx
==
8
)
{
// ACK subframes 4
subframe_ul
=
4
;
subframe_dl0
=
4
;
subframe_dl1
=
0xff
;
subframe_dl
[
0
]
=
4
;
subframe_dl
[
1
]
=
0xff
;
}
else
{
LOG_E
(
PHY
,
"phy_procedures_lte.c: get_ack, illegal subframe_tx %d for tdd_config %d
\n
"
,
subframe_tx
,
frame_parms
->
tdd_config
);
return
(
0
);
LOG_E
(
PHY
,
"phy_procedures_lte.c: get_ack, illegal subframe_tx %d for tdd_config %d
\n
"
,
subframe_tx
,
frame_parms
->
tdd_config
);
return
0
;
}
// report ACK/NACK status
o_ACK
[
cw_idx
]
=
1
;
status
=
0
;
if
((
subframe_dl0
<
10
)
&&
(
harq_ack
[
subframe_dl0
].
send_harq_status
))
{
o_ACK
[
cw_idx
]
&=
harq_ack
[
subframe_dl0
].
ack
;
status
=
harq_ack
[
subframe_dl0
].
send_harq_status
;
if
((
subframe_dl
[
0
]
<
10
)
&&
(
harq_ack
[
subframe_dl
[
0
]
].
send_harq_status
))
{
o_ACK
[
cw_idx
]
&=
harq_ack
[
subframe_dl
[
0
]
].
ack
;
status
=
harq_ack
[
subframe_dl
[
0
]
].
send_harq_status
;
}
if
((
subframe_dl1
<
10
)
&&
(
harq_ack
[
subframe_dl1
].
send_harq_status
))
{
o_ACK
[
cw_idx
]
&=
harq_ack
[
subframe_dl1
].
ack
;
status
=
harq_ack
[
subframe_dl1
].
send_harq_status
;
if
((
subframe_dl
[
1
]
<
10
)
&&
(
harq_ack
[
subframe_dl
[
1
]
].
send_harq_status
))
{
o_ACK
[
cw_idx
]
&=
harq_ack
[
subframe_dl
[
1
]
].
ack
;
status
=
harq_ack
[
subframe_dl
[
1
]
].
send_harq_status
;
}
// report status = Nbundled
if
(
!
status
)
{
...
...
@@ -505,40 +844,205 @@ uint8_t get_reset_ack(LTE_DL_FRAME_PARMS *frame_parms,
}
if
(
!
do_reset
&&
(
subframe_ul
<
10
))
{
if
((
subframe_dl0
<
10
)
&&
(
subframe_dl1
<
10
))
{
LOG_D
(
PHY
,
"ul-sf#%d vDAI_UL[sf#%d]=%d Nbundled=%d: dlsf#%d ACK=%d harq_status=%d vDAI_DL=%d, dlsf#%d ACK=%d harq_status=%d vDAI_DL=%d, o_ACK[0]=%d status=%d
\n
"
,
subframe_tx
,
subframe_ul
,
harq_ack
[
subframe_ul
].
vDAI_UL
,
status
,
subframe_dl0
,
harq_ack
[
subframe_dl0
].
ack
,
harq_ack
[
subframe_dl0
].
send_harq_status
,
harq_ack
[
subframe_dl0
].
vDAI_DL
,
subframe_dl1
,
harq_ack
[
subframe_dl1
].
ack
,
harq_ack
[
subframe_dl1
].
send_harq_status
,
harq_ack
[
subframe_dl1
].
vDAI_DL
,
o_ACK
[
cw_idx
],
status
);
}
else
if
(
subframe_dl0
<
10
)
{
LOG_D
(
PHY
,
"ul-sf#%d vDAI_UL[sf#%d]=%d Nbundled=%d: dlsf#%d ACK=%d status=%d vDAI_DL=%d, o_ACK[0]=%d status=%d
\n
"
,
subframe_tx
,
subframe_ul
,
harq_ack
[
subframe_ul
].
vDAI_UL
,
status
,
subframe_dl0
,
harq_ack
[
subframe_dl0
].
ack
,
harq_ack
[
subframe_dl0
].
send_harq_status
,
harq_ack
[
subframe_dl0
].
vDAI_DL
,
o_ACK
[
cw_idx
],
status
);
}
else
if
(
subframe_dl1
<
10
)
{
LOG_D
(
PHY
,
"ul-sf#%d vDAI_UL[sf#%d]=%d Nbundled=%d: dlsf#%d ACK=%d status=%d vDAI_DL=%d, o_ACK[0]=%d status=%d
\n
"
,
subframe_tx
,
subframe_ul
,
harq_ack
[
subframe_ul
].
vDAI_UL
,
status
,
subframe_dl1
,
harq_ack
[
subframe_dl1
].
ack
,
harq_ack
[
subframe_dl1
].
send_harq_status
,
harq_ack
[
subframe_dl1
].
vDAI_DL
,
o_ACK
[
cw_idx
],
status
);
if
((
subframe_dl
[
0
]
<
10
)
&&
(
subframe_dl
[
1
]
<
10
))
{
LOG_D
(
PHY
,
"ul-sf#%d vDAI_UL[sf#%d]=%d Nbundled=%d: dlsf#%d ACK=%d harq_status=%d vDAI_DL=%d, dlsf#%d ACK=%d harq_status=%d "
"vDAI_DL=%d, o_ACK[0]=%d status=%d
\n
"
,
subframe_tx
,
subframe_ul
,
harq_ack
[
subframe_ul
].
vDAI_UL
,
status
,
subframe_dl
[
0
],
harq_ack
[
subframe_dl
[
0
]].
ack
,
harq_ack
[
subframe_dl
[
0
]].
send_harq_status
,
harq_ack
[
subframe_dl
[
0
]].
vDAI_DL
,
subframe_dl
[
1
],
harq_ack
[
subframe_dl
[
1
]].
ack
,
harq_ack
[
subframe_dl
[
1
]].
send_harq_status
,
harq_ack
[
subframe_dl
[
1
]].
vDAI_DL
,
o_ACK
[
cw_idx
],
status
);
}
else
if
(
subframe_dl
[
0
]
<
10
)
{
LOG_D
(
PHY
,
"ul-sf#%d vDAI_UL[sf#%d]=%d Nbundled=%d: dlsf#%d ACK=%d status=%d vDAI_DL=%d, o_ACK[0]=%d status=%d
\n
"
,
subframe_tx
,
subframe_ul
,
harq_ack
[
subframe_ul
].
vDAI_UL
,
status
,
subframe_dl
[
0
],
harq_ack
[
subframe_dl
[
0
]].
ack
,
harq_ack
[
subframe_dl
[
0
]].
send_harq_status
,
harq_ack
[
subframe_dl
[
0
]].
vDAI_DL
,
o_ACK
[
cw_idx
],
status
);
}
else
if
(
subframe_dl
[
1
]
<
10
)
{
LOG_D
(
PHY
,
"ul-sf#%d vDAI_UL[sf#%d]=%d Nbundled=%d: dlsf#%d ACK=%d status=%d vDAI_DL=%d, o_ACK[0]=%d status=%d
\n
"
,
subframe_tx
,
subframe_ul
,
harq_ack
[
subframe_ul
].
vDAI_UL
,
status
,
subframe_dl
[
1
],
harq_ack
[
subframe_dl
[
1
]].
ack
,
harq_ack
[
subframe_dl
[
1
]].
send_harq_status
,
harq_ack
[
subframe_dl
[
1
]].
vDAI_DL
,
o_ACK
[
cw_idx
],
status
);
}
}
// reset ACK/NACK status
if
(
do_reset
)
{
LOG_D
(
PHY
,
"ul-sf#%d ACK/NACK status resetting @ dci0-sf#%d, dci1x/2x-sf#%d, dci1x/2x-sf#%d
\n
"
,
subframe_tx
,
subframe_ul
,
subframe_dl0
,
subframe_dl1
);
LOG_D
(
PHY
,
"ul-sf#%d ACK/NACK status resetting @ dci0-sf#%d, dci1x/2x-sf#%d, dci1x/2x-sf#%d
\n
"
,
subframe_tx
,
subframe_ul
,
subframe_dl
[
0
],
subframe_dl
[
1
]);
if
(
subframe_ul
<
10
)
{
harq_ack
[
subframe_ul
].
vDAI_UL
=
0xff
;
}
if
(
subframe_dl0
<
10
)
{
harq_ack
[
subframe_dl0
].
vDAI_DL
=
0xff
;
harq_ack
[
subframe_dl0
].
ack
=
2
;
harq_ack
[
subframe_dl0
].
send_harq_status
=
0
;
if
(
subframe_dl
[
0
]
<
10
)
{
harq_ack
[
subframe_dl
[
0
]
].
vDAI_DL
=
0xff
;
harq_ack
[
subframe_dl
[
0
]
].
ack
=
2
;
harq_ack
[
subframe_dl
[
0
]
].
send_harq_status
=
0
;
}
if
(
subframe_dl1
<
10
)
{
harq_ack
[
subframe_dl1
].
vDAI_DL
=
0xff
;
harq_ack
[
subframe_dl1
].
ack
=
2
;
harq_ack
[
subframe_dl1
].
send_harq_status
=
0
;
if
(
subframe_dl
[
1
]
<
10
)
{
harq_ack
[
subframe_dl
[
1
]].
vDAI_DL
=
0xff
;
harq_ack
[
subframe_dl
[
1
]].
ack
=
2
;
harq_ack
[
subframe_dl
[
1
]].
send_harq_status
=
0
;
}
}
break
;
case
2
:
if
(
subframe_tx
==
2
)
{
// ACK subframes 5,6
subframe_ul
=
8
;
subframe_dl
[
0
]
=
4
;
subframe_dl
[
1
]
=
5
;
subframe_dl
[
2
]
=
8
;
subframe_dl
[
3
]
=
6
;
}
else
if
(
subframe_tx
==
7
)
{
// ACK subframes 0,1
subframe_ul
=
3
;
subframe_dl
[
0
]
=
9
;
subframe_dl
[
1
]
=
0
;
subframe_dl
[
2
]
=
3
;
subframe_dl
[
3
]
=
1
;
}
else
{
LOG_E
(
PHY
,
"phy_procedures_lte.c: get_ack, illegal subframe_tx %d for tdd_config %d
\n
"
,
subframe_tx
,
frame_parms
->
tdd_config
);
return
0
;
}
// report ACK/NACK status
o_ACK
[
cw_idx
]
=
1
;
status
=
0
;
if
((
subframe_dl
[
0
]
<
10
)
&&
(
harq_ack
[
subframe_dl
[
0
]].
send_harq_status
))
{
o_ACK
[
cw_idx
]
&=
harq_ack
[
subframe_dl
[
0
]].
ack
;
status
=
harq_ack
[
subframe_dl
[
0
]].
send_harq_status
;
}
if
((
subframe_dl
[
1
]
<
10
)
&&
(
harq_ack
[
subframe_dl
[
1
]].
send_harq_status
))
{
o_ACK
[
cw_idx
]
&=
harq_ack
[
subframe_dl
[
1
]].
ack
;
status
=
harq_ack
[
subframe_dl
[
1
]].
send_harq_status
;
}
if
((
subframe_dl
[
2
]
<
10
)
&&
(
harq_ack
[
subframe_dl
[
2
]].
send_harq_status
))
{
o_ACK
[
cw_idx
]
&=
harq_ack
[
subframe_dl
[
2
]].
ack
;
status
=
harq_ack
[
subframe_dl
[
2
]].
send_harq_status
;
}
if
((
subframe_dl
[
3
]
<
10
)
&&
(
harq_ack
[
subframe_dl
[
3
]].
send_harq_status
))
{
o_ACK
[
cw_idx
]
&=
harq_ack
[
subframe_dl
[
3
]].
ack
;
status
=
harq_ack
[
subframe_dl
[
3
]].
send_harq_status
;
}
// report status = Nbundled
if
(
!
status
)
{
o_ACK
[
cw_idx
]
=
0
;
}
else
{
if
(
harq_ack
[
subframe_ul
].
vDAI_UL
<
0xff
)
{
status
=
harq_ack
[
subframe_ul
].
vDAI_UL
;
}
}
if
(
!
do_reset
&&
(
subframe_ul
<
10
))
{
// TODO
if
((
subframe_dl
[
0
]
<
10
)
&&
(
subframe_dl
[
1
]
<
10
))
{
LOG_D
(
PHY
,
"ul-sf#%d vDAI_UL[sf#%d]=%d Nbundled=%d: dlsf#%d ACK=%d harq_status=%d vDAI_DL=%d, dlsf#%d ACK=%d harq_status=%d "
"vDAI_DL=%d, o_ACK[0]=%d status=%d
\n
"
,
subframe_tx
,
subframe_ul
,
harq_ack
[
subframe_ul
].
vDAI_UL
,
status
,
subframe_dl
[
0
],
harq_ack
[
subframe_dl
[
0
]].
ack
,
harq_ack
[
subframe_dl
[
0
]].
send_harq_status
,
harq_ack
[
subframe_dl
[
0
]].
vDAI_DL
,
subframe_dl
[
1
],
harq_ack
[
subframe_dl
[
1
]].
ack
,
harq_ack
[
subframe_dl
[
1
]].
send_harq_status
,
harq_ack
[
subframe_dl
[
1
]].
vDAI_DL
,
o_ACK
[
cw_idx
],
status
);
}
else
if
(
subframe_dl
[
0
]
<
10
)
{
LOG_D
(
PHY
,
"ul-sf#%d vDAI_UL[sf#%d]=%d Nbundled=%d: dlsf#%d ACK=%d status=%d vDAI_DL=%d, o_ACK[0]=%d status=%d
\n
"
,
subframe_tx
,
subframe_ul
,
harq_ack
[
subframe_ul
].
vDAI_UL
,
status
,
subframe_dl
[
0
],
harq_ack
[
subframe_dl
[
0
]].
ack
,
harq_ack
[
subframe_dl
[
0
]].
send_harq_status
,
harq_ack
[
subframe_dl
[
0
]].
vDAI_DL
,
o_ACK
[
cw_idx
],
status
);
}
else
if
(
subframe_dl
[
1
]
<
10
)
{
LOG_D
(
PHY
,
"ul-sf#%d vDAI_UL[sf#%d]=%d Nbundled=%d: dlsf#%d ACK=%d status=%d vDAI_DL=%d, o_ACK[0]=%d status=%d
\n
"
,
subframe_tx
,
subframe_ul
,
harq_ack
[
subframe_ul
].
vDAI_UL
,
status
,
subframe_dl
[
1
],
harq_ack
[
subframe_dl
[
1
]].
ack
,
harq_ack
[
subframe_dl
[
1
]].
send_harq_status
,
harq_ack
[
subframe_dl
[
1
]].
vDAI_DL
,
o_ACK
[
cw_idx
],
status
);
}
}
// reset ACK/NACK status
if
(
do_reset
)
{
LOG_D
(
PHY
,
"ul-sf#%d ACK/NACK status resetting @ dci0-sf#%d, dci1x/2x-sf#%d, dci1x/2x-sf#%d
\n
"
,
subframe_tx
,
subframe_ul
,
subframe_dl
[
0
],
subframe_dl
[
1
]);
if
(
subframe_ul
<
10
)
{
harq_ack
[
subframe_ul
].
vDAI_UL
=
0xff
;
}
if
(
subframe_dl
[
0
]
<
10
)
{
harq_ack
[
subframe_dl
[
0
]].
vDAI_DL
=
0xff
;
harq_ack
[
subframe_dl
[
0
]].
ack
=
2
;
harq_ack
[
subframe_dl
[
0
]].
send_harq_status
=
0
;
}
if
(
subframe_dl
[
1
]
<
10
)
{
harq_ack
[
subframe_dl
[
1
]].
vDAI_DL
=
0xff
;
harq_ack
[
subframe_dl
[
1
]].
ack
=
2
;
harq_ack
[
subframe_dl
[
1
]].
send_harq_status
=
0
;
}
if
(
subframe_dl
[
2
]
<
10
)
{
harq_ack
[
subframe_dl
[
2
]].
vDAI_DL
=
0xff
;
harq_ack
[
subframe_dl
[
2
]].
ack
=
2
;
harq_ack
[
subframe_dl
[
2
]].
send_harq_status
=
0
;
}
if
(
subframe_dl
[
3
]
<
10
)
{
harq_ack
[
subframe_dl
[
3
]].
vDAI_DL
=
0xff
;
harq_ack
[
subframe_dl
[
3
]].
ack
=
2
;
harq_ack
[
subframe_dl
[
3
]].
send_harq_status
=
0
;
}
}
...
...
@@ -546,116 +1050,201 @@ uint8_t get_reset_ack(LTE_DL_FRAME_PARMS *frame_parms,
case
3
:
if
(
subframe_tx
==
2
)
{
// ACK subframes 5 and 6
subframe_dl0
=
5
;
subframe_dl1
=
6
;
subframe_dl
[
0
]
=
5
;
subframe_dl
[
1
]
=
6
;
subframe_ul
=
2
;
//printf("subframe_tx 2, TDD config 3: harq_ack[5] = %d (%d),harq_ack[6] = %d (%d)\n",harq_ack[5].ack,harq_ack[5].send_harq_status,harq_ack[6].ack,harq_ack[6].send_harq_status);
// printf("subframe_tx 2, TDD config 3: harq_ack[5] = %d (%d),harq_ack[6] = %d
// (%d)\n",harq_ack[5].ack,harq_ack[5].send_harq_status,harq_ack[6].ack,harq_ack[6].send_harq_status);
}
else
if
(
subframe_tx
==
3
)
{
// ACK subframes 7 and 8
subframe_dl0
=
7
;
subframe_dl1
=
8
;
subframe_dl
[
0
]
=
7
;
subframe_dl
[
1
]
=
8
;
subframe_ul
=
3
;
//
printf("Subframe 3, TDD config 3: harq_ack[7] = %d,harq_ack[8] = %d\n",harq_ack[7].ack,harq_ack[8].ack);
//
printf("status %d : o_ACK (%d,%d)\n", status,o_ACK[0],o_ACK[1]);
//
printf("Subframe 3, TDD config 3: harq_ack[7] = %d,harq_ack[8] = %d\n",harq_ack[7].ack,harq_ack[8].ack);
//
printf("status %d : o_ACK (%d,%d)\n", status,o_ACK[0],o_ACK[1]);
}
else
if
(
subframe_tx
==
4
)
{
// ACK subframes 9 and 0
subframe_dl0
=
9
;
subframe_dl1
=
0
;
subframe_dl
[
0
]
=
9
;
subframe_dl
[
1
]
=
0
;
subframe_ul
=
4
;
//
printf("Subframe 4, TDD config 3: harq_ack[9] = %d,harq_ack[0] = %d\n",harq_ack[9].ack,harq_ack[0].ack);
//
printf("Subframe 4, TDD config 3: harq_ack[9] = %d,harq_ack[0] = %d\n",harq_ack[9].ack,harq_ack[0].ack);
}
else
{
LOG_E
(
PHY
,
"phy_procedures_lte.c: get_ack, illegal subframe_tx %d for tdd_config %d
\n
"
,
subframe_tx
,
frame_parms
->
tdd_config
);
return
(
0
);
LOG_E
(
PHY
,
"phy_procedures_lte.c: get_ack, illegal subframe_tx %d for tdd_config %d
\n
"
,
subframe_tx
,
frame_parms
->
tdd_config
);
return
0
;
}
// report ACK/NACK status
o_ACK
[
cw_idx
]
=
0
;
if
(
harq_ack
[
subframe_dl0
].
send_harq_status
==
1
)
{
o_ACK
[
cw_idx
]
=
harq_ack
[
subframe_dl0
].
ack
;
if
(
harq_ack
[
subframe_dl
[
0
]
].
send_harq_status
==
1
)
{
o_ACK
[
cw_idx
]
=
harq_ack
[
subframe_dl
[
0
]
].
ack
;
if
(
harq_ack
[
subframe_dl1
].
send_harq_status
==
1
)
o_ACK
[
cw_idx
]
&=
harq_ack
[
subframe_dl1
].
ack
;
}
else
if
(
harq_ack
[
subframe_dl1
].
send_harq_status
==
1
)
o_ACK
[
cw_idx
]
=
harq_ack
[
subframe_dl1
].
ack
;
if
(
harq_ack
[
subframe_dl
[
1
]
].
send_harq_status
==
1
)
o_ACK
[
cw_idx
]
&=
harq_ack
[
subframe_dl
[
1
]
].
ack
;
}
else
if
(
harq_ack
[
subframe_dl
[
1
]
].
send_harq_status
==
1
)
o_ACK
[
cw_idx
]
=
harq_ack
[
subframe_dl
[
1
]
].
ack
;
pN_bundled
[
0
]
=
harq_ack
[
subframe_rx
].
vDAI_UL
;
status
=
harq_ack
[
subframe_dl0
].
send_harq_status
+
harq_ack
[
subframe_dl1
].
send_harq_status
;
status
=
harq_ack
[
subframe_dl
[
0
]].
send_harq_status
+
harq_ack
[
subframe_dl
[
1
]
].
send_harq_status
;
//LOG_D(PHY,"TDD Config3 UL Sfn %d, dl Sfn0 %d status %d o_Ack %d, dl Sfn1 %d status %d o_Ack %d subframe_rx %d N_bundled %d \n",
// subframe_tx, subframe_dl0, harq_ack[subframe_dl0].send_harq_status,harq_ack[subframe_dl0].ack,
// subframe_dl1, harq_ack[subframe_dl1].send_harq_status,harq_ack[subframe_dl1].ack, subframe_rx, pN_bundled[0]);
// LOG_D(PHY,"TDD Config3 UL Sfn %d, dl Sfn0 %d status %d o_Ack %d, dl Sfn1 %d status %d o_Ack %d subframe_rx %d N_bundled
// %d \n",
// subframe_tx, subframe_dl[0], harq_ack[subframe_dl[0]].send_harq_status,harq_ack[subframe_dl[0]].ack,
// subframe_dl[1], harq_ack[subframe_dl[1]].send_harq_status,harq_ack[subframe_dl[1]].ack, subframe_rx, pN_bundled[0]);
if
(
do_reset
)
{
// reset ACK/NACK status
harq_ack
[
subframe_dl0
].
ack
=
2
;
harq_ack
[
subframe_dl1
].
ack
=
2
;
harq_ack
[
subframe_dl0
].
send_harq_status
=
0
;
harq_ack
[
subframe_dl1
].
send_harq_status
=
0
;
harq_ack
[
subframe_dl
[
0
]
].
ack
=
2
;
harq_ack
[
subframe_dl
[
1
]
].
ack
=
2
;
harq_ack
[
subframe_dl
[
0
]
].
send_harq_status
=
0
;
harq_ack
[
subframe_dl
[
1
]
].
send_harq_status
=
0
;
}
break
;
case
4
:
if
(
subframe_tx
==
2
)
{
// ACK subframes 4, 5 and 0
subframe_dl0
=
0
;
subframe_dl1
=
4
;
subframe_dl2
=
5
;
subframe_dl
[
0
]
=
0
;
subframe_dl
[
1
]
=
4
;
subframe_dl
[
2
]
=
5
;
subframe_ul
=
2
;
//printf("subframe_tx 2, TDD config 3: harq_ack[5] = %d (%d),harq_ack[6] = %d (%d)\n",harq_ack[5].ack,harq_ack[5].send_harq_status,harq_ack[6].ack,harq_ack[6].send_harq_status);
// printf("subframe_tx 2, TDD config 3: harq_ack[5] = %d (%d),harq_ack[6] = %d
// (%d)\n",harq_ack[5].ack,harq_ack[5].send_harq_status,harq_ack[6].ack,harq_ack[6].send_harq_status);
}
else
if
(
subframe_tx
==
3
)
{
// ACK subframes 6, 7 8 and 9
subframe_dl0
=
7
;
subframe_dl1
=
8
;
subframe_dl2
=
9
;
subframe_dl3
=
6
;
subframe_dl
[
0
]
=
7
;
subframe_dl
[
1
]
=
8
;
subframe_dl
[
2
]
=
9
;
subframe_dl
[
3
]
=
6
;
subframe_ul
=
3
;
//
printf("Subframe 3, TDD config 3: harq_ack[7] = %d,harq_ack[8] = %d\n",harq_ack[7].ack,harq_ack[8].ack);
//
printf("status %d : o_ACK (%d,%d)\n", status,o_ACK[0],o_ACK[1]);
//
printf("Subframe 3, TDD config 3: harq_ack[7] = %d,harq_ack[8] = %d\n",harq_ack[7].ack,harq_ack[8].ack);
//
printf("status %d : o_ACK (%d,%d)\n", status,o_ACK[0],o_ACK[1]);
}
else
{
LOG_E
(
PHY
,
"phy_procedures_lte.c: get_ack, illegal subframe_tx %d for tdd_config %d
\n
"
,
subframe_tx
,
frame_parms
->
tdd_config
);
return
(
0
);
LOG_E
(
PHY
,
"phy_procedures_lte.c: get_ack, illegal subframe_tx %d for tdd_config %d
\n
"
,
subframe_tx
,
frame_parms
->
tdd_config
);
return
0
;
}
// report ACK/NACK status
o_ACK
[
cw_idx
]
=
0
;
if
(
harq_ack
[
subframe_dl0
].
send_harq_status
==
1
)
o_ACK
[
cw_idx
]
=
harq_ack
[
subframe_dl0
].
ack
;
if
(
harq_ack
[
subframe_dl
[
0
]
].
send_harq_status
==
1
)
o_ACK
[
cw_idx
]
=
harq_ack
[
subframe_dl
[
0
]
].
ack
;
if
(
harq_ack
[
subframe_dl1
].
send_harq_status
==
1
)
o_ACK
[
cw_idx
]
&=
harq_ack
[
subframe_dl1
].
ack
;
if
(
harq_ack
[
subframe_dl
[
1
]
].
send_harq_status
==
1
)
o_ACK
[
cw_idx
]
&=
harq_ack
[
subframe_dl
[
1
]
].
ack
;
if
(
harq_ack
[
subframe_dl2
].
send_harq_status
==
1
)
o_ACK
[
cw_idx
]
&=
harq_ack
[
subframe_dl2
].
ack
;
if
(
harq_ack
[
subframe_dl
[
2
]
].
send_harq_status
==
1
)
o_ACK
[
cw_idx
]
&=
harq_ack
[
subframe_dl
[
2
]
].
ack
;
if
(
harq_ack
[
subframe_dl3
].
send_harq_status
==
1
)
o_ACK
[
cw_idx
]
&=
harq_ack
[
subframe_dl3
].
ack
;
if
(
harq_ack
[
subframe_dl
[
3
]
].
send_harq_status
==
1
)
o_ACK
[
cw_idx
]
&=
harq_ack
[
subframe_dl
[
3
]
].
ack
;
pN_bundled
[
0
]
=
harq_ack
[
subframe_rx
].
vDAI_UL
;
status
=
harq_ack
[
subframe_dl0
].
send_harq_status
+
harq_ack
[
subframe_dl1
].
send_harq_status
+
harq_ack
[
subframe_dl2
].
send_harq_status
+
harq_ack
[
subframe_dl3
].
send_harq_status
;
LOG_D
(
PHY
,
"TDD Config3 UL Sfn %d, dl Sfn0 %d status %d o_Ack %d, dl Sfn1 %d status %d o_Ack %d dl Sfn2 %d status %d o_Ack %d dl Sfn3 %d status %d o_Ack %d subframe_rx %d N_bundled %d status %d
\n
"
,
subframe_tx
,
subframe_dl0
,
harq_ack
[
subframe_dl0
].
send_harq_status
,
harq_ack
[
subframe_dl0
].
ack
,
subframe_dl1
,
harq_ack
[
subframe_dl1
].
send_harq_status
,
harq_ack
[
subframe_dl1
].
ack
,
subframe_dl2
,
harq_ack
[
subframe_dl2
].
send_harq_status
,
harq_ack
[
subframe_dl2
].
ack
,
subframe_dl3
,
harq_ack
[
subframe_dl3
].
send_harq_status
,
harq_ack
[
subframe_dl3
].
ack
,
subframe_rx
,
pN_bundled
[
0
],
status
);
status
=
harq_ack
[
subframe_dl
[
0
]].
send_harq_status
+
harq_ack
[
subframe_dl
[
1
]].
send_harq_status
+
harq_ack
[
subframe_dl
[
2
]].
send_harq_status
+
harq_ack
[
subframe_dl
[
3
]].
send_harq_status
;
LOG_D
(
PHY
,
"TDD Config3 UL Sfn %d, dl Sfn0 %d status %d o_Ack %d, dl Sfn1 %d status %d o_Ack %d dl Sfn2 %d status %d o_Ack %d "
"dl Sfn3 %d status %d o_Ack %d subframe_rx %d N_bundled %d status %d
\n
"
,
subframe_tx
,
subframe_dl
[
0
],
harq_ack
[
subframe_dl
[
0
]].
send_harq_status
,
harq_ack
[
subframe_dl
[
0
]].
ack
,
subframe_dl
[
1
],
harq_ack
[
subframe_dl
[
1
]].
send_harq_status
,
harq_ack
[
subframe_dl
[
1
]].
ack
,
subframe_dl
[
2
],
harq_ack
[
subframe_dl
[
2
]].
send_harq_status
,
harq_ack
[
subframe_dl
[
2
]].
ack
,
subframe_dl
[
3
],
harq_ack
[
subframe_dl
[
3
]].
send_harq_status
,
harq_ack
[
subframe_dl
[
3
]].
ack
,
subframe_rx
,
pN_bundled
[
0
],
status
);
if
(
do_reset
)
{
// reset ACK/NACK status
harq_ack
[
subframe_dl0
].
ack
=
2
;
harq_ack
[
subframe_dl1
].
ack
=
2
;
harq_ack
[
subframe_dl2
].
ack
=
2
;
harq_ack
[
subframe_dl3
].
ack
=
2
;
harq_ack
[
subframe_dl0
].
send_harq_status
=
0
;
harq_ack
[
subframe_dl1
].
send_harq_status
=
0
;
harq_ack
[
subframe_dl2
].
send_harq_status
=
0
;
harq_ack
[
subframe_dl3
].
send_harq_status
=
0
;
harq_ack
[
subframe_dl
[
0
]
].
ack
=
2
;
harq_ack
[
subframe_dl
[
1
]
].
ack
=
2
;
harq_ack
[
subframe_dl
[
2
]
].
ack
=
2
;
harq_ack
[
subframe_dl
[
3
]
].
ack
=
2
;
harq_ack
[
subframe_dl
[
0
]
].
send_harq_status
=
0
;
harq_ack
[
subframe_dl
[
1
]
].
send_harq_status
=
0
;
harq_ack
[
subframe_dl
[
2
]
].
send_harq_status
=
0
;
harq_ack
[
subframe_dl
[
3
]
].
send_harq_status
=
0
;
}
break
;
case
6
:
if
(
subframe_tx
==
2
)
{
// ACK subframe 5
subframe_ul
=
2
;
subframe_dl
[
0
]
=
5
;
subframe_dl
[
1
]
=
0xff
;
}
else
if
(
subframe_tx
==
3
)
{
// ACK subframe 6
subframe_ul
=
3
;
subframe_dl
[
0
]
=
6
;
subframe_dl
[
1
]
=
0xff
;
}
else
if
(
subframe_tx
==
4
)
{
// ACK subframe 9
subframe_ul
=
4
;
subframe_dl
[
0
]
=
9
;
subframe_dl
[
1
]
=
0xff
;
}
else
if
(
subframe_tx
==
7
)
{
// ACK subframes 0
subframe_ul
=
7
;
subframe_dl
[
0
]
=
0
;
subframe_dl
[
1
]
=
0xff
;
}
else
if
(
subframe_tx
==
8
)
{
// ACK subframe 1
subframe_ul
=
8
;
subframe_dl
[
0
]
=
1
;
subframe_dl
[
1
]
=
0xff
;
}
else
{
LOG_E
(
PHY
,
"phy_procedures_lte.c: get_ack, illegal subframe_tx %d for tdd_config %d
\n
"
,
subframe_tx
,
frame_parms
->
tdd_config
);
return
0
;
}
// report ACK/NACK status
o_ACK
[
cw_idx
]
=
1
;
status
=
0
;
if
((
subframe_dl
[
0
]
<
10
)
&&
(
harq_ack
[
subframe_dl
[
0
]].
send_harq_status
))
{
o_ACK
[
cw_idx
]
&=
harq_ack
[
subframe_dl
[
0
]].
ack
;
status
+=
harq_ack
[
subframe_dl
[
0
]].
send_harq_status
;
}
// report status = Nbundled
if
(
!
status
)
{
o_ACK
[
cw_idx
]
=
0
;
}
else
{
if
(
harq_ack
[
subframe_ul
].
vDAI_UL
<
0xff
)
{
status
+=
harq_ack
[
subframe_ul
].
vDAI_UL
;
}
}
// reset ACK/NACK status
if
(
do_reset
)
{
LOG_D
(
PHY
,
"ul-sf#%d ACK/NACK status resetting @ dci0-sf#%d, dci1x/2x-sf#%d, dci1x/2x-sf#%d
\n
"
,
subframe_tx
,
subframe_ul
,
subframe_dl
[
0
],
subframe_dl
[
1
]);
if
(
subframe_ul
<
10
)
{
harq_ack
[
subframe_ul
].
vDAI_UL
=
0xff
;
}
if
(
subframe_dl
[
0
]
<
10
)
{
harq_ack
[
subframe_dl
[
0
]].
vDAI_DL
=
0xff
;
harq_ack
[
subframe_dl
[
0
]].
ack
=
2
;
harq_ack
[
subframe_dl
[
0
]].
send_harq_status
=
0
;
}
}
break
;
}
}
//printf("status %d\n",status);
return
(
status
);
return
(
status
);
}
uint8_t
get_ack
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
...
...
@@ -718,7 +1307,7 @@ uint16_t get_Np(uint8_t N_RB_DL,uint8_t nCCE,uint8_t plus1)
default:
LOG_E
(
PHY
,
"get_Np() FATAL: unsupported N_RB_DL %d
\n
"
,
N_RB_DL
);
return
(
0
)
;
return
0
;
break
;
}
...
...
@@ -730,98 +1319,163 @@ uint16_t get_Np(uint8_t N_RB_DL,uint8_t nCCE,uint8_t plus1)
return
(
Np
[
0
+
plus1
]);
}
// Return number of DL subframes (DL + S)
int
subframe_num
(
LTE_DL_FRAME_PARMS
*
frame_parms
){
if
(
frame_parms
->
frame_type
==
FDD
)
return
10
;
switch
(
frame_parms
->
tdd_config
)
{
case
0
:
return
4
;
case
1
:
return
6
;
case
2
:
return
8
;
case
3
:
return
7
;
case
4
:
return
8
;
case
5
:
return
9
;
case
6
:
return
5
;
default:
LOG_E
(
PHY
,
"Unsupported TDD configuration %d
\n
"
,
frame_parms
->
tdd_config
);
AssertFatal
(
frame_parms
->
tdd_config
==
1
||
frame_parms
->
tdd_config
==
3
||
frame_parms
->
tdd_config
==
4
||
frame_parms
->
tdd_config
==
5
,
"subframe x Unsupported TDD configuration"
);
return
(
255
);
LOG_E
(
PHY
,
"Unsupported TDD configuration %d
\n
"
,
frame_parms
->
tdd_config
);
AssertFatal
(
frame_parms
->
tdd_config
==
1
||
frame_parms
->
tdd_config
==
3
||
frame_parms
->
tdd_config
==
4
||
frame_parms
->
tdd_config
==
5
,
"subframe x Unsupported TDD configuration"
);
return
(
255
);
}
}
// Return the type (DL, UL or Special) of subframe
lte_subframe_t
subframe_select
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
unsigned
char
subframe
)
{
// if FDD return dummy value
if
(
frame_parms
->
frame_type
==
FDD
)
return
(
SF_DL
);
return
(
SF_DL
);
else
{
switch
(
frame_parms
->
tdd_config
)
{
case
0
:
switch
(
subframe
)
{
case
0
:
case
5
:
return
(
SF_DL
);
break
;
case
2
:
case
3
:
case
4
:
case
7
:
case
8
:
case
9
:
return
(
SF_UL
);
break
;
default:
return
(
SF_S
);
break
;
}
case
1
:
switch
(
subframe
)
{
case
0
:
case
4
:
case
5
:
case
9
:
return
(
SF_DL
);
return
(
SF_DL
);
break
;
case
2
:
case
3
:
case
7
:
case
8
:
return
(
SF_UL
);
return
(
SF_UL
);
break
;
default:
return
(
SF_S
);
return
(
SF_S
);
break
;
}
case
2
:
switch
(
subframe
)
{
case
0
:
case
3
:
case
4
:
case
5
:
case
8
:
case
9
:
return
(
SF_DL
);
break
;
case
2
:
case
7
:
return
(
SF_UL
);
break
;
default:
return
(
SF_S
);
break
;
}
case
3
:
if
((
subframe
<
1
)
||
(
subframe
>=
5
))
return
(
SF_DL
);
else
if
((
subframe
>
1
)
&&
(
subframe
<
5
))
return
(
SF_UL
);
else
if
(
subframe
==
1
)
if
((
subframe
<
1
)
||
(
subframe
>=
5
))
return
(
SF_DL
);
else
if
((
subframe
>
1
)
&&
(
subframe
<
5
))
return
(
SF_UL
);
else
if
(
subframe
==
1
)
return
(
SF_S
);
else
{
LOG_E
(
PHY
,
"[PHY_PROCEDURES_LTE] Unknown subframe number
\n
"
);
return
(
255
);
LOG_E
(
PHY
,
"[PHY_PROCEDURES_LTE] Unknown subframe number
\n
"
);
return
(
255
);
}
case
4
:
if
((
subframe
<
1
)
||
(
subframe
>=
4
))
return
(
SF_DL
);
else
if
((
subframe
>
1
)
&&
(
subframe
<
4
))
return
(
SF_UL
);
else
if
(
subframe
==
1
)
if
((
subframe
<
1
)
||
(
subframe
>=
4
))
return
(
SF_DL
);
else
if
((
subframe
>
1
)
&&
(
subframe
<
4
))
return
(
SF_UL
);
else
if
(
subframe
==
1
)
return
(
SF_S
);
else
{
LOG_E
(
PHY
,
"[PHY_PROCEDURES_LTE] Unknown subframe number
\n
"
);
return
(
255
);
LOG_E
(
PHY
,
"[PHY_PROCEDURES_LTE] Unknown subframe number
\n
"
);
return
(
255
);
}
case
5
:
if
((
subframe
<
1
)
||
(
subframe
>=
3
))
return
(
SF_DL
);
else
if
((
subframe
>
1
)
&&
(
subframe
<
3
))
return
(
SF_UL
);
else
if
(
subframe
==
1
)
if
((
subframe
<
1
)
||
(
subframe
>=
3
))
return
(
SF_DL
);
else
if
((
subframe
>
1
)
&&
(
subframe
<
3
))
return
(
SF_UL
);
else
if
(
subframe
==
1
)
return
(
SF_S
);
else
{
LOG_E
(
PHY
,
"[PHY_PROCEDURES_LTE] Unknown subframe number
\n
"
);
return
(
255
);
LOG_E
(
PHY
,
"[PHY_PROCEDURES_LTE] Unknown subframe number
\n
"
);
return
(
255
);
}
break
;
case
6
:
switch
(
subframe
)
{
case
0
:
case
5
:
case
9
:
return
(
SF_DL
);
break
;
default:
AssertFatal
(
1
==
0
,
"subframe %d Unsupported TDD configuration %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
return
(
255
);
case
2
:
case
3
:
case
4
:
case
7
:
case
8
:
return
(
SF_UL
);
break
;
default:
return
(
SF_S
);
break
;
}
default:
LOG_E
(
PHY
,
"subframe %d Unsupported TDD configuration %d
\n
"
,
subframe
,
frame_parms
->
tdd_config
);
return
(
255
);
}
}
}
...
...
@@ -852,8 +1506,7 @@ dci_detect_mode_t dci_detect_mode_select(LTE_DL_FRAME_PARMS *frame_parms,uint8_t
return
ret
;
}
// Return the HARQ PID of a PHICH by finding its corresponding PUSCH timing
uint8_t
phich_subframe_to_harq_pid
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
uint32_t
frame
,
uint8_t
subframe
)
{
...
...
@@ -863,6 +1516,7 @@ uint8_t phich_subframe_to_harq_pid(LTE_DL_FRAME_PARMS *frame_parms,uint32_t fram
phich_subframe2_pusch_subframe
(
frame_parms
,
subframe
)));
}
// Return if whether or not it is a possible PHICH subframe (Refer to 3GPP TS 36213, Table 8.3-1)
unsigned
int
is_phich_subframe
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
unsigned
char
subframe
)
{
...
...
@@ -870,37 +1524,53 @@ unsigned int is_phich_subframe(LTE_DL_FRAME_PARMS *frame_parms,unsigned char sub
return
(
1
);
}
else
{
switch
(
frame_parms
->
tdd_config
)
{
case
0
:
if
((
subframe
==
0
)
||
(
subframe
==
1
)
||
(
subframe
==
5
)
||
(
subframe
==
6
))
return
1
;
break
;
case
1
:
if
((
subframe
==
1
)
||
(
subframe
==
4
)
||
(
subframe
==
6
)
||
(
subframe
==
9
))
return
(
1
);
return
1
;
break
;
case
2
:
if
((
subframe
==
3
)
||
(
subframe
==
8
))
return
1
;
break
;
case
3
:
if
((
subframe
==
0
)
||
(
subframe
==
8
)
||
(
subframe
==
9
))
return
(
1
)
;
return
1
;
break
;
case
4
:
if
((
subframe
==
8
)
||
(
subframe
==
9
)
)
return
(
1
)
;
if
((
subframe
==
8
)
||
(
subframe
==
9
)
)
return
1
;
break
;
case
5
:
if
(
subframe
==
8
)
return
(
1
);
return
1
;
break
;
case
6
:
if
((
subframe
==
0
)
||
(
subframe
==
1
)
||
(
subframe
==
5
)
||
(
subframe
==
6
)
||
(
subframe
==
9
))
return
1
;
break
;
default:
return
(
0
)
;
return
0
;
break
;
}
}
return
(
0
)
;
return
0
;
}
...
...
openair1/SCHED_UE/phy_procedures_lte_ue.c
View file @
4171dcc0
...
...
@@ -1124,6 +1124,64 @@ uint16_t get_n1_pucch(PHY_VARS_UE *ue,
}
break
;
case
6
:
// DL:S:UL:UL:UL:DL:S:UL:UL:DL
harq_ack0
=
2
;
// DTX
M
=
1
;
if
(
subframe
==
2
)
{
candidate_dl
[
0
]
=
5
;
}
else
if
(
subframe
==
3
)
{
candidate_dl
[
0
]
=
6
;
}
else
if
(
subframe
==
4
)
{
candidate_dl
[
0
]
=
9
;
}
else
if
(
subframe
==
7
)
{
candidate_dl
[
0
]
=
0
;
}
else
if
(
subframe
==
8
)
{
candidate_dl
[
0
]
=
1
;
}
else
{
LOG_E
(
PHY
,
"[UE%d] : Frame %d phy_procedures_lte.c: get_n1pucch, illegal tx-subframe %d for tdd_config %d
\n
"
,
ue
->
Mod_id
,
proc
->
frame_tx
,
subframe
,
frame_parms
->
tdd_config
);
return
(
0
);
}
if
(
harq_ack
[
candidate_dl
[
0
]].
send_harq_status
>
0
)
{
last_dl
=
candidate_dl
[
0
];
}
if
(
last_dl
>=
10
)
{
LOG_E
(
PHY
,
"[UE%d] : Frame %d phy_procedures_lte.c: get_n1pucch, illegal rx-subframe %d (tx-subframe %d) for tdd_config %d
\n
"
,
ue
->
Mod_id
,
proc
->
frame_tx
,
last_dl
,
subframe
,
frame_parms
->
tdd_config
);
return
(
0
);
}
LOG_D
(
PHY
,
"SFN/SF %d/%d calculating n1_pucch0 from last_dl=%d
\n
"
,
proc
->
frame_tx
%
1024
,
proc
->
subframe_tx
,
last_dl
);
// i=0
nCCE0
=
ue
->
pdcch_vars
[
ue
->
current_thread_id
[
proc
->
subframe_rx
]][
eNB_id
]
->
nCCE
[
last_dl
];
n1_pucch0
=
get_Np
(
frame_parms
->
N_RB_DL
,
nCCE0
,
0
)
+
nCCE0
+
frame_parms
->
pucch_config_common
.
n1PUCCH_AN
;
harq_ack0
=
b
[
0
];
if
(
harq_ack0
!=
2
)
{
// DTX
if
(
SR
==
0
)
{
b
[
0
]
=
harq_ack0
;
b
[
1
]
=
harq_ack0
;
ue
->
pucch_sel
[
subframe
]
=
0
;
return
(
n1_pucch0
);
}
else
{
b
[
0
]
=
harq_ack0
;
b
[
1
]
=
harq_ack0
;
return
(
ue
->
scheduling_request_config
[
eNB_id
].
sr_PUCCH_ResourceIndex
);
}
}
break
;
}
// switch tdd_config
}
...
...
openair2/LAYER2/MAC/eNB_scheduler_RA.c
View file @
4171dcc0
...
...
@@ -1329,9 +1329,10 @@ initiate_ra_proc(module_id_t module_idP,
abort
();
case
1
:
case
3
:
case
4
:
case
3
:
case
4
:
case
5
:
case
6
:
offset
=
6
;
break
;
}
...
...
openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
View file @
4171dcc0
...
...
@@ -264,6 +264,7 @@ generate_dlsch_header(unsigned char *mac_header,
}
//------------------------------------------------------------------------------
// For Dl subframe, we allocate the DAI of UL subframe accorting table (3GPP TS 36213, Table 10.1.3.1-1 K PDSCH)
void
set_ul_DAI
(
int
module_idP
,
int
UE_idP
,
...
...
@@ -318,7 +319,23 @@ set_ul_DAI(int module_idP,
case
2
:
// if ((subframeP==3)||(subframeP==8))
// UE_info->UE_template[CC_idP][UE_idP].DAI_ul = DAI;
// UE_list->UE_template[CC_idP][UE_idP].DAI_ul = DAI;
switch
(
subframeP
)
{
case
0
:
case
1
:
UE_info
->
UE_template
[
CC_idP
][
UE_idP
].
DAI_ul
[
7
]
=
DAI
;
break
;
case
4
:
case
5
:
case
8
:
UE_info
->
UE_template
[
CC_idP
][
UE_idP
].
DAI_ul
[
2
]
=
DAI
;
break
;
case
9
:
UE_info
->
UE_template
[
CC_idP
][
UE_idP
].
DAI_ul
[
7
]
=
DAI
;
break
;
}
break
;
case
3
:
...
...
@@ -361,8 +378,27 @@ set_ul_DAI(int module_idP,
break
;
case
6
:
// if ((subframeP==1)||(subframeP==4)||(subframeP==6)||(subframeP==9))
// UE_info->UE_template[CC_idP][UE_idP].DAI_ul = DAI;
switch
(
subframeP
)
{
case
0
:
UE_info
->
UE_template
[
CC_idP
][
UE_idP
].
DAI_ul
[
7
]
=
DAI
;
break
;
case
1
:
UE_info
->
UE_template
[
CC_idP
][
UE_idP
].
DAI_ul
[
8
]
=
DAI
;
break
;
case
5
:
UE_info
->
UE_template
[
CC_idP
][
UE_idP
].
DAI_ul
[
2
]
=
DAI
;
break
;
case
6
:
UE_info
->
UE_template
[
CC_idP
][
UE_idP
].
DAI_ul
[
3
]
=
DAI
;
break
;
case
9
:
UE_info
->
UE_template
[
CC_idP
][
UE_idP
].
DAI_ul
[
4
]
=
DAI
;
break
;
}
break
;
default:
...
...
openair2/LAYER2/MAC/eNB_scheduler_fairRR.c
View file @
4171dcc0
...
...
@@ -3097,11 +3097,16 @@ void schedule_ulsch_rnti_fairRR(module_id_t module_idP,
if
(
cc
->
tdd_Config
)
{
switch
(
cc
->
tdd_Config
->
subframeAssignment
)
{
case
1
:
case
0
:
case
2
:
case
6
:
if
(
subframeP
==
1
||
subframeP
==
6
)
cqi_req
=
0
;
break
;
case
3
:
case
4
:
case
5
:
if
(
subframeP
==
1
)
cqi_req
=
0
;
break
;
...
...
openair2/LAYER2/MAC/eNB_scheduler_primitives.c
View file @
4171dcc0
...
...
@@ -212,7 +212,6 @@ get_Msg3alloc(COMMON_channels_t *cc,
sub_frame_t
*
subframe
)
//------------------------------------------------------------------------------
{
// Fill in other TDD Configuration!!!!
int
subframeAssignment
;
if
(
cc
->
tdd_Config
==
NULL
)
{
// FDD
...
...
@@ -227,7 +226,18 @@ get_Msg3alloc(COMMON_channels_t *cc,
}
else
{
// TDD
subframeAssignment
=
(
int
)
cc
->
tdd_Config
->
subframeAssignment
;
if
(
subframeAssignment
==
1
)
{
if
(
subframeAssignment
==
0
)
{
switch
(
current_subframe
)
{
case
0
:
*
subframe
=
7
;
*
frame
=
current_frame
;
break
;
case
5
:
*
subframe
=
2
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
break
;
}
}
else
if
(
subframeAssignment
==
1
)
{
switch
(
current_subframe
)
{
case
0
:
*
subframe
=
7
;
...
...
@@ -249,6 +259,26 @@ get_Msg3alloc(COMMON_channels_t *cc,
*
frame
=
(
current_frame
+
1
)
&
1023
;
break
;
}
}
else
if
(
subframeAssignment
==
2
)
{
switch
(
current_subframe
)
{
case
0
:
case
3
:
*
subframe
=
2
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
break
;
case
4
:
case
5
:
case
8
:
*
subframe
=
7
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
break
;
case
9
:
*
subframe
=
2
;
*
frame
=
(
current_frame
+
2
)
&
1023
;
break
;
}
}
else
if
(
subframeAssignment
==
3
)
{
switch
(
current_subframe
)
{
case
0
:
...
...
@@ -311,6 +341,23 @@ get_Msg3alloc(COMMON_channels_t *cc,
*
frame
=
(
current_frame
+
2
)
&
1023
;
break
;
}
}
else
if
(
subframeAssignment
==
6
)
{
switch
(
current_subframe
)
{
case
0
:
*
subframe
=
7
;
*
frame
=
current_frame
;
break
;
case
5
:
*
subframe
=
2
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
break
;
case
9
:
*
subframe
=
7
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
break
;
}
}
}
...
...
@@ -341,12 +388,28 @@ get_Msg3allocret(COMMON_channels_t *cc,
}
else
{
subframeAssignment
=
(
int
)
cc
->
tdd_Config
->
subframeAssignment
;
if
(
subframeAssignment
==
1
)
{
if
(
subframeAssignment
==
0
)
{
// original PUSCH in 2, PHICH in 6 (S), ret in 2
// original PUSCH in 3, PHICH in 0, ret in 4
// original PUSCH in 4, PHICH in 0, ret in 4
// original PUSCH in 7, PHICH in 1 (S), ret in 7
// original PUSCH in 8, PHICH in 5, ret in 9
// original PUSCH in 9, PHICH in 5, ret in 9
*
frame
=
(
current_frame
+
1
)
&
1023
;
if
((
*
subframe
==
3
)
||
(
*
subframe
==
8
))
{
*
subframe
=
((
*
subframe
==
3
)
?
4
:
9
);
}
}
else
if
(
subframeAssignment
==
1
)
{
// original PUSCH in 2, PHICH in 6 (S), ret in 2
// original PUSCH in 3, PHICH in 9, ret in 3
// original PUSCH in 7, PHICH in 1 (S), ret in 7
// original PUSCH in 8, PHICH in 4, ret in 8
*
frame
=
(
current_frame
+
1
)
&
1023
;
}
else
if
(
subframeAssignment
==
2
)
{
// original PUSCH in 2, PHICH in 8, ret in 2 next frame
// original PUSCH in 3, PHICH in 9, ret in 3 next frame
// original PUSCH in 4, PHICH in 0, ret in 4 next frame
*
frame
=
(
current_frame
+
1
)
&
1023
;
}
else
if
(
subframeAssignment
==
3
)
{
// original PUSCH in 2, PHICH in 8, ret in 2 next frame
// original PUSCH in 3, PHICH in 9, ret in 3 next frame
...
...
@@ -359,6 +422,34 @@ get_Msg3allocret(COMMON_channels_t *cc,
}
else
if
(
subframeAssignment
==
5
)
{
// original PUSCH in 2, PHICH in 8, ret in 2 next frame
*
frame
=
(
current_frame
+
1
)
&
1023
;
}
else
if
(
cc
->
tdd_Config
->
subframeAssignment
==
6
)
{
// original PUSCH in 2, PHICH in 6 (S), ret in 3
// original PUSCH in 3, PHICH in 9, ret in 4
// original PUSCH in 4, PHICH in 0, ret in 7
// original PUSCH in 7, PHICH in 1 (S), ret in 8
// original PUSCH in 8, PHICH in 5, ret in 2+
*
frame
=
(
current_frame
+
1
)
&
1023
;
switch
(
*
subframe
)
{
case
2
:
*
subframe
=
3
;
break
;
case
3
:
*
subframe
=
4
;
break
;
case
4
:
*
subframe
=
7
;
break
;
case
7
:
*
subframe
=
8
;
break
;
case
8
:
*
subframe
=
2
;
*
frame
=
(
current_frame
+
1
)
&
1023
;
break
;
default:
break
;
}
}
}
...
...
@@ -366,6 +457,8 @@ get_Msg3allocret(COMMON_channels_t *cc,
}
//------------------------------------------------------------------------------
// In TDD modes 1-5, each HarqPID is associated with a unique subframe and the number of harq processes equals the
// number of UL subframes. Modes 0 and 6 have more processes than UL subframes so HarqPID depends on sfn
uint8_t
subframe2harqpid
(
COMMON_channels_t
*
cc
,
frame_t
frame
,
...
...
@@ -379,6 +472,14 @@ subframe2harqpid(COMMON_channels_t *cc,
ret
=
(((
frame
<<
1
)
+
subframe
)
&
7
);
}
else
{
switch
(
cc
->
tdd_Config
->
subframeAssignment
)
{
uint32_t
cycle_idx
;
case
0
:
cycle_idx
=
7
-
frame
%
7
;
if
(
subframe
<
5
)
{
return
(
cycle_idx
+
subframe
-
2
)
%
7
;
}
else
{
return
(
cycle_idx
+
subframe
-
4
)
%
7
;
}
case
1
:
if
(
subframe
==
2
||
subframe
==
3
||
subframe
==
7
||
subframe
==
8
)
{
switch
(
subframe
)
{
...
...
@@ -393,9 +494,10 @@ subframe2harqpid(COMMON_channels_t *cc,
break
;
default:
AssertFatal
(
1
==
0
,
"subframe2_harq_pid, Illegal subframe %d for TDD mode %d
\n
"
,
AssertFatal
(
1
==
0
,
"subframe2_harq_pid, Illegal subframe %d for TDD mode %d
\n
"
,
subframe
,
(
int
)
cc
->
tdd_Config
->
subframeAssignment
);
(
int
)
cc
->
tdd_Config
->
subframeAssignment
);
break
;
}
}
...
...
@@ -429,6 +531,13 @@ subframe2harqpid(COMMON_channels_t *cc,
(
int
)
cc
->
tdd_Config
->
subframeAssignment
);
ret
=
(
subframe
-
2
);
break
;
case
6
:
cycle_idx
=
6
-
frame
%
6
;
if
(
subframe
<
5
)
{
return
(
cycle_idx
+
subframe
-
2
)
%
6
;
}
else
{
return
(
cycle_idx
+
subframe
-
4
)
%
6
;
}
default:
AssertFatal
(
1
==
0
,
"subframe2_harq_pid, Unsupported TDD mode %d
\n
"
,
...
...
@@ -441,156 +550,32 @@ subframe2harqpid(COMMON_channels_t *cc,
}
//------------------------------------------------------------------------------
uint8_t
get_Msg3harqpid
(
COMMON_channels_t
*
cc
,
frame_t
frame
,
sub_frame_t
current_subframe
)
int
is_UL_sf
(
COMMON_channels_t
*
ccP
,
sub_frame_t
subframeP
)
//------------------------------------------------------------------------------
{
uint8_t
ul_subframe
=
0
;
uint32_t
ul_frame
=
0
;
// if FDD return dummy value
if
(
ccP
->
tdd_Config
==
NULL
)
return
0
;
if
(
cc
->
tdd_Config
==
NULL
)
{
// FDD
ul_subframe
=
(
current_subframe
>
3
)
?
(
current_subframe
-
4
)
:
(
current_subframe
+
6
);
ul_frame
=
(
current_subframe
>
3
)
?
((
frame
+
1
)
&
1023
)
:
frame
;
}
else
{
switch
(
cc
->
tdd_Config
->
subframeAssignment
)
{
case
1
:
switch
(
current_subframe
)
{
case
9
:
switch
(
ccP
->
tdd_Config
->
subframeAssignment
)
{
case
0
:
ul_subframe
=
7
;
break
;
case
5
:
case
7
:
ul_subframe
=
2
;
break
;
}
break
;
case
3
:
switch
(
current_subframe
)
{
switch
(
subframeP
)
{
case
0
:
case
5
:
case
6
:
ul_subframe
=
2
;
break
;
case
7
:
ul_subframe
=
3
;
break
;
case
8
:
ul_subframe
=
4
;
break
;
case
9
:
ul_subframe
=
2
;
break
;
}
break
;
return
0
;
case
2
:
case
3
:
case
4
:
switch
(
current_subframe
)
{
case
0
:
case
5
:
case
6
:
case
7
:
case
8
:
case
9
:
ul_subframe
=
2
;
break
;
case
7
:
ul_subframe
=
3
;
break
;
}
break
;
case
5
:
ul_subframe
=
2
;
break
;
return
1
;
default:
LOG_E
(
PHY
,
"get_Msg3_harq_pid: Unsupported TDD configuration %d
\n
"
,
(
int
)
cc
->
tdd_Config
->
subframeAssignment
);
AssertFatal
(
1
==
0
,
"get_Msg3_harq_pid: Unsupported TDD configuration"
);
break
;
}
}
return
(
subframe2harqpid
(
cc
,
ul_frame
,
ul_subframe
));
}
//------------------------------------------------------------------------------
uint32_t
pdcchalloc2ulframe
(
COMMON_channels_t
*
ccP
,
uint32_t
frame
,
uint8_t
n
)
//------------------------------------------------------------------------------
{
uint32_t
ul_frame
=
(
frame
+
(
n
>=
6
?
1
:
0
));
if
(
ccP
->
tdd_Config
)
{
if
(
ccP
->
tdd_Config
->
subframeAssignment
==
1
)
{
if
(
n
==
1
||
n
==
6
)
{
ul_frame
=
(
frame
+
(
n
==
1
?
0
:
1
));
}
}
else
if
(
ccP
->
tdd_Config
->
subframeAssignment
==
6
)
{
if
(
n
==
0
||
n
==
1
||
n
==
5
||
n
==
6
)
{
ul_frame
=
(
frame
+
(
n
>=
5
?
1
:
0
));
}
else
if
(
n
==
9
)
{
ul_frame
=
(
frame
+
1
);
}
}
}
LOG_D
(
PHY
,
"frame %d subframe %d: PUSCH frame = %d
\n
"
,
frame
,
n
,
ul_frame
);
return
ul_frame
;
}
//------------------------------------------------------------------------------
uint8_t
pdcchalloc2ulsubframe
(
COMMON_channels_t
*
ccP
,
uint8_t
n
)
//------------------------------------------------------------------------------
{
uint8_t
ul_subframe
;
if
(
ccP
->
tdd_Config
&&
ccP
->
tdd_Config
->
subframeAssignment
==
1
&&
(
n
==
1
||
n
==
6
))
// tdd_config 0,1 SF 1,5
ul_subframe
=
((
n
+
6
)
%
10
);
else
if
(
ccP
->
tdd_Config
&&
ccP
->
tdd_Config
->
subframeAssignment
==
6
&&
(
n
==
0
||
n
==
1
||
n
==
5
||
n
==
6
))
ul_subframe
=
((
n
+
7
)
%
10
);
else
if
(
ccP
->
tdd_Config
&&
ccP
->
tdd_Config
->
subframeAssignment
==
6
&&
n
==
9
)
// tdd_config 6 SF 9
ul_subframe
=
((
n
+
5
)
%
10
);
else
ul_subframe
=
((
n
+
4
)
%
10
);
LOG_D
(
PHY
,
"subframe %d: PUSCH subframe = %d
\n
"
,
n
,
ul_subframe
);
return
ul_subframe
;
}
//------------------------------------------------------------------------------
int
is_UL_sf
(
COMMON_channels_t
*
ccP
,
sub_frame_t
subframeP
)
//------------------------------------------------------------------------------
{
// if FDD return dummy value
if
(
ccP
->
tdd_Config
==
NULL
)
return
0
;
switch
(
ccP
->
tdd_Config
->
subframeAssignment
)
{
}
break
;
case
1
:
switch
(
subframeP
)
{
case
0
:
...
...
@@ -611,6 +596,26 @@ is_UL_sf(COMMON_channels_t *ccP,
break
;
case
2
:
switch
(
subframeP
)
{
case
0
:
case
3
:
case
4
:
case
5
:
case
8
:
case
9
:
return
(
0
);
break
;
case
2
:
case
7
:
return
(
1
);
break
;
default:
return
(
0
);
break
;
}
break
;
case
3
:
if
(
subframeP
<=
1
||
subframeP
>=
5
)
return
0
;
...
...
@@ -629,11 +634,27 @@ is_UL_sf(COMMON_channels_t *ccP,
return
1
;
case
6
:
switch
(
subframeP
)
{
case
0
:
case
5
:
case
9
:
return
0
;
case
2
:
case
3
:
case
4
:
case
7
:
case
8
:
return
1
;
default:
AssertFatal
(
1
==
0
,
"subframe %d Unsupported TDD configuration %d
\n
"
,
subframeP
,
(
int
)
ccP
->
tdd_Config
->
subframeAssignment
);
return
0
;
}
break
;
default:
AssertFatal
(
1
==
0
,
"subframe %d Unsupported TDD configuration %d
\n
"
,
subframeP
,
(
int
)
ccP
->
tdd_Config
->
subframeAssignment
);
}
return
0
;
...
...
@@ -673,23 +694,54 @@ ul_subframe2_k_phich(COMMON_channels_t *cc,
sub_frame_t
ul_subframe
)
//------------------------------------------------------------------------------
{
if
(
cc
->
tdd_Config
)
{
//TODO fill other tdd config
switch
(
cc
->
tdd_Config
->
subframeAssignment
)
{
if
(
cc
->
tdd_Config
)
{
switch
(
cc
->
tdd_Config
->
subframeAssignment
)
{
case
0
:
if
(
ul_subframe
==
2
||
ul_subframe
==
7
)
return
4
;
else
if
(
ul_subframe
==
3
||
ul_subframe
==
8
)
return
7
;
else
if
(
ul_subframe
==
4
||
ul_subframe
==
9
)
return
6
;
else
return
255
;
break
;
case
1
:
if
(
ul_subframe
==
2
||
ul_subframe
==
7
)
if
(
ul_subframe
==
2
||
ul_subframe
==
7
)
return
4
;
else
if
(
ul_subframe
==
3
||
ul_subframe
==
8
)
else
if
(
ul_subframe
==
3
||
ul_subframe
==
8
)
return
6
;
return
255
;
case
2
:
if
(
ul_subframe
==
2
||
ul_subframe
==
7
)
return
6
;
else
return
255
;
case
3
:
if
(
ul_subframe
==
2
||
ul_subframe
==
3
||
ul_subframe
==
4
)
return
6
;
case
4
:
if
(
ul_subframe
==
2
||
ul_subframe
==
3
)
return
6
;
case
5
:
if
(
ul_subframe
==
2
)
return
6
;
case
6
:
if
(
ul_subframe
==
2
||
ul_subframe
==
7
)
return
4
;
else
if
(
ul_subframe
==
3
||
ul_subframe
==
4
)
return
6
;
else
if
(
ul_subframe
==
8
)
return
7
;
else
return
255
;
break
;
}
}
...
...
@@ -2436,84 +2488,6 @@ get_tmode(module_id_t module_idP,
return
0
;
}
//------------------------------------------------------------------------------
int8_t
get_ULharq
(
module_id_t
module_idP
,
int
CC_idP
,
uint16_t
frameP
,
uint8_t
subframeP
)
//------------------------------------------------------------------------------
{
int8_t
ret
=
-
1
;
eNB_MAC_INST
*
eNB
=
RC
.
mac
[
module_idP
];
COMMON_channels_t
*
cc
=
&
eNB
->
common_channels
[
CC_idP
];
if
(
cc
->
tdd_Config
==
NULL
)
{
// FDD
ret
=
(((
frameP
<<
1
)
+
subframeP
)
&
7
);
}
else
{
switch
(
cc
->
tdd_Config
->
subframeAssignment
)
{
case
1
:
switch
(
subframeP
)
{
case
2
:
case
3
:
ret
=
(
subframeP
-
2
);
break
;
case
7
:
case
8
:
ret
=
(
subframeP
-
5
);
break
;
default:
AssertFatal
(
1
==
0
,
"subframe2_harq_pid, Illegal subframe %d for TDD mode %d
\n
"
,
subframeP
,
(
int
)
cc
->
tdd_Config
->
subframeAssignment
);
break
;
}
break
;
case
2
:
AssertFatal
((
subframeP
==
2
)
||
(
subframeP
==
7
),
"subframe2_harq_pid, Illegal subframe %d for TDD mode %d
\n
"
,
subframeP
,
(
int
)
cc
->
tdd_Config
->
subframeAssignment
);
ret
=
(
subframeP
/
7
);
break
;
case
3
:
AssertFatal
((
subframeP
>
1
)
&&
(
subframeP
<
5
),
"subframe2_harq_pid, Illegal subframe %d for TDD mode %d
\n
"
,
subframeP
,
(
int
)
cc
->
tdd_Config
->
subframeAssignment
);
ret
=
(
subframeP
-
2
);
break
;
case
4
:
AssertFatal
((
subframeP
>
1
)
&&
(
subframeP
<
4
),
"subframe2_harq_pid, Illegal subframe %d for TDD mode %d
\n
"
,
subframeP
,
(
int
)
cc
->
tdd_Config
->
subframeAssignment
);
ret
=
(
subframeP
-
2
);
break
;
case
5
:
AssertFatal
(
subframeP
==
2
,
"subframe2_harq_pid, Illegal subframe %d for TDD mode %d
\n
"
,
subframeP
,
(
int
)
cc
->
tdd_Config
->
subframeAssignment
);
ret
=
(
subframeP
-
2
);
break
;
default:
AssertFatal
(
1
==
0
,
"subframe2_harq_pid, Unsupported TDD mode %d
\n
"
,
(
int
)
cc
->
tdd_Config
->
subframeAssignment
);
break
;
}
}
AssertFatal
(
ret
!=
-
1
,
"invalid harq_pid(%d) at SFN/SF = %d/%d
\n
"
,
(
int8_t
)
ret
,
frameP
,
subframeP
);
return
ret
;
}
//------------------------------------------------------------------------------
uint16_t
getRIV
(
uint16_t
N_RB_DL
,
...
...
@@ -3626,10 +3600,8 @@ int CCE_try_allocate_ulsch(int module_id,
}
//------------------------------------------------------------------------------
void
get_retransmission_timing
(
LTE_TDD_Config_t
*
tdd_Config
,
frame_t
*
frameP
,
sub_frame_t
*
subframeP
)
// Used for MSG 4
void
get_retransmission_timing
(
LTE_TDD_Config_t
*
tdd_Config
,
frame_t
*
frameP
,
sub_frame_t
*
subframeP
)
//------------------------------------------------------------------------------
{
if
(
tdd_Config
==
NULL
)
{
...
...
@@ -3639,12 +3611,14 @@ get_retransmission_timing(LTE_TDD_Config_t *tdd_Config,
*
subframeP
=
(
*
subframeP
+
8
)
%
10
;
}
else
{
switch
(
tdd_Config
->
subframeAssignment
)
{
//TODO fill in other TDD configs
default:
printf
(
"%s:%d: TODO
\n
"
,
__FILE__
,
__LINE__
);
abort
();
switch
(
tdd_Config
->
subframeAssignment
)
{
// TODO fill in other TDD configs
case
0
:
if
(
*
subframeP
==
0
||
*
subframeP
==
5
)
{
*
subframeP
+=
0
;
*
frameP
=
(
*
frameP
+
1
)
%
1024
;
}
else
{
LOG_E
(
MAC
,
"Illegal dl subframe %d for tdd config %ld
\n
"
,
*
subframeP
,
tdd_Config
->
subframeAssignment
);
}
break
;
case
1
:
...
...
@@ -3657,12 +3631,52 @@ get_retransmission_timing(LTE_TDD_Config_t *tdd_Config,
*
frameP
=
(
*
frameP
+
(
*
subframeP
/
10
))
%
1024
;
*
subframeP
%=
10
;
}
else
{
AssertFatal
(
2
==
1
,
"Illegal dl subframe %d for tdd config %ld
\n
"
,
*
subframeP
,
tdd_Config
->
subframeAssignment
);
AssertFatal
(
2
==
1
,
"Illegal dl subframe %d for tdd config %ld
\n
"
,
*
subframeP
,
tdd_Config
->
subframeAssignment
);
}
break
;
case
2
:
if
(
*
subframeP
==
0
)
{
*
subframeP
=
4
;
*
frameP
=
(
*
frameP
+
1
)
%
1024
;
}
else
if
(
*
subframeP
==
3
)
{
*
subframeP
=
5
;
*
frameP
=
(
*
frameP
+
1
)
%
1024
;
}
else
if
(
*
subframeP
==
4
)
{
*
subframeP
=
8
;
*
frameP
=
(
*
frameP
+
1
)
%
1024
;
}
else
if
(
*
subframeP
==
5
)
{
*
subframeP
=
9
;
*
frameP
=
(
*
frameP
+
1
)
%
1024
;
}
else
if
(
*
subframeP
==
8
)
{
*
subframeP
=
0
;
*
frameP
=
(
*
frameP
+
2
)
%
1024
;
}
else
if
(
*
subframeP
==
9
)
{
*
subframeP
=
3
;
*
frameP
=
(
*
frameP
+
2
)
%
1024
;
}
else
{
LOG_E
(
MAC
,
"Illegal dl subframe %d for tdd config %ld
\n
"
,
*
subframeP
,
tdd_Config
->
subframeAssignment
);
return
;
}
break
;
case
6
:
if
(
*
subframeP
==
0
)
{
*
subframeP
=
5
;
*
frameP
=
(
*
frameP
+
1
)
%
1024
;
}
else
if
(
*
subframeP
==
9
)
{
*
subframeP
=
0
;
*
frameP
=
(
*
frameP
+
2
)
%
1024
;
}
else
if
(
*
subframeP
==
5
)
{
*
subframeP
=
9
;
*
frameP
=
(
*
frameP
+
1
)
%
1024
;
}
else
{
AssertFatal
(
2
==
1
,
"Illegal dl subframe %d for tdd config %ld
\n
"
,
*
subframeP
,
tdd_Config
->
subframeAssignment
);
}
break
;
default:
printf
(
"%s:%d: TODO
\n
"
,
__FILE__
,
__LINE__
);
abort
();
}
}
...
...
@@ -3676,10 +3690,17 @@ get_dl_subframe_count(int tdd_config_sfa,
//------------------------------------------------------------------------------
{
uint8_t
tdd1
[
10
]
=
{
1
,
-
1
,
-
1
,
-
1
,
2
,
3
,
-
1
,
-
1
,
-
1
,
4
};
// special subframes 1,6 are excluded
uint8_t
tdd6
[
10
]
=
{
1
,
-
1
,
-
1
,
-
1
,
-
1
,
2
,
-
1
,
-
1
,
-
1
,
3
};
// special subframes 1,6 are excluded
switch
(
tdd_config_sfa
)
{
// TODO fill in other tdd configs
case
1
:
return
tdd1
[
subframeP
];
break
;
case
6
:
return
tdd6
[
subframeP
];
break
;
default:
AssertFatal
(
1
==
0
,
"TDD config not supported"
);
}
return
-
1
;
...
...
@@ -3714,6 +3735,23 @@ frame_subframe2_dl_harq_pid(LTE_TDD_Config_t *tdd_Config,
count
,
harq_pid
);
return
harq_pid
;
case
6
:
count
=
get_dl_subframe_count
(
tdd_Config
->
subframeAssignment
,
subframeP
);
harq_pid
=
(((
frame_cnt
*
1024
+
abs_frameP
)
*
3
)
-
1
+
count
)
%
6
;
// 3 dl subframes in a frame
if
(
harq_pid
<
0
)
{
harq_pid
+=
6
;
}
LOG_D
(
MAC
,
"[frame_subframe2_dl_harq_pid] (%d,%d) calculate harq_pid ((( %d * 1024 + %d) *3) - 1 + %d) = %d
\n
"
,
(
abs_frameP
+
1024
)
%
1024
,
subframeP
,
frame_cnt
,
abs_frameP
,
count
,
harq_pid
);
return
harq_pid
;
}
}
else
{
return
((
abs_frameP
*
10
)
+
subframeP
)
&
7
;
...
...
@@ -3792,6 +3830,18 @@ ul_ACK_subframe2M(LTE_TDD_Config_t *tdd_Config,
subframe
,
tdd_Config
->
subframeAssignment
);
break
;
case
6
:
if
(
subframe
==
2
||
subframe
==
3
||
subframe
==
4
||
subframe
==
7
||
subframe
==
8
)
{
return
1
;
}
else
{
LOG_E
(
PHY
,
"eNB_scheduler_primitives.c/ul_ACK_subframe2M: illegal subframe %d for tdd_config %ld
\n
"
,
subframe
,
tdd_Config
->
subframeAssignment
);
return
(
0
);
}
break
;
}
return
0
;
...
...
@@ -3807,11 +3857,26 @@ ul_ACK_subframe2dl_subframe(LTE_TDD_Config_t *tdd_Config,
if
(
tdd_Config
==
NULL
)
{
return
((
subframe
<
4
)
?
subframe
+
6
:
subframe
-
4
);
}
switch
(
tdd_Config
->
subframeAssignment
)
{
case
0
:
if
(
subframe
==
2
)
{
// ACK subframe 6
return
(
6
);
}
else
if
(
subframe
==
4
)
{
// ACK subframe 0
return
(
0
);
}
else
if
(
subframe
==
7
)
{
// ACK subframe 1
return
(
1
);
}
else
if
(
subframe
==
9
)
{
// ACK subframe 5
return
(
5
);
}
else
{
LOG_E
(
MAC
,
"illegal subframe %d for tdd_config %ld
\n
"
,
subframe
,
tdd_Config
->
subframeAssignment
);
return
(
0
);
}
break
;
case
3
:
if
(
subframe
==
2
)
{
// ACK subframes 5 and 6
if
(
ACK_index
==
2
)
return
1
;
if
(
ACK_index
==
2
)
return
1
;
return
(
5
+
ACK_index
);
}
...
...
@@ -3831,9 +3896,10 @@ ul_ACK_subframe2dl_subframe(LTE_TDD_Config_t *tdd_Config,
case
4
:
if
(
subframe
==
2
)
{
// ACK subframes 0, 4 and 5
//if (ACK_index==2)
//
if (ACK_index==2)
// return(1); TBC
if
(
ACK_index
==
2
)
return
0
;
if
(
ACK_index
==
2
)
return
0
;
return
(
4
+
ACK_index
);
}
...
...
@@ -3868,6 +3934,41 @@ ul_ACK_subframe2dl_subframe(LTE_TDD_Config_t *tdd_Config,
subframe
,
tdd_Config
->
subframeAssignment
);
break
;
case
2
:
if
(
subframe
==
2
)
{
// ACK subframes 4 and 5 and 8
if
(
ACK_index
==
2
)
{
return
(
8
);
}
return
(
4
+
ACK_index
);
}
else
if
(
subframe
==
7
)
{
// ACK subframes 9 and 0 and 3
if
(
ACK_index
==
2
)
{
return
(
3
);
}
return
((
9
+
ACK_index
)
%
10
);
// To be updated
}
else
{
LOG_E
(
MAC
,
"illegal subframe %d for tdd_config %ld
\n
"
,
subframe
,
tdd_Config
->
subframeAssignment
);
return
255
;
}
break
;
case
6
:
if
(
subframe
==
2
)
{
// ACK subframe 5
return
(
5
);
}
else
if
(
subframe
==
3
)
{
// ACK subframe 6
return
(
6
);
}
else
if
(
subframe
==
4
)
{
// ACK subframe 9
return
(
9
);
}
else
if
(
subframe
==
7
)
{
// ACK subframe 0
return
(
0
);
}
else
if
(
subframe
==
8
)
{
// ACK subframe 1
return
(
1
);
}
else
{
LOG_E
(
MAC
,
"illegal subframe %d for tdd_config %ld
\n
"
,
subframe
,
tdd_Config
->
subframeAssignment
);
return
(
0
);
}
break
;
}
return
0
;
...
...
@@ -3933,8 +4034,22 @@ extract_harq(module_id_t mod_idP,
subframeP
,
m
);
if
(
frameP
==
1023
&&
subframeP
>
5
)
frame_tx
=-
1
;
else
frame_tx
=
subframeP
<
4
?
frameP
-
1
:
frameP
;
if
(
subframe_tx
==
255
)
{
AssertFatal
(
subframe_tx
!=
0xff
,
"illegal subframe number 0xff
\n
"
);
}
if
(
cc
->
tdd_Config
->
subframeAssignment
==
2
||
cc
->
tdd_Config
->
subframeAssignment
==
6
)
{
if
(
subframe_tx
>
subframeP
)
{
frame_tx
=
(
frameP
+
1023
)
%
1024
;
// will reduce by one
}
else
{
frame_tx
=
frameP
;
}
}
else
{
if
(
frameP
==
1023
&&
subframeP
>
5
)
frame_tx
=
-
1
;
else
frame_tx
=
subframeP
<
4
?
frameP
-
1
:
frameP
;
}
harq_pid
=
frame_subframe2_dl_harq_pid
(
cc
->
tdd_Config
,
frame_tx
,
...
...
openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
View file @
4171dcc0
...
...
@@ -792,15 +792,36 @@ rx_sdu(const module_id_t enb_mod_idP,
if
(
mac
->
common_channels
[
CC_idP
].
tdd_Config
!=
NULL
)
{
switch
(
mac
->
common_channels
[
CC_idP
].
tdd_Config
->
subframeAssignment
)
{
case
0
:
ra
->
Msg4_frame
=
frameP
+
1
;
ra
->
Msg4_subframe
=
((
subframeP
<
5
)
?
0
:
5
);
break
;
case
1
:
ra
->
Msg4_frame
=
frameP
+
((
subframeP
>
2
)
?
1
:
0
);
ra
->
Msg4_subframe
=
(
subframeP
+
7
)
%
10
;
break
;
case
2
:
ra
->
Msg4_frame
=
(
frameP
+
((
subframeP
>
2
)
?
1
:
0
))
%
1024
;
ra
->
Msg4_subframe
=
(
subframeP
+
6
)
%
10
;
break
;
case
3
:
case
4
:
case
5
:
ra
->
Msg4_frame
=
frameP
;
ra
->
Msg4_subframe
=
subframeP
+
4
;
break
;
case
6
:
ra
->
Msg4_frame
=
frameP
+
((
subframeP
<
5
)
?
0
:
1
);
ra
->
Msg4_subframe
=
((
subframeP
<
5
)
?
9
:
5
);
break
;
default:
printf
(
"%s:%d: TODO
\n
"
,
__FILE__
,
__LINE__
);
abort
();
// TODO need to be complete for other tdd configs.
}
}
else
{
/* Program Msg4 PDCCH+DLSCH/MPDCCH transmission 4 subframes from now,
...
...
@@ -1562,12 +1583,17 @@ schedule_ulsch_rnti(module_id_t module_idP,
* Subframes:36.213/7.2.3 CQI definition */
if
(
cc
[
CC_id
].
tdd_Config
)
{
switch
(
cc
[
CC_id
].
tdd_Config
->
subframeAssignment
)
{
case
0
:
case
1
:
case
2
:
case
6
:
if
(
subframeP
==
1
||
subframeP
==
6
)
cqi_req
=
0
;
break
;
case
3
:
case
4
:
case
5
:
if
(
subframeP
==
1
)
cqi_req
=
0
;
break
;
...
...
openair2/LAYER2/MAC/mac_proto.h
View file @
4171dcc0
...
...
@@ -1051,14 +1051,6 @@ uint8_t ul_subframe2_k_phich(COMMON_channels_t *cc, sub_frame_t ul_subframe);
unsigned
char
ul_ACK_subframe2M
(
LTE_TDD_Config_t
*
tdd_Config
,
unsigned
char
subframe
);
uint8_t
get_Msg3harqpid
(
COMMON_channels_t
*
cc
,
frame_t
frame
,
sub_frame_t
current_subframe
);
uint32_t
pdcchalloc2ulframe
(
COMMON_channels_t
*
ccP
,
uint32_t
frame
,
uint8_t
n
);
uint8_t
pdcchalloc2ulsubframe
(
COMMON_channels_t
*
ccP
,
uint8_t
n
);
int
is_UL_sf
(
COMMON_channels_t
*
ccP
,
sub_frame_t
subframeP
);
uint8_t
getQm
(
uint8_t
mcs
);
...
...
openair2/RRC/LTE/MESSAGES/asn1_msg.c
View file @
4171dcc0
...
...
@@ -2738,6 +2738,8 @@ do_RRCConnectionSetup(
physicalConfigDedicated2
->
schedulingRequestConfig
->
choice
.
setup
.
sr_PUCCH_ResourceIndex
=
71
-
ue_context_pP
->
local_uid
/
10
;
//ue_context_pP->local_uid;
}
else
{
switch
(
carrier
->
sib1
->
tdd_Config
->
subframeAssignment
)
{
case
0
:
case
6
:
case
1
:
switch
(
frame_parms
->
N_RB_UL
)
{
case
25
:
...
...
@@ -2779,6 +2781,12 @@ do_RRCConnectionSetup(
physicalConfigDedicated2
->
schedulingRequestConfig
->
choice
.
setup
.
sr_ConfigIndex
=
7
+
(
ue_context_pP
->
local_uid
&
1
);
// Isr = 5 (every 10 subframes, offset=2 for UE0, 3 for UE1, 3 for UE2, 2 for UE3 , etc..)
break
;
case
6
:
// To be checked : Multi UE
physicalConfigDedicated2
->
schedulingRequestConfig
->
choice
.
setup
.
sr_ConfigIndex
=
18
+
(
ue_context_pP
->
local_uid
&
3
)
*
5
;
// Isr = 18 (every 20 subframes, offset=3 for UE0, 7 for UE1, 2 for UE2, 7 for UE3 , 2 for UE4 etc..)
break
;
default:
physicalConfigDedicated2
->
schedulingRequestConfig
->
choice
.
setup
.
sr_ConfigIndex
=
7
;
// Isr = 5 (every 10 subframes, offset=2 for all UE0 etc..)
...
...
openair2/RRC/LTE/rrc_eNB.c
View file @
4171dcc0
...
...
@@ -4477,6 +4477,12 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct
physicalConfigDedicated2
->
schedulingRequestConfig
->
choice
.
setup
.
sr_ConfigIndex
=
7
+
(
ue_context_pP
->
local_uid
&
1
);
// Isr = 5 (every 10 subframes, offset=2 for UE0, 3 for UE1, 3 for UE2, 2 for UE3 , etc..)
break
;
case
6
:
physicalConfigDedicated2
->
schedulingRequestConfig
->
choice
.
setup
.
sr_ConfigIndex
=
18
+
(
ue_context_pP
->
local_uid
&
3
)
*
5
;
// Isr = 18 (every 20 subframes, offset=3 for UE0, 7 for UE1, 2 for UE2, 7 for UE3 , 2 for UE4 etc..)
break
;
default:
physicalConfigDedicated2
->
schedulingRequestConfig
->
choice
.
setup
.
sr_ConfigIndex
=
7
;
// Isr = 5 (every 10 subframes, offset=2 for all UE0 etc..)
...
...
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