diff --git a/Android.bp b/Android.bp
index 95745ce..45ad9cb 100644
--- a/Android.bp
+++ b/Android.bp
@@ -17,7 +17,6 @@
     name: "chip",
     values: [
         "SR1XX",
-        "SR200",
     ],
 }
 
@@ -37,15 +36,6 @@
     name: "uwb_defaults",
     soong_config_variables: {
         chip: {
-            SR200: {
-                cflags: ["-DSR200=TRUE"],
-                srcs: [
-                    "halimpl/hal/sr200/*.cc",
-                ],
-                local_include_dirs: [
-                    "halimpl/hal/sr200",
-                ],
-            },
             conditions_default: {
                 cflags: ["-DSR1XX=TRUE"],
                 srcs: [
diff --git a/halimpl/hal/sr200/NxpUwbChipSr200.cc b/halimpl/hal/sr200/NxpUwbChipSr200.cc
deleted file mode 100644
index c1d3d79..0000000
--- a/halimpl/hal/sr200/NxpUwbChipSr200.cc
+++ /dev/null
@@ -1,166 +0,0 @@
-#include "NxpUwbChip.h"
-#include "phNxpConfig.h"
-#include "phNxpUciHal.h"
-#include "phNxpUciHal_ext.h"
-#include "phUwbStatus.h"
-#include "phUwbTypes.h"
-#include "phNxpUwbCalib.h"
-#include "uci_defs.h"
-
-#define UCI_MSG_UWB_ESE_BINDING_LEN                   11
-#define UCI_MSG_UWB_ESE_BINDING_OFFSET_COUNT          5
-#define UCI_MSG_UWB_ESE_BINDING_OFFSET_BINDING_STATE  6
-
-extern phNxpUciHal_Control_t nxpucihal_ctrl;
-extern int hdll_fw_download();
-
-class NxpUwbChipSr200 final : public NxpUwbChip {
-public:
-  NxpUwbChipSr200();
-  virtual ~NxpUwbChipSr200();
-
-  tHAL_UWB_STATUS chip_init();
-  tHAL_UWB_STATUS core_init();
-  device_type_t get_device_type(const uint8_t *param, size_t param_len);
-  tHAL_UWB_STATUS read_otp(extcal_param_id_t id, uint8_t *data, size_t data_len, size_t *retlen);
-  tHAL_UWB_STATUS apply_calibration(extcal_param_id_t id, const uint8_t ch, const uint8_t *data, size_t data_len);
-private:
-  bool on_binding_status_ntf(size_t packet_len, const uint8_t* packet);
-
-  tHAL_UWB_STATUS check_binding_done();
-  int16_t extra_group_delay(void);
-
-  UciHalRxHandler bindingStatusNtfHandler_;
-  UciHalSemaphore bindingStatusNtfWait_;
-  uint8_t bindingStatus_;
-};
-
-NxpUwbChipSr200::NxpUwbChipSr200() :
-  bindingStatus_(UWB_DEVICE_UNKNOWN)
-{
-}
-
-NxpUwbChipSr200::~NxpUwbChipSr200()
-{
-}
-
-bool NxpUwbChipSr200::on_binding_status_ntf(size_t packet_len, const uint8_t* packet)
-{
-  if (packet_len >= UCI_RESPONSE_STATUS_OFFSET) {
-    bindingStatus_ = packet[UCI_RESPONSE_STATUS_OFFSET];
-    NXPLOG_UCIHAL_D("BINDING_STATUS_NTF: 0x%x", bindingStatus_);
-    bindingStatusNtfWait_.post(UWBSTATUS_SUCCESS);
-  }
-  return true;
-}
-
-tHAL_UWB_STATUS NxpUwbChipSr200::check_binding_done()
-{
-  // Wait for Binding status notification
-  if (bindingStatusNtfWait_.getStatus() != UWBSTATUS_SUCCESS) {
-    bindingStatusNtfWait_.wait();
-  }
-  if (bindingStatusNtfWait_.getStatus() != UWBSTATUS_SUCCESS) {
-    NXPLOG_UCIHAL_E("Binding status notification timeout");
-
-    // Stop HAL init when it didn't receive the binding notification
-    if (nxpucihal_ctrl.fw_boot_mode == USER_FW_BOOT_MODE)
-      return UWBSTATUS_FAILED;
-    else
-      return UWBSTATUS_SUCCESS;
-  }
-
-  switch (bindingStatus_) {
-  case UWB_DEVICE_NOT_BOUND:
-    NXPLOG_UCIHAL_E("Binding status: Unbound.");
-    break;
-  case UWB_DEVICE_BOUND_UNLOCKED:
-    NXPLOG_UCIHAL_E("Binding status: bound & unlocked.");
-    break;
-  case UWB_DEVICE_BOUND_LOCKED:
-    NXPLOG_UCIHAL_D("Binding status: bound & locked.");
-    break;
-  case UWB_DEVICE_UNKNOWN:
-    NXPLOG_UCIHAL_D("Binding status: Unknown.");
-    break;
-  default:
-    NXPLOG_UCIHAL_E("Unknown binding status: 0x%x", bindingStatus_);
-    return UWBSTATUS_FAILED;
-  }
-
-  return UWBSTATUS_SUCCESS;
-}
-
-tHAL_UWB_STATUS NxpUwbChipSr200::chip_init()
-{
-  tHAL_UWB_STATUS status;
-
-  // system in FW download mode
-  // This will be cleared on first Device Status NTF
-  nxpucihal_ctrl.fw_dwnld_mode = true;
-
-  NXPLOG_UCIHAL_D("Start SR200 FW download");
-
-  for (int i = 0; i < 5; i++) {
-    phTmlUwb_Chip_Reset();
-
-    status = hdll_fw_download();
-
-    if (status == UWBSTATUS_SUCCESS) {
-      NXPLOG_UCIHAL_D("Complete SR200 FW download");
-      break;
-    } else if(status == UWBSTATUS_FILE_NOT_FOUND) {
-      NXPLOG_UCIHAL_E("FW file Not found.");
-      break;
-    } else {
-      NXPLOG_UCIHAL_E("FW download failed, status= 0x%x, retry.", status);
-    }
-  }
-
-  // register binding status ntf handler
-  bindingStatusNtfHandler_ = UciHalRxHandler(
-      UCI_MT_NTF, UCI_GID_PROPRIETARY, UCI_MSG_BINDING_STATUS_NTF,
-      std::bind(&NxpUwbChipSr200::on_binding_status_ntf, this, std::placeholders::_1, std::placeholders::_2));
-
-  return status;
-}
-
-tHAL_UWB_STATUS NxpUwbChipSr200::core_init()
-{
-  return check_binding_done();
-}
-
-device_type_t NxpUwbChipSr200::get_device_type(const uint8_t *param, size_t param_len)
-{
-  // should be 'SR200..'
-  const char marker[] = { 'S', 'R', '2', '0', '0' };
-  if (param_len >= sizeof(marker)) {
-    if (!memcmp(param, marker, sizeof(marker)))
-      return DEVICE_TYPE_SR200;
-  }
-  return DEVICE_TYPE_UNKNOWN;
-}
-
-tHAL_UWB_STATUS
-NxpUwbChipSr200::read_otp(extcal_param_id_t id,
-                          uint8_t *data, size_t data_len, size_t *retlen)
-{
-  return UWBSTATUS_NOT_ALLOWED;
-}
-
-tHAL_UWB_STATUS
-NxpUwbChipSr200::apply_calibration(extcal_param_id_t id, const uint8_t ch,
-                                   const uint8_t *data, size_t data_len)
-{
-  return phNxpUwbCalib_apply_calibration(id, ch, data, data_len);
-}
-
-int16_t NxpUwbChipSr200::extra_group_delay(void) {
-  // Only for SR100. Not for SR2XX
-  return 0;
-}
-
-std::unique_ptr<NxpUwbChip> GetUwbChip()
-{
-  return std::make_unique<NxpUwbChipSr200>();
-}
diff --git a/halimpl/hal/sr200/fwd_hdll.cc b/halimpl/hal/sr200/fwd_hdll.cc
deleted file mode 100644
index 45145ca..0000000
--- a/halimpl/hal/sr200/fwd_hdll.cc
+++ /dev/null
@@ -1,2168 +0,0 @@
-/*
- * Copyright 2021-2023 NXP
- *
- * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
- */
-
-#include <sys/ioctl.h>
-#include <dlfcn.h>
-
-#include "fwd_hdll.h"
-#include "phNxpConfig.h"
-#include "phNxpLog.h"
-#include "phNxpUciHal_fwd_utils.h"
-#include "phNxpUciHal_utils.h"
-#include "phTmlUwb_spi.h"
-
-#define MAX_FRAME_LEN 4200
-static uint8_t is_fw_download_log_enabled = 0x00;
-
-static phFWD_Status_t openFwBinFile(phUwbFWImageContext_t *pfwImageCtx);
-static phFWD_Status_t openFwSoFile(phUwbFWImageContext_t *pfwImageCtx);
-static phFWD_Status_t phNxpUciHal_fw_recovery(phUwbFWImageContext_t *pfwImageCtx);
-
-char default_fw_path[FILEPATH_MAXLEN] = "/vendor/firmware/uwb/";
-const char *default_dev_fw_bin = "libsr200t_fw.bin";
-const char *default_dev_fw_so = "libsr200t_fw.so";
-const char *default_so_file_extn = ".so";
-extern uint32_t timeoutTimerId;
-static bool isHdllReadTmeoutExpired = false;
-static bool bSkipEdlCheck = false;
-static bool glcRotation = false;
-
-phUwbFWImageContext_t fwImageCtx;
-
-/*******************************************************************************
-**
-** Function    :   phGenericSendAndRecv
-**
-** Description :   This function sends the HDLL commands to HeliosX chip over
-                   SPI using phHdll_PutApdu() and gets the response using
-                   phHdll_GetApdu().
-**
-** Parameters  :   payload     - HDLL command to be sent
-                   len         - HDLL command length
-                   readbuff    - HDLL command response buffer
-                   rsp_buf_len - HDLL command rsponse buffer length
-**
-** Returns     :   phFWD_Status_t : 0 - success
-                                     1 - failure
-**
-**
-*******************************************************************************/
-phFWD_Status_t phGenericSendAndRecv(uint8_t *payload, uint16_t len,
-                                    uint8_t *read_buff, uint16_t *rsp_buf_len) {
-  phFWD_Status_t ret = FW_DNLD_FAILURE;
-  if (FW_DNLD_SUCCESS != (ret = phHdll_PutApdu((uint8_t *)&payload[0], len))) {
-    return ret;
-  }
-  if (FW_DNLD_SUCCESS !=
-      (ret = phHdll_GetApdu((uint8_t *)&read_buff[0], HDLL_READ_BUFF_SIZE,
-                            rsp_buf_len))) {
-    return ret;
-  }
-  return ret;
-}
-
-/*******************************************************************************
-**
-** Function    :   print_getInfoRsp
-**
-** Description :   This function prints the HDLL GetInfo command's response
-**
-** Parameters  :   getInfoRsp  - Struct which has the GetInfo response details.
-**
-** Returns     :   None
-**
-**
-*******************************************************************************/
-void print_getInfoRsp(phHDLLGetInfo_t *getInfoRsp) {
-  uint8_t i = 0, offset = 0;
-  char buff[HDLL_READ_BUFF_SIZE] = {0};
-  if (NULL == getInfoRsp) {
-    return;
-  }
-  NXPLOG_FWDNLD_D("=====================GET_INFO =======================\n");
-  NXPLOG_FWDNLD_D("Boot Status: 0x%02X\n", getInfoRsp->boot_status);
-  NXPLOG_FWDNLD_D("Session Control: 0x%02X\n", getInfoRsp->session_control);
-  NXPLOG_FWDNLD_D("Session Type: 0x%02X\n", getInfoRsp->session_type);
-  NXPLOG_FWDNLD_D("ROM Version: 0x%02X\n", getInfoRsp->rom_version);
-  NXPLOG_FWDNLD_D("AT Page Status: 0x%02X\n", getInfoRsp->AT_page_status);
-  NXPLOG_FWDNLD_D("Chip Version: Major.Minor: %02X.%02X\n",
-                  getInfoRsp->chip_major_ver, getInfoRsp->chip_minor_ver);
-  NXPLOG_FWDNLD_D("FW Version: Major.Minor: %02X.%02X\n",
-                  getInfoRsp->fw_major_ver, getInfoRsp->fw_minor_ver);
-
-  for (i = 0; i != 8; i += 2) { // 4bytes
-    sprintf(&buff[i], "%02X", getInfoRsp->chip_variant[offset++]);
-  }
-  buff[i] = '\0';
-  NXPLOG_FWDNLD_D("Chip Variant: 0x%s\n", buff);
-  NXPLOG_FWDNLD_D("Device Lifecycle: 0x%X\n", getInfoRsp->device_life_cycle);
-
-  for (i = 0, offset = 0; i != 32; i += 2) { // 16bytes
-    sprintf(&buff[i], "%02X", getInfoRsp->chip_id[offset++]);
-  }
-  buff[i] = '\0';
-  NXPLOG_FWDNLD_D("Chip ID: 0x%s\n", buff);
-
-  for (i = 0, offset = 0; i != 8; i += 2) { // 4bytes
-    sprintf(&buff[i], "%02X", getInfoRsp->chip_id_crc[offset++]);
-  }
-  buff[i] = '\0';
-  NXPLOG_FWDNLD_D("Chip ID CRC:0x%s\n", buff);
-  NXPLOG_FWDNLD_D("=====================================================\n");
-}
-
-/*******************************************************************************
-**
-** Function    :   process_getInfo_rsp
-**
-** Description :   This function processes the HDLL GetInfo command's response
-**
-** Parameters  :   payload  - Struct in which the processed info will be kept
-**
-** Returns     :   On failure - NULL
-                   On success - Pointer to the phHDLLGetInfo_t struct
-**
-**
-*******************************************************************************/
-phHDLLGetInfo_t *process_getInfo_rsp(uint8_t *payload) {
-  uint8_t offset = 0;
-  phHDLLGetInfo_t *getInfoRsp = NULL;
-  uint8_t device_lc_mode[4] = {0};
-
-  getInfoRsp = (phHDLLGetInfo_t *)malloc(sizeof(phHDLLGetInfo_t));
-  if (NULL == getInfoRsp) {
-    return NULL;
-  }
-  memset(getInfoRsp, 0, sizeof(phHDLLGetInfo_t));
-  getInfoRsp->boot_status = payload[offset++];
-  getInfoRsp->session_control = payload[offset++];
-  getInfoRsp->session_type = payload[offset++];
-  getInfoRsp->rom_version = (eUWBD_Rom_Version_t)payload[offset++];
-  getInfoRsp->AT_page_status = (eUWBD_AT_Page_status_t)payload[offset++];
-  offset += 2; // padding bytes
-  getInfoRsp->chip_major_ver = payload[offset++];
-  getInfoRsp->chip_minor_ver = payload[offset++];
-  getInfoRsp->fw_major_ver = payload[offset++];
-  getInfoRsp->fw_minor_ver = payload[offset++];
-  memcpy(getInfoRsp->chip_variant, payload + offset, sizeof(uint8_t) * 4);
-  offset += 4;
-  memcpy(device_lc_mode, payload + offset, sizeof(uint8_t) * 4);
-  getInfoRsp->device_life_cycle = (eUWBD_LC_mode_t)(device_lc_mode[0] | (device_lc_mode[1] << 8) | (device_lc_mode[2] << 16) | (device_lc_mode[3] << 24));
-  offset += 4;
-  memcpy(getInfoRsp->chip_id, payload + offset, sizeof(uint8_t) * 16);
-  offset += 16;
-  memcpy(getInfoRsp->chip_id_crc, payload + offset, sizeof(uint8_t) * 4);
-  return getInfoRsp;
-}
-
-/*******************************************************************************
-**
-** Function    :   getFwImageCtx
-**
-** Description :   This function use to get the FW image context
-**
-** Parameters  :   pfwImageCtx -> pointer to fw image context
-**
-** Returns     :   On failure - returns FW_DNLD_FAILURE
-                              - or FW_DNLD_FILE_NOT_FOUND if FW file not present
-                                in the MW.
-                   On success - returns FW_DNLD_SUCCESS.
-**
-**
-*******************************************************************************/
-phFWD_Status_t getFwImageCtx(phUwbFWImageContext_t *pfwImageCtx) {
-  phFWD_Status_t status = FW_DNLD_SUCCESS;
-  char *configured_fw_name = NULL;
-  const uint16_t fw_file_max_len = FILENAME_MAXLEN;
-  const char *pDefaultFwFileName = NULL;
-  char* ret = NULL;
-
-  configured_fw_name = (char *)malloc(fw_file_max_len * sizeof(char));
-  int maxSrcLen = (FILEPATH_MAXLEN - strlen(pfwImageCtx->default_fw_path)) - 1;
-  if (configured_fw_name == NULL) {
-    NXPLOG_FWDNLD_E("malloc of configured_fw_name failed ");
-    return FW_DNLD_FAILURE;
-  }
-
-  /* Default FW download configset to bin file */
-  pDefaultFwFileName = default_dev_fw_bin;
-
-  if (!NxpConfig_GetStr(NAME_NXP_UWB_FW_FILENAME, configured_fw_name,
-                            fw_file_max_len)) {
-    NXPLOG_FWDNLD_D("Invalid Dev Fw  name keeping the default name: %s",
-                    pDefaultFwFileName);
-    strncat(pfwImageCtx->default_fw_path, pDefaultFwFileName, maxSrcLen);
-  } else {
-    NXPLOG_FWDNLD_D("configured_fw_name : %s", configured_fw_name);
-    strncat(pfwImageCtx->default_fw_path, configured_fw_name, maxSrcLen);
-  }
-
-  NXPLOG_FWDNLD_D("fw file path : %s", pfwImageCtx->default_fw_path);
-  // Search for so extension in filename
-  ret = strstr(configured_fw_name, default_so_file_extn);
-  if(ret) {
-    pfwImageCtx->fw_dnld_config = SO_FILE_BASED_FW_DOWNLOAD;
-    /* Get Fw Context from so file */
-    status = openFwSoFile(pfwImageCtx);
-  } else {
-    /* Get Fw Context from bin file */
-    status = openFwBinFile(pfwImageCtx);
-  }
-
-  if (configured_fw_name != NULL) {
-      free(configured_fw_name);
-    }
-  memset(pfwImageCtx->default_fw_path, '\0', sizeof(char) * FILEPATH_MAXLEN);
-  strcpy(pfwImageCtx->default_fw_path, "/vendor/firmware/uwb/");
-  return status;
-}
-
-/*******************************************************************************
-**
-** Function    :   printManifestInfo
-**
-** Description :   This function is use to get UWB Manifest info
-**
-** Parameters  :   pfwImageCtx -> pointer to fw image context
-**
-** Returns     :   On failure - returns FW_DNLD_FAILURE
-                              - or FW_DNLD_FILE_NOT_FOUND if FW file not present
-                                in the MW.
-                   On success - returns FW_DNLD_SUCCESS.
-**
-**
-*******************************************************************************/
-void printManifest_info(UWBManifest_t *fwLibManifest) {
-
-  if(fwLibManifest == NULL) {
-    return;
-  }
-  NXPLOG_FWDNLD_D("================= FW Lib Manifest ====================\n");
-  NXPLOG_FWDNLD_D("UWB manifest version = %x\n",fwLibManifest->layout_version);
-  NXPLOG_FWDNLD_D("UWB manifest creation year = %d\n",fwLibManifest->creation_date_yy);
-  NXPLOG_FWDNLD_D("UWB manifest creation month = %d\n",fwLibManifest->creation_date_month);
-  NXPLOG_FWDNLD_D("UWB manifest creation day = %d\n",fwLibManifest->creation_date_day);
-  NXPLOG_FWDNLD_D("UWB manifest creation hour = %d\n",fwLibManifest->creation_date_hour);
-  NXPLOG_FWDNLD_D("UWB manifest creation minutes = %d\n",fwLibManifest->creation_date_minutes);
-  NXPLOG_FWDNLD_D("UWB manifest creation seconds = %d\n",fwLibManifest->creation_date_seconds);
-  NXPLOG_FWDNLD_D("UWB manifest count  = %d\n",fwLibManifest->countMWCESFW);
-
-  return;
-
-}
-
-/*******************************************************************************
-**
-** Function    :   openFwSoFile
-**
-** Description :   This function loads the FW shared library context
-                   if the FW file exists otherwise returns failure.
-**
-** Parameters  :   pfwImageCtx -> pointer to fw image context
-**
-** Returns     :   On failure - returns FW_DNLD_FAILURE
-                              - or FW_DNLD_FILE_NOT_FOUND if FW file not present
-                                in the MW.
-                   On success - returns FW_DNLD_SUCCESS.
-**
-**
-*******************************************************************************/
-static phFWD_Status_t openFwSoFile(phUwbFWImageContext_t *pfwImageCtx) {
-  void *flibptr = NULL;
-  UWBManifest_t *currentFwLib = NULL;
-  pfwImageCtx->gFwLib = NULL;
-  phFWD_Status_t status = FW_DNLD_SUCCESS;
-
-  NXPLOG_FWDNLD_D("%s:%d enter", __func__,__LINE__);
-
-  pfwImageCtx->gFwLib = dlopen(pfwImageCtx->default_fw_path, RTLD_LAZY);
-  if (pfwImageCtx->gFwLib == NULL) {
-    // Apparently, the library could not be opened
-    NXPLOG_FWDNLD_E("%s: Error! opening FW file %s\n", __func__,
-                    pfwImageCtx->default_fw_path);
-    status = FW_DNLD_FILE_NOT_FOUND;
-    goto cleanup;
-  }
-  flibptr = dlsym(pfwImageCtx->gFwLib, "gUWBManifest");
-  if (!flibptr) {
-    NXPLOG_FWDNLD_E("%s: Could not get function pointer\n", __func__);
-    status = FW_DNLD_FAILURE;
-    goto cleanup;
-  }
-
-  currentFwLib = (UWBManifest_t *)flibptr;
-  if (currentFwLib == NULL) {
-    NXPLOG_FWDNLD_E("%s:%d UwbManifest is null exiting.....", __func__, __LINE__);
-    status = FW_DNLD_FAILURE;
-    goto cleanup;
-  }
-
-  printManifest_info(currentFwLib);
-
-  // read the FW bytes into buffer
-  if (pfwImageCtx->deviceInfo->rom_version == VER_A1V1) {
-    if(currentFwLib->mwCESFW[MWCESFW_A1V1_RECOVERY_FW_OFFSET] == NULL || currentFwLib->mwCESFW[MWCESFW_A1V1_FW_OFFSET] == NULL) {
-        NXPLOG_FWDNLD_E("%s:%d UwbManifest mwCESFW is null exiting.....", __func__, __LINE__);
-        status = FW_DNLD_FAILURE;
-        goto cleanup;
-    }
-    if(pfwImageCtx->deviceInfo->AT_page_status == STATUS_PAGE_ERROR) {
-      pfwImageCtx->fwRecovery = true;
-      pfwImageCtx->fwImgSize = currentFwLib->mwCESFW[MWCESFW_A1V1_RECOVERY_FW_OFFSET]->lenCESFW;
-      pfwImageCtx->fwImage = currentFwLib->mwCESFW[MWCESFW_A1V1_RECOVERY_FW_OFFSET]->pCESFW;
-    } else if((pfwImageCtx->deviceInfo->device_life_cycle == CUSTOMER_MODE) && glcRotation == true) {
-      if(currentFwLib->mwCESFW[MWCESFW_A1V1_LC_FW_OFFSET] == NULL ) {
-        NXPLOG_FWDNLD_E("%s:%d LC FW does not exist.....", __func__, __LINE__);
-        status = FW_DNLD_FAILURE;
-        goto cleanup;
-      } else {
-        pfwImageCtx->fwImgSize = currentFwLib->mwCESFW[MWCESFW_A1V1_LC_FW_OFFSET]->lenCESFW;
-        pfwImageCtx->fwImage = currentFwLib->mwCESFW[MWCESFW_A1V1_LC_FW_OFFSET]->pCESFW;
-      }
-    }else {
-      pfwImageCtx->fwImgSize = currentFwLib->mwCESFW[MWCESFW_A1V1_FW_OFFSET]->lenCESFW;
-      pfwImageCtx->fwImage = currentFwLib->mwCESFW[MWCESFW_A1V1_FW_OFFSET]->pCESFW;
-    }
-  }
-  else if (pfwImageCtx->deviceInfo->rom_version == VER_A1V2) {
-    if(currentFwLib->mwCESFW[MWCESFW_A1V2_RECOVERY_FW_OFFSET] == NULL || currentFwLib->mwCESFW[MWCESFW_A1V2_FW_OFFSET] == NULL) {
-        NXPLOG_FWDNLD_E("%s:%d UwbManifest mwCESFW is null exiting.....", __func__, __LINE__);
-        status = FW_DNLD_FAILURE;
-        goto cleanup;
-    }
-    if(pfwImageCtx->deviceInfo->AT_page_status == STATUS_PAGE_ERROR) {
-      pfwImageCtx->fwRecovery = true;
-      pfwImageCtx->fwImgSize = currentFwLib->mwCESFW[MWCESFW_A1V2_RECOVERY_FW_OFFSET]->lenCESFW;
-      pfwImageCtx->fwImage = currentFwLib->mwCESFW[MWCESFW_A1V2_RECOVERY_FW_OFFSET]->pCESFW;
-    } else if((pfwImageCtx->deviceInfo->device_life_cycle == CUSTOMER_MODE) && glcRotation == true) {
-      if(currentFwLib->mwCESFW[MWCESFW_A1V2_LC_FW_OFFSET] == NULL ) {
-        NXPLOG_FWDNLD_E("%s:%d LC FW does not exist.....", __func__, __LINE__);
-        status = FW_DNLD_FAILURE;
-        goto cleanup;
-      } else {
-        pfwImageCtx->fwImgSize = currentFwLib->mwCESFW[MWCESFW_A1V2_LC_FW_OFFSET]->lenCESFW;
-        pfwImageCtx->fwImage = currentFwLib->mwCESFW[MWCESFW_A1V2_LC_FW_OFFSET]->pCESFW;
-      }
-    } else {
-      pfwImageCtx->fwImgSize = currentFwLib->mwCESFW[MWCESFW_A1V2_FW_OFFSET]->lenCESFW;
-      pfwImageCtx->fwImage = currentFwLib->mwCESFW[MWCESFW_A1V2_FW_OFFSET]->pCESFW;
-    }
-  }
-  if ((!(pfwImageCtx->fwImgSize)) || (NULL == pfwImageCtx->fwImage)) {
-    NXPLOG_FWDNLD_E("%s: Error! File %s is empty\n", __func__, pfwImageCtx->default_fw_path);
-    status = FW_DNLD_FAILURE;
-    goto cleanup;
-  }
-
-  NXPLOG_FWDNLD_E("exiting %s fwImgSize %d" , __func__, pfwImageCtx->fwImgSize);
-
-  return status;
-
-cleanup:
-  if (pfwImageCtx->gFwLib != NULL) {
-        dlclose(pfwImageCtx->gFwLib);
-        pfwImageCtx->gFwLib = NULL;
-  }
-  return status;
-
-}
-
-/*******************************************************************************
-**
-** Function    :   openFwBinFile
-**
-** Description :   This function copies the entire Bin FW file content into a buffer
-                   if the FW file exists otherwise returns failure.
-**
-** Parameters  :   pfwImageCtx -> pointer to fw image context
-**
-** Returns     :   On failure - returns FW_DNLD_FAILURE
-                              - or FW_DNLD_FILE_NOT_FOUND if FW file not present
-                                in the MW.
-                   On success - returns FW_DNLD_SUCCESS.
-**
-**
-*******************************************************************************/
-static phFWD_Status_t openFwBinFile(phUwbFWImageContext_t *pfwImageCtx) {
-  phFWD_Status_t status = FW_DNLD_SUCCESS;
-  long int file_size = 0;
-  size_t ret_size = 0;
-  FILE *fptr = NULL;
-
-  NXPLOG_FWDNLD_D("%s:%d enter", __func__,__LINE__);
-
-  // open FW binary file
-  if ((fptr = fopen(pfwImageCtx->default_fw_path, "rb")) == NULL) {
-    NXPLOG_FWDNLD_E("%s: Error! opening FW file %s\n", __func__,
-                    pfwImageCtx->default_fw_path);
-    status = FW_DNLD_FILE_NOT_FOUND;
-    goto exit;
-  }
-
-  // find the FW binary file size
-  fseek(fptr, 0L, SEEK_END);
-  file_size = ftell(fptr);
-  if (!file_size || (-1L == file_size)) {
-    NXPLOG_FWDNLD_E("%s: Error! File %s is empty\n", __func__, pfwImageCtx->default_fw_path);
-    status = FW_DNLD_FAILURE;
-    goto exit;
-  }
-  else {
-    pfwImageCtx->fwImgSize = file_size;
-  }
-
-  // read the FW bytes into buffer
-  pfwImageCtx->fwImage = (uint8_t *)malloc(sizeof(uint8_t) * pfwImageCtx->fwImgSize);
-  if (NULL == pfwImageCtx->fwImage)
-  {
-    status = FW_DNLD_FAILURE;
-    NXPLOG_FWDNLD_E("%s: Error in allocating memory\n", __func__);
-    goto exit;
-  }
-  rewind(fptr);
-  ret_size = fread(pfwImageCtx->fwImage, sizeof(uint8_t), pfwImageCtx->fwImgSize, fptr);
-  if (ret_size != pfwImageCtx->fwImgSize) {
-    if (feof(fptr))
-    {
-      NXPLOG_FWDNLD_E("%s: Error reading file %s, unexpected end of file\n",
-                      __func__, pfwImageCtx->default_fw_path);
-    }
-    else if (ferror(fptr))
-    {
-      NXPLOG_FWDNLD_E("%s: Error reading file %s\n", __func__, pfwImageCtx->default_fw_path);
-    }
-    status = FW_DNLD_FAILURE;
-    goto exit;
-  }
-
-exit:
-  if (NULL != fptr)
-  {
-    fclose(fptr);
-  }
-
-  return status;
-}
-
-/*******************************************************************************
-**
-** Function    :   check_fw_update_required
-**
-** Description :   This function checks whether FW update is required or not
-                   based on FW version from MW binary and FW version present in
-                   the HeliosX chip.
-**
-** Parameters  :   getInfoRsp  - Struct which has the GetInfo response details.
-**
-** Returns     :   FW_DNLD_FAILURE - If any un expected failure
-                   FW_DNLD_NOT_REQUIRED - FW update not required
-                   FW_DNLD_REQUIRED - FW update required
-                   FW_DNLD_FILE_NOT_FOUND - if the FW bin file is unable to
-                                                open or not present
-**
-**
-*******************************************************************************/
-phFWD_Status_t check_fw_update_required(phHDLLGetInfo_t *getInfoRsp) {
-  uint32_t next_frame_first_byte_index = 0;
-  uint32_t index = 0;
-  uint8_t mw_fw_major_ver = 0;
-  uint8_t mw_fw_minor_ver = 0;
-  uint32_t frame_payload_length = 0;
-  uint32_t frame_length = 0;
-  unsigned long num = 0;
-  phFWD_Status_t status = FW_DNLD_FAILURE;
-
-  fwImageCtx.deviceInfo = getInfoRsp;
-  fwImageCtx.fw_dnld_config = BIN_FILE_BASED_FW_DOWNLOAD;
-  fwImageCtx.fw_flash_config = FLASH_UPPER_VER_UPDATE;
-  fwImageCtx.fwRecovery = false;
-  strcpy(fwImageCtx.default_fw_path, default_fw_path);
-
-  status = getFwImageCtx(&fwImageCtx);
-  if (status != FW_DNLD_SUCCESS) {
-    return status;
-  }
-
-  if (NxpConfig_GetNum(NAME_NXP_UWB_FLASH_CONFIG, &num, sizeof(num))) {
-    fwImageCtx.fw_flash_config = (uint8_t)num;
-    NXPLOG_FWDNLD_D("NAME_NXP_UWB_FLASH_CONFIG: 0x%02x\n", fwImageCtx.fw_flash_config);
-    if (!(fwImageCtx.fw_flash_config == FLASH_UPPER_VER_UPDATE ||
-          fwImageCtx.fw_flash_config == FLASH_DIFFERENT_VER_UPDATE ||
-          fwImageCtx.fw_flash_config == FLASH_FORCE_UPDATE))
-    {
-      fwImageCtx.fw_flash_config = FLASH_UPPER_VER_UPDATE;
-    }
-  }
-  else {
-    NXPLOG_FWDNLD_D("NAME_NXP_UWB_FLASH_CONFIG: failed 0x%02x\n",
-                    fwImageCtx.fw_flash_config);
-  }
-
-  frame_payload_length = (fwImageCtx.fwImage[next_frame_first_byte_index] << 8) +
-                         (fwImageCtx.fwImage[next_frame_first_byte_index + 1]);
-  frame_length = frame_payload_length + HDLL_HEADER_LEN + HDLL_FOOTER_LEN;
-
-  // get the index of first_write_cmd_payload
-  next_frame_first_byte_index = next_frame_first_byte_index + frame_length;
-  index = next_frame_first_byte_index;
-  mw_fw_major_ver = fwImageCtx.fwImage[index + MW_MAJOR_FW_VER_OFFSET];
-  mw_fw_minor_ver = fwImageCtx.fwImage[index + MW_MINOR_FW_VER_OFFSET];
-  NXPLOG_FWDNLD_D("mw_fw_ver: %02X.%02X chip_fw_ver: %02X.%02X\n",
-                  mw_fw_major_ver, mw_fw_minor_ver, getInfoRsp->fw_major_ver,
-                  getInfoRsp->fw_minor_ver);
-
-  if(getInfoRsp->session_control == SESSION_CONTROL_OPEN){
-    NXPLOG_FWDNLD_D("FW Update required as session control is open \n");
-    status = FW_DNLD_REQUIRED;
-  } else {
-    switch (fwImageCtx.fw_flash_config) {
-    case FLASH_UPPER_VER_UPDATE: {
-      if (mw_fw_major_ver > getInfoRsp->fw_major_ver) {
-        NXPLOG_FWDNLD_D("FLASH_UPPER_VER_UPDATE:FW Update required\n");
-        status = FW_DNLD_REQUIRED;
-      } else if (mw_fw_major_ver == getInfoRsp->fw_major_ver) {
-        if (mw_fw_minor_ver > getInfoRsp->fw_minor_ver) {
-          NXPLOG_FWDNLD_D("FLASH_UPPER_VER_UPDATE:FW Update required\n");
-          status = FW_DNLD_REQUIRED;
-        } else {
-          NXPLOG_FWDNLD_E(
-              "FLASH_UPPER_VER_UPDATE:FW lower Minor version is not supported\n");
-          status = FW_DNLD_NOT_REQUIRED;
-        }
-      } else {
-        NXPLOG_FWDNLD_E(
-            "FLASH_UPPER_VER_UPDATE:FW lower Major version is not supported\n");
-        status = FW_DNLD_NOT_REQUIRED;
-      }
-    } break;
-    case FLASH_FORCE_UPDATE: {
-      if (mw_fw_major_ver < getInfoRsp->fw_major_ver) {
-        NXPLOG_FWDNLD_E(
-            "FLASH_FORCE_UPDATE:FW lower Major version is not supported\n");
-        status = FW_DNLD_NOT_REQUIRED;
-      } else {
-        NXPLOG_FWDNLD_D("FLASH_FORCE_UPDATE:FW Update required\n");
-        status = FW_DNLD_REQUIRED;
-      }
-    } break;
-    case FLASH_DIFFERENT_VER_UPDATE: {
-      if (mw_fw_major_ver > getInfoRsp->fw_major_ver) {
-        NXPLOG_FWDNLD_D("FLASH_DIFFERENT_VER_UPDATE:FW Update required\n");
-        status = FW_DNLD_REQUIRED;
-      } else if(mw_fw_major_ver == getInfoRsp->fw_major_ver) {
-        if(mw_fw_minor_ver == getInfoRsp->fw_minor_ver) {
-          NXPLOG_FWDNLD_E(
-            "FLASH_DIFFERENT_VER_UPDATE:Same Minor FW version update is not supported\n");
-            status = FW_DNLD_NOT_REQUIRED;
-        } else {
-          NXPLOG_FWDNLD_E(
-            "FLASH_DIFFERENT_VER_UPDATE:FW Update required\n");
-            status = FW_DNLD_REQUIRED;
-        }
-      } else {
-        NXPLOG_FWDNLD_D("FLASH_DIFFERENT_VER_UPDATE:lower Major FW version update is not supported\n");
-        status = FW_DNLD_NOT_REQUIRED;;
-      }
-    } break;
-    }
-  }
-  return status;
-}
-
-/*******************************************************************************
-**
-** Function    :   handleGetInfoRsp
-**
-** Description :   This function handles the GetInfo response that is received
-                   from the HeliosX chip.
-**
-** Parameters  :   hdll_payload  - HDLL response buffer
-**
-** Returns     :   FW_DNLD_FAILURE - If any un expected failure
-                   FW_DNLD_NOT_REQUIRED - FW update not required
-                   FW_DNLD_REQUIRED - FW update required
-                   FW_DNLD_FILE_NOT_FOUND - if the FW bin file is unable to
-                                                open or not present
-**
-**
-*******************************************************************************/
-phFWD_Status_t handleGetInfoRsp(uint8_t *hdll_payload) {
-  phFWD_Status_t ret = FW_DNLD_FAILURE;
-  phHDLLGetInfo_t *getInfoRsp = NULL;
-
-  getInfoRsp = process_getInfo_rsp(hdll_payload);
-  if (NULL == getInfoRsp) {
-    return ret;
-  }
-  print_getInfoRsp(getInfoRsp);
-  ret = check_fw_update_required(getInfoRsp);
-
-  if (NULL != getInfoRsp) {
-    free(getInfoRsp);
-  }
-  return ret;
-}
-
-/*******************************************************************************
-**
-** Function    :   printHDLLRspStatus
-**
-** Description :   This function prints the HDLL response status string based on
-                   the given status code
-
-** Parameters  :   status  - status code
-**
-** Returns     :   None
-**
-**
-*******************************************************************************/
-
-void printHDLLRspStatus(uint8_t status) {
-  switch (status) {
-  case GENERIC_SUCCESS:
-    NXPLOG_FWDNLD_D("Received status: GENERIC_SUCCESS");
-    break;
-  case ACKNOWLEDGE:
-    NXPLOG_FWDNLD_D("Received status: ACKNOWLEDGE");
-    break;
-  case READY:
-    NXPLOG_FWDNLD_D("Received status: READY");
-    break;
-  case GENERIC_ERROR:
-    NXPLOG_FWDNLD_D("Received status: GENERIC_ERROR");
-    break;
-  case MEMORY_ERROR:
-    NXPLOG_FWDNLD_D("Received status: MEMORY_ERROR");
-    break;
-  case TIMEOUT_ERROR:
-    NXPLOG_FWDNLD_D("Received status: TIMEOUT_ERROR");
-    break;
-  case CRC_ERROR:
-    NXPLOG_FWDNLD_D("Received status: CRC_ERROR");
-    break;
-  case INVALID_ERROR:
-    NXPLOG_FWDNLD_D("Received status: INVALID_ERROR");
-    break;
-  case INVALID_LENGTH_ERROR:
-    NXPLOG_FWDNLD_D("Received status: INVALID_LENGTH_ERROR");
-    break;
-  case INVALID_ADDRESS_ERROR:
-    NXPLOG_FWDNLD_D("Received status: INVALID_ADDRESS_ERROR");
-    break;
-  case ECC_SIGNATURE_ERROR:
-    NXPLOG_FWDNLD_D("Received status: ECC_SIGNATURE_ERROR");
-    break;
-  case SHA384_HASH_ERROR:
-    NXPLOG_FWDNLD_D("Received status: SHA384_HASH_ERROR");
-    break;
-  case LIFECYCLE_VALIDITY_ERROR:
-    NXPLOG_FWDNLD_D("Received status: LIFECYCLE_VALIDITY_ERROR");
-    break;
-  case CHIP_ID_ERROR:
-    NXPLOG_FWDNLD_D("Received status: CHIP_ID_ERROR");
-    break;
-  case CHIP_VERSION_ERROR:
-    NXPLOG_FWDNLD_D("Received status: CHIP_VERSION_ERROR");
-    break;
-  case CERTIFICATE_VERSION_ERROR:
-    NXPLOG_FWDNLD_D("Received status: CERTIFICATE_VERSION_ERROR");
-    break;
-  case FIRMWARE_VERSION_ERROR:
-    NXPLOG_FWDNLD_D("Received status: FIRMWARE_VERSION_ERROR");
-    break;
-  case SRAM_DOWNLOAD_ALLOW_ERROR:
-    NXPLOG_FWDNLD_D("Received status: SRAM_DOWNLOAD_ALLOW_ERROR");
-    break;
-  case KEY_DERIVATION_ERROR:
-    NXPLOG_FWDNLD_D("Received status: KEY_DERIVATION_ERROR");
-    break;
-  case ENCRYPTED_PAYLOAD_DECRYPTION_ERROR:
-    NXPLOG_FWDNLD_D("Received status: ENCRYPTED_PAYLOAD_DECRYPTION_ERROR");
-    break;
-  case INVALID_ENCRYPTED_PAYLOAD_ERROR:
-    NXPLOG_FWDNLD_D("Received status: INVALID_ENCRYPTED_PAYLOAD_ERROR");
-    break;
-  case PROTECTED_CACHE_LOAD_ERROR:
-    NXPLOG_FWDNLD_D("Received status: PROTECTED_CACHE_LOAD_ERROR");
-    break;
-  case PROTECTED_CACHE_DEPLOY_ERROR:
-    NXPLOG_FWDNLD_D("Received status: PROTECTED_CACHE_DEPLOY_ERROR");
-    break;
-  case LIFECYCLE_UPDATE_ERROR:
-    NXPLOG_FWDNLD_D("Received status: LIFECYCLE_UPDATE_ERROR");
-    break;
-  case FLASH_BLANK_PAGE_ERROR:
-    NXPLOG_FWDNLD_D("Received status: FLASH_BLANK_PAGE_ERROR");
-    break;
-  case FLASH_CHECK_MARGIN_ERROR:
-    NXPLOG_FWDNLD_D("Received status: FLASH_CHECK_MARGIN_ERROR");
-    break;
-  default:
-    break;
-  };
-}
-
-/*******************************************************************************
-**
-** Function    :   process_hdll_response
-**
-** Description :   This function processes the HDLL response
-
-** Parameters  :   hdllCmdRsp  - HDLL command response structure which has the
-                                 received response info as well as the expected
-                                 response info.
-**
-** Returns     :   FW_DNLD_FAILURE - If any undesired response received
-                   FW_DNLD_SUCCESS - On proper response
-**
-**
-*******************************************************************************/
-
-/*
- * HDLL Response:
- * <-------HDLL Header--->|<------------------HDLL payload--------------------->
- * <-------HDLL (2bytes)->|<-----HCP (2bytes)------->|<-Application--> <--CRC-->
- * <31 30> <29>  <28 -16> |<15 -14><13 - 8> <7 - 0>  |<status><Payload><2 bytes>
- * <--R--><Chunk><length> |< Type ><Group><Operation>|<1 byte>
- *
- */
-phFWD_Status_t process_hdll_response(phHDLLCmdRsp_t *hdllCmdRsp) {
-  uint8_t hdll_msg_type = 0;
-  uint8_t hdll_rsp_status = 0;
-  uint16_t hdll_packet_len = 0;
-  uint8_t hdll_group = 0;
-  uint8_t hdll_operation = 0;
-  uint8_t *hdll_payload = NULL;
-  uint16_t hdll_payload_len = 0;
-  phFWD_Status_t ret = FW_DNLD_FAILURE;
-
-  if (hdllCmdRsp == NULL || hdllCmdRsp->rsp_buf == NULL) {
-    NXPLOG_FWDNLD_E("%s HDLL response buffer is NULL\n", __func__);
-    return ret;
-  }
-  if (hdllCmdRsp->rsp_buf_len < HDLL_MIN_RSP_LEN) {
-    NXPLOG_FWDNLD_E(
-        "%s Error! HDLL response buffer length is %d, expected min %d bytes\n",
-        __func__, hdllCmdRsp->rsp_buf_len, HDLL_MIN_RSP_LEN);
-    return ret;
-  }
-
-  // parse hdll frame
-  hdll_packet_len = (uint16_t)(hdllCmdRsp->rsp_buf[0] << 8) |
-                    (hdllCmdRsp->rsp_buf[HDLL_LEN_OFFSET]);
-  hdll_packet_len &= HDLL_PKT_LEN_BITMASK;
-  NXPLOG_FWDNLD_D("Received RSP packet len      :0x%04X\n", hdll_packet_len);
-  if (hdll_packet_len == 0) {
-    NXPLOG_FWDNLD_D("Error in hdll response.. hdll_packet_len = 0\n");
-    return ret;
-  }
-
-  hdll_msg_type = hdllCmdRsp->rsp_buf[HDLL_TYPE_OFFSET] >> HCP_GROUP_LEN;
-  hdll_group =
-      (hdllCmdRsp->rsp_buf[HDLL_GROUP_OFFSET] & HDLL_RSP_GROUP_BIT_MASK);
-  hdll_operation = hdllCmdRsp->rsp_buf[HDLL_OPERATION_OFFSET];
-  hdll_rsp_status = hdllCmdRsp->rsp_buf[HDLL_RSP_STATUS_OFFSET];
-
-  NXPLOG_FWDNLD_D("Received RSP msg type        :0x%02X\n", hdll_msg_type);
-  NXPLOG_FWDNLD_D("Received RSP group operation :0x%02X%02X\n", hdll_group,
-                  hdll_operation);
-  NXPLOG_FWDNLD_D("Received RSP status code     :0x%02X\n", hdll_rsp_status);
-  printHDLLRspStatus(hdll_rsp_status);
-
-  hdll_payload_len = hdllCmdRsp->rsp_buf_len - (HDLL_RSP_PAYLOAD_OFFSET + HDLL_CRC_LEN);
-  NXPLOG_FWDNLD_D("hdll payload len = 0x%02x" , hdll_payload_len);
-
-  if (hdll_payload_len > 0) {
-    hdll_payload = (uint8_t *)malloc(
-        sizeof(uint8_t) *
-        (hdll_payload_len));
-    if (NULL == hdll_payload) {
-      return ret;
-    }
-    memcpy(hdll_payload, &hdllCmdRsp->rsp_buf[HDLL_RSP_PAYLOAD_OFFSET],
-           hdll_payload_len);
-  }
-
-  // validate the response
-  if (hdllCmdRsp->status != hdll_rsp_status) {
-    NXPLOG_FWDNLD_D("Error! expected response status code is 0x%02X  but "
-                    "received 0x%02X\n",
-                    hdllCmdRsp->status, hdll_rsp_status);
-    ret = FW_DNLD_FAILURE;
-  } else if (hdllCmdRsp->type != hdll_msg_type) {
-    NXPLOG_FWDNLD_D(
-        "Error! expected HDLL type code is 0x%02X but received 0x%02X\n",
-        hdllCmdRsp->type, hdll_msg_type);
-    ret = FW_DNLD_FAILURE;
-  } else if ((hdllCmdRsp->group != hdll_group) ||
-           (hdllCmdRsp->operation != hdll_operation)) {
-    NXPLOG_FWDNLD_D("Error! expected response operation code is 0x%02X%02X but "
-                    "received 0x%02X%02X \n",
-                    hdllCmdRsp->group, hdllCmdRsp->operation, hdll_group,
-                    hdll_operation);
-    ret = FW_DNLD_FAILURE;
-  } else
-  {
-    ret = FW_DNLD_SUCCESS;
-  }
-
-  if (ret == FW_DNLD_FAILURE){
-    goto exit;
-  }
-
-  // Handle the response according to the operation
-  switch (hdll_group) {
-  case HCP_OPERATION_GROUP_PROTOCOL: {
-    switch (hdll_operation) {
-    case PROTOCOL_GROUP_OP_CODE_HDLL: {
-      NXPLOG_FWDNLD_D("Received PROTOCOL_GROUP_HDLL_OP_CODE\n");
-    } break;
-    case PROTOCOL_GROUP_OP_CODE_HCP: {
-      NXPLOG_FWDNLD_D("Received PROTOCOL_GROUP_HCP_OP_CODE\n");
-    } break;
-    case PROTOCOL_GROUP_OP_CODE_EDL: {
-      NXPLOG_FWDNLD_D("Received PROTOCOL_GROUP_EDL_OP_CODE\n");
-    } break;
-    }
-  } break;
-
-  case HCP_OPERATION_GROUP_GENERIC: {
-    switch (hdll_operation) {
-    case GENERIC_GROUP_OP_CODE_RESET: {
-      NXPLOG_FWDNLD_D("Received OP_GENERIC_RESET\n");
-      // Generic reset cmd will have the rsp only in case of error.
-      // How to handle the situation.
-    } break;
-    case GENERIC_GROUP_OP_CODE_GETINFO: {
-      NXPLOG_FWDNLD_D("Received OP_GENERIC_GET_INFO\n");
-      if (hdll_payload != NULL) {
-        ret = handleGetInfoRsp(hdll_payload);
-      }
-    } break;
-    }
-  } break;
-
-  case HCP_OPERATION_GROUP_EDL: {
-    switch (hdll_operation) {
-    case EDL_DOWNLOAD_CERTIFICATE: {
-      NXPLOG_FWDNLD_D("Received OP_EDL_DOWNLOAD_CERTIFICATE\n");
-    } break;
-    case EDL_DOWNLOAD_FLASH_WRITE_FIRST: {
-      NXPLOG_FWDNLD_D("Received OP_EDL_DOWNLOAD_FLASH_WRITE_FIRST\n");
-    }
-    break;
-    case EDL_DOWNLOAD_FLASH_WRITE: {
-      NXPLOG_FWDNLD_D("Received OP_EDL_DOWNLOAD_FLASH_WRITE\n");
-    } break;
-    case EDL_DOWNLOAD_FLASH_WRITE_LAST: {
-      NXPLOG_FWDNLD_D("Received OP_EDL_DOWNLOAD_FLASH_WRITE_LAST\n");
-    } break;
-    case EDL_DOWNLOAD_SRAM_WRITE_FIRST: {
-      NXPLOG_FWDNLD_D("Received OP_EDL_DOWNLOAD_SRAM_WRITE_FIRST\n");
-    } break;
-    case EDL_DOWNLOAD_SRAM_WRITE: {
-      NXPLOG_FWDNLD_D("Received OP_EDL_DOWNLOAD_SRAM_WRITE\n");
-    } break;
-    case EDL_DOWNLOAD_SRAM_WRITE_LAST: {
-      NXPLOG_FWDNLD_D("Received OP_EDL_DOWNLOAD_SRAM_WRITE_LAST\n");
-    } break;
-    case EDL_LIFECYCLE_CERTIFICATE: {
-      NXPLOG_FWDNLD_D("Received OP_EDL_LIFECYCLE_CERTIFICATE\n");
-    } break;
-    case EDL_LIFECYCLE_WRITE_FIRST: {
-      NXPLOG_FWDNLD_D("Received OP_EDL_LIFECYCLE_WRITE_FIRST\n");
-    } break;
-    case EDL_LIFECYCLE_WRITE_LAST: {
-      NXPLOG_FWDNLD_D("Received OP_EDL_LIFECYCLE_WRITE_LAST\n");
-    } break;
-    case EDL_PATCH_SRAM_WRITE: {
-      NXPLOG_FWDNLD_D("Received OP_EDL_PATCH_SRAM_WRITE\n");
-    } break;
-    case EDL_PATCH_SRAM_WRITE_LAST: {
-      NXPLOG_FWDNLD_D("Received OP_EDL_PATCH_SRAM_WRITE_LAST\n");
-    } break;
-    case EDL_PATCH_FLASH_WRITE: {
-      NXPLOG_FWDNLD_D("Received OP_EDL_PATCH_FLASH_WRITE\n");
-    } break;
-    }
-  } break;
-  default:
-    break;
-  }
-
-exit:
-  if (hdll_payload != NULL) {
-    free(hdll_payload);
-  }
-  return ret;
-}
-
-/*******************************************************************************
-**
-** Function    :   sendEdlDownloadCertificateCmd
-**
-** Description :   This function frames the EdlDownloadCertificateCmd which
-                   needs to be sent as part of FW download sequence.
-**
-** Parameters  :   payload  - HDLL command buffer
-                   len - command buffer length
-                   rsp_buf - response buffer that will be received from the
-                   HeliosX chip.
-**
-** Returns     :   FW_DNLD_FAILURE - If any undesired response received
-                   FW_DNLD_SUCCESS - On proper response
-**
-**
-*******************************************************************************/
-phFWD_Status_t sendEdlDownloadCertificateCmd(uint8_t *payload, uint16_t len,
-                                             uint8_t *rsp_buf) {
-
-  uint16_t rsp_buf_len = 0x0;
-  phFWD_Status_t ret = FW_DNLD_SUCCESS;
-  phHDLLCmdRsp_t *hdllCmdRsp = NULL;
-
-  ret = phGenericSendAndRecv(payload, len, rsp_buf, &rsp_buf_len);
-  if (!rsp_buf_len || ret == FW_DNLD_FAILURE) {
-    NXPLOG_FWDNLD_D("Error in sending/receiving OP_EDL_DOWNLOAD_CERTIFICATE "
-                    "cmd/response\n");
-    return ret;
-  }
-
-  hdllCmdRsp = (phHDLLCmdRsp_t *)malloc(sizeof(phHDLLCmdRsp_t));
-  if (NULL == hdllCmdRsp) {
-    return ret;
-  }
-
-  hdllCmdRsp->group = HCP_OPERATION_GROUP_EDL;
-  hdllCmdRsp->operation = EDL_DOWNLOAD_CERTIFICATE;
-  hdllCmdRsp->rsp_buf = rsp_buf;
-  hdllCmdRsp->rsp_buf_len = rsp_buf_len;
-  hdllCmdRsp->status = GENERIC_SUCCESS;
-  hdllCmdRsp->type = HCP_TYPE_RESPONSE;
-  ret = process_hdll_response(hdllCmdRsp);
-
-  if (NULL != hdllCmdRsp) {
-    free(hdllCmdRsp);
-  }
-
-  return ret;
-}
-
-/*******************************************************************************
-**
-** Function    :   sendEdlFlashWriteFirstCmd
-**
-** Description :   This function frames the EdlFlashWriteFirstCmd which
-                   needs to be sent as part of FW download sequence.
-**
-** Parameters  :   payload  - HDLL command buffer
-                   len - command buffer length
-                   rsp_buf - response buffer that will be received from the
-                   HeliosX chip.
-**
-** Returns     :   FW_DNLD_FAILURE - If any undesired response received
-                   FW_DNLD_SUCCESS - On proper response
-**
-**
-*******************************************************************************/
-phFWD_Status_t sendEdlFlashWriteFirstCmd(uint8_t *payload, uint16_t len,
-                                         uint8_t *rsp_buf) {
-  uint16_t rsp_buf_len = 0x0;
-  phFWD_Status_t ret = FW_DNLD_SUCCESS;
-  phHDLLCmdRsp_t *hdllCmdRsp = NULL;
-
-  ret = phGenericSendAndRecv(payload, len, rsp_buf, &rsp_buf_len);
-  if (!rsp_buf_len || ret == FW_DNLD_FAILURE) {
-    NXPLOG_FWDNLD_D("Error in sending/receiving "
-                    "OP_EDL_DOWNLOAD_FLASH_WRITE_FIRST cmd/response\n");
-    return ret;
-  }
-
-  hdllCmdRsp = (phHDLLCmdRsp_t *)malloc(sizeof(phHDLLCmdRsp_t));
-  if (NULL == hdllCmdRsp) {
-    return ret;
-  }
-
-  hdllCmdRsp->group = HCP_OPERATION_GROUP_EDL;
-  hdllCmdRsp->operation = EDL_DOWNLOAD_FLASH_WRITE_FIRST;
-  hdllCmdRsp->rsp_buf = rsp_buf;
-  hdllCmdRsp->rsp_buf_len = rsp_buf_len;
-  hdllCmdRsp->status = GENERIC_SUCCESS;
-  hdllCmdRsp->type = HCP_TYPE_RESPONSE;
-  ret = process_hdll_response(hdllCmdRsp);
-
-  if (NULL != hdllCmdRsp) {
-    free(hdllCmdRsp);
-  }
-
-  return ret;
-}
-
-/*******************************************************************************
-**
-** Function    :   sendEdlFlashWriteCmd
-**
-** Description :   This function frames the sendEdlFlashWriteCmd which
-                   will have the actual FW chunk.
-**
-** Parameters  :   payload  - HDLL command buffer
-                   len - command buffer length
-                   rsp_buf - response buffer that will be received from the
-                   HeliosX chip.
-**
-** Returns     :   FW_DNLD_FAILURE - If any undesired response received
-                   FW_DNLD_SUCCESS - On proper response
-**
-**
-*******************************************************************************/
-phFWD_Status_t sendEdlFlashWriteCmd(uint8_t *payload, uint16_t len,
-                                    uint8_t *rsp_buf) {
-  uint16_t rsp_buf_len = 0x0;
-  phFWD_Status_t ret = FW_DNLD_SUCCESS;
-  phHDLLCmdRsp_t *hdllCmdRsp = NULL;
-
-  ret = phGenericSendAndRecv(payload, len, rsp_buf, &rsp_buf_len);
-  if (!rsp_buf_len || ret == FW_DNLD_FAILURE) {
-    NXPLOG_FWDNLD_D("Error in sending/receiving OP_EDL_DOWNLOAD_FLASH_WRITE "
-                    "cmd/response\n");
-    return ret;
-  }
-
-  hdllCmdRsp = (phHDLLCmdRsp_t *)malloc(sizeof(phHDLLCmdRsp_t));
-  if (NULL == hdllCmdRsp) {
-    return ret;
-  }
-
-  hdllCmdRsp->group = HCP_OPERATION_GROUP_EDL;
-  hdllCmdRsp->operation = EDL_DOWNLOAD_FLASH_WRITE;
-  hdllCmdRsp->rsp_buf = rsp_buf;
-  hdllCmdRsp->rsp_buf_len = rsp_buf_len;
-  hdllCmdRsp->status = GENERIC_SUCCESS;
-  hdllCmdRsp->type = HCP_TYPE_RESPONSE;
-  ret = process_hdll_response(hdllCmdRsp);
-
-  if (NULL != hdllCmdRsp) {
-    free(hdllCmdRsp);
-  }
-
-  return ret;
-}
-
-/*******************************************************************************
-**
-** Function    :   sendEdlFlashWriteLastCmd
-**
-** Description :   This function frames the EdlFlashWriteLastCmd which
-                   needs to be sent as part of FW download sequence.
-**
-** Parameters  :   payload  - HDLL command buffer
-                   len - command buffer length
-                   rsp_buf - response buffer that will be received from the
-                   HeliosX chip.
-**
-** Returns     :   FW_DNLD_FAILURE - If any undesired response received
-                   FW_DNLD_SUCCESS - On proper response
-**
-**
-*******************************************************************************/
-phFWD_Status_t sendEdlFlashWriteLastCmd(uint8_t *payload, uint16_t len,
-                                        uint8_t *rsp_buf) {
-  uint16_t rsp_buf_len = 0x0;
-  phFWD_Status_t ret = FW_DNLD_SUCCESS;
-  phHDLLCmdRsp_t *hdllCmdRsp = NULL;
-
-  ret = phGenericSendAndRecv(payload, len, rsp_buf, &rsp_buf_len);
-  if (!rsp_buf_len || ret == FW_DNLD_FAILURE) {
-    NXPLOG_FWDNLD_D("Error in sending/receiving "
-                    "OP_EDL_DOWNLOAD_FLASH_WRITE_LAST cmd/response\n");
-    return ret;
-  }
-
-  hdllCmdRsp = (phHDLLCmdRsp_t *)malloc(sizeof(phHDLLCmdRsp_t));
-  if (NULL == hdllCmdRsp) {
-    return ret;
-  }
-
-  hdllCmdRsp->group = HCP_OPERATION_GROUP_EDL;
-  hdllCmdRsp->operation = EDL_DOWNLOAD_FLASH_WRITE_LAST;
-  hdllCmdRsp->rsp_buf = rsp_buf;
-  hdllCmdRsp->rsp_buf_len = rsp_buf_len;
-  hdllCmdRsp->status = GENERIC_SUCCESS;
-  hdllCmdRsp->type = HCP_TYPE_RESPONSE;
-  ret = process_hdll_response(hdllCmdRsp);
-
-  if (NULL != hdllCmdRsp) {
-    free(hdllCmdRsp);
-  }
-
-  return ret;
-}
-
-/*******************************************************************************
-**
-** Function    :   sendEdlLifecycleCertificateCmd
-**
-** Description :   This function frames the EdlLifecycleCertificateCmd which
-                   needs to be sent as part of Lifecycle update.
-**
-** Parameters  :   payload  - HDLL command buffer
-                   len - command buffer length
-                   rsp_buf - response buffer that will be received from the
-                   HeliosX chip.
-**
-** Returns     :   FW_DNLD_FAILURE - If any undesired response received
-                   FW_DNLD_SUCCESS - On proper response
-**
-**
-*******************************************************************************/
-phFWD_Status_t sendEdlLifecycleCertificateCmd(uint8_t *payload, uint16_t len,
-                                              uint8_t *rsp_buf) {
-  uint16_t rsp_buf_len = 0x0;
-  phFWD_Status_t ret = FW_DNLD_SUCCESS;
-  phHDLLCmdRsp_t *hdllCmdRsp = NULL;
-
-  ret = phGenericSendAndRecv(payload, len, rsp_buf, &rsp_buf_len);
-  if (!rsp_buf_len || ret == FW_DNLD_FAILURE) {
-    NXPLOG_FWDNLD_D("Error in sending/receiving "
-                    "EDL_LIFECYCLE_CERTIFICATE cmd/response\n");
-    return ret;
-  }
-
-  hdllCmdRsp = (phHDLLCmdRsp_t *)malloc(sizeof(phHDLLCmdRsp_t));
-  if (NULL == hdllCmdRsp) {
-    return ret;
-  }
-
-  hdllCmdRsp->group = HCP_OPERATION_GROUP_EDL;
-  hdllCmdRsp->operation = EDL_LIFECYCLE_CERTIFICATE;
-  hdllCmdRsp->rsp_buf = rsp_buf;
-  hdllCmdRsp->rsp_buf_len = rsp_buf_len;
-  hdllCmdRsp->status = GENERIC_SUCCESS;
-  hdllCmdRsp->type = HCP_TYPE_RESPONSE;
-  ret = process_hdll_response(hdllCmdRsp);
-
-  if (NULL != hdllCmdRsp) {
-    free(hdllCmdRsp);
-  }
-
-  return ret;
-}
-
-/*******************************************************************************
-**
-** Function    :   sendEdlLifecycleWriteFirstCmd
-**
-** Description :   This function frames the EdlLifecycleWriteFirstCmd which
-                   needs to be sent as part of Lifecycle update.
-**
-** Parameters  :   payload  - HDLL command buffer
-                   len - command buffer length
-                   rsp_buf - response buffer that will be received from the
-                   HeliosX chip.
-**
-** Returns     :   FW_DNLD_FAILURE - If any undesired response received
-                   FW_DNLD_SUCCESS - On proper response
-**
-**
-*******************************************************************************/
-phFWD_Status_t sendEdlLifecycleWriteFirstCmd(uint8_t *payload, uint16_t len,
-                                             uint8_t *rsp_buf) {
-  uint16_t rsp_buf_len = 0x0;
-  phFWD_Status_t ret = FW_DNLD_SUCCESS;
-  phHDLLCmdRsp_t *hdllCmdRsp = NULL;
-
-  ret = phGenericSendAndRecv(payload, len, rsp_buf, &rsp_buf_len);
-  if (!rsp_buf_len || ret == FW_DNLD_FAILURE) {
-    NXPLOG_FWDNLD_D("Error in sending/receiving "
-                    "EDL_LIFECYCLE_WRITE_FIRST cmd/response\n");
-    return ret;
-  }
-
-  hdllCmdRsp = (phHDLLCmdRsp_t *)malloc(sizeof(phHDLLCmdRsp_t));
-  if (NULL == hdllCmdRsp) {
-    return ret;
-  }
-
-  hdllCmdRsp->group = HCP_OPERATION_GROUP_EDL;
-  hdllCmdRsp->operation = EDL_LIFECYCLE_WRITE_FIRST;
-  hdllCmdRsp->rsp_buf = rsp_buf;
-  hdllCmdRsp->rsp_buf_len = rsp_buf_len;
-  hdllCmdRsp->status = GENERIC_SUCCESS;
-  hdllCmdRsp->type = HCP_TYPE_RESPONSE;
-  ret = process_hdll_response(hdllCmdRsp);
-
-  if (NULL != hdllCmdRsp) {
-    free(hdllCmdRsp);
-  }
-
-  return ret;
-}
-
-/*******************************************************************************
-**
-** Function    :   sendEdlLifecycleWriteLastCmd
-**
-** Description :   This function frames the EdlLifecycleWriteLastCmd which
-                   needs to be sent as part of Lifecycle update.
-**
-** Parameters  :   payload  - HDLL command buffer
-                   len - command buffer length
-                   rsp_buf - response buffer that will be received from the
-                   HeliosX chip.
-**
-** Returns     :   FW_DNLD_FAILURE - If any undesired response received
-                   FW_DNLD_SUCCESS - On proper response
-**
-**
-*******************************************************************************/
-phFWD_Status_t sendEdlLifecycleWriteLastCmd(uint8_t *payload, uint16_t len,
-                                            uint8_t *rsp_buf) {
-  uint16_t rsp_buf_len = 0x0;
-  phFWD_Status_t ret = FW_DNLD_SUCCESS;
-  phHDLLCmdRsp_t *hdllCmdRsp = NULL;
-
-  ret = phGenericSendAndRecv(payload, len, rsp_buf, &rsp_buf_len);
-  if (!rsp_buf_len || ret == FW_DNLD_FAILURE) {
-    NXPLOG_FWDNLD_D("Error in sending/receiving "
-                    "EDL_LIFECYCLE_WRITE_LAST cmd/response\n");
-    return ret;
-  }
-
-  hdllCmdRsp = (phHDLLCmdRsp_t *)malloc(sizeof(phHDLLCmdRsp_t));
-  if (NULL == hdllCmdRsp) {
-    return ret;
-  }
-
-  hdllCmdRsp->group = HCP_OPERATION_GROUP_EDL;
-  hdllCmdRsp->operation = EDL_LIFECYCLE_WRITE_LAST;
-  hdllCmdRsp->rsp_buf = rsp_buf;
-  hdllCmdRsp->rsp_buf_len = rsp_buf_len;
-  hdllCmdRsp->status = GENERIC_SUCCESS;
-  hdllCmdRsp->type = HCP_TYPE_RESPONSE;
-  ret = process_hdll_response(hdllCmdRsp);
-
-  if (NULL != hdllCmdRsp) {
-    free(hdllCmdRsp);
-  }
-
-  return ret;
-}
-
-/*******************************************************************************
-**
-** Function    :   sendEdlPatchFlashWriteCmd
-**
-** Description :   This function frames the sendEdlPatchlFlashWriteCmd which
-                   will send the EDL Patch Flash Write cmd
-**
-** Parameters  :   payload  - HDLL command buffer
-                   len - command buffer length
-                   rsp_buf - response buffer that will be received from the
-                   HeliosX chip.
-**
-** Returns     :   FW_DNLD_FAILURE - If any undesired response received
-                   FW_DNLD_SUCCESS - On proper response
-**
-**
-*******************************************************************************/
-phFWD_Status_t sendEdlPatchFlashWriteCmd(uint8_t *payload, uint16_t len,
-                                    uint8_t *rsp_buf) {
-  uint16_t rsp_buf_len = 0x0;
-  phFWD_Status_t ret = FW_DNLD_SUCCESS;
-  phHDLLCmdRsp_t *hdllCmdRsp = NULL;
-
-  ret = phGenericSendAndRecv(payload, len, rsp_buf, &rsp_buf_len);
-  if (!rsp_buf_len || ret == FW_DNLD_FAILURE) {
-    NXPLOG_FWDNLD_D("Error in sending/receiving OP_EDL_PATCH_FLASH_WRITE "
-                    "cmd/response\n");
-    return ret;
-  }
-
-  hdllCmdRsp = (phHDLLCmdRsp_t *)malloc(sizeof(phHDLLCmdRsp_t));
-  if (NULL == hdllCmdRsp) {
-    return ret;
-  }
-
-  hdllCmdRsp->group = HCP_OPERATION_GROUP_EDL;
-  hdllCmdRsp->operation = EDL_PATCH_FLASH_WRITE;
-  hdllCmdRsp->rsp_buf = rsp_buf;
-  hdllCmdRsp->rsp_buf_len = rsp_buf_len;
-  hdllCmdRsp->status = GENERIC_SUCCESS;
-  hdllCmdRsp->type = HCP_TYPE_RESPONSE;
-  ret = process_hdll_response(hdllCmdRsp);
-
-  if (NULL != hdllCmdRsp) {
-    free(hdllCmdRsp);
-  }
-
-  return ret;
-}
-
-/*******************************************************************************
-**
-** Function    :   phHal_Host_CalcCrc16
-**
-** Description :   This function calculates the HDLL command's CRC
-**
-** Parameters  :   p  - HDLL command buffer
-                   dwLength - command buffer length
-**
-** Returns     :   the calculated CRC value
-**
-**
-*******************************************************************************/
-static uint16_t phHal_Host_CalcCrc16(uint8_t *p, uint32_t dwLength) {
-  uint32_t i;
-  uint16_t crc_new;
-  uint16_t crc = 0xffffU;
-
-  for (i = 0; i < dwLength; i++) {
-    crc_new = (uint8_t)(crc >> 8) | (crc << 8);
-    crc_new ^= p[i];
-    crc_new ^= (uint8_t)(crc_new & 0xff) >> 4;
-    crc_new ^= crc_new << 12;
-    crc_new ^= (crc_new & 0xff) << 5;
-    crc = crc_new;
-  }
-  return crc;
-}
-
-/*******************************************************************************
-**
-** Function    :   phBuildHdllCmd
-**
-** Description :   This function frames the final HDLL command (HDLL header +
-                   HDLL payload + CRC) by framing HDLL payload and HDLL frame
-                   using 2 different APIs.
-**
-** Parameters  :   hdllCmd - HDLL command structure which has the information
-                             to build the corresponding HDLL command.
-**
-** Returns     :   NULL - on failure
-                   HDLL command buffer - On success
-**
-**
-*******************************************************************************/
-
-/*
- * HDLL Command:
- * <--------HDLL Header---->|<------------------HDLL payload------------------->
- * <--------HDLL (2bytes)-->|<-----HCP (2bytes)------->|<-Application-><--CRC-->
- * <31 30> <29>    <28 -16> |<15 -14><13 - 8><7 - 0>   |<---Payload---><2 bytes>
- * <--R--> <Chunk> <length> |< Type ><Group><Operation>|
- *
- */
-
-uint8_t *phBuildHdllCmd(phHDLLCmd_t *hdllCmd) {
-  uint8_t type = 0;
-  uint8_t *hdll_frame = NULL;
-  uint16_t hdll_frame_size = 0;
-  uint16_t hdll_crc = 0x0;
-  uint16_t hdll_header = 0x0;
-  NXPLOG_FWDNLD_D("phBuildHdllCmd:\n");
-
-  if (NULL == hdllCmd) {
-    return NULL;
-  }
-  // header len =2 bytes + hdll_payload_len + crc =2 bytes
-  hdll_frame_size = HDLL_HEADER_LEN + HCP_MSG_HEADER_LEN +
-                    hdllCmd->payload_len + HDLL_CRC_LEN;
-  hdll_frame = (uint8_t *)malloc(sizeof(uint8_t) * hdll_frame_size);
-  if (NULL == hdll_frame) {
-    return hdll_frame;
-  }
-
-  // build hdll frame
-  hdll_header |= hdllCmd->payload_len + HCP_MSG_HEADER_LEN;
-  hdll_header &= HDLL_PKT_LEN_BITMASK;
-  hdll_header = hdllCmd->chunk_size ? (HDLL_PKT_CHUNK_BITMASK | hdll_header)
-                                    : hdll_header;
-
-  // hdll_header uint16 to uint8
-  hdll_frame[HDLL_CHUNK_OFFSET] = (hdll_header >> 8);
-  hdll_frame[HDLL_LEN_OFFSET] = (hdll_header & 0xFF);
-
-  type = HCP_TYPE_COMMAND;
-  type <<= HCP_GROUP_LEN;
-  hdll_frame[HDLL_TYPE_OFFSET] = type | hdllCmd->group;
-  hdll_frame[HDLL_OPERATION_OFFSET] = hdllCmd->operation;
-
-  if (hdllCmd->payload_len > 0 && hdllCmd->payload != NULL) {
-    // copy hdll payload into hdll frame
-    memcpy(&hdll_frame[HDLL_PAYLOAD_OFFSET], hdllCmd->payload,
-           hdllCmd->payload_len);
-  }
-
-  hdll_crc = phHal_Host_CalcCrc16(hdll_frame, hdll_frame_size - 2);
-  hdll_frame[hdll_frame_size - 2] = (hdll_crc >> 8);
-  hdll_frame[hdll_frame_size - 1] = (hdll_crc & 0xFF);
-
-  hdllCmd->frame_size = hdll_frame_size;
-  return hdll_frame;
-}
-
-/*******************************************************************************
-**
-** Function    :   sendEdlResetCmd
-**
-** Description :   This function frames the EdlResetCmd and sends to the HeliosX
-                   chip
-**
-** Parameters  :   None
-**
-** Returns     :   FW_DNLD_FAILURE - If any failure occurs while framing or
-                                    sending the command or while receiving the
-                                    response
-                   FW_DNLD_SUCCESS - On success
-**
-**
-*******************************************************************************/
-phFWD_Status_t sendEdlResetCmd() {
-  uint8_t rsp_buf[HDLL_READ_BUFF_SIZE] = {0};
-  uint8_t *hdll_frame = NULL;
-  phFWD_Status_t ret = FW_DNLD_FAILURE;
-  uint16_t rsp_buf_len = 0x0;
-  phHDLLCmd_t *hdllCmd = NULL;
-  phHDLLCmdRsp_t *hdllCmdRsp = NULL;
-
-  hdllCmd = (phHDLLCmd_t *)malloc(sizeof(phHDLLCmd_t));
-  if (NULL == hdllCmd) {
-    goto exit;
-  }
-
-  hdllCmd->group = HCP_OPERATION_GROUP_GENERIC;
-  hdllCmd->operation = GENERIC_GROUP_OP_CODE_RESET;
-  hdllCmd->chunk_size = 0;
-  hdllCmd->frame_size = 0;
-  hdllCmd->payload = NULL;
-  hdllCmd->payload_len = 0;
-
-  hdll_frame = phBuildHdllCmd(hdllCmd);
-  if (NULL == hdll_frame) {
-    goto exit;
-  }
-  NXPLOG_FWDNLD_D("Sending operation: OP_GENERIC_RESET\n");
-  ret = phGenericSendAndRecv(hdll_frame, hdllCmd->frame_size, rsp_buf,
-                             &rsp_buf_len);
-  if (ret == FW_DNLD_FAILURE) {
-    // treat is as success as generic reset will have response only if there
-    // is an error.
-    ret = FW_DNLD_SUCCESS;
-  }
-  if (rsp_buf_len > 0) {
-    hdllCmdRsp = (phHDLLCmdRsp_t *)malloc(sizeof(phHDLLCmdRsp_t));
-    if (NULL == hdllCmdRsp) {
-      ret = FW_DNLD_FAILURE;
-      goto exit;
-    }
-    hdllCmdRsp->group = HCP_OPERATION_GROUP_GENERIC;
-    hdllCmdRsp->operation = GENERIC_GROUP_OP_CODE_RESET;
-    hdllCmdRsp->rsp_buf = rsp_buf;
-    hdllCmdRsp->rsp_buf_len = rsp_buf_len;
-    hdllCmdRsp->status = GENERIC_SUCCESS;
-    hdllCmdRsp->type = HCP_TYPE_RESPONSE;
-    ret = process_hdll_response(hdllCmdRsp);
-  }
-exit:
-  if (hdll_frame != NULL) {
-    free(hdll_frame);
-  }
-  if (NULL != hdllCmd) {
-    free(hdllCmd);
-  }
-  if (NULL != hdllCmdRsp) {
-    free(hdllCmdRsp);
-  }
-  return ret;
-}
-
-/*******************************************************************************
-**
-** Function    :   phGetEdlReadyNtf
-**
-** Description :   This function frames the GetEdlReadyNtf command and sends to
-                   the HeliosX chip
-**
-** Parameters  :   None
-**
-** Returns     :   FW_DNLD_FAILURE - If any failure occurs while framing or
-                                    sending the command or while receiving the
-                                    response
-                   FW_DNLD_SUCCESS - On success
-**
-**
-*******************************************************************************/
-phFWD_Status_t phGetEdlReadyNtf() {
-  uint8_t rsp_buf[HDLL_READ_BUFF_SIZE] = {0};
-  phFWD_Status_t ret = FW_DNLD_FAILURE;
-  uint16_t rsp_buf_len = 0x0;
-  phHDLLCmdRsp_t *hdllCmdRsp = NULL;
-
-  NXPLOG_FWDNLD_D("Wait for EDL_READY notification\n");
-  ret =
-      phHdll_GetApdu((uint8_t *)&rsp_buf[0], HDLL_READ_BUFF_SIZE, &rsp_buf_len);
-
-  if (!rsp_buf_len || ret == FW_DNLD_FAILURE) {
-    NXPLOG_FWDNLD_D("Error in sending/receiving GET_EDL_READY cmd/response\n");
-    return ret;
-  }
-
-  hdllCmdRsp = (phHDLLCmdRsp_t *)malloc(sizeof(phHDLLCmdRsp_t));
-  if (NULL == hdllCmdRsp) {
-    return ret;
-  }
-
-  hdllCmdRsp->group = HCP_OPERATION_GROUP_PROTOCOL;
-  hdllCmdRsp->operation = PROTOCOL_GROUP_OP_CODE_EDL;
-  hdllCmdRsp->rsp_buf = rsp_buf;
-  hdllCmdRsp->rsp_buf_len = rsp_buf_len;
-  hdllCmdRsp->status = READY;
-  hdllCmdRsp->type = HCP_TYPE_NOTIFICATION;
-  ret = process_hdll_response(hdllCmdRsp);
-
-  if (NULL != hdllCmdRsp) {
-    free(hdllCmdRsp);
-  }
-  return ret;
-}
-
-/*******************************************************************************
-**
-** Function    :   phGenericGetInfo
-**
-** Description :   This function frames the GenericGetInfo command and sends to
-                   the HeliosX chip
-**
-** Parameters  :   None
-**
-** Returns     :   FW_DNLD_FAILURE - If any failure occurs while framing or
-                                    sending the command or while receiving the
-                                    response
-                   FW_DNLD_SUCCESS - On success
-**
-**
-*******************************************************************************/
-phFWD_Status_t phGenericGetInfo() {
-  uint8_t rsp_buf[HDLL_READ_BUFF_SIZE] = {0};
-  uint8_t *hdll_frame = NULL;
-  phFWD_Status_t ret = FW_DNLD_FAILURE;
-  uint16_t rsp_buf_len = 0x0;
-  phHDLLCmd_t *hdllCmd = NULL;
-  phHDLLCmdRsp_t *hdllCmdRsp = NULL;
-
-  hdllCmd = (phHDLLCmd_t *)malloc(sizeof(phHDLLCmd_t));
-  if (NULL == hdllCmd) {
-    ret = FW_DNLD_FAILURE;
-    goto exit;
-  }
-  hdllCmd->group = HCP_OPERATION_GROUP_GENERIC;
-  hdllCmd->operation = GENERIC_GROUP_OP_CODE_GETINFO;
-  hdllCmd->chunk_size = 0;
-  hdllCmd->frame_size = 0;
-  hdllCmd->payload = NULL;
-  hdllCmd->payload_len = 0;
-
-  hdll_frame = phBuildHdllCmd(hdllCmd);
-  if (NULL == hdll_frame) {
-    goto exit;
-  }
-  NXPLOG_FWDNLD_D("Sending operation: OP_GENERIC_GET_INFO\n");
-  ret = phGenericSendAndRecv(hdll_frame, hdllCmd->frame_size, rsp_buf,
-                             &rsp_buf_len);
-  if (!rsp_buf_len || ret == FW_DNLD_FAILURE) {
-    NXPLOG_FWDNLD_D("Error in sending/receiving hdll cmd/response\n");
-    return ret;
-  }
-
-  hdllCmdRsp = (phHDLLCmdRsp_t *)malloc(sizeof(phHDLLCmdRsp_t));
-  if (NULL == hdllCmdRsp) {
-    ret = FW_DNLD_FAILURE;
-    goto exit;
-  }
-  hdllCmdRsp->group = HCP_OPERATION_GROUP_GENERIC;
-  hdllCmdRsp->operation = GENERIC_GROUP_OP_CODE_GETINFO;
-  hdllCmdRsp->rsp_buf = rsp_buf;
-  hdllCmdRsp->rsp_buf_len = rsp_buf_len;
-  hdllCmdRsp->status = GENERIC_SUCCESS;
-  hdllCmdRsp->type = HCP_TYPE_RESPONSE;
-  ret = process_hdll_response(hdllCmdRsp);
-exit:
-  if (NULL != hdll_frame) {
-    free(hdll_frame);
-  }
-  if (NULL != hdllCmd) {
-    free(hdllCmd);
-  }
-  if (NULL != hdllCmdRsp) {
-    free(hdllCmdRsp);
-  }
-  return ret;
-}
-
-/*******************************************************************************
-**
-** Function    :   phHdll_GetHdllReadyNtf
-**
-** Description :   This function frames the GetHdllReadyNtf command and sends to
-                   the HeliosX chip
-**
-** Parameters  :   None
-**
-** Returns     :   FW_DNLD_FAILURE - If any failure occurs while framing or
-                                    sending the command or while receiving the
-                                    response
-                   FW_DNLD_SUCCESS - On success
-**
-**
-*******************************************************************************/
-phFWD_Status_t phHdll_GetHdllReadyNtf() {
-  uint8_t rsp_buf[HDLL_READ_BUFF_SIZE] = {0};
-  phFWD_Status_t ret = FW_DNLD_FAILURE;
-  uint16_t rsp_buf_len = 0x0;
-  phHDLLCmdRsp_t *hdllCmdRsp = NULL;
-
-  NXPLOG_FWDNLD_D("Wait for HDL_READY notification\n");
-  ret =
-      phHdll_GetApdu((uint8_t *)&rsp_buf[0], HDLL_READ_BUFF_SIZE, &rsp_buf_len);
-
-  if (!rsp_buf_len || ret == FW_DNLD_FAILURE) {
-    NXPLOG_FWDNLD_D("Error in reading GET_HDL_READY notification\n");
-    return ret;
-  }
-
-  hdllCmdRsp = (phHDLLCmdRsp_t *)malloc(sizeof(phHDLLCmdRsp_t));
-  if (NULL == hdllCmdRsp) {
-    return ret;
-  }
-
-  hdllCmdRsp->group = HCP_OPERATION_GROUP_PROTOCOL;
-  hdllCmdRsp->operation = PROTOCOL_GROUP_OP_CODE_HDLL;
-  hdllCmdRsp->rsp_buf = rsp_buf;
-  hdllCmdRsp->rsp_buf_len = rsp_buf_len;
-  hdllCmdRsp->status = READY;
-  hdllCmdRsp->type = HCP_TYPE_NOTIFICATION;
-  ret = process_hdll_response(hdllCmdRsp);
-
-  if (FW_DNLD_SUCCESS != ret) {
-    // check whether we received EDL ready notification or not
-    // if yes, perform FW download directly.
-    hdllCmdRsp->group = HCP_OPERATION_GROUP_PROTOCOL;
-    hdllCmdRsp->operation = PROTOCOL_GROUP_OP_CODE_EDL;
-    hdllCmdRsp->rsp_buf = rsp_buf;
-    hdllCmdRsp->rsp_buf_len = rsp_buf_len;
-    hdllCmdRsp->status = READY;
-    hdllCmdRsp->type = HCP_TYPE_NOTIFICATION;
-    ret = process_hdll_response(hdllCmdRsp);
-
-    if (FW_DNLD_SUCCESS == ret) {
-      bSkipEdlCheck = true;
-    }
-  }
-
-  if (NULL != hdllCmdRsp) {
-    free(hdllCmdRsp);
-  }
-
-  return ret;
-}
-
-/*******************************************************************************
-**
-** Function    :   phEdl_send_and_recv
-**
-** Description :   This function sends and receives the EDL group commands and
-                   responses based on the given operation code.
-**
-** Parameters  :   hdll_data - HDLL command buffer
-                   hdll_data_len - HDLL command buffer len
-                   group - HCP group code
-                   operation - operation code.
-**
-** Returns     :   FW_DNLD_FAILURE - If any failure occurs while framing or
-                                    sending the command or while receiving the
-                                    response
-                   FW_DNLD_SUCCESS - On success
-**
-**
-*******************************************************************************/
-
-phFWD_Status_t phEdl_send_and_recv(uint8_t *hdll_data, uint32_t hdll_data_len,
-                                   uint8_t group, uint8_t operation) {
-  phFWD_Status_t ret = FW_DNLD_FAILURE;
-  uint8_t rsp_buff[HDLL_READ_BUFF_SIZE] = {0};
-
-  if (group != HCP_OPERATION_GROUP_EDL) {
-    NXPLOG_FWDNLD_D("Error! HCP operation group is not EDL\n");
-    return ret;
-  }
-  switch (operation) {
-  case EDL_DOWNLOAD_CERTIFICATE: {
-    ret = sendEdlDownloadCertificateCmd(hdll_data, hdll_data_len, rsp_buff);
-  } break;
-  case EDL_DOWNLOAD_FLASH_WRITE_FIRST: {
-    ret = sendEdlFlashWriteFirstCmd(hdll_data, hdll_data_len, rsp_buff);
-  } break;
-  case EDL_DOWNLOAD_FLASH_WRITE: {
-    ret = sendEdlFlashWriteCmd(hdll_data, hdll_data_len, rsp_buff);
-  } break;
-  case EDL_DOWNLOAD_FLASH_WRITE_LAST: {
-    ret = sendEdlFlashWriteLastCmd(hdll_data, hdll_data_len, rsp_buff);
-  } break;
-  case EDL_LIFECYCLE_CERTIFICATE: {
-    ret = sendEdlLifecycleCertificateCmd(hdll_data, hdll_data_len, rsp_buff);
-  } break;
-  case EDL_LIFECYCLE_WRITE_FIRST: {
-    ret = sendEdlLifecycleWriteFirstCmd(hdll_data, hdll_data_len, rsp_buff);
-  } break;
-  case EDL_LIFECYCLE_WRITE_LAST: {
-    ret = sendEdlLifecycleWriteLastCmd(hdll_data, hdll_data_len, rsp_buff);
-  } break;
-  case EDL_PATCH_FLASH_WRITE: {
-    ret = sendEdlPatchFlashWriteCmd(hdll_data, hdll_data_len, rsp_buff);
-  } break;
-
-  default:
-    break;
-  }
-  return ret;
-}
-
-/*******************************************************************************
-**
-** Function    :   phLoadFwBinary
-**
-** Description :   This function reads the MW FW binary file and writes to
-                   HeliosX chip.
-**
-** Parameters  :   pfwImageCtx -> pointer to fw image context
-**
-** Returns     :   FW_DNLD_FAILURE - on failure
-                   FW_DNLD_SUCCESS - On success
-**
-**
-*******************************************************************************/
-phFWD_Status_t phLoadFwBinary(phUwbFWImageContext_t *pfwImageCtx) {
-  uint32_t next_frame_first_byte_index = 0;
-  uint8_t current_op_group;
-  uint8_t current_op;
-  uint32_t frame_payload_length = 0;
-  uint32_t frame_length = 0;
-  phFWD_Status_t status = FW_DNLD_FAILURE;
-  uint8_t current_frame[MAX_FRAME_LEN] = {0};
-
-  if (NULL == pfwImageCtx->fwImage) {
-    return status;
-  }
-  NXPLOG_FWDNLD_D("phLoadFwBinary\n");
-  while (1) {
-    // compute next frame payload length
-    // TODO: warning this is not HDLL fragmentation compatible (valid header can
-    // have chunk flag (biy 10 (13)) set) Assuming header length is 2 bytes
-    frame_payload_length = (pfwImageCtx->fwImage[next_frame_first_byte_index] << 8) +
-                           (pfwImageCtx->fwImage[next_frame_first_byte_index + 1]);
-
-    // if max_payload_length is not None and (frame_payload_length >=
-    // max_payload_length): raise Exception('Invalid SFWU content (not an HDLL
-    // header).')
-
-    // copy the header, the payload and the footer (crc) from the file bytes
-    // into a byte array
-    frame_length = frame_payload_length + HDLL_HEADER_LEN + HDLL_FOOTER_LEN;
-    if (frame_length > MAX_FRAME_LEN) {
-      NXPLOG_FWDNLD_E("%s: Error while performing FW download frame_length > "
-                      "MAX_FRAME_LEN\n",
-                      __func__);
-      status = FW_DNLD_FAILURE;
-      break;
-    }
-    memcpy(current_frame, &pfwImageCtx->fwImage[next_frame_first_byte_index],
-           frame_length);
-    current_op_group = current_frame[2];
-    current_op = current_frame[3];
-
-    status = phEdl_send_and_recv(current_frame, frame_length, current_op_group,
-                                 current_op);
-    if (status != FW_DNLD_SUCCESS) {
-      NXPLOG_FWDNLD_E("%s: Error while performing FW download\n", __func__);
-      break;
-    }
-
-    // update byte index
-    next_frame_first_byte_index = next_frame_first_byte_index + frame_length;
-
-    // check end of file
-    if (next_frame_first_byte_index >= pfwImageCtx->fwImgSize) {
-      break;
-    }
-  }
-
-  // clean-up
-  if (pfwImageCtx->fwImage != NULL) {
-    if (pfwImageCtx->fw_dnld_config == BIN_FILE_BASED_FW_DOWNLOAD) {
-      free(pfwImageCtx->fwImage);
-    } else if (pfwImageCtx->fw_dnld_config == SO_FILE_BASED_FW_DOWNLOAD) {
-      if (pfwImageCtx->gFwLib != NULL) {
-        dlclose(pfwImageCtx->gFwLib);
-        pfwImageCtx->gFwLib = NULL;
-      }
-    }
-
-    pfwImageCtx->fwImage = NULL;
-  }
-  return status;
-}
-
-/******************************************************************************
- * Function         phHandle_hdll_read_timeout_cb
- *
- * Description      Timer call back function
- *
- * Returns          None
- *
- ******************************************************************************/
-static void phHandle_hdll_read_timeout_cb(uint32_t timerId, void *pContext) {
-  UNUSED(timerId);
-  UNUSED(pContext);
-  NXPLOG_FWDNLD_E("ERROR: phHandle_hdll_read_timeout_cb - HDLL read timeout\n");
-  ioctl((intptr_t)tPalConfig.pDevHandle, SRXXX_SET_PWR, ABORT_READ_PENDING);
-  isHdllReadTmeoutExpired = true;
-}
-
-/******************************************************************************/
-/*   GLOBAL FUNCTIONS                                                         */
-/******************************************************************************/
-
-/*******************************************************************************
-**
-** Function    :   phHdll_GetApdu
-**
-** Description :   This function reads the HDLL command's response from HeliosX
-                   chip over SPI.
-**
-** Parameters  :   pApdu     - HDLL response buffer
-                   sz        - Max buffer size to be read
-                   rsp_buf_len - HDLL response buffer length
-**
-** Returns     :   phFWD_Status_t : 0 - success
-                                     1 - failure
-**
-**
-*******************************************************************************/
-
-phFWD_Status_t phHdll_GetApdu(uint8_t *pApdu, uint16_t sz,
-                              uint16_t *rsp_buf_len) {
-  // NXPLOG_FWDNLD_D("phHdll_GetApdu Enter\n");
-  int ret_len = 0;
-  int status = 0;
-
-  if (sz == 0 || sz > PHHDLL_MAX_LEN_PAYLOAD_MISO) {
-    NXPLOG_FWDNLD_E("ERROR: phHdll_GetApdu data len is 0 or greater than max "
-                    "palyload length supported\n");
-    return FW_DNLD_FAILURE;
-  }
-
-  /* Start timer */
-  status = phOsalUwb_Timer_Start(timeoutTimerId, HDLL_READ_OP_TIMEOUT,
-                                 &phHandle_hdll_read_timeout_cb, NULL);
-  if (UWBSTATUS_SUCCESS != status) {
-    NXPLOG_FWDNLD_E("%s: Response timer not started!!!", __func__);
-    return FW_DNLD_FAILURE;
-  }
-  ret_len = read((intptr_t)tPalConfig.pDevHandle, (void *)pApdu, (sz));
-
-  if (true == isHdllReadTmeoutExpired) {
-    isHdllReadTmeoutExpired = false;
-    return FW_DNLD_FAILURE;
-  } else {
-    /* Stop Timer */
-    status = phOsalUwb_Timer_Stop(timeoutTimerId);
-    if (UWBSTATUS_SUCCESS != status) {
-      NXPLOG_FWDNLD_E("%s: Response timer stop ERROR!!!", __func__);
-      return FW_DNLD_FAILURE;
-    }
-  }
-
-  if (ret_len <= 0) {
-    NXPLOG_FWDNLD_E("ERROR: Get APDU %u bytes failed!\n", sz);
-    return FW_DNLD_FAILURE;
-  }
-  *rsp_buf_len = ret_len;
-  if (is_fw_download_log_enabled == 0x01) {
-    phNxpUciHal_print_packet(NXP_TML_FW_DNLD_RSP_UWBS_2_AP, pApdu, ret_len);
-  }
-
-  return FW_DNLD_SUCCESS;
-}
-
-/*******************************************************************************
-**
-** Function    :   phHdll_PutApdu
-**
-** Description :   This function sends the HDLL command to HeliosX chip over SPI
-**
-** Parameters  :   pApdu     - HDLL command to be sent
-                   sz        - HDLL command length
-**
-** Returns     :   phFWD_Status_t : 0 - success
-                                     1 - failure
-**
-**
-*******************************************************************************/
-
-phFWD_Status_t phHdll_PutApdu(uint8_t *pApdu, uint16_t sz) {
-  int ret;
-  int numWrote = 0;
-  if (is_fw_download_log_enabled == 0x01) {
-    phNxpUciHal_print_packet(NXP_TML_FW_DNLD_CMD_AP_2_UWBS, pApdu, sz);
-  }
-
-  ret = write((intptr_t)tPalConfig.pDevHandle, pApdu, sz);
-  if (ret > 0) {
-    numWrote += ret;
-  } else if (ret == 0) {
-    NXPLOG_FWDNLD_E("_spi_write() EOF");
-    return FW_DNLD_FAILURE;
-  } else {
-    NXPLOG_FWDNLD_E("_spi_write() errno : %x", ret);
-    return FW_DNLD_FAILURE;
-  }
-  return FW_DNLD_SUCCESS;
-}
-
-/*******************************************************************************
- * Function         hdll_fw_download
- *
- * Description      This function is called by jni when wired mode is
- *                  performed.First SRXXX driver will give the access
- *                  permission whether wired mode is allowed or not
- *                  arg (0):
- * Returns          FW_DNLD_SUCCESS - on success
-                    FW_DNLD_FAILURE - on failure
-                    FW_DNLD_FILE_NOT_FOUND - if the FW binary is not found or
-                                             unable to open
- *
- ******************************************************************************/
-int hdll_fw_download()
-{
-  phFWD_Status_t ret = FW_DNLD_FAILURE;
-  unsigned long num = 0;
-  NXPLOG_FWDNLD_D("hdll_fw_download enter.....\n");
-
-  isHdllReadTmeoutExpired = false;
-  bSkipEdlCheck = false;
-  if (NxpConfig_GetNum(NAME_UWB_FW_DOWNLOAD_LOG, &num, sizeof(num))) {
-    is_fw_download_log_enabled = (uint8_t)num;
-    ALOGD("NAME_UWB_FW_DOWNLOAD_LOG: 0x%02x\n", is_fw_download_log_enabled);
-  } else {
-    ALOGD("NAME_UWB_FW_DOWNLOAD_LOG: failed 0x%02x\n",
-          is_fw_download_log_enabled);
-  }
-  ioctl((intptr_t)tPalConfig.pDevHandle, SRXXX_SET_FWD, PWR_ENABLE);
-
-  ret = phHdll_GetHdllReadyNtf();
-  if (ret != FW_DNLD_SUCCESS) {
-    NXPLOG_FWDNLD_E("%s:%d error in getting the hdll ready notification...\n",
-                    __func__,__LINE__);
-    return ret;
-  }
-  /* Get the Device information */
-  ret = phGenericGetInfo();
-  if (ret == FW_DNLD_FILE_NOT_FOUND) {
-      goto exit;
-  }
-
-  if (ret == FW_DNLD_FAILURE) {
-    NXPLOG_FWDNLD_E("%s: error in getting the getInfo notification...\n",
-                      __func__);
-    return ret;
-  }
-
-  if (!bSkipEdlCheck) {
-    if (ret == FW_DNLD_NOT_REQUIRED)
-    {
-      goto exit;
-    }
-    ret = phGetEdlReadyNtf();
-    if (ret != FW_DNLD_SUCCESS) {
-      NXPLOG_FWDNLD_E("%s: error in getting the EDL ready notification...\n",
-                      __func__);
-      return ret;
-    }
-  }
-
-  if(fwImageCtx.fwRecovery)
-  {
-    /* perform FW recovery */
-    ret = phNxpUciHal_fw_recovery(&fwImageCtx);
-    if (ret == FW_DNLD_FAILURE) {
-      NXPLOG_FWDNLD_E("%s: error downloading recovery FW...\n",
-                      __func__);
-      return ret;
-    }
-    // TODO: Remove this after recovrry FW tested added to avoid endless loop of fw download.
-    fwImageCtx.fwRecovery = false;
-  }
-
-  /*  */
-  ret = phLoadFwBinary(&fwImageCtx);
-  if (ret != FW_DNLD_SUCCESS) {
-    NXPLOG_FWDNLD_E("%s: error in phLoadFwBinary...\n", __func__);
-    return ret;
-  }
-
-exit:
-  // do chip reset
-  phTmlUwb_Chip_Reset();
-  ret = phHdll_GetHdllReadyNtf();
-
-  ioctl((intptr_t)tPalConfig.pDevHandle, SRXXX_SET_FWD, PWR_DISABLE);
-  NXPLOG_FWDNLD_D("hdll_fw_download completed.....\n");
-  return ret;
-}
-
-/*******************************************************************************
- * Function         phNxpUciHal_fw_recovery
- *
- * Description      This function is use to download recovery FW
- * Returns          FW_DNLD_SUCCESS - on success
-                    FW_DNLD_FAILURE - on failure
-                    FW_DNLD_FILE_NOT_FOUND - if the FW binary is not found or
-                                             unable to open
- *
- ******************************************************************************/
-
-static phFWD_Status_t phNxpUciHal_fw_recovery(phUwbFWImageContext_t *pfwImageCtx) {
-  phFWD_Status_t ret = FW_DNLD_FAILURE;
-  NXPLOG_FWDNLD_D("phNxpUciHal_fw_recovery enter.....\n");
-
-  ret = phLoadFwBinary(pfwImageCtx);
-  if (ret != FW_DNLD_SUCCESS) {
-    NXPLOG_FWDNLD_E("%s: error in phLoadFwBinary...\n", __func__);
-    return ret;
-  }
-
-  // do chip reset
-  phTmlUwb_Chip_Reset();
-  ret = phHdll_GetHdllReadyNtf();
-  if (ret != FW_DNLD_SUCCESS) {
-    NXPLOG_FWDNLD_E("%s:%d error in getting the hdll ready notification...\n",
-                    __func__,__LINE__);
-    return ret;
-  }
-  /* Get the Device information */
-  ret = phGenericGetInfo();
-  if (ret == FW_DNLD_FAILURE || ret == FW_DNLD_FILE_NOT_FOUND) {
-      NXPLOG_FWDNLD_E("%s:%d error in getting the getInfo notification...\n",
-                      __func__,__LINE__);
-      return ret;
-  }
-
-  if (!bSkipEdlCheck) {
-    if (ret == FW_DNLD_NOT_REQUIRED) {
-      return ret;
-    }
-
-    ret = phGetEdlReadyNtf();
-    if (ret != FW_DNLD_SUCCESS) {
-      NXPLOG_FWDNLD_E("%s:%d error in getting the EDL ready notification...\n",
-                      __func__,__LINE__);
-      return ret;
-    }
-  }
-
-  return ret;
-}
-
-/*******************************************************************************
- * Function         phNxpUciHal_fw_lcrotation
- *
- * Description      This function is use to download recovery FW
- * Returns          FW_DNLD_SUCCESS - on success
-                    FW_DNLD_FAILURE - on failure
-                    FW_DNLD_FILE_NOT_FOUND - if the FW binary is not found or
-                                             unable to open
- *
- ******************************************************************************/
-
-phFWD_Status_t phNxpUciHal_fw_lcrotation() {
-  phFWD_Status_t ret = FW_DNLD_FAILURE;
-  glcRotation = true;
-  NXPLOG_FWDNLD_D("phNxpUciHal_fw_lcrotation enter.....\n");
-
-  ioctl((intptr_t)tPalConfig.pDevHandle, SRXXX_SET_FWD, PWR_ENABLE);
-
-  ret = phHdll_GetHdllReadyNtf();
-  if (ret != FW_DNLD_SUCCESS) {
-    NXPLOG_FWDNLD_E("%s:%d error in getting the hdll ready notification...\n",
-                    __func__,__LINE__);
-    return ret;
-  }
-    /* Get the Device information */
-  ret = phGenericGetInfo();
-  if (ret == FW_DNLD_FILE_NOT_FOUND) {
-    goto exit;
-  }
-
-  if (ret == FW_DNLD_FAILURE) {
-      NXPLOG_FWDNLD_E("%s:%d error in getting the getInfo notification...\n",
-                      __func__,__LINE__);
-      return ret;
-  }
-
-  if (!bSkipEdlCheck) {
-
-    ret = phGetEdlReadyNtf();
-    if (ret != FW_DNLD_SUCCESS) {
-      NXPLOG_FWDNLD_E("%s:%d error in getting the EDL ready notification...\n",
-                      __func__,__LINE__);
-      return ret;
-    }
-  }
-  ret = phLoadFwBinary(&fwImageCtx);
-  if (ret != FW_DNLD_SUCCESS) {
-    NXPLOG_FWDNLD_E("%s: error in phLoadFwBinary...\n", __func__);
-    glcRotation = false;
-    return ret;
-  }
-  glcRotation = false;
-
-exit:
-  // do chip reset
-  phTmlUwb_Chip_Reset();
-  ret = phHdll_GetHdllReadyNtf();
-
-  ioctl((intptr_t)tPalConfig.pDevHandle, SRXXX_SET_FWD, PWR_DISABLE);
-  NXPLOG_FWDNLD_D("hdll_fw_download completed.....\n");
-  return ret;
-}
-
-/*******************************************************************************
- * Function         setDeviceHandle
- *
- * Description      This function sets the SPI device handle that needs to be
-                    used in this file for SPI communication
- * Parameters       pDevHandle - SPI device handle
- * Returns          None
- *
- ******************************************************************************/
-void setDeviceHandle(void *pDevHandle) {
-  NXPLOG_FWDNLD_D("Set the device handle!\n");
-  if (pDevHandle == NULL) {
-    NXPLOG_FWDNLD_E("device handle is NULL!\n");
-  } else {
-    tPalConfig.pDevHandle = (void *)((intptr_t)pDevHandle);
-  }
-}
diff --git a/halimpl/hal/sr200/fwd_hdll.h b/halimpl/hal/sr200/fwd_hdll.h
deleted file mode 100644
index 7b54a49..0000000
--- a/halimpl/hal/sr200/fwd_hdll.h
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * Copyright 2021-2023 NXP
- *
- * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
- */
-
-#ifndef _PHNXPUCIHAL_FW_H
-#define _PHNXPUCIHAL_FW_H
-#include <stdint.h>
-
-#define PHHDLL_LEN_LRC (1U)
-#define PHHDLL_MAX_MISO_DATA_LEN (256U)
-#define PHHDLL_MAX_LEN_PAYLOAD_MISO (PHHDLL_MAX_MISO_DATA_LEN + PHHDLL_LEN_LRC)
-
-#define FILEPATH_MAXLEN 500
-#define FILENAME_MAXLEN 260
-
-#define HCP_MSG_HEADER_LEN 2
-#define HDLL_HEADER_LEN 2
-#define HDLL_FOOTER_LEN 2
-#define HDLL_CRC_LEN 2
-#define HDLL_PKT_CHUNK_BITMASK 0x2000
-#define HDLL_PKT_LEN_BITMASK 0x1FFF
-#define HCP_GROUP_LEN 6 // bits
-
-#define HDLL_CHUNK_OFFSET 0
-#define HDLL_LEN_OFFSET 1
-#define HDLL_TYPE_OFFSET 2
-#define HDLL_GROUP_OFFSET 2
-#define HDLL_OPERATION_OFFSET 3
-#define HDLL_PAYLOAD_OFFSET 4
-
-#define HDLL_RSP_STATUS_OFFSET 4
-#define HDLL_RSP_PAYLOAD_OFFSET 5
-
-#define HDLL_RSP_GROUP_BIT_MASK 0x3F
-#define HDLL_MIN_RSP_LEN 8
-#define MW_MAJOR_FW_VER_OFFSET 4
-#define MW_MINOR_FW_VER_OFFSET 5
-
-#define HDLL_READ_BUFF_SIZE 64
-#define HDLL_READ_OP_TIMEOUT 2000 /* 2 seconds timeout */
-
-#define BIN_FILE_BASED_FW_DOWNLOAD 0x00
-#define SO_FILE_BASED_FW_DOWNLOAD  0x01
-#define SESSION_CONTROL_OPEN 0x55
-
-/* Struct to frame HDLL command */
-typedef struct phHDLLCmd {
-  uint8_t group;
-  uint8_t operation;
-  uint8_t chunk_size;
-  uint16_t payload_len;
-  uint16_t frame_size;
-  uint8_t *payload;
-} phHDLLCmd_t;
-
-/* Struct to process HDLL response */
-typedef struct phHDLLCmdRsp {
-  uint8_t *rsp_buf;
-  uint8_t rsp_buf_len;
-  uint8_t group;
-  uint8_t operation;
-  uint8_t status;
-  uint8_t type;
-} phHDLLCmdRsp_t;
-
-/* HCP Operation Group */
-typedef enum {
-  HCP_OPERATION_GROUP_PROTOCOL = 0x01,
-  HCP_OPERATION_GROUP_GENERIC,
-  HCP_OPERATION_GROUP_EDL
-} eHCP_OPERATION_GROUP_t;
-
-/* operation codes under protocol group */
-typedef enum {
-  PROTOCOL_GROUP_OP_CODE_HDLL = 0x01,
-  PROTOCOL_GROUP_OP_CODE_HCP,
-  PROTOCOL_GROUP_OP_CODE_EDL
-} ePROTOCOL_GROUP_OP_CODE_t;
-
-/* operation codes under generic group */
-typedef enum {
-  GENERIC_GROUP_OP_CODE_RESET = 0x01,
-  GENERIC_GROUP_OP_CODE_GETINFO
-} eGENERIC_GROUP_OP_CODE_t;
-
-/* operation code under EDL group */
-typedef enum {
-  EDL_DOWNLOAD_CERTIFICATE = 0x01,
-  EDL_DOWNLOAD_FLASH_WRITE_FIRST = 0x02,
-  EDL_DOWNLOAD_FLASH_WRITE = 0x03,
-  EDL_DOWNLOAD_FLASH_WRITE_LAST = 0x04,
-  EDL_DOWNLOAD_SRAM_WRITE_FIRST = 0x05,
-  EDL_DOWNLOAD_SRAM_WRITE = 0x06,
-  EDL_DOWNLOAD_SRAM_WRITE_LAST = 0x07,
-  EDL_LIFECYCLE_CERTIFICATE = 0x11,
-  EDL_LIFECYCLE_WRITE_FIRST = 0x12,
-  EDL_LIFECYCLE_WRITE_LAST = 0x13,
-  EDL_PATCH_SRAM_WRITE = 0x21,
-  EDL_PATCH_SRAM_WRITE_LAST = 0x22,
-  EDL_PATCH_FLASH_WRITE = 0x23
-} eEDL_GROUP_OP_CODE_t;
-
-/* UWB Device ROM Version */
-typedef enum {
-  VER_A1V1 = 0x02,
-  VER_A1V2 = 0x03,
-} eUWBD_Rom_Version_t;
-
-/* UWB AT page status */
-typedef enum {
-  STATUS_PAGE_OK = 0x55,
-  STATUS_RECOVERED_N_1 = 0x5A,
-  STATUS_RECOVERED_N_2 = 0xA5,
-  STATUS_PAGE_ERROR = 0xAA,
-} eUWBD_AT_Page_status_t;
-
-/* UWB Device lifecycle mode */
-typedef enum {
-  UNKNOWN = 0xCCCCCCCC,
-  DEGRADED_MODE = 0x5C5C5C5C,
-  FLASH_TEST_MODE = 0xAAAAAAAA,
-  DEVELOPMENT_MODE = 0xC5C5C5C5,
-  CUSTOMER_MODE = 0xA5A5A5A5,
-  PROTECTED_MODE = 0x55555555,
-  NXP_RMA_MODE = 0x5A5A5A5A,
-} eUWBD_LC_mode_t;
-
-/* Struct to store the getinfo response */
-typedef struct phHDLLGetInfo {
-  uint8_t boot_status;
-  uint8_t session_control;
-  uint8_t session_type;
-  eUWBD_Rom_Version_t rom_version;
-  eUWBD_AT_Page_status_t AT_page_status;
-  uint8_t chip_major_ver;
-  uint8_t chip_minor_ver;
-  uint8_t fw_minor_ver;
-  uint8_t fw_major_ver;
-  uint8_t chip_variant[4];
-  eUWBD_LC_mode_t device_life_cycle;
-  uint8_t chip_id[16];
-  uint8_t chip_id_crc[4];
-} phHDLLGetInfo_t;
-
-/* HCP type */
-typedef enum {
-  HCP_TYPE_COMMAND = 0x00,
-  HCP_TYPE_RESPONSE,
-  HCP_TYPE_NOTIFICATION
-} eHCP_TYPE_t;
-
-/* Application status codes */
-typedef enum {
-  /* Success */
-  GENERIC_SUCCESS = 0x00,
-  ACKNOWLEDGE = 0x01,
-  READY = 0x02,
-
-  /* Generic errors */
-  GENERIC_ERROR = 0x80,
-  MEMORY_ERROR = 0x81,
-  TIMEOUT_ERROR = 0x82,
-  CRC_ERROR = 0x83,
-  INVALID_ERROR = 0x84,
-
-  /* Verification errors */
-  INVALID_LENGTH_ERROR = 0x90,
-  INVALID_ADDRESS_ERROR = 0x91,
-  ECC_SIGNATURE_ERROR = 0x92,
-  SHA384_HASH_ERROR = 0x93,
-  LIFECYCLE_VALIDITY_ERROR = 0x94,
-  CHIP_ID_ERROR = 0x95,
-  CHIP_VERSION_ERROR = 0x96,
-  CERTIFICATE_VERSION_ERROR = 0x97,
-  FIRMWARE_VERSION_ERROR = 0x98,
-  SRAM_DOWNLOAD_ALLOW_ERROR = 0x99,
-
-  /* Encryption errors */
-  KEY_DERIVATION_ERROR = 0xA0,
-  ENCRYPTED_PAYLOAD_DECRYPTION_ERROR = 0xA1,
-  INVALID_ENCRYPTED_PAYLOAD_ERROR = 0xA2,
-
-  /* N-1 & N-2 errors */
-  PROTECTED_CACHE_LOAD_ERROR = 0xB0,
-  PROTECTED_CACHE_DEPLOY_ERROR = 0xB1,
-  LIFECYCLE_UPDATE_ERROR = 0xB2,
-
-  /* Flash errors */
-  FLASH_BLANK_PAGE_ERROR = 0xC0,
-  FLASH_CHECK_MARGIN_ERROR = 0xC1
-} eAPPLICATION_STATUS_CODES_t;
-
-/* FW download status */
-typedef enum phFWD_Status {
-  FW_DNLD_SUCCESS = 0x00,
-  FW_DNLD_FAILURE = 0x01,
-  FW_DNLD_REQUIRED = 0x02,
-  FW_DNLD_NOT_REQUIRED = 0x03,
-  FW_DNLD_FILE_NOT_FOUND = 0x14,
-} phFWD_Status_t;
-
-/* FW download flash config status */
-typedef enum phFWD_flash_Status {
-  FLASH_UPPER_VER_UPDATE = 0x01,
-  FLASH_FORCE_UPDATE = 0x02,
-  FLASH_DIFFERENT_VER_UPDATE = 0x03,
-} phFWD_flash_Status_t;
-
-typedef struct phUwbFWImageContext
-{
-    /* pointer to the FW image to be used */
-    uint8_t *fwImage;
-    /* size of fw image */
-    uint32_t fwImgSize;
-    /* FW FLASH update Options Configurations */
-    uint8_t fw_flash_config;
-    /* FW Download file Options Configurations */
-    uint8_t fw_dnld_config;
-    /* FW recovery */
-    bool fwRecovery;
-    void *gFwLib;
-    /* default fw file path */
-    char default_fw_path[FILEPATH_MAXLEN];
-    /* Device Info */
-    phHDLLGetInfo_t *deviceInfo;
-} phUwbFWImageContext_t;
-
-/* SR200 device config */
-typedef struct phPalSr200_Config {
-  void* pDevHandle;
-} phPalSr200_Config_t;
-
-/* PWR States */
-typedef enum phSetPwrState{
-  PWR_DISABLE = 0,
-  PWR_ENABLE,
-  ABORT_READ_PENDING
-} phSetPwrState_t;
-
-phPalSr200_Config_t tPalConfig;
-
-phFWD_Status_t phHdll_GetApdu(uint8_t *pApdu, uint16_t sz,
-                              uint16_t *rsp_buf_len);
-phFWD_Status_t phHdll_PutApdu(uint8_t *pApdu, uint16_t sz);
-
-#endif /* _PHNXPUCIHAL_FW_H */
diff --git a/halimpl/hal/sr200/phNxpUciHal_LC.cc b/halimpl/hal/sr200/phNxpUciHal_LC.cc
deleted file mode 100644
index 1a3d56f..0000000
--- a/halimpl/hal/sr200/phNxpUciHal_LC.cc
+++ /dev/null
@@ -1,498 +0,0 @@
-/*
- * Copyright 2012-2019, 2022-2023 NXP
- *
- * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
- */
-
-#if 0
-
-#include <log/log.h>
-#include <phNxpLog.h>
-#include <cutils/properties.h>
-#include <phNxpUciHal.h>
-#include <phNxpUciHal_Adaptation.h>
-#include <phNxpUciHal_ext.h>
-#include <phTmlUwb.h>
-#include <phTmlUwb_spi.h>
-#include <sys/stat.h>
-#include <string.h>
-#include <array>
-#include "hal_nxpuwb.h"
-#include "phNxpConfig.h"
-#include <android-base/stringprintf.h>
-
-#if (NXP_UWB_EXTNS == TRUE)
-#include "phNxpUciHalProp.h"
-#endif
-#include <phNxpUciHal_LC.h>
-
-using android::base::StringPrintf;
-
-phNxpUciHal_lcfwdl_Control_t nxpucihal_lcfwdl_ctrl;
-extern phNxpUciHal_Control_t nxpucihal_ctrl;
-extern bool uwb_get_platform_id;
-extern bool uwb_device_initialized;
-static uint8_t Rx_buffer[UCI_MAX_DATA_LEN];
-
-/**************** local methods used in this file only ************************/
-static tHAL_UWB_STATUS phNxpUciHal_performLcRotation();
-static void* phNxpUciHal_lcfwdl_thread(void* arg);
-
-/******************************************************************************
- * Function         phNxpUciHal_lcfwdl_thread
- *
- * Description      This function is a thread handler which handles all TML and
- *                  UCI messages.
- *
- * Returns          void
- *
- ******************************************************************************/
-static void* phNxpUciHal_lcfwdl_thread(void* arg) {
-  phNxpUciHal_lcfwdl_Control_t* p_nxpucihal_lcfwdl_ctrl = (phNxpUciHal_lcfwdl_Control_t*)arg;
-  tHAL_UWB_STATUS status = UWBSTATUS_FAILED;
-
-  NXPLOG_UCIHAL_D("lcfwdl thread started");
-  p_nxpucihal_lcfwdl_ctrl->lcfwdl_thread_running = 1;
-
-  while (p_nxpucihal_lcfwdl_ctrl->lcfwdl_thread_running == 1) {
-
-    if (p_nxpucihal_lcfwdl_ctrl->lcfwdl_thread_running == 0) {
-      break;
-    }
-
-    if(p_nxpucihal_lcfwdl_ctrl->isPlatformIdSet) {
-      status = phNxpUciHal_performLcRotation();
-      if (nxpucihal_ctrl.p_uwb_stack_cback != NULL) {
-        /* Send binding status cached ntf event */
-        if ((nxpucihal_ctrl.p_uwb_stack_data_cback != NULL) && (nxpucihal_lcfwdl_ctrl.rcv_data_len <= UCI_MAX_PAYLOAD_LEN)) {
-          if(status != UWBSTATUS_SUCCESS) {
-            /* lc rotation FW fwdl failed cased */
-            NXPLOG_UCIHAL_E("phNxpUciHal_performLcRotation failed...");
-            nxpucihal_lcfwdl_ctrl.rcv_data[4] = 0x04;
-          }
-          (*nxpucihal_ctrl.p_uwb_stack_data_cback)(nxpucihal_lcfwdl_ctrl.rcv_data_len, nxpucihal_lcfwdl_ctrl.rcv_data);
-        }
-      }
-    } else {
-      if (nxpucihal_ctrl.p_uwb_stack_cback != NULL) {
-        /* Send binding status cached ntf event */
-        if ((nxpucihal_ctrl.p_uwb_stack_data_cback != NULL) && (nxpucihal_lcfwdl_ctrl.rcv_data_len <= UCI_MAX_PAYLOAD_LEN)) {
-            /* lc rotation FW fwdl failed cased */
-            NXPLOG_UCIHAL_E("%s Platform Id is not set...", __func__);
-            nxpucihal_lcfwdl_ctrl.rcv_data[4] = 0x04;
-          (*nxpucihal_ctrl.p_uwb_stack_data_cback)(nxpucihal_lcfwdl_ctrl.rcv_data_len, nxpucihal_lcfwdl_ctrl.rcv_data);
-        }
-      }
-    }
-    p_nxpucihal_lcfwdl_ctrl->isLcRotationOngoing = 0;
-    p_nxpucihal_lcfwdl_ctrl->lcfwdl_thread_running = 0;
-
-    break;
-  }
-
-  NXPLOG_UCIHAL_D("lcfwdl thread stopped");
-  pthread_attr_destroy(&nxpucihal_lcfwdl_ctrl.attr_thread);
-  pthread_exit(NULL);
-  return NULL;
-}
-
-/******************************************************************************
- * Function         phNxpUciHal_parsePlatformId
- *
- * Description      This function parse GetPlatformId response.
- *
- * Returns          void
- *
- ******************************************************************************/
-void phNxpUciHal_parsePlatformId(uint8_t * p_rx_data , uint16_t rx_data_len) {
-  uint8_t index = UCI_MSG_HDR_SIZE; // Excluding the header and Versions
-  uint8_t * pUwbsRsp = NULL;
-  uint16_t uwbsRspLen = 0;
-  uint8_t getCalibStatus = UWBSTATUS_FAILED;
-  uint8_t getCalibState;
-  uint8_t count = 0;
-  NXPLOG_UCIHAL_D("phNxpUciHal_parsePlatformId enter ....");
-
-  pUwbsRsp = (uint8_t*)malloc(sizeof(uint8_t) * rx_data_len);
-  if(pUwbsRsp == NULL) {
-    NXPLOG_UCIHAL_E("pUwbsRsp memory allocation failed");
-    return;
-  }
-  memcpy(&pUwbsRsp[0], &p_rx_data[0], rx_data_len);
-  if (rx_data_len < UCI_MSG_HDR_SIZE){
-    NXPLOG_UCIHAL_E("%s : Invalid rsp length", __func__);
-    free(pUwbsRsp);
-    return;
-  }
-  uwbsRspLen = rx_data_len ;
-  getCalibStatus = pUwbsRsp[index++];
-  NXPLOG_UCIHAL_D("getCalibStatus %d" , getCalibStatus);
-  if(getCalibStatus == UWBSTATUS_SUCCESS) {
-    getCalibState = pUwbsRsp[index++];
-    if (getCalibState == 0x08) {
-      NXPLOG_UCIHAL_D("Platform ID not Set");
-      uwb_get_platform_id = false;
-      free(pUwbsRsp);
-      return;
-    } else {
-      do {
-          nxpucihal_lcfwdl_ctrl.uwbsPlatformId[count++] = pUwbsRsp[index++];
-      } while(index < uwbsRspLen);
-    }
-    nxpucihal_lcfwdl_ctrl.isPlatformIdSet = true;
-    uwb_get_platform_id = false;
-    NXPLOG_UCIHAL_D("Platform ID: %s", nxpucihal_lcfwdl_ctrl.uwbsPlatformId);
-  }
-  free(pUwbsRsp);
-  return;
-}
-
-/******************************************************************************
- * Function         phNxpUciHal_parseUWBSLifecycle
- *
- * Description      This function parse UWBS Lifecycle response.
- *
- * Returns          UWBS Lifecycle.
- *
- ******************************************************************************/
-uint32_t phNxpUciHal_parseUWBSLifecycle(uint8_t * p_rx_data , uint16_t rx_data_len) {
-  uint8_t index = UCI_MSG_HDR_SIZE; // Excluding the header and Versions
-  uint8_t paramId = 0;
-  uint8_t length = 0;
-  uint32_t uwbsLc = 0;
-  uint8_t * pUwbsDeviceInfo = NULL;
-  uint16_t pUwbsDeviceInfoLen = 0;
-  uint8_t getDeviceInfostatus = UWBSTATUS_FAILED;
-  NXPLOG_UCIHAL_D("phNxpUciHal_parseUWBSLifecycle enter ....");
-
-  pUwbsDeviceInfo = (uint8_t*)malloc(sizeof(uint8_t) * rx_data_len);
-  if(pUwbsDeviceInfo == NULL) {
-    NXPLOG_UCIHAL_E("pUwbsDeviceInfo memory allocation failed");
-    return uwbsLc;
-  }
-  memcpy(&pUwbsDeviceInfo[0], &p_rx_data[0], rx_data_len);
-  pUwbsDeviceInfoLen = rx_data_len ;
-  getDeviceInfostatus = pUwbsDeviceInfo[index++];
-  NXPLOG_UCIHAL_D("getDeviceInfostatus %d" , getDeviceInfostatus);
-  if(getDeviceInfostatus == UWBSTATUS_SUCCESS)
-  {
-    index = index + UWB_INDEX_TO_RETRIEVE_PARAMS;
-    uint8_t parameterLength = pUwbsDeviceInfo[index++];
-    if (parameterLength > 0) {
-      do {
-          paramId = pUwbsDeviceInfo[index++];
-          length = pUwbsDeviceInfo[index++];
-          if ((paramId == UWBS_LIFECYCLE) && (length == UWBS_LIFECYCLE_LENGTH)) {
-            uwbsLc = (pUwbsDeviceInfo[index] | (pUwbsDeviceInfo[index+1] << 8) | (pUwbsDeviceInfo[index+2] <<16) | (pUwbsDeviceInfo[index+3] <<24));
-            break;
-          } else {
-            index = index + length;
-          }
-      } while(index < pUwbsDeviceInfoLen);
-    }
-  }
-  NXPLOG_UCIHAL_D("UWBS Lifecycle: 0x%x", uwbsLc);
-  free(pUwbsDeviceInfo);
-  return uwbsLc;
-}
-
-/******************************************************************************
- * Function         phNxpUciHal_sendSetCoreConfigurations
- *
- * Description      This function send Core device Config command.
- *
- * Returns          status.
- *
- ******************************************************************************/
-static uint8_t phNxpUciHal_sendSetCoreConfigurations(){
-  /* Disable Low power mode */
-  const uint8_t setCoreConfigurations[] = {0x20, 0x04, 0x00, 0x04, 0x01, 0x01, 0x01, 0x00};
-  tHAL_UWB_STATUS status = phNxpUciHal_send_ext_cmd(sizeof(setCoreConfigurations), setCoreConfigurations);
-  if(status != UWBSTATUS_SUCCESS) {
-    return status;
-  }
-  return status;
-}
-
-/******************************************************************************
- * Function         phNxpUciHal_sendGetDeviceCapInfo
- *
- * Description      This function send Device Caps Info command.
- *
- * Returns          status.
- *
- ******************************************************************************/
-static uint8_t phNxpUciHal_sendGetDeviceCapInfo(){
-  const uint8_t buffer[] = {0x20, 0x03, 0x00, 0x00};
-  tHAL_UWB_STATUS status = phNxpUciHal_send_ext_cmd(sizeof(buffer), buffer);
-  if(status != UWBSTATUS_SUCCESS) {
-    return status;
-  }
-  return status;
-}
-
-/******************************************************************************
- * Function         phNxpUciHal_setSecureConfig
- *
- * Description      This function set secure calibration parameters from config file.
- *
- * Returns          tHAL_UWB_STATUS.
- *
- ******************************************************************************/
-tHAL_UWB_STATUS phNxpUciHal_setSecureConfig() {
-  NXPLOG_UCIHAL_D(" phNxpUciHal_setSecureConfig Enter..");
-  std::array<uint8_t, NXP_MAX_CONFIG_STRING_LEN> buffer;
-  uint8_t* vendorConfig = NULL;
-  tHAL_UWB_STATUS status;
-  buffer.fill(0);
-  long retlen = 0;
-  // Apply secure calibration
-  for(int i = 1;i <= 10;i++) {
-    std::string str = NAME_NXP_SECURE_CONFIG_BLK;
-    std::string value = std::to_string(i);
-    std::string name = str + value;
-    NXPLOG_UCIHAL_D(" phNxpUciHal_setSecureConfig :: Name of the config block is %s", name.c_str());
-    if (GetNxpConfigByteArrayValue(name.c_str(), (char*)buffer.data(), buffer.size(), &retlen)) {
-      if ((retlen > 0) && (retlen <= UCI_MAX_DATA_LEN)) {
-        vendorConfig = buffer.data();
-        status = phNxpUciHal_send_ext_cmd(retlen,vendorConfig);
-        NXPLOG_UCIHAL_D(" phNxpUciHal_send_ext_cmd :: status value for %s is %d ", name.c_str(),status);
-        if(status != UWBSTATUS_SUCCESS) {
-          NXPLOG_UCIHAL_D(" phNxpUciHal_send_ext_cmd :: setting %s is failed ", name.c_str());
-          //skip returning error and go ahead with remaining blocks
-          continue;
-        }
-      }
-    } else {
-      NXPLOG_UCIHAL_D(" phNxpUciHal_setSecureConfig::%s not available in the config file", name.c_str());
-    }
-  }
-  return UWBSTATUS_SUCCESS;
-}
-
-/******************************************************************************
- * Function         phNxpUciHal_getPlatformId
- *
- * Description      This function use to get platform ID.
- *
- * Returns          tHAL_UWB_STATUS.
- *
- ******************************************************************************/
-tHAL_UWB_STATUS phNxpUciHal_getPlatformId() {
-  NXPLOG_UCIHAL_D(" phNxpUciHal_getPlatformId Enter..");
-  const uint8_t buffer[] = {0x2F, EXT_UCI_MSG_GET_CALIBRATION, 0x00, 0x02, 0x00, UCI_CALIB_PARAM_PLATFORM_ID};
-  uwb_get_platform_id = true;
-  tHAL_UWB_STATUS status = phNxpUciHal_send_ext_cmd(sizeof(buffer), buffer);
-  if(status != UWBSTATUS_SUCCESS) {
-    return status;
-  }
-  return UWBSTATUS_SUCCESS;
-}
-
-/******************************************************************************
- * Function         phNxpUciHal_setPlatformId
- *
- * Description      This function set platform ID given in config file.
- *
- * Returns          tHAL_UWB_STATUS.
- *
- ******************************************************************************/
-tHAL_UWB_STATUS phNxpUciHal_setPlatformId() {
-  NXPLOG_UCIHAL_D(" phNxpUciHal_setPlatformId Enter..");
-  uint8_t *platformId = NULL;
-  uint8_t buffer[UCI_MAX_DATA_LEN] = {0x00};
-  tHAL_UWB_STATUS status;
-
-  platformId = (uint8_t *)malloc(NXP_MAX_CONFIG_STRING_LEN * sizeof(uint8_t));
-  if (platformId == NULL) {
-    NXPLOG_FWDNLD_E("malloc of platformId failed ");
-    return UWBSTATUS_FAILED;
-  }
-
-  if (GetNxpConfigStrValue(NAME_PLATFORM_ID, (char *)platformId, NXP_MAX_CONFIG_STRING_LEN)) {
-    int platformIdLen = strlen((char*)platformId);
-    NXPLOG_UCIHAL_D(" %s Platform ID: %s",__func__, platformId);
-    buffer[0] = 0x2F;
-    buffer[1] = EXT_UCI_MSG_SET_CALIBRATION;
-    buffer[2] = 0x00;
-    buffer[3] = platformIdLen + 3; //payload (channelid+calibparam+length+calibValue)
-    buffer[4] = 0x00; //channel id
-    buffer[5] = UCI_CALIB_PARAM_PLATFORM_ID;
-    buffer[6] = platformIdLen;
-    for(int i = 0 ; i < platformIdLen ; i++)
-    {
-      buffer[7 + i] = platformId[i];
-    }
-    int cmdLen = buffer[3] + UCI_MSG_HDR_SIZE;
-
-    status = phNxpUciHal_send_ext_cmd(cmdLen,buffer);
-    NXPLOG_UCIHAL_D(" phNxpUciHal_send_ext_cmd :: status value for PLATFORM_ID is %d ", status);
-  } else {
-    NXPLOG_UCIHAL_D(" %s :: PLATFORM_ID not available in the config file", __func__);
-    status = UWBSTATUS_FAILED;
-  }
-
-  if (platformId != NULL) {
-      free(platformId);
-  }
-  return status;
-}
-
-tHAL_UWB_STATUS phNxpUciHal_start_lcfwdl_thread() {
-  NXPLOG_UCIHAL_D("phNxpUciHal_start_lcfwdl_thread enter....");
-
-  nxpucihal_lcfwdl_ctrl.rcv_data_len = nxpucihal_ctrl.rx_data_len;
-  memcpy(&nxpucihal_lcfwdl_ctrl.rcv_data[0], nxpucihal_ctrl.p_rx_data, nxpucihal_lcfwdl_ctrl.rcv_data_len);
-
-  CONCURRENCY_LOCK();
-  pthread_attr_init(&nxpucihal_lcfwdl_ctrl.attr_thread);
-  pthread_attr_setdetachstate(&nxpucihal_lcfwdl_ctrl.attr_thread, PTHREAD_CREATE_DETACHED);
-  if (pthread_create(&nxpucihal_lcfwdl_ctrl.lcfwdl_tread, &nxpucihal_lcfwdl_ctrl.attr_thread,
-               phNxpUciHal_lcfwdl_thread, &nxpucihal_lcfwdl_ctrl) != 0) {
-    NXPLOG_UCIHAL_E("pthread_create failed");
-    CONCURRENCY_UNLOCK();
-    return UWBSTATUS_FAILED;
-  }
-  CONCURRENCY_UNLOCK();
-  return UWBSTATUS_SUCCESS;
-}
-
-static tHAL_UWB_STATUS phNxpUciHal_performLcRotation() {
-  tHAL_UWB_STATUS status = UWBSTATUS_FAILED;
-  uint8_t fwd_retry_count = 0;
-
-  phTmlUwb_Spi_Reset();
-  NXPLOG_UCIHAL_D(" Start LC rotation FW download");
-  /* Create the local semaphore */
-  if (phNxpUciHal_init_cb_data(&nxpucihal_ctrl.dev_status_ntf_wait, NULL) !=
-      UWBSTATUS_SUCCESS) {
-    NXPLOG_UCIHAL_E("Create dev_status_ntf_wait failed");
-    return status;
-  }
-
-  uwb_device_initialized = false;
-fwd_retry:
-      nxpucihal_ctrl.fw_dwnld_mode = true; /* system in FW download mode*/
-      nxpucihal_ctrl.uwbc_device_state = UWB_DEVICE_STATE_UNKNOWN;
-      status = phNxpUciHal_fw_lcrotation();
-      if(status == UWBSTATUS_SUCCESS) {
-          nxpucihal_ctrl.isSkipPacket = 1;
-          status = phTmlUwb_Read( Rx_buffer, UCI_MAX_DATA_LEN,
-                    (pphTmlUwb_TransactCompletionCb_t)&phNxpUciHal_read_complete, NULL);
-          if (status != UWBSTATUS_PENDING) {
-            NXPLOG_UCIHAL_E("read status error status = %x", status);
-            goto failure;
-          }
-          phNxpUciHal_sem_timed_wait(&nxpucihal_ctrl.dev_status_ntf_wait);
-          if (nxpucihal_ctrl.dev_status_ntf_wait.status != UWBSTATUS_SUCCESS) {
-            NXPLOG_UCIHAL_E("UWB_DEVICE_READY dev_status_ntf_wait semaphore timed out");
-            goto failure;
-          }
-          NXPLOG_UCIHAL_D("uwbc_device_state: %d",nxpucihal_ctrl.uwbc_device_state);
-          if(nxpucihal_ctrl.uwbc_device_state != UWB_DEVICE_READY) {
-            NXPLOG_UCIHAL_E("UWB_DEVICE_READY not received uwbc_device_state = %x",nxpucihal_ctrl.uwbc_device_state);
-            goto failure;
-          }
-          nxpucihal_ctrl.isSkipPacket = 0;
-          status = phNxpUciHal_set_board_config();
-          if (status != UWBSTATUS_SUCCESS) {
-            NXPLOG_UCIHAL_E("%s: Set Board Config Failed", __func__);
-            goto failure;
-          }
-          phNxpUciHal_sem_timed_wait(&nxpucihal_ctrl.dev_status_ntf_wait);
-          if (nxpucihal_ctrl.dev_status_ntf_wait.status != UWBSTATUS_SUCCESS) {
-            NXPLOG_UCIHAL_E("UWB_DEVICE_READY dev_status_ntf_wait semaphore timed out");
-            goto failure;
-          }
-          if(nxpucihal_ctrl.uwbc_device_state != UWB_DEVICE_READY) {
-            NXPLOG_UCIHAL_E("UWB_DEVICE_READY not received uwbc_device_state = %x",nxpucihal_ctrl.uwbc_device_state);
-            goto failure;
-          }
-          NXPLOG_UCIHAL_D("%s: Send device reset", __func__);
-          status = phNxpUciHal_uwb_reset();
-          if (status != UWBSTATUS_SUCCESS) {
-            NXPLOG_UCIHAL_E("%s: device reset Failed", __func__);
-            goto failure;
-          }
-          phNxpUciHal_sem_timed_wait(&nxpucihal_ctrl.dev_status_ntf_wait);
-          if (nxpucihal_ctrl.dev_status_ntf_wait.status != UWBSTATUS_SUCCESS) {
-            NXPLOG_UCIHAL_E("UWB_DEVICE_READY dev_status_ntf_wait semaphore timed out");
-            goto failure;
-          }
-          if(nxpucihal_ctrl.uwbc_device_state != UWB_DEVICE_READY) {
-            NXPLOG_UCIHAL_E("UWB_DEVICE_READY not received uwbc_device_state = %x",nxpucihal_ctrl.uwbc_device_state);
-            goto failure;
-          }
-
-          status = phNxpUciHal_applyVendorConfig();
-          if (status != UWBSTATUS_SUCCESS) {
-            // If vendor config is failed after LC rotation , as of now skip reporting error
-            NXPLOG_UCIHAL_E("%s: Apply vendor Config Failed", __func__);
-          }
-
-          status = phNxpUciHal_setSecureConfig();
-          if (status != UWBSTATUS_SUCCESS) {
-            // If set secure calib param failed , as of now skip reporting error
-            NXPLOG_UCIHAL_E("%s: Apply secure Config Failed", __func__);
-          }
-
-          status = phNxpUciHal_sendGetCoreDeviceInfo();
-          if (status != UWBSTATUS_SUCCESS) {
-            NXPLOG_UCIHAL_E("%s: phNxpUciHal_sendGetCoreDeviceInfo Failed", __func__);
-            goto failure;
-          }
-
-          status = phNxpUciHal_sendSetCoreConfigurations();
-          if (status != UWBSTATUS_SUCCESS) {
-            NXPLOG_UCIHAL_E("%s: phNxpUciHal_setCoreConfigurations Failed", __func__);
-            goto failure;
-          }
-          status = phNxpUciHal_sendGetDeviceCapInfo();
-          if (status != UWBSTATUS_SUCCESS) {
-            NXPLOG_UCIHAL_E("%s: phNxpUciHal_sendGetDeviceCapInfo Failed", __func__);
-            goto failure;
-          }
-          uwb_device_initialized = true;
-      } else if(status == UWBSTATUS_FILE_NOT_FOUND) {
-        NXPLOG_UCIHAL_E("FW download File Not found: status= %x", status);
-        goto failure;
-      } else {
-        NXPLOG_UCIHAL_E("FW download is failed FW download recovery starts: status= %x", status);
-        fwd_retry_count++;
-          if(fwd_retry_count <= FWD_MAX_RETRY_COUNT) {
-            phTmlUwb_Chip_Reset();
-            usleep(5000);
-            goto fwd_retry;
-          } else {
-            goto failure;
-          }
-      }
-      phNxpUciHal_cleanup_cb_data(&nxpucihal_ctrl.dev_status_ntf_wait);
-      return status;
-    failure:
-        if(nxpucihal_ctrl.uwbc_device_state == UWB_DEVICE_ERROR) {
-          phNxpUciHalProp_dump_fw_crash_log();
-          if (UWBSTATUS_SUCCESS != phNxpUciHal_uwb_reset()) {
-            NXPLOG_UCIHAL_E("%s: device reset Failed", __func__);
-          } else {
-            NXPLOG_UCIHAL_E("%s: device reset success", __func__);
-          }
-          phTmlUwb_Spi_Reset();
-          goto fwd_retry;
-        }
-        phNxpUciHal_cleanup_cb_data(&nxpucihal_ctrl.dev_status_ntf_wait);
-
-        return UWBSTATUS_FAILED;
-}
-
-#endif
\ No newline at end of file
diff --git a/halimpl/hal/sr200/phNxpUciHal_LC.h b/halimpl/hal/sr200/phNxpUciHal_LC.h
deleted file mode 100644
index 077b8a1..0000000
--- a/halimpl/hal/sr200/phNxpUciHal_LC.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2012-2020, 2023 NXP
- *
- * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
- */
-
-#ifndef _PHNXPUCIHAL_LC_H_
-#define _PHNXPUCIHAL_LC_H_
-
-#include <phNxpUciHal.h>
-
-/* Macros for parsing GetDeviceInfo response */
-#define UWB_INDEX_TO_RETRIEVE_PARAMS 0x08
-#define UWBS_LIFECYCLE 0x06
-#define UWBS_LIFECYCLE_LENGTH 0x04
-
-/* LC Rotation data structure */
-typedef struct {
-  pthread_attr_t attr_thread;
-  pthread_t lcfwdl_tread;      /* lcfwdl thread handle */
-  uint8_t lcfwdl_thread_running;
-  /* Rx data */
-  uint8_t rcv_data[100];
-  uint16_t rcv_data_len;
-  /* To check LC rotation process*/
-  uint8_t isLcRotationOngoing;
-  /* UWBs device lifecycle */
-  uint32_t uwbsDeviceLc;
-  /* To check platformId */
-  bool isPlatformIdSet;
-  /* Platform ID */
-  uint8_t uwbsPlatformId[NXP_MAX_CONFIG_STRING_LEN];
-}phNxpUciHal_lcfwdl_Control_t;
-
-#define UWBS_LC_DEVELOPMENT_MODE  0xC5C5C5C5
-#define UWBS_LC_CUSTOMER_MODE     0xA5A5A5A5
-#define UWBS_LC_PROTECTED_MODE    0x55555555
-
-extern phNxpUciHal_lcfwdl_Control_t nxpucihal_lcfwdl_ctrl;
-
-extern int phNxpUciHal_fw_lcrotation();
-tHAL_UWB_STATUS phNxpUciHal_start_lcfwdl_thread();
-uint32_t phNxpUciHal_parseUWBSLifecycle(uint8_t * p_rx_data , uint16_t rx_data_len);
-void phNxpUciHal_parsePlatformId(uint8_t * p_rx_data , uint16_t rx_data_len);
-tHAL_UWB_STATUS phNxpUciHal_getPlatformId();
-tHAL_UWB_STATUS phNxpUciHal_setPlatformId();
-tHAL_UWB_STATUS phNxpUciHal_setSecureConfig();
-
-#endif
diff --git a/halimpl/hal/sr200/phNxpUciHal_fwd_utils.h b/halimpl/hal/sr200/phNxpUciHal_fwd_utils.h
deleted file mode 100644
index 4b07a4e..0000000
--- a/halimpl/hal/sr200/phNxpUciHal_fwd_utils.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2022-2023 NXP
- *
- * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
- */
-
-#include <stdint.h>
-#include <stdio.h>
-
-#define __PACKED__ __attribute__((packed))
-
-#define MWCESFW_COUNT 0x08
-
-#define MWCESFW_A1V1_FW_OFFSET              0x00
-#define MWCESFW_A1V1_RECOVERY_FW_OFFSET     0x01
-#define MWCESFW_A1V2_FW_OFFSET              0x02
-#define MWCESFW_A1V2_RECOVERY_FW_OFFSET     0x03
-#define MWCESFW_A1V1_LC_FW_OFFSET           0x04
-#define MWCESFW_A1V2_LC_FW_OFFSET           0x05
-
-typedef struct __PACKED__ MWCESFW
-{
-  uint32_t layout_version;
-  uint8_t fw_ver_major;
-  uint8_t fw_ver_minor;
-  uint8_t fw_ver_dev;
-  uint8_t fw_ver_is_to;
-  uint8_t fw_ver_git_sha1[32];
-  uint32_t fw_artifact_number;
-  uint32_t lenCESFW;
-  uint8_t *pCESFW;
-} MWCESFW_t;
-
-typedef struct __PACKED__ UWBManifest
-{
-  uint32_t layout_version;
-  uint8_t creation_date_yy;
-  uint8_t creation_date_month;
-  uint8_t creation_date_day;
-  uint8_t creation_date_hour;
-  uint8_t creation_date_minutes;
-  uint8_t creation_date_seconds;
-  uint8_t padding;
-  uint8_t countMWCESFW;
-  MWCESFW_t *mwCESFW[MWCESFW_COUNT];
-} UWBManifest_t;
