- Global variables that are never written to are marked const - Remove some EXTERN declaration - Remove unused `log_mem_multi` from logging module
2174 lines
88 KiB
C
2174 lines
88 KiB
C
/*
|
|
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership.
|
|
* The OpenAirInterface Software Alliance licenses this file to You under
|
|
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
|
* except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.openairinterface.org/?page_id=698
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*-------------------------------------------------------------------------------
|
|
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
|
* contact@openairinterface.org
|
|
*/
|
|
|
|
/*! \file PHY/LTE_TRANSPORT/dci_tools.c
|
|
* \brief PHY Support routines (eNB/UE) for filling PDSCH/PUSCH/DLSCH/ULSCH data structures based on DCI PDUs generated by eNB MAC scheduler.
|
|
* \author R. Knopp
|
|
* \date 2011
|
|
* \version 0.1
|
|
* \company Eurecom
|
|
* \email: knopp@eurecom.fr
|
|
* \note
|
|
* \warning
|
|
*/
|
|
|
|
#include "PHY/defs_eNB.h"
|
|
#include "PHY/phy_extern.h"
|
|
#ifdef DEBUG_DCI_TOOLS
|
|
#include "PHY/phy_vars.h"
|
|
#endif
|
|
#include "assertions.h"
|
|
#include "nfapi_interface.h"
|
|
#include "transport_common_proto.h"
|
|
#include "SCHED/sched_common.h"
|
|
//#define DEBUG_HARQ
|
|
#include "openair1/PHY/LTE_TRANSPORT/dci_tools_common_extern.h"
|
|
|
|
//#define DEBUG_DCI
|
|
|
|
uint32_t localRIV2alloc_LUT6[32];
|
|
uint32_t distRIV2alloc_even_LUT6[32];
|
|
uint32_t distRIV2alloc_odd_LUT6[32];
|
|
uint16_t RIV2nb_rb_LUT6[32];
|
|
uint16_t RIV2first_rb_LUT6[32];
|
|
uint16_t RIV_max6=0;
|
|
|
|
uint32_t localRIV2alloc_LUT25[512];
|
|
uint32_t distRIV2alloc_even_LUT25[512];
|
|
uint32_t distRIV2alloc_odd_LUT25[512];
|
|
uint16_t RIV2nb_rb_LUT25[512];
|
|
uint16_t RIV2first_rb_LUT25[512];
|
|
uint16_t RIV_max25=0;
|
|
|
|
|
|
uint32_t localRIV2alloc_LUT50_0[1600];
|
|
uint32_t localRIV2alloc_LUT50_1[1600];
|
|
uint32_t distRIV2alloc_gap0_even_LUT50_0[1600];
|
|
uint32_t distRIV2alloc_gap0_odd_LUT50_0[1600];
|
|
uint32_t distRIV2alloc_gap0_even_LUT50_1[1600];
|
|
uint32_t distRIV2alloc_gap0_odd_LUT50_1[1600];
|
|
uint32_t distRIV2alloc_gap1_even_LUT50_0[1600];
|
|
uint32_t distRIV2alloc_gap1_odd_LUT50_0[1600];
|
|
uint32_t distRIV2alloc_gap1_even_LUT50_1[1600];
|
|
uint32_t distRIV2alloc_gap1_odd_LUT50_1[1600];
|
|
uint16_t RIV2nb_rb_LUT50[1600];
|
|
uint16_t RIV2first_rb_LUT50[1600];
|
|
uint16_t RIV_max50=0;
|
|
|
|
uint32_t localRIV2alloc_LUT100_0[6000];
|
|
uint32_t localRIV2alloc_LUT100_1[6000];
|
|
uint32_t localRIV2alloc_LUT100_2[6000];
|
|
uint32_t localRIV2alloc_LUT100_3[6000];
|
|
uint32_t distRIV2alloc_gap0_even_LUT100_0[6000];
|
|
uint32_t distRIV2alloc_gap0_odd_LUT100_0[6000];
|
|
uint32_t distRIV2alloc_gap0_even_LUT100_1[6000];
|
|
uint32_t distRIV2alloc_gap0_odd_LUT100_1[6000];
|
|
uint32_t distRIV2alloc_gap0_even_LUT100_2[6000];
|
|
uint32_t distRIV2alloc_gap0_odd_LUT100_2[6000];
|
|
uint32_t distRIV2alloc_gap0_even_LUT100_3[6000];
|
|
uint32_t distRIV2alloc_gap0_odd_LUT100_3[6000];
|
|
uint32_t distRIV2alloc_gap1_even_LUT100_0[6000];
|
|
uint32_t distRIV2alloc_gap1_odd_LUT100_0[6000];
|
|
uint32_t distRIV2alloc_gap1_even_LUT100_1[6000];
|
|
uint32_t distRIV2alloc_gap1_odd_LUT100_1[6000];
|
|
uint32_t distRIV2alloc_gap1_even_LUT100_2[6000];
|
|
uint32_t distRIV2alloc_gap1_odd_LUT100_2[6000];
|
|
uint32_t distRIV2alloc_gap1_even_LUT100_3[6000];
|
|
uint32_t distRIV2alloc_gap1_odd_LUT100_3[6000];
|
|
uint16_t RIV2nb_rb_LUT100[6000];
|
|
uint16_t RIV2first_rb_LUT100[6000];
|
|
uint16_t RIV_max100=0;
|
|
|
|
uint32_t check_phich_reg(LTE_DL_FRAME_PARMS *frame_parms,uint32_t kprime,uint8_t lprime,uint8_t mi)
|
|
{
|
|
|
|
uint16_t i;
|
|
uint16_t Ngroup_PHICH = (frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)/48;
|
|
uint16_t mprime;
|
|
uint16_t *pcfich_reg = frame_parms->pcfich_reg;
|
|
|
|
if ((lprime>0) && (frame_parms->Ncp==0) )
|
|
return(0);
|
|
|
|
// printf("check_phich_reg : mi %d\n",mi);
|
|
|
|
// compute REG based on symbol
|
|
if ((lprime == 0)||
|
|
((lprime==1)&&(frame_parms->nb_antenna_ports_eNB == 4)))
|
|
mprime = kprime/6;
|
|
else
|
|
mprime = kprime>>2;
|
|
|
|
// check if PCFICH uses mprime
|
|
if ((lprime==0) &&
|
|
((mprime == pcfich_reg[0]) ||
|
|
(mprime == pcfich_reg[1]) ||
|
|
(mprime == pcfich_reg[2]) ||
|
|
(mprime == pcfich_reg[3]))) {
|
|
#ifdef DEBUG_DCI_ENCODING
|
|
printf("[PHY] REG %d allocated to PCFICH\n",mprime);
|
|
#endif
|
|
return(1);
|
|
}
|
|
|
|
// handle Special subframe case for TDD !!!
|
|
|
|
// printf("Checking phich_reg %d\n",mprime);
|
|
if (mi > 0) {
|
|
if (((frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)%48) > 0)
|
|
Ngroup_PHICH++;
|
|
|
|
if (frame_parms->Ncp == 1) {
|
|
Ngroup_PHICH<<=1;
|
|
}
|
|
|
|
|
|
|
|
for (i=0; i<Ngroup_PHICH; i++) {
|
|
if ((mprime == frame_parms->phich_reg[i][0]) ||
|
|
(mprime == frame_parms->phich_reg[i][1]) ||
|
|
(mprime == frame_parms->phich_reg[i][2])) {
|
|
#ifdef DEBUG_DCI_ENCODING
|
|
printf("[PHY] REG %d (lprime %d) allocated to PHICH\n",mprime,lprime);
|
|
#endif
|
|
return(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
return(0);
|
|
}
|
|
|
|
uint16_t get_nquad(uint8_t num_pdcch_symbols,LTE_DL_FRAME_PARMS *frame_parms,uint8_t mi)
|
|
{
|
|
|
|
uint16_t Nreg=0;
|
|
uint8_t Ngroup_PHICH = (frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)/48;
|
|
|
|
if (((frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)%48) > 0)
|
|
Ngroup_PHICH++;
|
|
|
|
if (frame_parms->Ncp == 1) {
|
|
Ngroup_PHICH<<=1;
|
|
}
|
|
|
|
Ngroup_PHICH*=mi;
|
|
|
|
if ((num_pdcch_symbols>0) && (num_pdcch_symbols<4))
|
|
switch (frame_parms->N_RB_DL) {
|
|
case 6:
|
|
Nreg=12+(num_pdcch_symbols-1)*18;
|
|
break;
|
|
|
|
case 25:
|
|
Nreg=50+(num_pdcch_symbols-1)*75;
|
|
break;
|
|
|
|
case 50:
|
|
Nreg=100+(num_pdcch_symbols-1)*150;
|
|
break;
|
|
|
|
case 100:
|
|
Nreg=200+(num_pdcch_symbols-1)*300;
|
|
break;
|
|
|
|
default:
|
|
return(0);
|
|
}
|
|
|
|
// printf("Nreg %d (%d)\n",Nreg,Nreg - 4 - (3*Ngroup_PHICH));
|
|
return(Nreg - 4 - (3*Ngroup_PHICH));
|
|
}
|
|
|
|
uint16_t get_nCCE(uint8_t num_pdcch_symbols,LTE_DL_FRAME_PARMS *frame_parms,uint8_t mi)
|
|
{
|
|
return(get_nquad(num_pdcch_symbols,frame_parms,mi)/9);
|
|
}
|
|
|
|
|
|
|
|
|
|
void conv_eMTC_rballoc (uint16_t resource_block_coding, uint32_t N_RB_DL, uint32_t * rb_alloc)
|
|
{
|
|
|
|
|
|
int RIV = resource_block_coding&31;
|
|
int narrowband = resource_block_coding>>5;
|
|
int N_NB_DL = N_RB_DL / 6;
|
|
int i0 = (N_RB_DL >> 1) - (3 * N_NB_DL);
|
|
int first_rb = (6 * narrowband) + i0;
|
|
int alloc = localRIV2alloc_LUT6[RIV];
|
|
int ind = first_rb >> 5;
|
|
int ind_mod = first_rb & 31;
|
|
|
|
AssertFatal(RIV<32,"RIV is %d > 31\n",RIV);
|
|
|
|
if (((N_RB_DL & 1) > 0) && (narrowband >= (N_NB_DL >> 1)))
|
|
first_rb++;
|
|
rb_alloc[0] = 0;
|
|
rb_alloc[1] = 0;
|
|
rb_alloc[2] = 0;
|
|
rb_alloc[3] = 0;
|
|
rb_alloc[ind] = alloc << ind_mod;
|
|
if (ind_mod > 26)
|
|
rb_alloc[ind + 1] = alloc >> (6 - (ind_mod - 26));
|
|
}
|
|
|
|
|
|
void conv_rballoc(uint8_t ra_header,uint32_t rb_alloc,uint32_t N_RB_DL,uint32_t *rb_alloc2)
|
|
{
|
|
|
|
uint32_t i,shift,subset;
|
|
rb_alloc2[0] = 0;
|
|
rb_alloc2[1] = 0;
|
|
rb_alloc2[2] = 0;
|
|
rb_alloc2[3] = 0;
|
|
|
|
// printf("N_RB_DL %d, ra_header %d, rb_alloc %x\n",N_RB_DL,ra_header,rb_alloc);
|
|
|
|
switch (N_RB_DL) {
|
|
|
|
case 6:
|
|
rb_alloc2[0] = rb_alloc&0x3f;
|
|
break;
|
|
|
|
case 25:
|
|
if (ra_header == 0) {// Type 0 Allocation
|
|
|
|
for (i=12; i>0; i--) {
|
|
if ((rb_alloc&(1<<i)) != 0)
|
|
rb_alloc2[0] |= (3<<((2*(12-i))));
|
|
|
|
// printf("rb_alloc2 (type 0) %x\n",rb_alloc2);
|
|
}
|
|
|
|
if ((rb_alloc&1) != 0)
|
|
rb_alloc2[0] |= (1<<24);
|
|
} else {
|
|
subset = rb_alloc&1;
|
|
shift = (rb_alloc>>1)&1;
|
|
|
|
for (i=0; i<11; i++) {
|
|
if ((rb_alloc&(1<<(i+2))) != 0)
|
|
rb_alloc2[0] |= (1<<(2*i));
|
|
|
|
//printf("rb_alloc2 (type 1) %x\n",rb_alloc2);
|
|
}
|
|
|
|
if ((shift == 0) && (subset == 1))
|
|
rb_alloc2[0]<<=1;
|
|
else if ((shift == 1) && (subset == 0))
|
|
rb_alloc2[0]<<=4;
|
|
else if ((shift == 1) && (subset == 1))
|
|
rb_alloc2[0]<<=3;
|
|
}
|
|
|
|
break;
|
|
|
|
case 50:
|
|
if (ra_header==0) {
|
|
|
|
for (i=16; i>0; i--) {
|
|
if ((rb_alloc & (1 << i)) != 0)
|
|
rb_alloc2[(3 * (16 - i)) >> 5] |= (7U << ((3 * (16 - i)) % 32));
|
|
}
|
|
|
|
// bit mask across
|
|
if ((rb_alloc2[0]>>31)==1)
|
|
rb_alloc2[1] |= 1;
|
|
|
|
if ((rb_alloc&1) != 0)
|
|
rb_alloc2[1] |= (3 << 16);
|
|
}
|
|
else {
|
|
LOG_W(PHY,"resource type 1 not supported for N_RB_DL=50\n");
|
|
}
|
|
break;
|
|
|
|
case 100:
|
|
if (ra_header==0) {
|
|
for (i=0; i<25; i++) {
|
|
if ((rb_alloc & (1 << (24 - i))) != 0)
|
|
rb_alloc2[(4 * i) >> 5] |= (0xfU << ((4 * i) % 32));
|
|
|
|
// printf("rb_alloc2[%d] (type 0) %x (%d)\n",(4*i)>>5,rb_alloc2[(4*i)>>5],rb_alloc&(1<<i));
|
|
}
|
|
}
|
|
else {
|
|
LOG_W(PHY,"resource type 1 not supported for N_RB_DL=100\n");
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
LOG_E(PHY,"Invalid N_RB_DL %d\n", N_RB_DL);
|
|
DevParam (N_RB_DL, 0, 0);
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t conv_nprb(uint8_t ra_header,uint32_t rb_alloc,int N_RB_DL)
|
|
{
|
|
|
|
uint32_t nprb=0,i;
|
|
|
|
switch (N_RB_DL) {
|
|
case 6:
|
|
for (i=0; i<6; i++) {
|
|
if ((rb_alloc&(1<<i)) != 0)
|
|
nprb += 1;
|
|
}
|
|
|
|
break;
|
|
|
|
case 25:
|
|
if (ra_header == 0) {// Type 0 Allocation
|
|
|
|
for (i=12; i>0; i--) {
|
|
if ((rb_alloc&(1<<i)) != 0)
|
|
nprb += 2;
|
|
}
|
|
|
|
if ((rb_alloc&1) != 0)
|
|
nprb += 1;
|
|
} else {
|
|
for (i=0; i<11; i++) {
|
|
if ((rb_alloc&(1<<(i+2))) != 0)
|
|
nprb += 1;
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case 50:
|
|
if (ra_header == 0) {// Type 0 Allocation
|
|
|
|
for (i=0; i<16; i++) {
|
|
if ((rb_alloc&(1<<(16-i))) != 0)
|
|
nprb += 3;
|
|
}
|
|
|
|
if ((rb_alloc&1) != 0)
|
|
nprb += 2;
|
|
|
|
} else {
|
|
for (i=0; i<17; i++) {
|
|
if ((rb_alloc&(1<<(i+2))) != 0)
|
|
nprb += 1;
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case 100:
|
|
if (ra_header == 0) {// Type 0 Allocation
|
|
|
|
for (i=0; i<25; i++) {
|
|
if ((rb_alloc&(1<<(24-i))) != 0)
|
|
nprb += 4;
|
|
}
|
|
} else {
|
|
for (i=0; i<25; i++) {
|
|
if ((rb_alloc&(1<<(i+2))) != 0)
|
|
nprb += 1;
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
LOG_E(PHY,"Invalide N_RB_DL %d\n", N_RB_DL);
|
|
DevParam (N_RB_DL, 0, 0);
|
|
break;
|
|
}
|
|
|
|
return(nprb);
|
|
}
|
|
|
|
uint16_t computeRIV(uint16_t N_RB_DL,uint16_t RBstart,uint16_t Lcrbs)
|
|
{
|
|
|
|
uint16_t RIV;
|
|
|
|
if (Lcrbs<=(1+(N_RB_DL>>1)))
|
|
RIV = (N_RB_DL*(Lcrbs-1)) + RBstart;
|
|
else
|
|
RIV = (N_RB_DL*(N_RB_DL+1-Lcrbs)) + (N_RB_DL-1-RBstart);
|
|
|
|
return(RIV);
|
|
}
|
|
|
|
// Convert a DCI Format 1C RIV to a Format 1A RIV
|
|
// This extracts the start and length in PRBs from the 1C rballoc and
|
|
// recomputes the RIV as if it were the 1A rballoc
|
|
|
|
uint32_t conv_1C_RIV(int32_t rballoc,uint32_t N_RB_DL) {
|
|
|
|
int NpDLVRB,N_RB_step,LpCRBsm1,RBpstart;
|
|
|
|
switch (N_RB_DL) {
|
|
|
|
case 6: // N_RB_step = 2, NDLVRB = 6, NpDLVRB = 3
|
|
NpDLVRB = 3;
|
|
N_RB_step = 2;
|
|
break;
|
|
case 25: // N_RB_step = 2, NDLVRB = 24, NpDLVRB = 12
|
|
NpDLVRB = 12;
|
|
N_RB_step = 2;
|
|
break;
|
|
case 50: // N_RB_step = 4, NDLVRB = 46, NpDLVRB = 11
|
|
NpDLVRB = 11;
|
|
N_RB_step = 4;
|
|
break;
|
|
case 100: // N_RB_step = 4, NDLVRB = 96, NpDLVRB = 24
|
|
NpDLVRB = 24;
|
|
N_RB_step = 4;
|
|
break;
|
|
default:
|
|
NpDLVRB = 24;
|
|
N_RB_step = 4;
|
|
break;
|
|
}
|
|
|
|
// This is the 1C part from 7.1.6.3 in 36.213
|
|
LpCRBsm1 = rballoc/NpDLVRB;
|
|
// printf("LpCRBs = %d\n",LpCRBsm1+1);
|
|
|
|
if (LpCRBsm1 <= (NpDLVRB/2)) {
|
|
RBpstart = rballoc % NpDLVRB;
|
|
}
|
|
else {
|
|
LpCRBsm1 = NpDLVRB-LpCRBsm1;
|
|
RBpstart = NpDLVRB-(rballoc%NpDLVRB);
|
|
}
|
|
// printf("RBpstart %d\n",RBpstart);
|
|
return(computeRIV(N_RB_DL,N_RB_step*RBpstart,N_RB_step*(LpCRBsm1+1)));
|
|
|
|
}
|
|
|
|
// FIXME: this function is compting PRB outside the range, so I FORCED in the range
|
|
// I can't understand the 3GPP spec, see below note
|
|
uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) {
|
|
|
|
int offset;
|
|
int ret=-1;
|
|
|
|
switch (N_RB_DL) {
|
|
|
|
case 6:
|
|
// N_RB_DL = tildeN_RB_DL = 6
|
|
// Ngap = 4 , P=1, Nrow = 2, Nnull = 2
|
|
|
|
switch (vrb) {
|
|
case 0: // even: 0->0, 1->2, odd: 0->3, 1->5
|
|
case 1:
|
|
ret= ((3*odd_slot) + 2*(vrb&3))%6;
|
|
break;
|
|
case 2: // even: 2->3, 3->5, odd: 2->0, 3->2
|
|
case 3:
|
|
ret= ((3*odd_slot) + 2*(vrb&3) + 5)%6;
|
|
break;
|
|
case 4: // even: 4->1, odd: 4->4
|
|
ret= ((3*odd_slot) + 1)%6;
|
|
case 5: // even: 5->4, odd: 5->1
|
|
ret= ((3*odd_slot) + 4)%6;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case 15:
|
|
if (vrb<12) {
|
|
if ((vrb&3) < 2) // even: 0->0, 1->4, 4->1, 5->5, 8->2, 9->6 odd: 0->7, 1->11
|
|
ret= (((7*odd_slot) + 4*(vrb&3) + (vrb>>2))%14) + 14*(vrb/14);
|
|
else if (vrb < 12) // even: 2->7, 3->11, 6->8, 7->12, 10->9, 11->13
|
|
ret= (((7*odd_slot) + 4*(vrb&3) + (vrb>>2) +13 )%14) + 14*(vrb/14);
|
|
}
|
|
if (vrb==12)
|
|
ret= (3+(7*odd_slot)) % 14;
|
|
if (vrb==13)
|
|
ret= (10+(7*odd_slot)) % 14;
|
|
ret= 14;
|
|
break;
|
|
|
|
// Formula in TS 36.211, chap 6.2.3.2
|
|
// Fix me: returns a PRB number > 24 when vrb is 24
|
|
case 25:
|
|
ret= (((12*odd_slot) + 6*(vrb&3) + (vrb>>2))%24) + 24*(vrb/24);
|
|
break;
|
|
|
|
case 50: // P=3
|
|
if (Ngap==0) {
|
|
// Nrow=12,Nnull=2,NVRBDL=46,Ngap1= 27
|
|
if (vrb>=23)
|
|
offset=4;
|
|
else
|
|
offset=0;
|
|
if (vrb<44) {
|
|
if ((vrb&3)>=2)
|
|
ret= offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2) + 45)%46;
|
|
else
|
|
ret= offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2))%46;
|
|
}
|
|
if (vrb==44) // even: 44->11, odd: 45->34
|
|
ret= offset+((23*odd_slot) + 22-12+1);
|
|
if (vrb==45) // even: 45->10, odd: 45->33
|
|
ret= offset+((23*odd_slot) + 22+12);
|
|
if (vrb==46)
|
|
ret= offset+46+((23*odd_slot) + 23-12+1) % 46;
|
|
if (vrb==47)
|
|
ret= offset+46+((23*odd_slot) + 23+12) % 46;
|
|
if (vrb==48)
|
|
ret= offset+46+((23*odd_slot) + 23-12+1) % 46;
|
|
if (vrb==49)
|
|
ret= offset+46+((23*odd_slot) + 23+12) % 46;
|
|
}
|
|
else {
|
|
// Nrow=6,Nnull=6,NVRBDL=18,Ngap1= 27
|
|
if (vrb>=9)
|
|
offset=18;
|
|
else
|
|
offset=0;
|
|
|
|
if (vrb<12) {
|
|
if ((vrb&3)>=2)
|
|
ret= offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2) + 17)%18;
|
|
else
|
|
ret= offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2))%18;
|
|
}
|
|
else {
|
|
ret= offset+((9*odd_slot) + 12*(vrb&1)+(vrb>>1) )%18 + 18*(vrb/18);
|
|
}
|
|
}
|
|
break;
|
|
case 75:
|
|
// Ngap1 = 32, NVRBRL=64, P=4, Nrow= 16, Nnull=0
|
|
if (Ngap ==0) {
|
|
ret= ((32*odd_slot) + 16*(vrb&3) + (vrb>>2))%64 + (vrb/64);
|
|
} else {
|
|
// Ngap2 = 16, NVRBDL=32, Nrow=8, Nnull=0
|
|
ret= ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32);
|
|
}
|
|
break;
|
|
case 100:
|
|
// Ngap1 = 48, NVRBDL=96, Nrow=24, Nnull=0
|
|
if (Ngap ==0) {
|
|
ret= ((48*odd_slot) + 24*(vrb&3) + (vrb>>2))%96 + (vrb/96);
|
|
} else {
|
|
// Ngap2 = 16, NVRBDL=32, Nrow=8, Nnull=0
|
|
ret= ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32);
|
|
}
|
|
break;
|
|
default:
|
|
LOG_E(PHY,"Unknown N_RB_DL %d\n",N_RB_DL);
|
|
ret= 0;
|
|
}
|
|
return ret%N_RB_DL;
|
|
|
|
}
|
|
|
|
|
|
void generate_RIV_tables(void)
|
|
{
|
|
|
|
// 6RBs localized RIV
|
|
uint8_t Lcrbs,RBstart;
|
|
uint16_t RIV;
|
|
uint32_t alloc0,allocdist0_0_even,allocdist0_0_odd,allocdist0_1_even,allocdist0_1_odd;
|
|
uint32_t alloc1,allocdist1_0_even,allocdist1_0_odd,allocdist1_1_even,allocdist1_1_odd;
|
|
uint32_t alloc2,allocdist2_0_even,allocdist2_0_odd,allocdist2_1_even,allocdist2_1_odd;
|
|
uint32_t alloc3,allocdist3_0_even,allocdist3_0_odd,allocdist3_1_even,allocdist3_1_odd;
|
|
uint32_t nVRB,nVRB_even_dist,nVRB_odd_dist;
|
|
|
|
for (RBstart=0; RBstart<6; RBstart++) {
|
|
alloc0 = 0;
|
|
allocdist0_0_even = 0;
|
|
allocdist0_0_odd = 0;
|
|
for (Lcrbs=1; Lcrbs<=(6-RBstart); Lcrbs++) {
|
|
//printf("RBstart %d, len %d --> ",RBstart,Lcrbs);
|
|
nVRB = Lcrbs-1+RBstart;
|
|
alloc0 |= (1<<nVRB);
|
|
allocdist0_0_even |= (1<<get_prb(6,0,nVRB,0));
|
|
allocdist0_0_odd |= (1<<get_prb(6,1,nVRB,0));
|
|
RIV=computeRIV(6,RBstart,Lcrbs);
|
|
|
|
if (RIV>RIV_max6)
|
|
RIV_max6 = RIV;
|
|
|
|
// printf("RIV %d (%d) : first_rb %d NBRB %d\n",RIV,localRIV2alloc_LUT25[RIV],RBstart,Lcrbs);
|
|
localRIV2alloc_LUT6[RIV] = alloc0;
|
|
distRIV2alloc_even_LUT6[RIV] = allocdist0_0_even;
|
|
distRIV2alloc_odd_LUT6[RIV] = allocdist0_0_odd;
|
|
RIV2nb_rb_LUT6[RIV] = Lcrbs;
|
|
RIV2first_rb_LUT6[RIV] = RBstart;
|
|
}
|
|
}
|
|
|
|
|
|
for (RBstart=0; RBstart<25; RBstart++) {
|
|
alloc0 = 0;
|
|
allocdist0_0_even = 0;
|
|
allocdist0_0_odd = 0;
|
|
for (Lcrbs=1; Lcrbs<=(25-RBstart); Lcrbs++) {
|
|
nVRB = Lcrbs-1+RBstart;
|
|
//printf("RBstart %d, len %d --> ",RBstart,Lcrbs);
|
|
alloc0 |= (1<<nVRB);
|
|
allocdist0_0_even |= 1U << get_prb(25, 0, nVRB, 0);
|
|
allocdist0_0_odd |= 1U << get_prb(25, 1, nVRB, 0);
|
|
|
|
//printf("alloc 0 %x, allocdist0_even %x, allocdist0_odd %x\n",alloc0,allocdist0_0_even,allocdist0_0_odd);
|
|
RIV=computeRIV(25,RBstart,Lcrbs);
|
|
|
|
if (RIV>RIV_max25)
|
|
RIV_max25 = RIV;
|
|
|
|
localRIV2alloc_LUT25[RIV] = alloc0;
|
|
distRIV2alloc_even_LUT25[RIV] = allocdist0_0_even;
|
|
distRIV2alloc_odd_LUT25[RIV] = allocdist0_0_odd;
|
|
RIV2nb_rb_LUT25[RIV] = Lcrbs;
|
|
RIV2first_rb_LUT25[RIV] = RBstart;
|
|
}
|
|
}
|
|
|
|
|
|
for (RBstart=0; RBstart<50; RBstart++) {
|
|
alloc0 = 0;
|
|
alloc1 = 0;
|
|
allocdist0_0_even=0;
|
|
allocdist1_0_even=0;
|
|
allocdist0_0_odd=0;
|
|
allocdist1_0_odd=0;
|
|
allocdist0_1_even=0;
|
|
allocdist1_1_even=0;
|
|
allocdist0_1_odd=0;
|
|
allocdist1_1_odd=0;
|
|
|
|
for (Lcrbs=1; Lcrbs<=(50-RBstart); Lcrbs++) {
|
|
|
|
nVRB = Lcrbs-1+RBstart;
|
|
|
|
|
|
if (nVRB<32)
|
|
alloc0 |= 1U << nVRB;
|
|
else
|
|
alloc1 |= 1U << (nVRB - 32);
|
|
|
|
// Distributed Gap1, even slot
|
|
nVRB_even_dist = get_prb(50,0,nVRB,0);
|
|
if (nVRB_even_dist<32)
|
|
allocdist0_0_even |= 1U << nVRB_even_dist;
|
|
else
|
|
allocdist1_0_even |= 1U << (nVRB_even_dist - 32);
|
|
|
|
// Distributed Gap1, odd slot
|
|
nVRB_odd_dist = get_prb(50,1,nVRB,0);
|
|
if (nVRB_odd_dist<32)
|
|
allocdist0_0_odd |= (1U <<nVRB_odd_dist);
|
|
else
|
|
allocdist1_0_odd |= (1U <<(nVRB_odd_dist-32));
|
|
|
|
// Distributed Gap2, even slot
|
|
nVRB_even_dist = get_prb(50,0,nVRB,1);
|
|
if (nVRB_even_dist<32)
|
|
allocdist0_1_even |= 1U << nVRB_even_dist;
|
|
else
|
|
allocdist1_1_even |= 1U << (nVRB_even_dist - 32);
|
|
|
|
// Distributed Gap2, odd slot
|
|
nVRB_odd_dist = get_prb(50,1,nVRB,1);
|
|
if (nVRB_odd_dist<32)
|
|
allocdist0_1_odd |= 1U << nVRB_odd_dist;
|
|
else
|
|
allocdist1_1_odd |= 1U << (nVRB_odd_dist - 32);
|
|
|
|
RIV=computeRIV(50,RBstart,Lcrbs);
|
|
|
|
if (RIV>RIV_max50)
|
|
RIV_max50 = RIV;
|
|
|
|
// printf("RIV %d : first_rb %d NBRB %d\n",RIV,RBstart,Lcrbs);
|
|
localRIV2alloc_LUT50_0[RIV] = alloc0;
|
|
localRIV2alloc_LUT50_1[RIV] = alloc1;
|
|
distRIV2alloc_gap0_even_LUT50_0[RIV] = allocdist0_0_even;
|
|
distRIV2alloc_gap0_even_LUT50_1[RIV] = allocdist1_0_even;
|
|
distRIV2alloc_gap0_odd_LUT50_0[RIV] = allocdist0_0_odd;
|
|
distRIV2alloc_gap0_odd_LUT50_1[RIV] = allocdist1_0_odd;
|
|
distRIV2alloc_gap1_even_LUT50_0[RIV] = allocdist0_1_even;
|
|
distRIV2alloc_gap1_even_LUT50_1[RIV] = allocdist1_1_even;
|
|
distRIV2alloc_gap1_odd_LUT50_0[RIV] = allocdist0_1_odd;
|
|
distRIV2alloc_gap1_odd_LUT50_1[RIV] = allocdist1_1_odd;
|
|
RIV2nb_rb_LUT50[RIV] = Lcrbs;
|
|
RIV2first_rb_LUT50[RIV] = RBstart;
|
|
}
|
|
}
|
|
|
|
|
|
for (RBstart=0; RBstart<100; RBstart++) {
|
|
alloc0 = 0;
|
|
alloc1 = 0;
|
|
alloc2 = 0;
|
|
alloc3 = 0;
|
|
allocdist0_0_even=0;
|
|
allocdist1_0_even=0;
|
|
allocdist2_0_even=0;
|
|
allocdist3_0_even=0;
|
|
allocdist0_0_odd=0;
|
|
allocdist1_0_odd=0;
|
|
allocdist2_0_odd=0;
|
|
allocdist3_0_odd=0;
|
|
allocdist0_1_even=0;
|
|
allocdist1_1_even=0;
|
|
allocdist2_1_even=0;
|
|
allocdist3_1_even=0;
|
|
allocdist0_1_odd=0;
|
|
allocdist1_1_odd=0;
|
|
allocdist2_1_odd=0;
|
|
allocdist3_1_odd=0;
|
|
|
|
for (Lcrbs=1; Lcrbs<=(100-RBstart); Lcrbs++) {
|
|
|
|
nVRB = Lcrbs-1+RBstart;
|
|
|
|
if (nVRB<32)
|
|
alloc0 |= 1U << nVRB;
|
|
else if (nVRB<64)
|
|
alloc1 |= 1U << (nVRB - 32);
|
|
else if (nVRB<96)
|
|
alloc2 |= 1U << (nVRB - 64);
|
|
else
|
|
alloc3 |= 1U << (nVRB - 96);
|
|
|
|
// Distributed Gap1, even slot
|
|
nVRB_even_dist = get_prb(100,0,nVRB,0);
|
|
|
|
// if ((RBstart==0) && (Lcrbs<=8))
|
|
// printf("nVRB %d => nVRB_even_dist %d\n",nVRB,nVRB_even_dist);
|
|
|
|
if (nVRB_even_dist<32)
|
|
allocdist0_0_even |= 1U << nVRB_even_dist;
|
|
else if (nVRB_even_dist<64)
|
|
allocdist1_0_even |= 1U << (nVRB_even_dist - 32);
|
|
else if (nVRB_even_dist<96)
|
|
allocdist2_0_even |= 1U << (nVRB_even_dist - 64);
|
|
else
|
|
allocdist3_0_even |= 1U << (nVRB_even_dist - 96);
|
|
/* if ((RBstart==0) && (Lcrbs<=8))
|
|
printf("rballoc =>(%08x.%08x.%08x.%08x)\n",
|
|
allocdist0_0_even,
|
|
allocdist1_0_even,
|
|
allocdist2_0_even,
|
|
allocdist3_0_even
|
|
);
|
|
*/
|
|
// Distributed Gap1, odd slot
|
|
nVRB_odd_dist = get_prb(100,1,nVRB,0);
|
|
if (nVRB_odd_dist<32)
|
|
allocdist0_0_odd |= 1U << nVRB_odd_dist;
|
|
else if (nVRB_odd_dist<64)
|
|
allocdist1_0_odd |= 1U << (nVRB_odd_dist - 32);
|
|
else if (nVRB_odd_dist<96)
|
|
allocdist2_0_odd |= 1U << (nVRB_odd_dist - 64);
|
|
else
|
|
allocdist3_0_odd |= 1U << (nVRB_odd_dist - 96);
|
|
|
|
|
|
// Distributed Gap2, even slot
|
|
nVRB_even_dist = get_prb(100,0,nVRB,1);
|
|
if (nVRB_even_dist<32)
|
|
allocdist0_1_even |= 1U << nVRB_even_dist;
|
|
else if (nVRB_even_dist<64)
|
|
allocdist1_1_even |= 1U << (nVRB_even_dist - 32);
|
|
else if (nVRB_even_dist<96)
|
|
allocdist2_1_even |= 1U << (nVRB_even_dist - 64);
|
|
else
|
|
allocdist3_1_even |= 1U << (nVRB_even_dist - 96);
|
|
|
|
|
|
// Distributed Gap2, odd slot
|
|
nVRB_odd_dist = get_prb(100,1,nVRB,1);
|
|
if (nVRB_odd_dist<32)
|
|
allocdist0_1_odd |= 1U << nVRB_odd_dist;
|
|
else if (nVRB_odd_dist<64)
|
|
allocdist1_1_odd |= 1U << (nVRB_odd_dist - 32);
|
|
else if (nVRB_odd_dist<96)
|
|
allocdist2_1_odd |= 1U << (nVRB_odd_dist - 64);
|
|
else
|
|
allocdist3_1_odd |= 1U << (nVRB_odd_dist - 96);
|
|
|
|
RIV=computeRIV(100,RBstart,Lcrbs);
|
|
|
|
if (RIV>RIV_max100)
|
|
RIV_max100 = RIV;
|
|
|
|
// printf("RIV %d : first_rb %d NBRB %d\n",RIV,RBstart,Lcrbs);
|
|
localRIV2alloc_LUT100_0[RIV] = alloc0;
|
|
localRIV2alloc_LUT100_1[RIV] = alloc1;
|
|
localRIV2alloc_LUT100_2[RIV] = alloc2;
|
|
localRIV2alloc_LUT100_3[RIV] = alloc3;
|
|
distRIV2alloc_gap0_even_LUT100_0[RIV] = allocdist0_0_even;
|
|
distRIV2alloc_gap0_even_LUT100_1[RIV] = allocdist1_0_even;
|
|
distRIV2alloc_gap0_even_LUT100_2[RIV] = allocdist2_0_even;
|
|
distRIV2alloc_gap0_even_LUT100_3[RIV] = allocdist3_0_even;
|
|
distRIV2alloc_gap0_odd_LUT100_0[RIV] = allocdist0_0_odd;
|
|
distRIV2alloc_gap0_odd_LUT100_1[RIV] = allocdist1_0_odd;
|
|
distRIV2alloc_gap0_odd_LUT100_2[RIV] = allocdist2_0_odd;
|
|
distRIV2alloc_gap0_odd_LUT100_3[RIV] = allocdist3_0_odd;
|
|
distRIV2alloc_gap1_even_LUT100_0[RIV] = allocdist0_1_even;
|
|
distRIV2alloc_gap1_even_LUT100_1[RIV] = allocdist1_1_even;
|
|
distRIV2alloc_gap1_even_LUT100_2[RIV] = allocdist2_1_even;
|
|
distRIV2alloc_gap1_even_LUT100_3[RIV] = allocdist3_1_even;
|
|
distRIV2alloc_gap1_odd_LUT100_0[RIV] = allocdist0_1_odd;
|
|
distRIV2alloc_gap1_odd_LUT100_1[RIV] = allocdist1_1_odd;
|
|
distRIV2alloc_gap1_odd_LUT100_2[RIV] = allocdist2_1_odd;
|
|
distRIV2alloc_gap1_odd_LUT100_3[RIV] = allocdist3_1_odd;
|
|
|
|
RIV2nb_rb_LUT100[RIV] = Lcrbs;
|
|
RIV2first_rb_LUT100[RIV] = RBstart;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Ngap = 3, N_VRB_DL=6, P=1, N_row=2, N_null=4*2-6=2
|
|
// permutation for even slots :
|
|
// n_PRB'(0,2,4) = (0,1,2), n_PRB'(1,3,5) = (4,5,6)
|
|
// n_PRB''(0,1,2,3) = (0,2,4,6)
|
|
// => n_tilde_PRB(5) = (4)
|
|
// n_tilde_PRB(4) = (1)
|
|
// n_tilde_PRB(2,3) = (3,5)
|
|
// n_tilde_PRB(0,1) = (0,2)
|
|
|
|
uint32_t get_rballoc(vrb_t vrb_type,uint16_t rb_alloc_dci)
|
|
{
|
|
|
|
return(localRIV2alloc_LUT25[rb_alloc_dci]);
|
|
|
|
}
|
|
|
|
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);
|
|
} else {
|
|
|
|
switch (frame_parms->tdd_config) {
|
|
case 1:
|
|
switch (subframe) {
|
|
case 2:
|
|
case 3:
|
|
ret = (subframe-2);
|
|
break;
|
|
|
|
case 7:
|
|
case 8:
|
|
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);
|
|
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);
|
|
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);
|
|
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);
|
|
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);
|
|
break;
|
|
|
|
default:
|
|
LOG_E(PHY,"subframe2_harq_pid, Unsupported TDD mode %d\n",frame_parms->tdd_config);
|
|
ret = (255);
|
|
}
|
|
}
|
|
|
|
AssertFatal(ret != 255, "invalid harq_pid(%u) at SFN/SF = %u/%u\n", ret, frame, subframe);
|
|
return ret;
|
|
}
|
|
|
|
uint8_t pdcch_alloc2ul_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t n)
|
|
{
|
|
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 ( (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);
|
|
return ul_subframe;
|
|
}
|
|
|
|
uint8_t ul_subframe2pdcch_alloc_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t n)
|
|
{
|
|
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);
|
|
|
|
LOG_E(PHY, "%s %s:%i pdcch allocation error\n",__FUNCTION__,__FILE__,__LINE__);
|
|
return 0;
|
|
}
|
|
|
|
uint32_t pdcch_alloc2ul_frame(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame, uint8_t n)
|
|
{
|
|
uint32_t ul_frame;
|
|
|
|
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));
|
|
|
|
LOG_D(PHY, "frame %d subframe %d: PUSCH frame = %d\n", frame, n, ul_frame);
|
|
return ul_frame % 1024;
|
|
}
|
|
|
|
uint32_t pmi_extend(LTE_DL_FRAME_PARMS *frame_parms,uint8_t wideband_pmi, uint8_t rank)
|
|
{
|
|
|
|
uint8_t i,wideband_pmi2;
|
|
uint32_t pmi_ex = 0;
|
|
|
|
if (frame_parms->N_RB_DL!=25) {
|
|
LOG_E(PHY,"pmi_extend not yet implemented for anything else than 25PRB\n");
|
|
return(-1);
|
|
}
|
|
|
|
if (rank==0) {
|
|
wideband_pmi2=wideband_pmi&3;
|
|
for (i=0; i<14; i+=2)
|
|
pmi_ex|=(wideband_pmi2<<i);
|
|
}
|
|
else if (rank==1) {
|
|
wideband_pmi2=wideband_pmi&1;
|
|
for (i=0; i<7; i++)
|
|
pmi_ex|=(wideband_pmi2<<i);
|
|
}
|
|
else {
|
|
LOG_E(PHY,"unsupported rank\n");
|
|
return(-1);
|
|
}
|
|
|
|
return(pmi_ex);
|
|
}
|
|
|
|
uint64_t pmi2hex_2Ar1(uint32_t pmi)
|
|
{
|
|
|
|
uint64_t pmil = (uint64_t)pmi;
|
|
|
|
return ((pmil&3) + (((pmil>>2)&3)<<4) + (((pmil>>4)&3)<<8) + (((pmil>>6)&3)<<12) +
|
|
(((pmil>>8)&3)<<16) + (((pmil>>10)&3)<<20) + (((pmil>>12)&3)<<24) +
|
|
(((pmil>>14)&3)<<28) + (((pmil>>16)&3)<<32) + (((pmil>>18)&3)<<36) +
|
|
(((pmil>>20)&3)<<40) + (((pmil>>22)&3)<<44) + (((pmil>>24)&3)<<48));
|
|
}
|
|
|
|
uint64_t pmi2hex_2Ar2(uint32_t pmi)
|
|
{
|
|
|
|
uint64_t pmil = (uint64_t)pmi;
|
|
return ((pmil&1) + (((pmil>>1)&1)<<4) + (((pmil>>2)&1)<<8) + (((pmil>>3)&1)<<12) +
|
|
(((pmil>>4)&1)<<16) + (((pmil>>5)&1)<<20) + (((pmil>>6)&1)<<24) +
|
|
(((pmil>>7)&1)<<28) + (((pmil>>8)&1)<<32) + (((pmil>>9)&1)<<36) +
|
|
(((pmil>>10)&1)<<40) + (((pmil>>11)&1)<<44) + (((pmil>>12)&1)<<48));
|
|
}
|
|
|
|
|
|
int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci)
|
|
{
|
|
switch (dci->format) {
|
|
|
|
case format0: // This is an UL SCH allocation so nothing here, inform MAC
|
|
if ((frame_parms->frame_type == TDD) &&
|
|
(frame_parms->tdd_config>0))
|
|
switch(frame_parms->N_RB_DL) {
|
|
case 6:
|
|
LOG_D(PHY,"DCI format0 (TDD, 1.5MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, dai %d, cqi_req %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu[0])[0],
|
|
((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->hopping,
|
|
((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs,
|
|
((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi,
|
|
((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cshift,
|
|
((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai,
|
|
((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cqi_req);
|
|
break;
|
|
|
|
case 25:
|
|
LOG_D(PHY,"DCI format0 (TDD1-6, 5MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, dai %d, cqi_req %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu[0])[0],
|
|
((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->hopping,
|
|
((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs,
|
|
((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi,
|
|
((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cshift,
|
|
((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai,
|
|
((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cqi_req);
|
|
break;
|
|
|
|
case 50:
|
|
LOG_D(PHY,"DCI format0 (TDD1-6, 10MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, dai %d, cqi_req %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu[0])[0],
|
|
((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->hopping,
|
|
((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs,
|
|
((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi,
|
|
((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cshift,
|
|
((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai,
|
|
((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cqi_req);
|
|
break;
|
|
|
|
case 100:
|
|
LOG_D(PHY,"DCI format0 (TDD1-6, 20MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, dai %d, cqi_req %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu[0])[0],
|
|
((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->hopping,
|
|
((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs,
|
|
((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi,
|
|
((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cshift,
|
|
((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai,
|
|
((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cqi_req);
|
|
break;
|
|
|
|
default:
|
|
LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
|
|
DevParam (frame_parms->N_RB_DL, 0, 0);
|
|
break;
|
|
}
|
|
else if (frame_parms->frame_type == FDD)
|
|
switch(frame_parms->N_RB_DL) {
|
|
case 6:
|
|
LOG_D(PHY,"DCI format0 (FDD, 1.5MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, cqi_req %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu[0])[0],
|
|
((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->hopping,
|
|
((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
|
|
((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
|
|
((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->cshift,
|
|
((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->cqi_req);
|
|
break;
|
|
|
|
case 25:
|
|
LOG_D(PHY,"DCI format0 (FDD, 5MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, cqi_req %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu[0])[0],
|
|
((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->hopping,
|
|
((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
|
|
((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
|
|
((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->cshift,
|
|
((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->cqi_req);
|
|
break;
|
|
|
|
case 50:
|
|
LOG_D(PHY,"DCI format0 (FDD, 10MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, cqi_req %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu[0])[0],
|
|
((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->hopping,
|
|
((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
|
|
((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
|
|
((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->cshift,
|
|
((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->cqi_req);
|
|
break;
|
|
|
|
case 100:
|
|
LOG_D(PHY,"DCI format0 (FDD, 20MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, cqi_req %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu[0])[0],
|
|
((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->hopping,
|
|
((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
|
|
((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
|
|
((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->cshift,
|
|
((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->cqi_req);
|
|
break;
|
|
|
|
default:
|
|
LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
|
|
DevParam (frame_parms->N_RB_DL, 0, 0);
|
|
break;
|
|
}
|
|
else
|
|
LOG_E(PHY,"Don't know how to handle TDD format 0 yet\n");
|
|
|
|
break;
|
|
|
|
case format1:
|
|
if ((frame_parms->frame_type == TDD) &&
|
|
(frame_parms->tdd_config>0))
|
|
|
|
switch(frame_parms->N_RB_DL) {
|
|
case 6:
|
|
LOG_D(PHY,"DCI format1 (TDD 1.5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->mcs,
|
|
((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->ndi,
|
|
((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->rv,
|
|
((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->dai);
|
|
break;
|
|
|
|
case 25:
|
|
LOG_D(PHY,"DCI format1 (TDD 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->mcs,
|
|
((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->ndi,
|
|
((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->rv,
|
|
((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->dai);
|
|
break;
|
|
|
|
case 50:
|
|
LOG_D(PHY,"DCI format1 (TDD 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->mcs,
|
|
((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->ndi,
|
|
((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->rv,
|
|
((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->dai);
|
|
break;
|
|
|
|
case 100:
|
|
LOG_D(PHY,"DCI format1 (TDD 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->mcs,
|
|
((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->ndi,
|
|
((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->rv,
|
|
((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->dai);
|
|
break;
|
|
|
|
default:
|
|
LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
|
|
DevParam (frame_parms->N_RB_DL, 0, 0);
|
|
break;
|
|
}
|
|
else if (frame_parms->frame_type == FDD) {
|
|
switch(frame_parms->N_RB_DL) {
|
|
case 6:
|
|
LOG_D(PHY,"DCI format1 (FDD, 1.5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
|
|
((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
|
|
((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rv,
|
|
((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
case 25:
|
|
LOG_D(PHY,"DCI format1 (FDD, 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
|
|
((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
|
|
((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->rv,
|
|
((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
case 50:
|
|
LOG_D(PHY,"DCI format1 (FDD, 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
|
|
((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
|
|
((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->rv,
|
|
((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
case 100:
|
|
LOG_D(PHY,"DCI format1 (FDD, 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
|
|
((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
|
|
((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->rv,
|
|
((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
default:
|
|
LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
|
|
DevParam (frame_parms->N_RB_DL, 0, 0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
else
|
|
LOG_E(PHY,"Don't know how to handle TDD format 0 yet\n");
|
|
|
|
break;
|
|
|
|
case format1A: // This is DLSCH allocation for control traffic
|
|
if ((frame_parms->frame_type == TDD) &&
|
|
(frame_parms->tdd_config>0)) {
|
|
switch (frame_parms->N_RB_DL) {
|
|
case 6:
|
|
LOG_D(PHY,"DCI format1A (TDD1-6, 1_5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
|
|
LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->vrb_type);
|
|
LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc]);
|
|
LOG_D(PHY,"MCS %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs);
|
|
LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->harq_pid);
|
|
LOG_D(PHY,"NDI %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi);
|
|
LOG_D(PHY,"RV %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rv);
|
|
LOG_D(PHY,"TPC %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC);
|
|
LOG_D(PHY,"DAI %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai);
|
|
break;
|
|
|
|
case 25:
|
|
LOG_D(PHY,"DCI format1A (TDD1-6, 5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
|
|
LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->vrb_type);
|
|
LOG_D(PHY,"RB_ALLOC %d (NB_RB %d)\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc]);
|
|
LOG_D(PHY,"MCS %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs);
|
|
LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->harq_pid);
|
|
LOG_D(PHY,"NDI %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi);
|
|
LOG_D(PHY,"RV %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rv);
|
|
LOG_D(PHY,"TPC %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC);
|
|
LOG_D(PHY,"DAI %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai);
|
|
break;
|
|
|
|
case 50:
|
|
LOG_D(PHY,"DCI format1A (TDD1-6, 10MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
|
|
LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->vrb_type);
|
|
LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc]);
|
|
LOG_D(PHY,"MCS %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs);
|
|
LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->harq_pid);
|
|
LOG_D(PHY,"NDI %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi);
|
|
LOG_D(PHY,"RV %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rv);
|
|
LOG_D(PHY,"TPC %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC);
|
|
LOG_D(PHY,"DAI %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai);
|
|
break;
|
|
|
|
case 100:
|
|
LOG_D(PHY,"DCI format1A (TDD1-6, 20MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
|
|
LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->vrb_type);
|
|
LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT100[((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc]);
|
|
LOG_D(PHY,"MCS %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs);
|
|
LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->harq_pid);
|
|
LOG_D(PHY,"NDI %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi);
|
|
LOG_D(PHY,"RV %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rv);
|
|
LOG_D(PHY,"TPC %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC);
|
|
LOG_D(PHY,"DAI %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai);
|
|
break;
|
|
|
|
default:
|
|
LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
|
|
DevParam (frame_parms->N_RB_DL, 0, 0);
|
|
break;
|
|
}
|
|
|
|
} else if (frame_parms->frame_type == FDD) {
|
|
switch (frame_parms->N_RB_DL) {
|
|
case 6:
|
|
LOG_D(PHY,"DCI format1A(FDD, 1.5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
|
|
LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
|
|
LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
|
|
LOG_D(PHY,"MCS %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
|
|
LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
|
|
LOG_D(PHY,"NDI %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
|
|
LOG_D(PHY,"RV %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rv);
|
|
LOG_D(PHY,"TPC %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
case 25:
|
|
LOG_D(PHY,"DCI format1A(FDD, 5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
|
|
LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
|
|
LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
|
|
LOG_D(PHY,"MCS %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
|
|
LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
|
|
LOG_D(PHY,"NDI %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
|
|
LOG_D(PHY,"RV %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->rv);
|
|
LOG_D(PHY,"TPC %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
case 50:
|
|
LOG_D(PHY,"DCI format1A(FDD, 10MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
|
|
LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
|
|
LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
|
|
LOG_D(PHY,"MCS %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
|
|
LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
|
|
LOG_D(PHY,"NDI %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
|
|
LOG_D(PHY,"RV %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rv);
|
|
LOG_D(PHY,"TPC %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
case 100:
|
|
LOG_D(PHY,"DCI format1A(FDD, 20MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
|
|
LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
|
|
LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT100[((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
|
|
LOG_D(PHY,"MCS %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
|
|
LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
|
|
LOG_D(PHY,"NDI %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
|
|
LOG_D(PHY,"RV %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->rv);
|
|
LOG_D(PHY,"TPC %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
default:
|
|
LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
|
|
DevParam (frame_parms->N_RB_DL, 0, 0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case format1C: // This is DLSCH allocation for control traffic
|
|
switch (frame_parms->N_RB_DL) {
|
|
case 6:
|
|
LOG_D(PHY,"DCI format1C (1.5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
|
|
LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",
|
|
((DCI1C_1_5MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT6[conv_1C_RIV(((DCI1C_1_5MHz_t *)&dci->dci_pdu[0])->rballoc,6)]);
|
|
LOG_D(PHY,"MCS %d\n",((DCI1C_1_5MHz_t *)&dci->dci_pdu[0])->mcs);
|
|
break;
|
|
|
|
case 25:
|
|
LOG_D(PHY,"DCI format1C (5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
|
|
LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1C_5MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[conv_1C_RIV(((DCI1C_5MHz_t *)&dci->dci_pdu[0])->rballoc,25)]);
|
|
LOG_D(PHY,"MCS %d\n",((DCI1C_5MHz_t *)&dci->dci_pdu[0])->mcs);
|
|
break;
|
|
|
|
case 50:
|
|
LOG_D(PHY,"DCI format1C (10MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
|
|
LOG_D(PHY,"Ngap %d\n",((DCI1C_10MHz_t *)&dci->dci_pdu[0])->Ngap);
|
|
LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1C_10MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[conv_1C_RIV(((DCI1C_10MHz_t *)&dci->dci_pdu[0])->rballoc,50)]);
|
|
LOG_D(PHY,"MCS %d\n",((DCI1C_10MHz_t *)&dci->dci_pdu[0])->mcs);
|
|
break;
|
|
|
|
case 100:
|
|
LOG_D(PHY,"DCI format1C (20MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
|
|
LOG_D(PHY,"Ngap %d\n",((DCI1C_20MHz_t *)&dci->dci_pdu[0])->Ngap);
|
|
LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1C_20MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[conv_1C_RIV(((DCI1C_20MHz_t *)&dci->dci_pdu[0])->rballoc,100)]);
|
|
LOG_D(PHY,"MCS %d\n",((DCI1C_20MHz_t *)&dci->dci_pdu[0])->mcs);
|
|
break;
|
|
|
|
|
|
default:
|
|
LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
|
|
DevParam (frame_parms->N_RB_DL, 0, 0);
|
|
break;
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
case format2:
|
|
|
|
if ((frame_parms->frame_type == TDD) &&
|
|
(frame_parms->tdd_config>0)) {
|
|
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
|
switch(frame_parms->N_RB_DL) {
|
|
case 6:
|
|
LOG_D(PHY,"DCI format2 2 antennas (TDD 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
|
|
((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->tpmi
|
|
);
|
|
break;
|
|
|
|
case 25:
|
|
LOG_D(PHY,"DCI format2 2 antennas (TDD 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
|
|
((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->tpmi);
|
|
break;
|
|
|
|
case 50:
|
|
LOG_D(PHY,"DCI format2 2 antennas (TDD 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
|
|
((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->tpmi);
|
|
break;
|
|
|
|
case 100:
|
|
LOG_D(PHY,"DCI format2 2 antennas (TDD 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
|
|
((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->tpmi);
|
|
break;
|
|
|
|
default:
|
|
LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
|
|
DevParam (frame_parms->N_RB_DL, 0, 0);
|
|
break;
|
|
}
|
|
} else if (frame_parms->nb_antenna_ports_eNB == 4) {
|
|
switch(frame_parms->N_RB_DL) {
|
|
case 6:
|
|
LOG_D(PHY,"DCI format2 2 antennas (TDD 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
|
|
((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi
|
|
);
|
|
break;
|
|
|
|
case 25:
|
|
LOG_D(PHY,"DCI format2 2 antennas (TDD 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
|
|
((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi);
|
|
break;
|
|
|
|
case 50:
|
|
LOG_D(PHY,"DCI format2 2 antennas (TDD 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
|
|
((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi);
|
|
break;
|
|
|
|
case 100:
|
|
LOG_D(PHY,"DCI format2 2 antennas (TDD 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
|
|
((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi);
|
|
break;
|
|
|
|
default:
|
|
LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
|
|
DevParam (frame_parms->N_RB_DL, 0, 0);
|
|
break;
|
|
}
|
|
}
|
|
} else if (frame_parms->frame_type == FDD) {
|
|
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
|
switch(frame_parms->N_RB_DL) {
|
|
case 6:
|
|
LOG_D(PHY,"DCI format2 2 antennas (FDD, 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->tpmi,
|
|
((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
case 25:
|
|
|
|
LOG_D(PHY,"DCI format2 2 antennas (FDD, 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, swap %d, TPMI %d, TPC %d\n",
|
|
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->tpmi,
|
|
((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
case 50:
|
|
LOG_D(PHY,"DCI format2 2 antennas (FDD, 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->tpmi,
|
|
((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
case 100:
|
|
LOG_D(PHY,"DCI format2 2 antennas (FDD, 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->tpmi,
|
|
((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
default:
|
|
LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
|
|
DevParam (frame_parms->N_RB_DL, 0, 0);
|
|
break;
|
|
}
|
|
} else if (frame_parms->nb_antenna_ports_eNB == 4) {
|
|
switch(frame_parms->N_RB_DL) {
|
|
|
|
case 6:
|
|
LOG_D(PHY,"DCI format2 4 antennas (FDD, 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
|
|
((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
case 25:
|
|
LOG_D(PHY,"DCI format2 4 antennas (FDD, 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
|
|
((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
case 50:
|
|
LOG_D(PHY,"DCI format2 4 antennas (FDD, 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
|
|
((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
case 100:
|
|
LOG_D(PHY,"DCI format2 4 antennas (FDD, 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
|
|
((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
default:
|
|
LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
|
|
DevParam (frame_parms->N_RB_DL, 0, 0);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
else
|
|
LOG_E(PHY,"Don't know how to handle TDD format 0 yet\n");
|
|
|
|
break;
|
|
|
|
case format2A:
|
|
|
|
if ((frame_parms->frame_type == TDD) &&
|
|
(frame_parms->tdd_config>0)) {
|
|
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
|
switch(frame_parms->N_RB_DL) {
|
|
case 6:
|
|
LOG_D(PHY,"DCI format2A 2 antennas (FDD 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
|
|
((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap
|
|
);
|
|
break;
|
|
|
|
case 25:
|
|
LOG_D(PHY,"DCI format2A 2 antennas (FDD 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n",
|
|
dci->rnti,
|
|
((uint64_t*)&dci->dci_pdu)[0],
|
|
((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
|
|
((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap);
|
|
break;
|
|
|
|
case 50:
|
|
LOG_D(PHY,"DCI format2A 2 antennas (FDD 10 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n",
|
|
dci->rnti,
|
|
((uint64_t*)&dci->dci_pdu)[0],
|
|
((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
|
|
((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap);
|
|
break;
|
|
|
|
case 100:
|
|
LOG_D(PHY,"DCI format2A 2 antennas (FDD 20 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n",
|
|
dci->rnti,
|
|
((uint64_t*)&dci->dci_pdu)[0],
|
|
((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
|
|
((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap);
|
|
break;
|
|
|
|
default:
|
|
LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
|
|
DevParam (frame_parms->N_RB_DL, 0, 0);
|
|
break;
|
|
}
|
|
} else if (frame_parms->nb_antenna_ports_eNB == 4) {
|
|
switch(frame_parms->N_RB_DL) {
|
|
case 6:
|
|
LOG_D(PHY,"DCI format2A 4 antennas (TDD 1.5 MHz), rnti %x (%"PRIu64"): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
|
|
dci->rnti,
|
|
((uint64_t*)&dci->dci_pdu)[0],
|
|
((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
|
|
((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi
|
|
);
|
|
break;
|
|
|
|
case 25:
|
|
LOG_D(PHY,"DCI format2A 4 antennas (TDD 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
|
|
dci->rnti,
|
|
((uint64_t*)&dci->dci_pdu)[0],
|
|
((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
|
|
((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi);
|
|
break;
|
|
|
|
case 50:
|
|
LOG_D(PHY,"DCI format2A 4 antennas (TDD 10 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
|
|
dci->rnti,
|
|
((uint64_t*)&dci->dci_pdu)[0],
|
|
((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
|
|
((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi);
|
|
break;
|
|
|
|
case 100:
|
|
LOG_D(PHY,"DCI format2A 4 antennas (TDD 20 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
|
|
dci->rnti,
|
|
((uint64_t*)&dci->dci_pdu)[0],
|
|
((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
|
|
((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
|
|
((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi);
|
|
break;
|
|
|
|
default:
|
|
LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
|
|
DevParam (frame_parms->N_RB_DL, 0, 0);
|
|
break;
|
|
}
|
|
}
|
|
} else if (frame_parms->frame_type == FDD) {
|
|
if (frame_parms->nb_antenna_ports_eNB == 2) {
|
|
switch(frame_parms->N_RB_DL) {
|
|
case 6:
|
|
LOG_D(PHY,"DCI format2A 2 antennas (FDD, 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n",
|
|
dci->rnti,
|
|
((uint32_t*)&dci->dci_pdu)[0],
|
|
((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
case 25:
|
|
LOG_D(PHY,"DCI format2A 2 antennas (FDD, 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n",
|
|
dci->rnti,
|
|
((uint64_t*)&dci->dci_pdu)[0],
|
|
((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
case 50:
|
|
LOG_D(PHY,"DCI format2A 2 antennas (FDD, 10 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n",
|
|
dci->rnti,
|
|
((uint64_t*)&dci->dci_pdu)[0],
|
|
((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
case 100:
|
|
LOG_D(PHY,"DCI format2A 2 antennas (FDD, 20 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n",
|
|
dci->rnti,
|
|
((uint64_t*)&dci->dci_pdu)[0],
|
|
((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
default:
|
|
LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
|
|
DevParam (frame_parms->N_RB_DL, 0, 0);
|
|
break;
|
|
}
|
|
} else if (frame_parms->nb_antenna_ports_eNB == 4) {
|
|
switch(frame_parms->N_RB_DL) {
|
|
|
|
case 6:
|
|
LOG_D(PHY,"DCI format2A 4 antennas (FDD, 1.5 MHz), rnti %x (%"PRIu64"): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n",
|
|
dci->rnti,
|
|
((uint64_t*)&dci->dci_pdu)[0],
|
|
((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
|
|
((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
case 25:
|
|
LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n",
|
|
dci->rnti,
|
|
((uint64_t*)&dci->dci_pdu)[0],
|
|
((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
|
|
((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
case 50:
|
|
LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n",
|
|
dci->rnti,
|
|
((uint64_t*)&dci->dci_pdu)[0],
|
|
((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
|
|
((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
case 100:
|
|
LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n",
|
|
dci->rnti,
|
|
((uint64_t*)&dci->dci_pdu)[0],
|
|
((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
|
|
((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
|
|
((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
|
|
((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
|
|
((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
|
|
((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
|
|
((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
|
|
((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
|
|
break;
|
|
|
|
default:
|
|
LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
|
|
DevParam (frame_parms->N_RB_DL, 0, 0);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
else
|
|
LOG_E(PHY,"Don't know how to handle TDD format 0 yet\n");
|
|
|
|
break;
|
|
|
|
case format1E_2A_M10PRB:
|
|
|
|
LOG_D(PHY,"DCI format1E_2A_M10PRB, rnti %x (%8x): harq_pid %d, rah %d, rb_alloc %x, mcs %d, rv %d, tpmi %d, ndi %d, dl_power_offset %d\n",
|
|
dci->rnti,
|
|
((uint32_t *)&dci->dci_pdu)[0],
|
|
((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->harq_pid,
|
|
//((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->tb_swap,
|
|
((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->rah,
|
|
((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->rballoc,
|
|
((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->mcs,
|
|
((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->rv,
|
|
((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->tpmi,
|
|
((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->ndi,
|
|
((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->dl_power_off
|
|
);
|
|
|
|
break;
|
|
|
|
default:
|
|
LOG_E(PHY,"dci_tools.c: dump_dci, unknown format %d\n",dci->format);
|
|
return(-1);
|
|
}
|
|
|
|
return(0);
|
|
}
|