2025-04-11 09:40:32 +08:00

415 lines
11 KiB
C

/******************************************************************************
*(C) Copyright 2018 EIGENCOMM International Ltd.
* All Rights Reserved
******************************************************************************
* Filename: fota_pub.h
*
* Description:
*
* History: 2021/10/24 created by xuwang
*
* Notes:
*
******************************************************************************/
#ifndef FOTA_PUB_H
#define FOTA_PUB_H
/*----------------------------------------------------------------------------*
* INCLUDES *
*----------------------------------------------------------------------------*/
#include <stdio.h>
#include <stdint.h>
#include <string.h>
/*----------------------------------------------------------------------------*
* MACROS *
*----------------------------------------------------------------------------*/
#define FOTA_EOK 0
#define FOTA_EUNDEF -1 /* undefined error */
#define FOTA_EARGS -2 /* arguments invalid */
#define FOTA_EBATT -3 /* battery low */
#define FOTA_EPAR -4 /* parchive invalid */
#define FOTA_EPARSZ -5 /* parchive size err */
#define FOTA_EFLQUERY -6 /* flash query fail */
#define FOTA_EFLERASE -7 /* flash erase fail */
#define FOTA_EFLWRITE -8 /* flash write fail */
#define FOTA_EFLREAD -9 /* flash read fail */
#define FOTA_EMINIT -10 /* memory init fail */
#define FOTA_EMALLOC -11 /* memory alloc fail */
#define FOTA_EMFREE -12 /* memory free fail */
#define FOTA_EPVER -13 /* parver uncompatible */
#define FOTA_EPMETH -14 /* pmethod unsupported */
#define FOTA_EFWNIDENT -15 /* fw non-identical */
#define FOTA_EPATCH -16 /* fw patch fail */
#define FOTA_EUNFOUND -17 /* item not found */
#define FOTA_EOVERFLOW -18 /* resource ran out */
#define FOTA_EPERM -19 /* scenario not permitted */
#define FOTA_ECHKSUM -20 /* checksum calc fail*/
#define FOTA_EDCONV -21 /* data convertion fail*/
#define FOTA_EVERIFY -22 /* verify signature fail*/
#define FOTA_EAUTH -23 /* no auth header*/
#define FOTA_TICK_RATE_MS (1)
#define FOTA_SIGNED_ECDSA_LEN 64
#define FOTA_SHA256_HASH_LEN 32
#define FOTA_ALIGN_UP(x,sz) (((x) + ((sz) - 1)) & (~((sz) - 1)))
#define FOTA_ALIGN_DOWN(x,sz) ((x) & (~((sz) - 1)))
#if (FOTA_PRESET_RAM_ENABLE == 1)
#include "common.h"
#define FOTA_LOGI(tag,fmt,args...) EC_Printf(fmt, ##args)
#define FOTA_TRACE(tag,fmt,args...) BL_TRACE(fmt, ##args)
#define FOTA_SPRINTF(buf,args...) BL_SPRINTF(buf, ##args)
#define FOTA_RAND() (0)
#else
#define FOTA_LOGI(tag,fmt,args...) printf(fmt, ##args)
#define FOTA_TRACE(tag,fmt,args...) printf(fmt, ##args)
#define FOTA_SPRINTF(buf,args...) sprintf(buf, ##args)
#define FOTA_RAND() rand()
#endif
/*----------------------------------------------------------------------------*
* DATA TYPE DEFINITION *
*----------------------------------------------------------------------------*/
/*-definition of 'fwAttr:3' */
typedef enum
{
FOTA_FA_UNDEF = 0,
FOTA_FA_BL,
FOTA_FA_AP,
FOTA_FA_CP,
FOTA_FA_APP,
FOTA_FA_APP2,
FOTA_FA_XOBJ,
FOTA_FA_SYSH,
FOTA_FA_MAXNUM
}FotaFwAttr_e;
typedef enum
{
FOTA_NVM_ZONE_REMAP = 0, /* remap zone, enabled when *.par is stored in FS zone */
FOTA_NVM_ZONE_DELTA, /* delta zone for downloading & patching */
FOTA_NVM_ZONE_BKUP,
FOTA_NVM_ZONE_BLU, /* bl updater <rsvd> */
FOTA_NVM_ZONE_AP,
FOTA_NVM_ZONE_CP,
FOTA_NVM_ZONE_APP,
FOTA_NVM_ZONE_APP2,
FOTA_NVM_ZONE_XOBJ,
FOTA_NVM_ZONE_SYSH,
FOTA_NVM_ZONE_MAXNUM,
FOTA_NVM_ZONE_UNDEF = 0xff,
FOTA_NVM_ZONE_ANY = FOTA_NVM_ZONE_UNDEF
}FotaNvmZoneId_e;
typedef uint32_t FotaNvmZoneId_bm;
#define FOTA_NVM_BM_ZONE_NONE (0)
#define FOTA_NVM_BM_ZONE_REMAP (1 << FOTA_NVM_ZONE_REMAP)
#define FOTA_NVM_BM_ZONE_DELTA (1 << FOTA_NVM_ZONE_DELTA)
#define FOTA_NVM_BM_ZONE_BKUP (1 << FOTA_NVM_ZONE_BKUP)
#define FOTA_NVM_BM_ZONE_BLU (1 << FOTA_NVM_ZONE_BLU)
#define FOTA_NVM_BM_ZONE_AP (1 << FOTA_NVM_ZONE_AP)
#define FOTA_NVM_BM_ZONE_CP (1 << FOTA_NVM_ZONE_CP)
#define FOTA_NVM_BM_ZONE_APP (1 << FOTA_NVM_ZONE_APP)
#define FOTA_NVM_BM_ZONE_APP2 (1 << FOTA_NVM_ZONE_APP2)
#define FOTA_NVM_BM_ZONE_XOBJ (1 << FOTA_NVM_ZONE_XOBJ)
#define FOTA_NVM_BM_ZONE_SYSH (1 << FOTA_NVM_ZONE_SYSH)
typedef enum
{
FOTA_CA_SHA256SUM = 0,
FOTA_CA_SHA224SUM,
FOTA_CA_ALGO_MAXNUM
}FotaChksumAlgo_e;
/* FOTA_CA_SHA256SUM */
typedef struct
{
uint8_t *input;
uint8_t *output;
size_t inLen;
uint32_t isLast;
}FotaCaSha256Sum_t;
/* for fotaNvmDoExtension() */
typedef enum
{
FOTA_DEF_US_DELAY = 0,
FOTA_DEF_WDT_KICK,
FOTA_DEF_WDT_START,
FOTA_DEF_WDT_STOP,
FOTA_DEF_GET_RAM_SIZE,
FOTA_DEF_CHK_BATTERY,
FOTA_DEF_CHK_DYN_MEM,
FOTA_DEF_CHK_REMAP_ZONE,
FOTA_DEF_CHK_DELTA_STATE,
FOTA_DEF_CHK_BASE_IMAGE, /* not used any more, call 'fotaNvmVerifyDelta()' instead, just for compatibility here! */
FOTA_DEF_CHK_TOTAL_PROGRESS,
FOTA_DEF_IS_IMAGE_IDENTICAL,
FOTA_DEF_SET_DOWNLOAD_OVER,
FOTA_DEF_RPT_DFU_PROGRESS,
FOTA_DEF_GET_DFU_PROGRESS,
FOTA_DEF_RPT_DFU_RESULT,
FOTA_DEF_SET_DFU_RESULT,
FOTA_DEF_GET_DFU_RESULT, /* not used any more, call 'fotaNvmGetOtaResult()' instead, just for compatibility here! */
FOTA_DEF_PREPARE_DFU,
FOTA_DEF_CLOSING_DFU,
FOTA_DEF_ADJ_ZONE_SIZE,
FOTA_DEF_SET_XOBJ_ZONE,
FOTA_DEF_CHK_HLS_STATE,
FOTA_DEF_CHK_BOOT_STATE,
FOTA_DEF_CHK_BOOT_HDSEC,
FOTA_DEF_CHK_SIGN_STATE /* is delta signed? */
}FotaDoExtensionFlags_e;
/* FOTA_DEF_US_DELAY */
typedef struct
{
uint32_t usec;
}FotaDefUsDelay_t;
/* FOTA_DEF_GET_RAM_SIZE */
typedef struct
{
uint32_t avlbSize;
}FotaDefGetRamSize_t;
/* FOTA_DEF_CHK_BATTERY */
typedef struct
{
uint8_t isBattLow; /* 0/1 */
uint8_t rsvd[3];
}FotaDefChkBattery_t;
/* FOTA_DEF_CHK_DYN_MEM */
typedef struct
{
uint8_t isEnable; /* 0/1 */
uint8_t rsvd[3];
}FotaDefChkDynMem_t;
/* FOTA_DEF_CHK_REMAP_ZONE */
typedef struct
{
uint8_t isEnable; /* 0/1 */
uint8_t rsvd[3];
}FotaDefChkRemapZone_t;
/* FOTA_DEF_CHK_DELTA_STATE */
typedef struct
{
uint8_t isValid; /* 0/1 */
uint8_t state; /* FotaDeltaChkState_e */
uint8_t rsvd[2];
}FotaDefChkDeltaState_t;
/* FOTA_DEF_CHK_BASE_IMAGE */
typedef struct
{
uint8_t isMatched; /* 0/1 */
uint8_t rsvd[3];
}FotaDefChkBaseImage_t;
/* FOTA_DEF_IS_IMAGE_IDENTICAL */
typedef struct
{
uint32_t zid; /* FotaNvmZoneId_e */
uint32_t size;
uint8_t *hash;
}FotaDefIsImageIdentical_t;
typedef enum
{
FOTA_DPR_FREQ_HIGH = 1,
FOTA_DPR_FREQ_MEDIUM,
FOTA_DPR_FREQ_LOW
}FotaDfuProgRptFreq_e;
/* FOTA_DEF_CHK_TOTAL_PROGRESS
* FOTA_DEF_RPT_DFU_PROGRESS
* FOTA_DEF_GET_DFU_PROGRESS
*/
typedef struct
{
uint8_t pkgNum;
uint8_t pkgId;
uint16_t isTotal :1;
uint16_t rptFreq :2; /* FotaDfuProgRptFreq_e */
uint16_t percent :13;
}FotaDefDfuProgress_t;
typedef enum
{
FOTA_DCS_DELTA_CHECKOK = 0, /* no error */
FOTA_DCS_DELTA_UNFOUND,
FOTA_DCS_DELTA_PARTIAL,
FOTA_DCS_DELTA_INVALID,
FOTA_DCS_DELTA_UNMATCHB, /* unmatched base image */
FOTA_DCS_DELTA_UNMATCHN, /* unmatched new image */
FOTA_DCS_DELTA_PATCHFAIL, /* patching failure */
FOTA_DCS_DELTA_SIGNFAIL,
FOTA_DCS_DELTA_UNDEF
}FotaDeltaChkState_e;
typedef enum
{
FOTA_DRC_DFU_UNDEF = 0,
FOTA_DRC_DFU_SUCC = 1,
FOTA_DRC_DFU_FAIL = 99
}FotaDfuResultCode_e;
/* FOTA_DEF_SET_DFU_RESULT
* FOTA_DEF_GET_DFU_RESULT
*/
typedef struct
{
uint8_t dfuResult; /* FotaDfuResultCode_e */
uint8_t deltaState; /* FotaDeltaChkState_e */
uint8_t rsvd[2];
}FotaDefDfuResult_t;
/* FOTA_DEF_PREPARE_DFU */
typedef struct
{
uint8_t rsvd[4];
}FotaDefPrepareDfu_t;
/* FOTA_DEF_CLOSING_DFU */
typedef struct
{
uint8_t rsvd[4];
}FotaDefClosingDfu_t;
/* FOTA_DEF_ADJ_ZONE_SIZE */
typedef struct
{
uint32_t zid; /* FotaNvmZoneId_e */
uint32_t size;
}FotaDefAdjZoneSize_t;
/* FOTA_DEF_SET_XOBJ_ZONE */
typedef struct
{
uint32_t handle;
uint32_t size;
uint32_t ovhd;
uint32_t extras;
}FotaDefSetXobjZone_t;
/* FOTA_DEF_CHK_HLS_STATE */
typedef struct
{
uint8_t isEnable;
uint8_t rsvd[3];
}FotaDefChkHlsState_t;
/* FOTA_DEF_CHK_BOOT_STATE */
typedef struct
{
uint8_t isSigned; /* 0/1: security boot or not? */
uint8_t rsvd[3];
}FotaDefChkBootState_t;
/* FOTA_DEF_CHK_BOOT_HDSEC */
typedef struct
{
uint8_t fwAttr; /* FotaFwAttr_e */
uint8_t shaAlgo; /* FotaChksumAlgo_e */
uint8_t rsvd[2];
uint8_t hash[FOTA_SHA256_HASH_LEN];
uint8_t ecdsa[FOTA_SIGNED_ECDSA_LEN];
}FotaDefChkBootHdSec_t;
/* FOTA_DEF_CHK_SIGN_STATE */
typedef struct
{
uint8_t isEnable; /* 0/1 */
uint8_t rsvd[3];
}FotaDefChkSignState_t;
#define FOTA_AUTH_MAGIC_0 0xEC
#define FOTA_AUTH_MAGIC_1 0xAE
#define FOTA_CHECK_AUTH_MAGIC(magic) \
(((FOTA_AUTH_MAGIC_0 == ((uint8_t*)(magic))[0]) && \
(FOTA_AUTH_MAGIC_1 == ((uint8_t*)(magic))[1])) ? 1 : 0)
typedef struct
{
uint8_t magic[2]; /* 0xEC,0xAE */
uint8_t rsvdb;
uint8_t curveType :2; /* 0: 256; 1: 224*/
uint8_t rsvdBits :6;
uint32_t rsvdw[2];
uint8_t sign[FOTA_SIGNED_ECDSA_LEN];
}CustFotaAuthHdr_t;
/*
* definition of 'pmagic': ec-delta/diff-fw
*/
#define FOTA_PARCHIVE_MAGIC_0 0xEC
#define FOTA_PARCHIVE_MAGIC_1 0xDF
#define FOTA_CHECK_PAR_MAGIC(magic) \
(((FOTA_PARCHIVE_MAGIC_0 == ((uint8_t*)(magic))[0]) && \
(FOTA_PARCHIVE_MAGIC_1 == ((uint8_t*)(magic))[1])) ? 1 : 0)
#define FOTA_PAR_RETEN_SIZE_4M 40
#define FOTA_PAR_RETEN_SIZE_16M 136
typedef struct
{
uint8_t pmagic[2]; /* 0xEC,0xDF */
uint8_t rsvd0;
uint8_t rsvdBit0:7;
uint8_t psigned :1; /* 0/1: is system signed bin included or not? */
uint16_t fotaCap :3; /* fota capacity(total size of images) in every single patching, 2^pcap(MB) */
uint16_t rsvdBit1:13;
uint16_t rsvd1;
uint32_t parLen; /* including hdr len */
uint8_t parHash[FOTA_SHA256_HASH_LEN];
#if !defined(__CC_ARM)
uint8_t retention[0];
#endif
}CustFotaParHdr_t;
typedef struct
{
uint32_t rsvd0 :5;
uint32_t fwAttr :3; /* FotaFwAttr_e */
uint32_t rsvd1 :24;
uint32_t pkgLen; /* including hdr len */
uint32_t rsvd2[3];
uint32_t baseFwSize;
uint8_t baseFwHash[FOTA_SHA256_HASH_LEN];
}CustFotaPkgHdr_t;
/*----------------------------------------------------------------------------*
* GLOBAL FUNCTIONS DECLEARATION *
*----------------------------------------------------------------------------*/
#ifdef __cplusplus
}
#endif
#endif