+void fillCoresetFeqDomAllocMap(uint16_t startPrbGrp, uint16_t numPrbGrp, uint8_t *freqDomain)
+{
+ uint8_t idx;
+ uint8_t prbGrpStartBit = 0;
+ uint8_t numBitsToRightShift = 0;
+ uint64_t mask = 0;
+ uint64_t freqAllocBitMap = 0;
+
+ /*
+ * Frequency allocation bit string is 45 bits long. Hence using 6 bytes (i.e. 48 bits) to represent it.
+ * Each bit corresponds to a group of 6 RBs.
+ *
+ * For example if a coreset includes PRB 24 to 47, then on dividing the PRBs into group of 6,
+ * startPrbGrp = 24/6 = 4
+ * numPrbGrp = 24/6 = 4
+ *
+ * Frequency allocation bit string is 48 bits long i.e. Bit 47...0
+ * Here, Bit 47 represents RB group 0, Bit 46 represent RB group 45 and so on.
+ * Since startPrbGrp = 4 and numPrbGrp = 4, it means RB group 4,5,6 and 7 are used in coreset.
+ * i.e. Bits 43, 42, 42 and 40 are masked to 1 and rest all bits are 0 in bitstring
+ */
+ prbGrpStartBit = 47;
+ while(numPrbGrp)
+ {
+ mask = 1;
+ mask = mask << (prbGrpStartBit - startPrbGrp);
+ freqAllocBitMap = freqAllocBitMap | mask;
+ startPrbGrp++;
+ numPrbGrp--;
+ }
+
+ /* Copying 48 LSBs from 64-bit integer to the 45 MSBS in 6-byte array
+ * The first (left-most / most significant) bit corresponds to the first RB
+ * group in the BWP, and so on
+ */
+ /* On right shifting freqAllocBitMap by 40 bits, the bits 47 to 40 of freqAllocBitMap
+ * will now become 8-LSB. Copying these 8-bits into freqDomain[].
+ * Now shifting freqAllocBitMap by 32 bits, the bit 39 to 32 of freqAllocBitMap will
+ * now become 8-LSB. Copying these 8-bits into next index of freqDomain.
+ * and so on.
+ */
+ numBitsToRightShift = 40;
+ mask = 0x0000FF0000000000;
+ for(idx=0; idx<FREQ_DOM_RSRC_SIZE; idx++)
+ {
+ freqDomain[idx] = (freqAllocBitMap & mask) >> numBitsToRightShift;
+ numBitsToRightShift -= 8;
+ mask = mask >> 8;
+ }
+}
+
+/*******************************************************************
+ *
+ * @brief Reverse and copy fixed buffer to mBuf
+ *
+ * @details
+ *
+ * Function : oduCpyFixBufToMsg
+ *
+ * Functionality: Reverse and copy fixed buffer to mBuf
+ *
+ * @params[in] Fixed buffer, msg buffer, length of message
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+void oduCpyFixBufToMsg(uint8_t *fixBuf, Buffer *mBuf, uint16_t len)
+{
+ uint16_t idx = 0, revIdx = 0, temp = 0, copyLen = 0;
+
+ /* ODU_COPY_FIX_BUF_TO_MSG copies fixed buffer in reverse order. \
+ * Hence reversing the fixed buffer before copying in order to \
+ * maintain the actual order*/
+ for(idx = 0, revIdx = len-1; idx < len/2; idx++, revIdx--)
+ {
+ temp = fixBuf[idx];
+ fixBuf[idx] = fixBuf[revIdx];
+ fixBuf[revIdx] = temp;
+ }
+ ODU_COPY_FIX_BUF_TO_MSG(fixBuf, mBuf, 0, len, (MsgLen *)©Len);
+}
+
+/*******************************************************************
+ *
+ * @brief Builds PLMN ID
+ *
+ * @details
+ *
+ * Function : plmnBuildId
+ *
+ * Functionality: Building the PLMN ID
+ *
+ * @params[in] PLMNID plmn
+ * @params[out] PLMNID in string format
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t buildPlmnId(Plmn plmn, uint8_t *buf)
+{
+ uint8_t mncCnt;
+ mncCnt = 2;
+ buf[0] = ((plmn.mcc[1] << 4) | (plmn.mcc[0]));
+ if(mncCnt == 2)
+ {
+ buf[1] = ((0xf0) | (plmn.mcc[2]));
+ buf[2] = ((plmn.mnc[1] << 4) | (plmn.mnc[0]));
+ }
+ else
+ {
+ buf[1] = ((plmn.mnc[0] << 4) | (plmn.mcc[2]));
+ buf[2] = ((plmn.mnc[2] << 4) | (plmn.mnc[1]));
+ }
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Function to map Sub carrier spacing enum value to value in kHz
+ *
+ * @details
+ *
+ * Function : convertScsEnumValToScsVal
+ *
+ * Functionality:
+ * Function to map Sub carrier spacing enum value to value in kHz
+ *
+ * @params[in] sub-carrier spacing enum value
+ * @return sub-carrier spacing value in kHz
+ *
+ * ****************************************************************/
+uint16_t convertScsEnumValToScsVal(uint8_t scsEnumValue)
+{
+ switch(scsEnumValue)
+ {
+ case SCS_15KHZ:
+ case SCS_30KHZ:
+ case SCS_60KHZ:
+ case SCS_120KHZ:
+ case SCS_240KHZ:
+ return (15 * pow(2,scsEnumValue));
+ default:
+ return 15;
+ }
+}
+
+/*******************************************************************
+ * @brief convert scs offset value into the enum value received from O1
+ *
+ * @details
+ *
+ * Function : convertScsValToScsEnum
+ *
+ * Functionality:
+ * - convert scs periodicity value
+ *
+ * @params[in] uint32_t num
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+
+uint8_t convertScsValToScsEnum(uint32_t num)
+{
+ switch(num)
+ {
+ case 15:
+ return SCS_15KHZ;
+
+ case 30:
+ return SCS_30KHZ;
+
+ case 60:
+ return SCS_60KHZ;
+
+ case 120:
+ return SCS_120KHZ;
+
+ case 240:
+ return SCS_240KHZ;
+
+ default:
+ return SCS_15KHZ;
+ }
+}
+
+/*******************************************************************
+ * @brief convert SSB periodicity value into the enum value received from O1
+ *
+ * @details
+ *
+ * Function : convertSSBPeriodicityToEnum
+ *
+ * Functionality:
+ * - convert scs periodicity value
+ *
+ * @params[in] uint32_t num
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t convertSSBPeriodicityToEnum(uint32_t num)