Files
kunlun/inc/utils/iot_img_hdr.h
2024-10-25 19:37:32 +08:00

473 lines
16 KiB
C

/****************************************************************************
*
* Copyright(c) 2019 by Aerospace C.Power-tech Technologies. ALL RIGHTS RESERVED.
*
* This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
* be copied by any method or incorporated into another program without
* the express written consent of Aerospace C.Power. This Information or any portion
* thereof remains the property of Aerospace C.Power. The Information contained herein
* is believed to be accurate and Aerospace C.Power assumes no responsibility or
* liability for its use in any way and conveys no license or title under
* any patent or copyright and makes no representation or warranty that this
* Information is free from patent or copyright infringement.
*
* ****************************************************************************/
#ifndef IOT_IMG_HDR_H
#define IOT_IMG_HDR_H
#ifdef __cplusplus
extern "C" {
#endif
/* pack for the structures in the whole file */
#pragma pack(push) /* save the pack status */
#pragma pack(1) /* 1 byte align */
typedef enum
{
devKunlun = 0xDC01, /* KL1/KL2 */
devKunlun2 = 0xDC02, /* KL2 */
devKunlun3 = 0xDC03, /* KL3 */
devMAX = 0xFFFF
}dvcType;
typedef enum
{
imgROM = 0x0000, /* Maybe,ROM doesn't need a imgType */
imgSP = 0xFC00, /* sp */
imgSBL = 0xFC01, /* sbl */
imgFRW = 0xFC02, /* kl1: 1MB fw, uncompressed for sta, run in flash; compressed for cco, run in psram */
imgCFG = 0xFC03, /* The first pib file. */
imgEFUSE = 0xFC04, /* efuse */
imgOEM = 0xFC05, /* oem */
imgFRW2 = 0xFC06, /* The second fw, maybe the backup one. not used. */
imgCFG2 = 0xFC07, /* The second pib file. */
imgCFRW1 = 0xFC08, /* kl1: 2MB fw, compressed for sta or cco, run in flash; kl2: 4M flash fw */
imgCFRW2 = 0xFC09, /* The second fw, maybe the backup one. not used. */
imgCFRW = 0xFC0A, /* kl1: 2MB fw, compressed for sta or cco, run in psram; kl2: 4M psram fw */
imgREF = 0xFC0B, /* ref */
imgCUS = 0xFC0C, /* cus */
imgCFRW4F = 0xFC0D, /* kl1: 4MB fw, compressed for sta or cco, run in flash */
imgCFRW4P = 0xFC0E, /* kl1: 4MB fw, compressed for sta or cco, run in psram */
imgMAX = 0xFFFF, /* invalid */
}imgType;
typedef enum
{
devV1Kunlun = 0x01, /* KL1/KL2 */
devV1Kunlun2= 0x02, /* KL2 */
devV1Kunlun3= 0x03, /* KL3 */
devV1MAX = 0xFF
}dvcTypeV1;
typedef enum
{
imgV1ROM = 0x00, /* Maybe,ROM doesn't need a imgType */
imgV1SBL = 0x01, /* sbl */
imgV1FRWPLC = 0x02, /* FW-PLC */
imgV1CFG = 0x03, /* The first pib file. */
imgV1OEM = 0x05, /* oem */
imgV1FRWCUS = 0x06, /* FW-CUS */
imgV1MAX = 0xFF /* invalid */
}imgTypeV1;
typedef enum
{
encType_none = 0x00,
encType_aa = 0xAA,
encType_99 = 0x99,
}encType;
typedef enum
{
zipType_none = 0x00, /* Uncompressed file. */
zipType_defult = 0x01, /* Compressed with lzma, level-0. */
zipType_max = 0xFF
}zipType;
typedef enum
{
sizeType_0MB = 0x00,
sizeType_1MB = 0x01,
sizeType_2MB = 0x02,
sizeType_4MB = 0x04,
sizeType_8MB = 0x08,
sizeType_max = 0xFF
}sizeType;
typedef enum
{
hdrVer_00 = 0x00, /* V0.0, first edition */
hdrVer_01 = 0x01, /* V0.1, be from v0.0, enable 4m flash module, kl1 kl2 used it */
hdrVer_02 = 0x02, /* V0.2, be from V0.1, offset->layout index + resv[3], kl1 kl2 */
hdrVer_10 = 0x10, /* V1.0, enable kl3, kl3 used it */
hdrVer_max = 0xFF
}hdrVersion;
#define IOT_MAGIC_NO 0x5566
#define IOT_XOR_VALUE 0xAA
#define IOT_XOR_VALUE_FLX 0x99
#define IOT_XOR_VALUE_QJ 0x66
#define IOT_XOR_VALUE_SPE 0xCC
#define IOT_XOR_VALUE_GX 0x33
#define IOT_XOR_VALUE_DT 0xDD
#define IOT_XOR_VALUE_YP 0xA9
#define IOT_FILE_MODE_PLAIN 0x00
#define IOT_FILE_MODE_ADD 0x01
#define IOT_FILE_MODE_SUB 0x02
#define IOT_FILE_MODE_XOR 0x03
#define IOT_FILE_MODE_UNKNOWN 0xFF
#define IOT_IMG_FLAG_MASK 0xf
#define IOT_IMG_FLAG_OFFSET 0x0
#define IOT_IMG_SIZE_MASK 0xf
#define IOT_IMG_SIZE_OFFSET 0x4
/* image global flag: bit0-3 */
#define IOT_IMG_FLAG_LZMA_EN 0x4
#define IOT_IMG_FLAG_FW2_EXT 0x8
/* image size: bit4-7 */
#define IOT_IMG_FLAG_SIZE_1M 0x1
#define IOT_IMG_FLAG_SIZE_2M 0x2
#define IOT_PKG_HDR_LEN 96
typedef struct iot_pkg_hdr {
/* 0 - plain, 1 - add enc_patern, 2 - dec enc_patern */
uint8_t enctype;
/* encrypt pattern */
uint8_t pattern;
/* 0 for CCo, 1 for STA. other value is reserved. */
uint16_t dev_type;
/* CRC of the whole upgrade file */
uint32_t file_crc;
/* length of the upgrade file */
uint32_t file_len;
/* magic number */
uint32_t magic_no;
/* version info */
uint32_t version;
/* start index of sp section */
uint32_t sp_start;
/* length of sp section */
uint32_t sp_len;
/* start index of sbl section */
uint32_t sbl_start;
/* length of sbl section */
uint32_t sbl_len;
/* start of oem section */
uint32_t oem_start;
/* length of oem section */
uint32_t oem_len;
/* start index of pib section */
uint32_t pib_start;
/* length of pib section */
uint32_t pib_len;
/* start index of fw section */
uint32_t fw_start;
/* length of fw section */
uint32_t fw_len;
/* start index of efuse section */
uint32_t efuse_start;
/* length of efuse section */
uint32_t efuse_len;
/* start index of fw2 section */
uint32_t fw2_start;
/* length of fw2 section */
uint32_t fw2_len;
/* start index of reference section */
uint32_t ref_start;
/* length of reference section */
uint32_t ref_len;
/* start index of custom section */
uint32_t cus_start;
/* length of custom section */
uint32_t cus_len;
/* vendor id*/
uint16_t vendor_id;
/* image type */
uint8_t img_type;
/* image flags */
uint8_t img_flag;
}iot_pkg_hdr_t;
/*
Format of image:
0 31
____________________________
|__________________________| --> image header size 64Bytes
| |
| |
| PAYLOAD |
| |
| _________________|
| |XXXXXXXXXXXXXXXXX| --> X is FIXED pad for 32Byte-aligning, suggested keeping '0'.
----------------------------
0 31
Description for image header V0 :
0 64
______________________________________________________________________________________________________________
| _dvcType | _imgType | _imgSize | _imgVer | _bltTimeS | _bltTimeB | _imgCRC | _guard | rev[8] | sha256[32]|
--------------------------------------------------------------------------------------------------------------
| 2Byte | 2Byte | 4Byte | 2Byte | 2Byte | 4Byte | 4Byte | 4Byte | 8Byte| 32Byte |
--------------------------------------------------------------------------------------------------------------
When written into file, PLS use big-endian . eg :
_________________________________________________________
image-header: | _dvcType=0xDEAD | _imgType=0xBEEF |
------------------------------------------------------ .......
bytes-stream: | byte0=0xDE | byte1=0xAD | byte2=0xBE | byte3=0xEF |
---------------------------------------------------------
*/
#define HEADER_REV_SIZE 0
#define SHA256_SIZE 32
/* 64Bytes-len */
typedef struct
{
/* Refrence to enum dvcType. */
uint16_t devType;
/* Refrence to enum imgType. _dvcType + _imgType -> MagicNum. */
uint16_t imgType;
/* Size of Payload only.NOT include imgHdr or data for aligning */
uint32_t imgSize;
/* Version. 0xA1C8 stands for V 10.1.200 (0x F.F.FF).V 15.15.255 is maximum. */
uint16_t imgVer;
/* Psram size, 0, 1, 2, 4, unit is MB. */
uint8_t psramSize;
/* Header version. reference for hdrVersion. */
uint8_t hdrVer;
/* firmware size, non-compressed */
uint32_t fwSize;
/* CRC32 for 'payload + pad for aligning' */
uint32_t imgCRC;
/* fixed, 0xa4e49a17 */
uint32_t guard;
/* flash layout index */
uint8_t layoutIdx;
/* reserved */
uint8_t resv[3];
/* 这个可能会用来存放压缩前img的crc */
uint32_t fwCRC;
/* sha256 for payload */
uint8_t sha256[SHA256_SIZE];
} imgHdrV0;
/* 64 bytes */
typedef struct
{
/* Refrence to enum dvcType. */
uint8_t devType;
/* Refrence to enum imgType. _dvcType + _imgType -> MagicNum. */
uint8_t imgType;
/* Refrence to enum encType. */
uint8_t encType;
/*
* bit0 : Only for ROM while loading SBL.
* 1b-Quad read enable if supported, 0b-Single byte read mode.
*/
uint8_t cfg;
/* Size of Payload only.NOT include imgHdr or data for aligning */
uint32_t imgSize;
/* Compress type, reference for zipType. */
uint8_t zipType;
/* Flash size, reference for sizeType. */
uint8_t flashSize;
/* Psram/DDR size, reference for sizeType. */
uint8_t psramSize;
/* Header version. reference for hdrVersion. */
uint8_t hdrVer; // imgheader版本,V1和V0位置相同
uint32_t imgVer;
/* CRC32 for 'payload + pad for aligning' */
uint32_t imgCRC;
/* fixed, 0xa4e49a17 */
uint32_t guard; // 通过这个值来确定是不是imgheader,V1和V0位置相同
/* flash layout index */
uint8_t layoutIdx;
/* reserved */
uint8_t resv[3];
/* Run address. */
uint32_t runAddr;
/* sha256 for payload */
uint8_t sha256[SHA256_SIZE];
} imgHdrV1;
#define HEADER_TOLTAL_SIZE 64
#define IMAGE_ALIGNED_SIZE 32
// 如果没有32字节对齐 把大小扩展至32字节对齐
#define IMAGE_LEN_FOR_CRC(l) ((((l)&(IMAGE_ALIGNED_SIZE-1)) ?\
(IMAGE_ALIGNED_SIZE-((l)&(IMAGE_ALIGNED_SIZE-1))) :0) + (l))
#define IMAGE_GUARD 0xa4e49a17
#define UINT8_GET(buf, n) (buf[n]&0xFF)
#define UINT16_GET(buf, n) (((buf[n]<<8)&0xFF00) | (buf[(n)+1]&0x00FF))
#define UINT32_GET(buf, n) (((buf[n]<<24)&0xFF000000) | ((buf[n+1]<<16)&0x00FF0000)\
|((buf[n+2]<<8)&0x0000FF00) | (buf[n+3]&0x000000FF))
#define IMGHDR_GET_DEVTYPE(p) UINT16_GET(p, 0)
#define IMGHDR_GET_IMGTYPE(p) UINT16_GET(p, 2)
#define IMGHDR_GET_IMGSIZE(p) UINT32_GET(p, 4)
#define IMGHDR_GET_IMGVER(p) UINT16_GET(p, 8)
#define IMGHDR_GET_PSRAMSIZE(p) UINT8_GET(p, 10)
#define IMGHDR_GET_HDRVER(p) UINT8_GET(p, 11)
#define IMGHDR_GET_FWSIZE(p) UINT32_GET(p, 12)
#define IMGHDR_GET_CRC(p) UINT32_GET(p, 16)
#define IMGHDR_GET_GUARD(p) UINT32_GET(p, 20)
#define IMGHDR_GET_LAYOUTIDX(p) UINT8_GET(p, 24)
#define IMGHDR_GET_FWCRC(p) UINT32_GET(p, 28)
#define IMGHDR_V1_GET_DEVTYPE(p) UINT8_GET(p, 0)
#define IMGHDR_V1_GET_IMGTYPE(p) UINT8_GET(p, 1)
#define IMGHDR_V1_GET_ENCVAL(p) UINT8_GET(p, 2)
#define IMGHDR_V1_GET_CONFIG(p) UINT8_GET(p, 3)
#define IMGHDR_V1_GET_IMGSIZE(p) UINT32_GET(p, 4)
#define IMGHDR_V1_GET_ZIPTYPE(p) UINT8_GET(p, 8)
#define IMGHDR_V1_GET_FLASHSIZE(p) UINT8_GET(p, 9)
#define IMGHDR_V1_GET_PSRAMSIZE(p) UINT8_GET(p, 10)
#define IMGHDR_V1_GET_HDRVER(p) UINT8_GET(p, 11)
#define IMGHDR_V1_GET_IMGVER(p) UINT32_GET(p, 12)
#define IMGHDR_V1_GET_IMGCRC(p) UINT32_GET(p, 16)
#define IMGHDR_V1_GET_GUARD(p) UINT32_GET(p, 20)
#define IMGHDR_V1_GET_LAYOUTIDX(p) UINT8_GET(p, 24)
#define IMGHDR_V1_GET_RUNADDR(p) UINT32_GET(p, 28)
#pragma pack(pop) /* restore the pack status */
#ifndef BUILD_BUG_ON
#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - (2 * (!(condition)))]))
#endif
typedef union
{
imgHdrV0 v0;
imgHdrV1 v1;
}imgHdr;
void static inline img_header_construct(imgHdr *pHr, char *pStr)
{
uint8_t hdrVersion = IMGHDR_GET_HDRVER(pStr);
uint32_t ui32 = IMGHDR_GET_GUARD(pStr);
BUILD_BUG_ON (sizeof(imgHdrV0) == sizeof(imgHdrV1));
if (ui32 != IMAGE_GUARD)
{
pHr->v0.hdrVer = hdrVer_max;
pHr->v0.guard = 0;
return;
}
if (hdrVersion == hdrVer_10) {
pHr->v1.devType = IMGHDR_V1_GET_DEVTYPE(pStr);
pHr->v1.imgType = IMGHDR_V1_GET_IMGTYPE(pStr);
pHr->v1.encType = IMGHDR_V1_GET_ENCVAL(pStr);
pHr->v1.cfg = IMGHDR_V1_GET_CONFIG(pStr);
pHr->v1.imgSize = IMGHDR_V1_GET_IMGSIZE(pStr);
pHr->v1.zipType = IMGHDR_V1_GET_ZIPTYPE(pStr);
pHr->v1.flashSize = IMGHDR_V1_GET_FLASHSIZE(pStr);
pHr->v1.psramSize = IMGHDR_V1_GET_PSRAMSIZE(pStr);
pHr->v1.hdrVer = hdrVersion;
pHr->v1.imgVer = IMGHDR_V1_GET_IMGVER(pStr);
pHr->v1.imgCRC = IMGHDR_V1_GET_IMGCRC(pStr);
pHr->v1.guard = IMAGE_GUARD;
pHr->v1.layoutIdx = IMGHDR_V1_GET_LAYOUTIDX(pStr);
pHr->v1.runAddr = IMGHDR_V1_GET_RUNADDR(pStr);
for(ui32 = 0; ui32 < SHA256_SIZE; ui32++)
{
pHr->v1.sha256[ui32] = (uint8_t)pStr[32 + ui32];
}
} else {
pHr->v0.devType = IMGHDR_GET_DEVTYPE(pStr);
pHr->v0.imgType = IMGHDR_GET_IMGTYPE(pStr);
pHr->v0.imgSize = IMGHDR_GET_IMGSIZE(pStr);
pHr->v0.hdrVer = hdrVersion;
pHr->v0.psramSize = IMGHDR_GET_PSRAMSIZE(pStr);
pHr->v0.imgVer = IMGHDR_GET_IMGVER(pStr);
pHr->v0.fwSize = IMGHDR_GET_FWSIZE(pStr);
pHr->v0.imgCRC = IMGHDR_GET_CRC(pStr);
pHr->v0.guard = IMAGE_GUARD;
pHr->v0.layoutIdx = IMGHDR_GET_LAYOUTIDX(pStr);
pHr->v0.fwCRC = IMGHDR_GET_FWCRC(pStr);
for(ui32 = 0; ui32 < SHA256_SIZE; ui32++)
{
pHr->v0.sha256[ui32] = (uint8_t)pStr[32 + ui32];
}
}
return;
}
#define IMGHDR_GET_COMMON_ITERM(pHdr, item) \
(((pHdr)->v0.guard != IMAGE_GUARD) ? \
(uint32_t)(0) : ((pHdr)->v1.hdrVer == hdrVer_10 ? \
(uint32_t)(pHdr)->v1.item : (uint32_t)(pHdr)->v0.item))
#define iot_imghdr_get_hdrVer(pHdr) IMGHDR_GET_COMMON_ITERM(pHdr, hdrVer)
#define iot_imghdr_get_devType(pHdr) IMGHDR_GET_COMMON_ITERM(pHdr, devType)
#define iot_imghdr_get_imgType(pHdr) IMGHDR_GET_COMMON_ITERM(pHdr, imgType)
#define iot_imghdr_get_imgSize(pHdr) IMGHDR_GET_COMMON_ITERM(pHdr, imgSize)
#define iot_imghdr_get_psramSize(pHdr) IMGHDR_GET_COMMON_ITERM(pHdr, psramSize)
#define iot_imghdr_get_imgVer(pHdr) IMGHDR_GET_COMMON_ITERM(pHdr, imgVer)
#define iot_imghdr_get_imgCRC(pHdr) IMGHDR_GET_COMMON_ITERM(pHdr, imgCRC)
#define iot_imghdr_get_guard(pHdr) IMGHDR_GET_COMMON_ITERM(pHdr, guard)
#define iot_imghdr_get_layout_idx(pHdr) IMGHDR_GET_COMMON_ITERM(pHdr, layoutIdx)
#define iot_imghdr_get_sha256(pHdr) IMGHDR_GET_COMMON_ITERM(pHdr, sha256)
#define iot_imghdr_get_fwSize(pHdr) \
(((pHdr)->v0.guard != IMAGE_GUARD) || (pHdr)->v1.hdrVer == hdrVer_10 ? \
(uint32_t)(0) : (uint32_t)(pHdr)->v0.fwSize)
#define iot_imghdr_get_fwCRC(pHdr) \
(((pHdr)->v0.guard != IMAGE_GUARD) || (pHdr)->v1.hdrVer == hdrVer_10 ? \
(uint32_t)(0) : (uint32_t)(pHdr)->v0.fwCRC)
#define iot_imghdr_get_encType(pHdr) \
(((pHdr)->v1.guard != IMAGE_GUARD) || (pHdr)->v1.hdrVer != hdrVer_10 ? \
(uint32_t)(0) : (uint32_t)(pHdr)->v1.encType)
#define iot_imghdr_get_zipType(pHdr) \
(((pHdr)->v1.guard != IMAGE_GUARD) || (pHdr)->v1.hdrVer != hdrVer_10 ? \
(uint32_t)(0) : (uint32_t)(pHdr)->v1.zipType)
#define iot_imghdr_get_flashSize(pHdr) \
(((pHdr)->v1.guard != IMAGE_GUARD) || (pHdr)->v1.hdrVer != hdrVer_10 ? \
(uint32_t)(0) : (uint32_t)(pHdr)->v1.flashSize)
#define iot_imghdr_get_runAddr(pHdr) \
(((pHdr)->v1.guard != IMAGE_GUARD) || (pHdr)->v1.hdrVer != hdrVer_10 ? \
(uint32_t)(0) : (uint32_t)(pHdr)->v1.runAddr)
#define iot_imghdr_get_quad_rd(pHdr) \
(((pHdr)->v1.guard != IMAGE_GUARD) || (pHdr)->v1.hdrVer != hdrVer_10 ? \
(uint32_t)(0) : (uint32_t)(((pHdr)->v1.cfg) & 0x1))
#ifdef __cplusplus
}
#endif
#endif //IOT_IMG_HDR_H