Merge branch 'enhancement-10-harmony' into enhancement-10-harmony-lts
This commit is contained in:
@@ -493,6 +493,11 @@ void compute_beta8(llr_t* alpha,llr_t* beta,llr_t *m_11,llr_t* m_10,unsigned sho
|
||||
|
||||
#endif
|
||||
|
||||
if (frame_length > 6143) {
|
||||
LOG_E(PHY,"compute_beta: frame_length %d\n",frame_length);
|
||||
return;
|
||||
}
|
||||
|
||||
// we are supposed to run compute_alpha just before compute_beta
|
||||
// so the initial states of backward computation can be set from last value of alpha states (forward computation)
|
||||
|
||||
|
||||
@@ -818,11 +818,14 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1
|
||||
break;
|
||||
|
||||
case 75:
|
||||
memset((void*)prachF,0,4*19432);
|
||||
memset((void*)prachF,0,4*18432);
|
||||
break;
|
||||
|
||||
case 100:
|
||||
memset((void*)prachF,0,4*24576);
|
||||
if (ue->frame_parms.threequarter_fs == 0)
|
||||
memset((void*)prachF,0,4*24576);
|
||||
else
|
||||
memset((void*)prachF,0,4*18432);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -886,6 +889,9 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1
|
||||
break;
|
||||
}
|
||||
|
||||
if (ue->frame_parms.threequarter_fs == 1)
|
||||
Ncp=(Ncp*3)>>2;
|
||||
|
||||
prach2 = prach+(Ncp<<1);
|
||||
|
||||
// do IDFT
|
||||
@@ -986,20 +992,39 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1
|
||||
break;
|
||||
|
||||
case 100:
|
||||
if (prach_fmt == 4) {
|
||||
idft4096(prachF,prach2,1);
|
||||
memmove( prach, prach+8192, Ncp<<2 );
|
||||
prach_len = 4096+Ncp;
|
||||
} else {
|
||||
idft24576(prachF,prach2);
|
||||
memmove( prach, prach+49152, Ncp<<2 );
|
||||
prach_len = 24576+Ncp;
|
||||
|
||||
if (prach_fmt>1) {
|
||||
memmove( prach2+49152, prach2, 98304 );
|
||||
prach_len = 2* 24576+Ncp;
|
||||
if (ue->frame_parms.threequarter_fs == 0) {
|
||||
if (prach_fmt == 4) {
|
||||
idft4096(prachF,prach2,1);
|
||||
memmove( prach, prach+8192, Ncp<<2 );
|
||||
prach_len = 4096+Ncp;
|
||||
} else {
|
||||
idft24576(prachF,prach2);
|
||||
memmove( prach, prach+49152, Ncp<<2 );
|
||||
prach_len = 24576+Ncp;
|
||||
|
||||
if (prach_fmt>1) {
|
||||
memmove( prach2+49152, prach2, 98304 );
|
||||
prach_len = 2* 24576+Ncp;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (prach_fmt == 4) {
|
||||
idft3072(prachF,prach2);
|
||||
//TODO: account for repeated format in dft output
|
||||
memmove( prach, prach+6144, Ncp<<2 );
|
||||
prach_len = 3072+Ncp;
|
||||
} else {
|
||||
idft18432(prachF,prach2);
|
||||
memmove( prach, prach+36864, Ncp<<2 );
|
||||
prach_len = 18432+Ncp;
|
||||
printf("Generated prach for 100 PRB, 3/4 sampling\n");
|
||||
if (prach_fmt>1) {
|
||||
memmove( prach2+36834, prach2, 73728 );
|
||||
prach_len = 2*18432+Ncp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -1026,18 +1051,18 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1
|
||||
((int16_t*)ue->common_vars.txdata[0])[2*i+1] = prach[2*j+1]<<4;
|
||||
}
|
||||
#if defined(EXMIMO)
|
||||
// handle switch before 1st TX subframe, guarantee that the slot prior to transmission is switch on
|
||||
for (k=prach_start - (ue->frame_parms.samples_per_tti>>1) ; k<prach_start ; k++) {
|
||||
if (k<0)
|
||||
ue->common_vars.txdata[0][k+ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE;
|
||||
else if (k>(ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME))
|
||||
ue->common_vars.txdata[0][k-ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE;
|
||||
else
|
||||
ue->common_vars.txdata[0][k] &= 0xFFFEFFFE;
|
||||
}
|
||||
// handle switch before 1st TX subframe, guarantee that the slot prior to transmission is switch on
|
||||
for (k=prach_start - (ue->frame_parms.samples_per_tti>>1) ; k<prach_start ; k++) {
|
||||
if (k<0)
|
||||
ue->common_vars.txdata[0][k+ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE;
|
||||
else if (k>(ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME))
|
||||
ue->common_vars.txdata[0][k-ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE;
|
||||
else
|
||||
ue->common_vars.txdata[0][k] &= 0xFFFEFFFE;
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
|
||||
|
||||
for (i=0; i<prach_len; i++) {
|
||||
((int16_t*)(&ue->common_vars.txdata[0][prach_start]))[2*i] = prach[2*i];
|
||||
((int16_t*)(&ue->common_vars.txdata[0][prach_start]))[2*i+1] = prach[2*i+1];
|
||||
@@ -1496,7 +1521,7 @@ void rx_prach(PHY_VARS_eNB *eNB,
|
||||
|
||||
#ifdef PRACH_DEBUG
|
||||
|
||||
if (en>40) {
|
||||
// if (en>40) {
|
||||
k = (12*n_ra_prb) - 6*eNB->frame_parms.N_RB_UL;
|
||||
|
||||
if (k<0)
|
||||
@@ -1510,7 +1535,7 @@ void rx_prach(PHY_VARS_eNB *eNB,
|
||||
write_output("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1);
|
||||
write_output("prach_ifft0.m","prach_t0",prach_ifft[0],1024,1,1);
|
||||
exit(-1);
|
||||
}
|
||||
// }
|
||||
#endif
|
||||
} // new dft
|
||||
|
||||
|
||||
@@ -190,6 +190,9 @@ void generate_pucch1x(int32_t **txdataF,
|
||||
else {
|
||||
d = (frame_parms->Ncp==0) ? 2 : 0;
|
||||
h= (nprime0+d)%(c*Nprime_div_deltaPUCCH_Shift);
|
||||
#ifdef DEBUG_PUCCH_TX
|
||||
printf("[PHY] PUCCH: h %d, d %d\n",h,d);
|
||||
#endif
|
||||
nprime1 = (h/c) + (h%c)*Nprime_div_deltaPUCCH_Shift;
|
||||
}
|
||||
|
||||
@@ -208,7 +211,7 @@ void generate_pucch1x(int32_t **txdataF,
|
||||
n_oc1<<=1;
|
||||
|
||||
#ifdef DEBUG_PUCCH_TX
|
||||
printf("[PHY] PUCCH: noc0 %d noc11 %d\n",n_oc0,n_oc1);
|
||||
printf("[PHY] PUCCH: noc0 %d noc1 %d\n",n_oc0,n_oc1);
|
||||
#endif
|
||||
|
||||
nprime=nprime0;
|
||||
|
||||
@@ -1200,6 +1200,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
|
||||
y[i2] = c*ulsch_llr[i++];
|
||||
i2=(i2+(Cmux<<2)-3);
|
||||
*/
|
||||
// slightly more optimized version (equivalent to above) for 16QAM to improve computational performance
|
||||
*(__m64 *)&y[i2] = _mm_sign_pi16(*(__m64*)&ulsch_llr[i],*(__m64*)&cseq[i]);i+=4;i2+=(Cmux<<2);
|
||||
|
||||
|
||||
@@ -1531,6 +1532,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
|
||||
|
||||
// RI
|
||||
|
||||
// rank 1
|
||||
if ((ulsch_harq->O_RI == 1) && (Qprime_RI > 0)) {
|
||||
ulsch_harq->o_RI[0] = ((ulsch_harq->q_RI[0] + ulsch_harq->q_RI[Q_m/2]) > 0) ? 0 : 1;
|
||||
}
|
||||
|
||||
+102
-17
@@ -5229,7 +5229,7 @@ void dft8192(int16_t *x,int16_t *y,int scale)
|
||||
|
||||
xtmpp = xtmp;
|
||||
|
||||
for (i=0; i<32; i++) {
|
||||
for (i=0; i<16; i++) {
|
||||
transpose4_ooff_simd256(x256 ,xtmpp,512);
|
||||
transpose4_ooff_simd256(x256+2,xtmpp+1,512);
|
||||
transpose4_ooff_simd256(x256+4,xtmpp+2,512);
|
||||
@@ -5267,7 +5267,7 @@ void dft8192(int16_t *x,int16_t *y,int scale)
|
||||
}
|
||||
|
||||
dft4096((int16_t*)(xtmp),(int16_t*)ytmp,1);
|
||||
dft4096((int16_t*)(xtmp+1024),(int16_t*)(ytmp+512),1);
|
||||
dft4096((int16_t*)(xtmp+512),(int16_t*)(ytmp+512),1);
|
||||
|
||||
|
||||
for (i=0; i<512; i++) {
|
||||
@@ -5319,7 +5319,7 @@ void idft8192(int16_t *x,int16_t *y,int scale)
|
||||
|
||||
xtmpp = xtmp;
|
||||
|
||||
for (i=0; i<32; i++) {
|
||||
for (i=0; i<16; i++) {
|
||||
transpose4_ooff_simd256(x256 ,xtmpp,512);
|
||||
transpose4_ooff_simd256(x256+2,xtmpp+1,512);
|
||||
transpose4_ooff_simd256(x256+4,xtmpp+2,512);
|
||||
@@ -5357,7 +5357,7 @@ void idft8192(int16_t *x,int16_t *y,int scale)
|
||||
}
|
||||
|
||||
idft4096((int16_t*)(xtmp),(int16_t*)ytmp,1);
|
||||
idft4096((int16_t*)(xtmp+1024),(int16_t*)(ytmp+512),1);
|
||||
idft4096((int16_t*)(xtmp+512),(int16_t*)(ytmp+512),1);
|
||||
|
||||
|
||||
for (i=0; i<512; i++) {
|
||||
@@ -5680,15 +5680,58 @@ void idft12288(int16_t *input, int16_t *output)
|
||||
// write_output("out.m","out",output,6144,1,1);
|
||||
}
|
||||
|
||||
#include "twiddle18432.h"
|
||||
// 6144 x 3
|
||||
void dft18432(int16_t *input, int16_t *output)
|
||||
{
|
||||
void dft18432(int16_t *input, int16_t *output) {
|
||||
|
||||
int i,i2,j;
|
||||
uint32_t tmp[3][6144] __attribute__((aligned(32)));
|
||||
uint32_t tmpo[3][6144] __attribute__((aligned(32)));
|
||||
|
||||
for (i=0,j=0; i<6144; i++) {
|
||||
tmp[0][i] = ((uint32_t *)input)[j++];
|
||||
tmp[1][i] = ((uint32_t *)input)[j++];
|
||||
tmp[2][i] = ((uint32_t *)input)[j++];
|
||||
}
|
||||
|
||||
dft6144((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]));
|
||||
dft6144((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]));
|
||||
dft6144((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]));
|
||||
|
||||
for (i=0,i2=0; i<12288; i+=8,i2+=4) {
|
||||
bfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]),
|
||||
(simd_q15_t*)(output+i),(simd_q15_t*)(output+12288+i),(simd_q15_t*)(output+24576+i),
|
||||
(simd_q15_t*)(twa18432+i),(simd_q15_t*)(twb18432+i));
|
||||
}
|
||||
|
||||
_mm_empty();
|
||||
_m_empty();
|
||||
}
|
||||
|
||||
void idft18432(int16_t *input, int16_t *output)
|
||||
{
|
||||
void idft18432(int16_t *input, int16_t *output) {
|
||||
|
||||
int i,i2,j;
|
||||
uint32_t tmp[3][6144] __attribute__((aligned(32)));
|
||||
uint32_t tmpo[3][6144] __attribute__((aligned(32)));
|
||||
|
||||
for (i=0,j=0; i<6144; i++) {
|
||||
tmp[0][i] = ((uint32_t *)input)[j++];
|
||||
tmp[1][i] = ((uint32_t *)input)[j++];
|
||||
tmp[2][i] = ((uint32_t *)input)[j++];
|
||||
}
|
||||
|
||||
idft6144((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]));
|
||||
idft6144((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]));
|
||||
idft6144((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]));
|
||||
|
||||
for (i=0,i2=0; i<12288; i+=8,i2+=4) {
|
||||
ibfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]),
|
||||
(simd_q15_t*)(output+i),(simd_q15_t*)(output+12288+i),(simd_q15_t*)(output+24576+i),
|
||||
(simd_q15_t*)(twa18432+i),(simd_q15_t*)(twb18432+i));
|
||||
}
|
||||
|
||||
_mm_empty();
|
||||
_m_empty();
|
||||
}
|
||||
|
||||
#include "twiddle24576.h"
|
||||
@@ -5733,8 +5776,8 @@ void dft24576(int16_t *input, int16_t *output)
|
||||
void idft24576(int16_t *input, int16_t *output)
|
||||
{
|
||||
int i,i2,j;
|
||||
uint32_t tmp[3][16384] __attribute__((aligned(32)));
|
||||
uint32_t tmpo[3][16384] __attribute__((aligned(32)));
|
||||
uint32_t tmp[3][8192] __attribute__((aligned(32)));
|
||||
uint32_t tmpo[3][8192] __attribute__((aligned(32)));
|
||||
|
||||
for (i=0,j=0; i<8192; i++) {
|
||||
tmp[0][i] = ((uint32_t *)input)[j++];
|
||||
@@ -5746,13 +5789,6 @@ void idft24576(int16_t *input, int16_t *output)
|
||||
idft8192((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1);
|
||||
idft8192((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1);
|
||||
|
||||
/*
|
||||
for (i=1; i<8192; i++) {
|
||||
tmpo[0][i] = tmpo[0][i<<1];
|
||||
tmpo[1][i] = tmpo[1][i<<1];
|
||||
tmpo[2][i] = tmpo[2][i<<1];
|
||||
}*/
|
||||
|
||||
/*
|
||||
write_output("in.m","in",input,24576,1,1);
|
||||
write_output("out0.m","o0",tmpo[0],8192,1,1);
|
||||
@@ -19129,6 +19165,55 @@ int main(int argc, char**argv)
|
||||
write_output("y2048.m","y2048",y,2048,1,1);
|
||||
write_output("x2048.m","x2048",x,2048,1,1);
|
||||
|
||||
memset((void*)x,0,2048*sizeof(int32_t));
|
||||
for (i=2;i<2402;i++) {
|
||||
if ((taus() & 1)==0)
|
||||
((int16_t*)x)[i] = 364;
|
||||
else
|
||||
((int16_t*)x)[i] = -364;
|
||||
}
|
||||
for (i=2*(4096-1200);i<8192;i++) {
|
||||
if ((taus() & 1)==0)
|
||||
((int16_t*)x)[i] = 364;
|
||||
else
|
||||
((int16_t*)x)[i] = -364;
|
||||
}
|
||||
reset_meas(&ts);
|
||||
|
||||
for (i=0; i<10000; i++) {
|
||||
start_meas(&ts);
|
||||
idft4096((int16_t *)x,(int16_t *)y,1);
|
||||
stop_meas(&ts);
|
||||
}
|
||||
|
||||
printf("\n\n4096-point(%f cycles)\n",(double)ts.diff/(double)ts.trials);
|
||||
write_output("y4096.m","y4096",y,4096,1,1);
|
||||
write_output("x4096.m","x4096",x,4096,1,1);
|
||||
|
||||
memset((void*)x,0,8192*sizeof(int32_t));
|
||||
for (i=2;i<4802;i++) {
|
||||
if ((taus() & 1)==0)
|
||||
((int16_t*)x)[i] = 364;
|
||||
else
|
||||
((int16_t*)x)[i] = -364;
|
||||
}
|
||||
for (i=2*(4096-1200);i<8192;i++) {
|
||||
if ((taus() & 1)==0)
|
||||
((int16_t*)x)[i] = 364;
|
||||
else
|
||||
((int16_t*)x)[i] = -364;
|
||||
}
|
||||
reset_meas(&ts);
|
||||
for (i=0; i<10000; i++) {
|
||||
start_meas(&ts);
|
||||
idft8192((int16_t *)x,(int16_t *)y,1);
|
||||
stop_meas(&ts);
|
||||
}
|
||||
|
||||
printf("\n\n8192-point(%f cycles)\n",(double)ts.diff/(double)ts.trials);
|
||||
write_output("y8192.m","y8192",y,8192,1,1);
|
||||
write_output("x8192.m","x8192",x,8192,1,1);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -104,13 +104,15 @@ int main(int argc, char **argv)
|
||||
double delay_avg=0;
|
||||
double ue_speed = 0;
|
||||
int NCS_config = 1,rootSequenceIndex=0;
|
||||
int threequarter_fs = 0;
|
||||
|
||||
logInit();
|
||||
|
||||
number_of_cards = 1;
|
||||
|
||||
|
||||
|
||||
while ((c = getopt (argc, argv, "hHaA:Cr:p:g:n:s:S:t:x:y:v:V:z:N:F:d:Z:L:R:")) != -1) {
|
||||
while ((c = getopt (argc, argv, "hHaA:Cr:p:g:n:s:S:t:x:y:v:V:z:N:F:d:Z:L:R:E")) != -1) {
|
||||
switch (c) {
|
||||
case 'a':
|
||||
printf("Running AWGN simulation\n");
|
||||
@@ -182,6 +184,10 @@ int main(int argc, char **argv)
|
||||
|
||||
break;
|
||||
|
||||
case 'E':
|
||||
threequarter_fs=1;
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
n_frames = atoi(optarg);
|
||||
break;
|
||||
@@ -316,7 +322,7 @@ int main(int argc, char **argv)
|
||||
Nid_cell,
|
||||
3,
|
||||
N_RB_DL,
|
||||
0,
|
||||
threequarter_fs,
|
||||
osf,
|
||||
0);
|
||||
|
||||
@@ -395,8 +401,9 @@ int main(int argc, char **argv)
|
||||
eNB->frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag=hs_flag;
|
||||
eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset=0;
|
||||
|
||||
eNB->node_function = eNodeB_3GPP;
|
||||
eNB->proc.subframe_rx = subframe;
|
||||
eNB->node_function = eNodeB_3GPP;
|
||||
eNB->proc.subframe_rx = subframe;
|
||||
eNB->proc.subframe_prach = subframe;
|
||||
|
||||
/* N_ZC not used later, so prach_fmt is also useless, don't set */
|
||||
//prach_fmt = get_prach_fmt(eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex,
|
||||
@@ -530,7 +537,7 @@ int main(int argc, char **argv)
|
||||
write_output("rxsig0.m","rxs0",
|
||||
&eNB->common_vars.rxdata[0][0][subframe*frame_parms->samples_per_tti],
|
||||
frame_parms->samples_per_tti,1,1);
|
||||
write_output("rxsigF0.m","rxsF0", &eNB->common_vars.rxdataF[0][0][0],512*nsymb*2,2,1);
|
||||
write_output("rxsigF0.m","rxsF0", eNB->prach_vars.rxsigF[0],6144,1,1);
|
||||
write_output("prach_preamble.m","prachp",&eNB->X_u[0],839,1,1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,7 +66,11 @@ int main(int argc, char **argv)
|
||||
uint8_t snr1set=0;
|
||||
//mod_sym_t **txdataF;
|
||||
int **txdata;
|
||||
double s_re[2][30720],s_im[2][30720],r_re[2][30720],r_im[2][30720];
|
||||
double s_re0[30720],s_re1[30720],s_im0[30720],s_im1[30720],r_re0[30720],r_im0[30720],r_re1[30720],r_im1[30720];
|
||||
double *s_re[2]={s_re0,s_re1};
|
||||
double *s_im[2]={s_im0,s_im1};
|
||||
double *r_re[2]={r_re0,r_re1};
|
||||
double *r_im[2]={r_im0,r_im1};
|
||||
double ricean_factor=0.0000005,iqim=0.0;
|
||||
|
||||
int trial, n_trials, ntrials=1, n_errors;
|
||||
@@ -352,12 +356,15 @@ int main(int argc, char **argv)
|
||||
|
||||
init_ncs_cell(&UE->frame_parms,UE->ncs_cell);
|
||||
|
||||
eNB->frame_parms.pucch_config_common.deltaPUCCH_Shift = 1;
|
||||
eNB->frame_parms.pucch_config_common.nRB_CQI = 0;
|
||||
eNB->frame_parms.pucch_config_common.nCS_AN = 0;
|
||||
UE->frame_parms.pucch_config_common.deltaPUCCH_Shift = 1;
|
||||
UE->frame_parms.pucch_config_common.nRB_CQI = 0;
|
||||
UE->frame_parms.pucch_config_common.nCS_AN = 0;
|
||||
init_ul_hopping(&eNB->frame_parms);
|
||||
init_ul_hopping(&UE->frame_parms);
|
||||
|
||||
eNB->frame_parms.pucch_config_common.deltaPUCCH_Shift = 2;
|
||||
eNB->frame_parms.pucch_config_common.nRB_CQI = 4;
|
||||
eNB->frame_parms.pucch_config_common.nCS_AN = 6;
|
||||
UE->frame_parms.pucch_config_common.deltaPUCCH_Shift = 2;
|
||||
UE->frame_parms.pucch_config_common.nRB_CQI = 4;
|
||||
UE->frame_parms.pucch_config_common.nCS_AN = 6;
|
||||
|
||||
pucch_payload = 0;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user