fapi: add spatial steam mapping for MU-MIMO

Update copy functions and ctest.

Signed-off-by: Sakthivel Velumani <s.velumani@northeastern.edu>
This commit is contained in:
Sakthivel Velumani
2025-12-14 14:23:38 +00:00
parent e57e5cd209
commit 5b2169d157
8 changed files with 257 additions and 14 deletions

View File

@@ -52,7 +52,7 @@ uint32_t pullarray32(uint8_t **values_to_pull,
uint32_t pullarrays32(uint8_t **in, int32_t out[], uint32_t max_len, uint32_t len, uint8_t *end);
uint32_t pusharray8(uint8_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end);
uint32_t pusharray16(uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end);
uint32_t pusharray16(const uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end);
uint32_t pusharrays16(int16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end);
uint32_t pusharray32(const uint32_t *values_to_push,
uint32_t max_num_values_to_push,

View File

@@ -381,7 +381,7 @@ uint32_t pullarrays16(uint8_t **in, int16_t out[], uint32_t max_len, uint32_t le
return 0;
}
}
uint32_t pusharray16(uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end)
uint32_t pusharray16(const uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end)
{
if (len == 0)
return 1;

View File

@@ -268,6 +268,17 @@ static uint8_t pack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppWritePa
if(!pack_nr_tx_beamforming_pdu(&value->precodingAndBeamforming,ppWritePackedMsg, end)) {
return 0;
}
#ifndef ENABLE_AERIAL
if (!push8(value->param_v4.numSpatialStreamIndices, ppWritePackedMsg, end))
return 0;
if (!pusharray8(value->param_v4.spatialStreamIndices,
MAX_NUM_SPATIAL_STREAMS,
value->param_v4.numSpatialStreamIndices,
ppWritePackedMsg,
end))
return 0;
#endif
return 1;
}
@@ -307,6 +318,31 @@ static uint8_t pack_dl_tti_pdcch_pdu_rel15_value(void *tlv, uint8_t **ppWritePac
return 0;
}
}
#ifndef ENABLE_AERIAL
// Spatial steam indices for MU-MIMO
const nfapi_v4_pdcch_pdu_parameters_t *p = &value->param_v4;
if (!push16(p->numSpatialStreams, ppWritePackedMsg, end))
return 0;
for (uint_fast16_t i = 0; i < p->numSpatialStreams; i++)
if (!(push16(p->dci_spatialStreamIndices[i].dci_index, ppWritePackedMsg, end)
&& push16(p->dci_spatialStreamIndices[i].spatial_stream_index, ppWritePackedMsg, end)))
return 0;
#endif
return 1;
}
static inline uint8_t pack_spatial_stream_indices(const nfapi_nr_spatial_stream_index_t *ss,
uint8_t **ppWritePackedMsg,
uint8_t *end)
{
if (!push8(ss->numSpatialStreamIndices, ppWritePackedMsg, end))
return 0;
if (!pusharray16(ss->spatialStreamIndices, MAX_NUM_SPATIAL_STREAMS, ss->numSpatialStreamIndices, ppWritePackedMsg, end))
return 0;
return 1;
}
@@ -369,6 +405,14 @@ static uint8_t pack_dl_tti_pdsch_pdu_rel15_value(void *tlv, uint8_t **ppWritePac
if (!push8(value->maintenance_parms_v3.ldpcBaseGraph, ppWritePackedMsg, end)
|| !push32(value->maintenance_parms_v3.tbSizeLbrmBytes, ppWritePackedMsg, end))
return 0;
// PDSCH parameter in FAPI v4 for MU-MIMO spatial stream indexing
if (!push8(value->param_v4.numberCodewords, ppWritePackedMsg, end))
return 0;
for (uint_fast8_t c = 0; c < value->param_v4.numberCodewords; c++)
if (!pack_spatial_stream_indices(value->param_v4.spatialStreamsCw + c, ppWritePackedMsg, end))
return 0;
#endif
return 1;
}
@@ -390,6 +434,11 @@ static uint8_t pack_dl_tti_ssb_pdu_rel15_value(void *tlv, uint8_t **ppWritePacke
if(!pack_nr_tx_beamforming_pdu(&value->precoding_and_beamforming,ppWritePackedMsg, end)) {
return 0;
}
#ifndef ENABLE_AERIAL
if (!(push8(value->param_v4.spatialStreamIndexPresent, ppWritePackedMsg, end)
&& push16(value->param_v4.spatialStreamIndex, ppWritePackedMsg, end)))
return 0;
#endif
return 1;
}
@@ -517,6 +566,30 @@ static uint8_t unpack_dl_tti_pdcch_pdu_rel15_value(void *tlv, uint8_t **ppReadPa
return 0;
}
}
#ifndef ENABLE_AERIAL
// Spatial steam indices for MU-MIMO
nfapi_v4_pdcch_pdu_parameters_t *p = &value->param_v4;
if (!pull16(ppReadPackedMsg, &p->numSpatialStreams, end))
return 0;
for (uint_fast16_t i = 0; i < p->numSpatialStreams; i++) {
if (!(pull16(ppReadPackedMsg, &p->dci_spatialStreamIndices[i].dci_index, end)
&& pull16(ppReadPackedMsg, &p->dci_spatialStreamIndices[i].spatial_stream_index, end)))
return 0;
}
#endif
return 1;
}
static inline uint8_t unpack_spatial_stream_indices(nfapi_nr_spatial_stream_index_t *ss, uint8_t **ppReadPackedMsg, uint8_t *end)
{
if (!pull8(ppReadPackedMsg, &ss->numSpatialStreamIndices, end))
return 0;
if (!pullarray16(ppReadPackedMsg, ss->spatialStreamIndices, MAX_NUM_SPATIAL_STREAMS, ss->numSpatialStreamIndices, end))
return 0;
return 1;
}
@@ -579,6 +652,14 @@ static uint8_t unpack_dl_tti_pdsch_pdu_rel15_value(void *tlv, uint8_t **ppReadPa
if (!pull8(ppReadPackedMsg, &value->maintenance_parms_v3.ldpcBaseGraph, end)
|| !pull32(ppReadPackedMsg, &value->maintenance_parms_v3.tbSizeLbrmBytes, end))
return 0;
// PDSCH parameter in FAPI v4 for MU-MIMO spatial stream indexing
if (!pull8(ppReadPackedMsg, &value->param_v4.numberCodewords, end))
return 0;
for (uint_fast8_t c = 0; c < value->param_v4.numberCodewords; c++)
if (!unpack_spatial_stream_indices(value->param_v4.spatialStreamsCw + c, ppReadPackedMsg, end))
return 0;
#endif
return 1;
}
@@ -602,6 +683,17 @@ static uint8_t unpack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppReadP
if(!unpack_nr_tx_beamforming_pdu(&value->precodingAndBeamforming, ppReadPackedMsg, end)) {
return 0;
}
#ifndef ENABLE_AERIAL
if (!pull8(ppReadPackedMsg, &value->param_v4.numSpatialStreamIndices, end))
return 0;
if (!pullarray8(ppReadPackedMsg,
value->param_v4.spatialStreamIndices,
MAX_NUM_SPATIAL_STREAMS,
value->param_v4.numSpatialStreamIndices,
end))
return 0;
#endif
return 1;
}
@@ -626,6 +718,11 @@ static uint8_t unpack_dl_tti_ssb_pdu_rel15_value(void *tlv, uint8_t **ppReadPack
if(!unpack_nr_tx_beamforming_pdu(&value->precoding_and_beamforming, ppReadPackedMsg, end)) {
return 0;
}
#ifndef ENABLE_AERIAL
if (!(pull8(ppReadPackedMsg, &value->param_v4.spatialStreamIndexPresent, end)
&& pull16(ppReadPackedMsg, &value->param_v4.spatialStreamIndex, end)))
return 0;
#endif
return 1;
}
@@ -725,7 +822,14 @@ static uint8_t pack_ul_tti_request_prach_pdu(const nfapi_nr_prach_pdu_t *prach_p
return 0;
}
return pack_nr_rx_beamforming_pdu(&prach_pdu->beamforming, ppWritePackedMsg, end);
if (!pack_nr_rx_beamforming_pdu(&prach_pdu->beamforming, ppWritePackedMsg, end))
return 0;
const nfapi_nr_spatial_stream_index_t *p = &prach_pdu->param_v4;
if (!pack_spatial_stream_indices(p, ppWritePackedMsg, end))
return 0;
return 1;
}
static uint8_t pack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
@@ -817,7 +921,8 @@ static uint8_t pack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu, ui
}
#ifndef ENABLE_AERIAL
if (!(push8(pusch_pdu->maintenance_parms_v3.ldpcBaseGraph, ppWritePackedMsg, end)
&& push32(pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes, ppWritePackedMsg, end)))
&& push32(pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes, ppWritePackedMsg, end)
&& pack_spatial_stream_indices(&pusch_pdu->param_v4, ppWritePackedMsg, end)))
return 0;
#endif
return 1;
@@ -845,7 +950,15 @@ static uint8_t pack_ul_tti_request_pucch_pdu(const nfapi_nr_pucch_pdu_t *pucch_p
return 0;
}
return pack_nr_rx_beamforming_pdu(&pucch_pdu->beamforming, ppWritePackedMsg, end);
if (!pack_nr_rx_beamforming_pdu(&pucch_pdu->beamforming, ppWritePackedMsg, end))
return 0;
#ifndef ENABLE_AERIAL
if (!pack_spatial_stream_indices(&pucch_pdu->param_v4, ppWritePackedMsg, end))
return 0;
#endif
return 1;
}
static uint8_t pack_ul_tti_request_srs_parameters_v4(nfapi_v4_srs_parameters_t *srsParameters,
@@ -1050,7 +1163,14 @@ static uint8_t unpack_ul_tti_request_prach_pdu(nfapi_nr_prach_pdu_t *prach_pdu,
return 0;
}
return unpack_nr_rx_beamforming_pdu(&prach_pdu->beamforming, ppReadPackedMsg, end);
if (!unpack_nr_rx_beamforming_pdu(&prach_pdu->beamforming, ppReadPackedMsg, end))
return 0;
#ifndef ENABLE_AERIAL
if (!unpack_spatial_stream_indices(&prach_pdu->param_v4, ppReadPackedMsg, end))
return 0;
#endif
return 1;
}
static uint8_t unpack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu, uint8_t **ppReadPackedMsg, uint8_t *end)
@@ -1139,7 +1259,8 @@ static uint8_t unpack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu,
}
#ifndef ENABLE_AERIAL
if (!(pull8(ppReadPackedMsg, &pusch_pdu->maintenance_parms_v3.ldpcBaseGraph, end)
&& pull32(ppReadPackedMsg, &pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes, end)))
&& pull32(ppReadPackedMsg, &pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes, end)
&& unpack_spatial_stream_indices(&pusch_pdu->param_v4, ppReadPackedMsg, end)))
return 0;
#endif
return 1;
@@ -1166,7 +1287,14 @@ static uint8_t unpack_ul_tti_request_pucch_pdu(nfapi_nr_pucch_pdu_t *pucch_pdu,
&& pull16(ppReadPackedMsg, &pucch_pdu->bit_len_csi_part2, end))) {
return 0;
}
return unpack_nr_rx_beamforming_pdu(&pucch_pdu->beamforming, ppReadPackedMsg, end);
if (!unpack_nr_rx_beamforming_pdu(&pucch_pdu->beamforming, ppReadPackedMsg, end))
return 0;
#ifndef ENABLE_AERIAL
if (!unpack_spatial_stream_indices(&pucch_pdu->param_v4, ppReadPackedMsg, end))
return 0;
#endif
return 1;
}
static uint8_t unpack_ul_tti_request_srs_parameters_v4(nfapi_v4_srs_parameters_t *srsParameters,

View File

@@ -1020,6 +1020,10 @@ static void copy_dl_tti_request_pdcch_pdu(const nfapi_nr_dl_tti_pdcch_pdu_rel15_
copy_dl_tti_beamforming(&src_dci_pdu->precodingAndBeamforming, &dst_dci_pdu->precodingAndBeamforming);
PARTIAL_COPY_RANGE(dst_dci_pdu, src_dci_pdu, nfapi_nr_dl_dci_pdu_t, beta_PDCCH_1_0, Payload);
}
dst->param_v4.numSpatialStreams = src->param_v4.numSpatialStreams;
for (uint_fast16_t i = 0; i < dst->param_v4.numSpatialStreams; i++) {
dst->param_v4.dci_spatialStreamIndices[i] = src->param_v4.dci_spatialStreamIndices[i];
}
}
static void copy_dl_tti_request_pdsch_pdu(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t *src, nfapi_nr_dl_tti_pdsch_pdu_rel15_t *dst)
@@ -1027,18 +1031,28 @@ static void copy_dl_tti_request_pdsch_pdu(const nfapi_nr_dl_tti_pdsch_pdu_rel15_
PARTIAL_COPY(dst, src, nfapi_nr_dl_tti_pdsch_pdu_rel15_t, nEpreRatioOfPDSCHToPTRS);
copy_dl_tti_beamforming(&src->precodingAndBeamforming, &dst->precodingAndBeamforming);
PARTIAL_COPY_RANGE(dst, src, nfapi_nr_dl_tti_pdsch_pdu_rel15_t, powerControlOffset, maintenance_parms_v3);
dst->param_v4.numberCodewords = src->param_v4.numberCodewords;
for (uint_fast8_t i = 0; i < dst->param_v4.numberCodewords; i++) {
const nfapi_nr_spatial_stream_index_t *s = src->param_v4.spatialStreamsCw + i;
nfapi_nr_spatial_stream_index_t *d = dst->param_v4.spatialStreamsCw + i;
COPY_STRUCT_ARRAY(d, s, spatialStreamIndices, numSpatialStreamIndices);
}
}
static void copy_dl_tti_request_csi_rs_pdu(const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *src, nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *dst)
{
PARTIAL_COPY(dst, src, nfapi_nr_dl_tti_csi_rs_pdu_rel15_t, power_control_offset_ss);
copy_dl_tti_beamforming(&src->precodingAndBeamforming, &dst->precodingAndBeamforming);
const struct nfapi_nr_csi_spatial_stream_index *s = &src->param_v4;
struct nfapi_nr_csi_spatial_stream_index *d = &dst->param_v4;
COPY_STRUCT_ARRAY(d, s, spatialStreamIndices, numSpatialStreamIndices);
}
static void copy_dl_tti_request_ssb_pdu(const nfapi_nr_dl_tti_ssb_pdu_rel15_t *src, nfapi_nr_dl_tti_ssb_pdu_rel15_t *dst)
{
PARTIAL_COPY(dst, src, nfapi_nr_dl_tti_ssb_pdu_rel15_t, ssbRsrp);
copy_dl_tti_beamforming(&src->precoding_and_beamforming, &dst->precoding_and_beamforming);
dst->param_v4 = src->param_v4;
}
static void copy_dl_tti_request_pdu(const nfapi_nr_dl_tti_request_pdu_t *src, nfapi_nr_dl_tti_request_pdu_t *dst)
@@ -1113,6 +1127,9 @@ static void copy_ul_tti_request_prach_pdu(const nfapi_nr_prach_pdu_t *src, nfapi
{
PARTIAL_COPY(dst, src, nfapi_nr_prach_pdu_t, num_cs);
copy_ul_tti_beamforming(&src->beamforming, &dst->beamforming);
const nfapi_nr_spatial_stream_index_t *s = &src->param_v4;
nfapi_nr_spatial_stream_index_t *d = &dst->param_v4;
COPY_STRUCT_ARRAY(d, s, spatialStreamIndices, numSpatialStreamIndices);
}
static void copy_ul_tti_request_pusch_pdu(const nfapi_nr_pusch_pdu_t *src, nfapi_nr_pusch_pdu_t *dst)
@@ -1152,12 +1169,18 @@ static void copy_ul_tti_request_pusch_pdu(const nfapi_nr_pusch_pdu_t *src, nfapi
copy_ul_tti_beamforming(&src->beamforming, &dst->beamforming);
dst->maintenance_parms_v3.ldpcBaseGraph = src->maintenance_parms_v3.ldpcBaseGraph;
dst->maintenance_parms_v3.tbSizeLbrmBytes = src->maintenance_parms_v3.tbSizeLbrmBytes;
const nfapi_nr_spatial_stream_index_t *s = &src->param_v4;
nfapi_nr_spatial_stream_index_t *d = &dst->param_v4;
COPY_STRUCT_ARRAY(d, s, spatialStreamIndices, numSpatialStreamIndices);
}
static void copy_ul_tti_request_pucch_pdu(const nfapi_nr_pucch_pdu_t *src, nfapi_nr_pucch_pdu_t *dst)
{
PARTIAL_COPY(dst, src, nfapi_nr_pucch_pdu_t, bit_len_csi_part2);
copy_ul_tti_beamforming(&src->beamforming, &dst->beamforming);
const nfapi_nr_spatial_stream_index_t *s = &src->param_v4;
nfapi_nr_spatial_stream_index_t *d = &dst->param_v4;
COPY_STRUCT_ARRAY(d, s, spatialStreamIndices, numSpatialStreamIndices);
}
static void copy_ul_tti_request_srs_parameters(const nfapi_v4_srs_parameters_t *src,

View File

@@ -853,6 +853,21 @@ typedef struct {
} nfapi_nr_dl_dci_pdu_t;
// The maximum number of spatial streams to be mapped depends on TLV 0x16E and
// the number of streams could be same as number of layers or number of antenna
// ports or number of baseband ports. Hence we set this to be the maximum number
// of baseband ports
#define MAX_NUM_SPATIAL_STREAMS 16
typedef struct {
uint16_t dci_index;
uint16_t spatial_stream_index;
} nfapi_v4_dci_spatial_stream_index_t;
typedef struct {
uint16_t numSpatialStreams;
nfapi_v4_dci_spatial_stream_index_t dci_spatialStreamIndices[MAX_NUM_SPATIAL_STREAMS];
} nfapi_v4_pdcch_pdu_parameters_t;
typedef struct {
///Bandwidth part size [TS38.213 sec12]. Number of contiguous PRBs allocated to the BWP,Value: 1->275
@@ -885,13 +900,32 @@ typedef struct {
uint16_t numDlDci;
///DL DCI PDU
nfapi_nr_dl_dci_pdu_t dci_pdu[MAX_DCI_CORESET];
} nfapi_nr_dl_tti_pdcch_pdu_rel15_t;
/// Spatial stream indexing for MU-MIMO
nfapi_v4_pdcch_pdu_parameters_t param_v4;
} nfapi_nr_dl_tti_pdcch_pdu_rel15_t;
typedef struct {
uint8_t ldpcBaseGraph;
uint32_t tbSizeLbrmBytes;
}nfapi_v3_pdsch_maintenance_parameters_t;
typedef struct {
/// Number of spatial streams used in the index array
uint8_t numSpatialStreamIndices;
/// Spatial stream index array
uint16_t spatialStreamIndices[MAX_NUM_SPATIAL_STREAMS];
} nfapi_nr_spatial_stream_index_t;
#define MAX_NUM_CODEWORDS 2
typedef struct {
// MU-MIMO support in FAPIv4
/// Number of codewords with spatial stream indices
uint8_t numberCodewords;
/// Spatial stream indexing for codeworeds
nfapi_nr_spatial_stream_index_t spatialStreamsCw[MAX_NUM_CODEWORDS];
} nfapi_v4_pdsch_parameters_t;
typedef struct {
uint16_t pduBitmap;
uint16_t rnti;
@@ -984,8 +1018,9 @@ typedef struct {
uint32_t dlTbCrc;
nfapi_v3_pdsch_maintenance_parameters_t maintenance_parms_v3;
}nfapi_nr_dl_tti_pdsch_pdu_rel15_t;
/// PDSCH parameters FAPI v4. used only for spatial stream indexing in MU-MIMO
nfapi_v4_pdsch_parameters_t param_v4;
} nfapi_nr_dl_tti_pdsch_pdu_rel15_t;
//for pdsch_pdu:
/*
@@ -1069,9 +1104,15 @@ typedef struct
uint8_t power_control_offset; // Ratio of PDSCH EPRE to NZP CSI-RSEPRE [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->23 representing -8 to 15 dB in 1dB steps; 255: L1 is configured with ProfileSSS
uint8_t power_control_offset_ss; // Ratio of NZP CSI-RS EPRE to SSB/PBCH block EPRE [3GPP TS 38.214, sec 5.2.2.3.1], Values: 0: -3dB; 1: 0dB; 2: 3dB; 3: 6dB; 255: L1 is configured with ProfileSSS
nfapi_nr_tx_precoding_and_beamforming_t precodingAndBeamforming;
/// Spatial stream indexing for MU-MIMO
struct nfapi_nr_csi_spatial_stream_index {
/// Number of spatial streams used in the index array
uint8_t numSpatialStreamIndices;
/// Spatial stream index array
uint8_t spatialStreamIndices[MAX_NUM_SPATIAL_STREAMS];
} param_v4;
} nfapi_nr_dl_tti_csi_rs_pdu_rel15_t;
typedef struct
{
uint32_t bch_payload;//BCH payload. The valid bits are indicated in the PARAM/CONFIG TLVs. If PARAM/CONFIG TLVs indicate MAC generates full bchPayload then the payload length is 31 bits with the 8 LSB bits being. Otherwise timing PBCH bits are generated by the PHY. And for bchPayload the 24 LSB are used.
@@ -1112,6 +1153,11 @@ typedef struct {
/// A value indicating the channel quality between the gNB and nrUE. Value: 0->255 dBM
uint8_t ssbRsrp;
nfapi_nr_tx_precoding_and_beamforming_t precoding_and_beamforming;
/// Spatial stream indexing
struct nfapi_v4_ssb_param {
uint8_t spatialStreamIndexPresent;
uint16_t spatialStreamIndex;
} param_v4;
} nfapi_nr_dl_tti_ssb_pdu_rel15_t;
typedef struct {
@@ -1279,7 +1325,7 @@ typedef struct
uint8_t prach_start_symbol;
uint16_t num_cs;
nfapi_nr_ul_beamforming_t beamforming;
nfapi_nr_spatial_stream_index_t param_v4;
} nfapi_nr_prach_pdu_t;
//for pusch_pdu:
@@ -1392,6 +1438,8 @@ typedef struct
//beamforming
nfapi_nr_ul_beamforming_t beamforming;
nfapi_v3_pdsch_maintenance_parameters_t maintenance_parms_v3;
// Spatial stream indexing for MU-MIMO
nfapi_nr_spatial_stream_index_t param_v4;
} nfapi_nr_pusch_pdu_t;
//for pucch_pdu:
@@ -1437,7 +1485,7 @@ typedef struct
uint16_t bit_len_csi_part2;
nfapi_nr_ul_beamforming_t beamforming;
nfapi_nr_spatial_stream_index_t param_v4;
} nfapi_nr_pucch_pdu_t;
typedef struct {

View File

@@ -0,0 +1,20 @@
/*
* SPDX-License-Identifier: LicenseRef-CSSL-1.0
*/
#ifndef OPENAIRINTERFACE_NR_FAPI_COMMON_UTIL_TEST_H
#define OPENAIRINTERFACE_NR_FAPI_COMMON_UTIL_TEST_H
#include "nfapi/tests/nr_fapi_test.h"
static uint8_t get_num_spatial_streams(void)
{
const uint16_t max_logical_ant_ports = MAX_NUM_SPATIAL_STREAMS;
return rand8_range(0, max_logical_ant_ports);
}
static void fill_spatial_streams(const uint8_t num_s, uint16_t s[MAX_NUM_SPATIAL_STREAMS])
{
for (int n = 0; n < num_s; n++)
s[n] = rand16_range(0, num_s - 1);
}
#endif

View File

@@ -4,6 +4,7 @@
#include "dci_payload_utils.h"
#include "nr_fapi_p7.h"
#include "nr_fapi_p7_utils.h"
#include "nr_fapi_common_util_test.h"
static void fill_dl_tti_request_beamforming(nfapi_nr_tx_precoding_and_beamforming_t *precodingAndBeamforming)
{
@@ -48,6 +49,11 @@ static void fill_dl_tti_request_pdcch_pdu(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdu
pdu->dci_pdu[dl_dci].PayloadSizeBits = rand16_range(0, DCI_PAYLOAD_BYTE_LEN * 8);
generate_payload(pdu->dci_pdu[dl_dci].PayloadSizeBits, pdu->dci_pdu[dl_dci].Payload);
}
pdu->param_v4.numSpatialStreams = get_num_spatial_streams();
for (int n = 0; n < pdu->param_v4.numSpatialStreams; n++) {
pdu->param_v4.dci_spatialStreamIndices[n].dci_index = rand16();
pdu->param_v4.dci_spatialStreamIndices[n].spatial_stream_index = rand16_range(0, pdu->param_v4.numSpatialStreams - 1);
}
}
static void fill_dl_tti_request_pdsch_pdu(nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdu)
@@ -109,6 +115,12 @@ static void fill_dl_tti_request_pdsch_pdu(nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdu
}
pdu->maintenance_parms_v3.ldpcBaseGraph = rand8();
pdu->maintenance_parms_v3.tbSizeLbrmBytes = rand32();
pdu->param_v4.numberCodewords = rand8_range(0, MAX_NUM_CODEWORDS);
for (int c = 0; c < pdu->param_v4.numberCodewords; c++) {
pdu->param_v4.spatialStreamsCw[c].numSpatialStreamIndices = get_num_spatial_streams();
fill_spatial_streams(pdu->param_v4.spatialStreamsCw[c].numSpatialStreamIndices,
pdu->param_v4.spatialStreamsCw[c].spatialStreamIndices);
}
}
static void fill_dl_tti_request_csi_rs_pdu(nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *pdu)
@@ -147,6 +159,9 @@ static void fill_dl_tti_request_csi_rs_pdu(nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *p
pdu->power_control_offset = rand8_range(0, 23);
pdu->power_control_offset_ss = rand8_range(0, 3);
fill_dl_tti_request_beamforming(&pdu->precodingAndBeamforming);
pdu->param_v4.numSpatialStreamIndices = get_num_spatial_streams();
for (int n = 0; n < pdu->param_v4.numSpatialStreamIndices; n++)
pdu->param_v4.spatialStreamIndices[n] = rand8_range(0, pdu->param_v4.numSpatialStreamIndices - 1);
}
static void fill_dl_tti_request_ssb_pdu(nfapi_nr_dl_tti_ssb_pdu_rel15_t *pdu)
@@ -159,6 +174,8 @@ static void fill_dl_tti_request_ssb_pdu(nfapi_nr_dl_tti_ssb_pdu_rel15_t *pdu)
pdu->bchPayloadFlag = rand8_range(0, 2);
pdu->bchPayload = rand24();
fill_dl_tti_request_beamforming(&pdu->precoding_and_beamforming);
pdu->param_v4.spatialStreamIndexPresent = rand8(0, 1);
pdu->param_v4.spatialStreamIndex = rand16_range(0, MAX_NUM_SPATIAL_STREAMS);
}
static void fill_dl_tti_request(nfapi_nr_dl_tti_request_t *msg)

View File

@@ -4,6 +4,7 @@
#include "dci_payload_utils.h"
#include "nr_fapi_p7.h"
#include "nr_fapi_p7_utils.h"
#include "nr_fapi_common_util_test.h"
static void fill_ul_tti_request_beamforming(nfapi_nr_ul_beamforming_t *beamforming_pdu)
{
@@ -28,6 +29,8 @@ static void fill_ul_tti_request_prach_pdu(nfapi_nr_prach_pdu_t *pdu)
pdu->prach_start_symbol = rand8_range(0, 13);
pdu->num_cs = rand16_range(0, 419);
fill_ul_tti_request_beamforming(&pdu->beamforming);
pdu->param_v4.numSpatialStreamIndices = get_num_spatial_streams();
fill_spatial_streams(pdu->param_v4.numSpatialStreamIndices, pdu->param_v4.spatialStreamIndices);
}
static void fill_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pdu)
@@ -133,6 +136,8 @@ static void fill_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pdu)
fill_ul_tti_request_beamforming(&pdu->beamforming);
pdu->maintenance_parms_v3.ldpcBaseGraph = rand8();
pdu->maintenance_parms_v3.tbSizeLbrmBytes = rand32();
pdu->param_v4.numSpatialStreamIndices = get_num_spatial_streams();
fill_spatial_streams(pdu->param_v4.numSpatialStreamIndices, pdu->param_v4.spatialStreamIndices);
}
static void fill_ul_tti_request_pucch_pdu(nfapi_nr_pucch_pdu_t *pdu)
@@ -247,6 +252,8 @@ static void fill_ul_tti_request_pucch_pdu(nfapi_nr_pucch_pdu_t *pdu)
}
fill_ul_tti_request_beamforming(&pdu->beamforming);
pdu->param_v4.numSpatialStreamIndices = get_num_spatial_streams();
fill_spatial_streams(pdu->param_v4.numSpatialStreamIndices, pdu->param_v4.spatialStreamIndices);
}
static void fill_ul_tti_request_srs_parameters(nfapi_v4_srs_parameters_t *params, const uint8_t num_symbols){