blob: 7b54a498d4f166dae52a425edbb19814ebb7b53b [file] [log] [blame]
/*
* 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 */