Remove hdll chip support. This is moved to the another project. Bug: 382359822 Test: Build (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:34796e29df6ade9e73a7d8ccf2f16d77565429fd) Merged-In: Ib3980f3be83f042ef459ea95023d23fe0a9c3e39 Change-Id: Ib3980f3be83f042ef459ea95023d23fe0a9c3e39
diff --git a/halimpl/hal/hdll/Android.bp b/halimpl/hal/hdll/Android.bp deleted file mode 100644 index f0acaba..0000000 --- a/halimpl/hal/hdll/Android.bp +++ /dev/null
@@ -1,25 +0,0 @@ - -package { - default_applicable_licenses: ["hardware_nxp_uwb_license"], -} - -cc_library_static { - name: "nxp_uwb_hdll", - srcs: [ - "fwd_hdll.cc", - "NxpUwbChipHdll.cc", - "phNxpUciHal_LC.cc", - ], - shared_libs: [ - "android.hardware.uwb-V1-ndk", - ], - include_dirs: [ - "hardware/nxp/uwb/extns/inc", - "hardware/nxp/uwb/halimpl/hal", - "hardware/nxp/uwb/halimpl/inc", - "hardware/nxp/uwb/halimpl/inc/common", - "hardware/nxp/uwb/halimpl/log", - "hardware/nxp/uwb/halimpl/tml", - "hardware/nxp/uwb/halimpl/utils", - ], -}
diff --git a/halimpl/hal/hdll/NxpUwbChipHdll.cc b/halimpl/hal/hdll/NxpUwbChipHdll.cc deleted file mode 100644 index 77c3c2b..0000000 --- a/halimpl/hal/hdll/NxpUwbChipHdll.cc +++ /dev/null
@@ -1,182 +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); - tHAL_UWB_STATUS get_supported_channels(const uint8_t **cal_channels, uint8_t *nr); -private: - bool on_binding_status_ntf(size_t packet_len, const uint8_t* packet); - - tHAL_UWB_STATUS check_binding_done(); - - 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) -{ - switch (id) { - case EXTCAL_PARAM_TX_POWER: - case EXTCAL_PARAM_TX_BASE_BAND_CONTROL: - case EXTCAL_PARAM_DDFS_TONE_CONFIG: - case EXTCAL_PARAM_TX_PULSE_SHAPE: - case EXTCAL_PARAM_RX_ANT_DELAY: - return sr1xx_apply_calibration(id, ch, data, data_len); - case EXTCAL_PARAM_CLK_ACCURACY: - /* break through */ - default: - NXPLOG_UCIHAL_E("Unsupported parameter: 0x%x", id); - return UWBSTATUS_FAILED; - } -} - -tHAL_UWB_STATUS -NxpUwbChipSr200::get_supported_channels(const uint8_t **cal_channels, uint8_t *nr) -{ - static const uint8_t sr200_cal_channels[] = {5, 9, 10}; - *cal_channels = sr200_cal_channels; - *nr = std::size(sr200_cal_channels); - return UWBSTATUS_SUCCESS; -} - -std::unique_ptr<NxpUwbChip> GetUwbChip() -{ - return std::make_unique<NxpUwbChipSr200>(); -}
diff --git a/halimpl/hal/hdll/fwd_hdll.cc b/halimpl/hal/hdll/fwd_hdll.cc deleted file mode 100644 index 45145ca..0000000 --- a/halimpl/hal/hdll/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/hdll/fwd_hdll.h b/halimpl/hal/hdll/fwd_hdll.h deleted file mode 100644 index 7b54a49..0000000 --- a/halimpl/hal/hdll/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/hdll/phNxpUciHal_LC.cc b/halimpl/hal/hdll/phNxpUciHal_LC.cc deleted file mode 100644 index 1a3d56f..0000000 --- a/halimpl/hal/hdll/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/hdll/phNxpUciHal_LC.h b/halimpl/hal/hdll/phNxpUciHal_LC.h deleted file mode 100644 index 077b8a1..0000000 --- a/halimpl/hal/hdll/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/hdll/phNxpUciHal_fwd_utils.h b/halimpl/hal/hdll/phNxpUciHal_fwd_utils.h deleted file mode 100644 index 4b07a4e..0000000 --- a/halimpl/hal/hdll/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;