+
+ /** @ingroup group_source_api_p7_fapi2phy_proc
+ *
+ * @param[in] p_fapi_vendor_msg Pointer to FAPI UL_TTI.request vendor message.
+ * @param[in] p_ia_ul_config_req Pointer to IAPI UL_TTI.request structure.
+ *
+ * @return no return.
+ *
+ * @description
+ * This function fills fields for UL_TTI.request structure that come from
+ * a vendor extension.
+ *
+**/
+void nr5g_fapi_ul_tti_req_to_phy_translation_vendor_ext(
+ fapi_vendor_msg_t * p_fapi_vendor_msg,
+ PULConfigRequestStruct p_ia_ul_config_req)
+{
+ uint8_t i = 0u;
+
+ fapi_vendor_ul_tti_req_t *p_vendor_ul_tti_req = NULL;
+ fapi_vendor_ul_tti_req_pdu_t *p_fapi_vendor_ul_tti_req_pdu = NULL;
+ fapi_vendor_ul_pusch_pdu_t *p_vendor_pusch_pdu = NULL;
+ fapi_vendor_ul_pucch_pdu_t *p_vendor_pucch_pdu = NULL;
+ fapi_vendor_ul_srs_pdu_t *p_vendor_srs_pdu = NULL;
+
+ ULSCHPDUStruct *p_ul_data_chan;
+ ULCCHUCIPDUStruct *p_ul_ctrl_chan;
+ SRSPDUStruct *p_ul_srs_chan;
+ PDUStruct *p_pdu_head;
+
+ p_vendor_ul_tti_req = &p_fapi_vendor_msg->p7_req_vendor.ul_tti_req;
+
+ p_pdu_head = p_ia_ul_config_req->sULPDU;
+
+ for (i = 0u; i < p_ia_ul_config_req->nPDU; i++) {
+ p_fapi_vendor_ul_tti_req_pdu = &p_vendor_ul_tti_req->ul_pdus[i];
+
+ switch (p_pdu_head->nPDUType) {
+ case UL_PDU_TYPE_PRACH:
+ // Not used
+ break;
+
+ case UL_PDU_TYPE_ULSCH:
+ {
+ p_ul_data_chan = (ULSCHPDUStruct *) p_pdu_head;
+ p_vendor_pusch_pdu = &p_fapi_vendor_ul_tti_req_pdu->pdu.pusch_pdu;
+
+ p_ul_data_chan->nNrOfAntennaPorts = p_vendor_pusch_pdu->nr_of_antenna_ports;
+ p_ul_data_chan->nNrofRxRU = p_vendor_pusch_pdu->nr_of_rx_ru;
+ NR5G_FAPI_MEMCPY(p_ul_data_chan->nRxRUIdx, sizeof(p_ul_data_chan->nRxRUIdx),
+ p_vendor_pusch_pdu->rx_ru_idx, sizeof(p_vendor_pusch_pdu->rx_ru_idx));
+ }
+ break;
+
+ case UL_PDU_TYPE_ULCCH_UCI:
+ {
+ p_ul_ctrl_chan = (ULCCHUCIPDUStruct *) p_pdu_head;
+ p_vendor_pucch_pdu = &p_fapi_vendor_ul_tti_req_pdu->pdu.pucch_pdu;
+
+ p_ul_ctrl_chan->nNrofRxRU = p_vendor_pucch_pdu->nr_of_rx_ru;
+ p_ul_ctrl_chan->nGroupId = p_vendor_pucch_pdu->group_id;
+ NR5G_FAPI_MEMCPY(p_ul_ctrl_chan->nRxRUIdx, sizeof(p_ul_ctrl_chan->nRxRUIdx),
+ p_vendor_pucch_pdu->rx_ru_idx, sizeof(p_vendor_pucch_pdu->rx_ru_idx));
+ }
+ break;
+
+ case UL_PDU_TYPE_SRS:
+ {
+ p_ul_srs_chan = (SRSPDUStruct *) p_pdu_head;
+ p_vendor_srs_pdu = &p_fapi_vendor_ul_tti_req_pdu->pdu.srs_pdu;
+
+ p_ul_srs_chan->nNrofRxRU = p_vendor_srs_pdu->nr_of_rx_ru;
+ NR5G_FAPI_MEMCPY(p_ul_srs_chan->nRxRUIdx, sizeof(p_ul_srs_chan->nRxRUIdx),
+ p_vendor_srs_pdu->rx_ru_idx, sizeof(p_vendor_srs_pdu->rx_ru_idx));
+ }
+ break;
+
+ default:
+ {
+ NR5G_FAPI_LOG(ERROR_LOG,
+ ("[NR5G_FAPI] [UL_TTI.request] Unknown PDU Type :%d",
+ p_ia_ul_config_req->sMsgHdr.nMessageType));
+ return;
+ }
+ }
+ p_pdu_head =
+ (PDUStruct *) ((uint8_t *) p_pdu_head + p_pdu_head->nPDUSize);
+ }
+}
+
+
+ /** @ingroup group_source_api_p7_fapi2phy_proc
+ *
+ * @param[in] p_fapi_vendor_msg Pointer to FAPI UL_TTI.request vendor message.
+ * @param[in] p_ia_ul_config_req Pointer to IAPI UL_TTI.request structure.
+ *
+ * @return Returns ::SUCCESS and ::FAILURE.
+ *
+ * @description
+ * This function fills symbol_no field for UL_TTI.request structure and fails if
+ * the mode is urllc and there is no associated vendor_msg.
+ *
+**/
+uint8_t nr5g_fapi_ul_tti_req_to_phy_translation_vendor_ext_symbol_no(
+ bool is_urllc,
+ fapi_vendor_msg_t * p_fapi_vendor_msg,
+ PULConfigRequestStruct p_ia_ul_config_req,
+ uint8_t* symbol_no)
+{
+ // for non-urllc mode symbol_no is a don't care
+ *symbol_no = 0u;
+ if (is_urllc)
+ {
+ if (NULL == p_fapi_vendor_msg)
+ {
+ NR5G_FAPI_LOG(ERROR_LOG, ("[NR5G_FAPI][UL_TTI.request] No vendor ext for URLLC! "
+ "_vendor_ul_tti_req"));
+ return FAILURE;
+ }
+ *symbol_no = p_ia_ul_config_req->sSFN_Slot.nSym = p_fapi_vendor_msg->p7_req_vendor.ul_tti_req.sym;
+ }
+ return SUCCESS;
+}
\ No newline at end of file