| 
									
										
										
										
											2024-09-28 14:24:04 +08:00
										 |  |  | /****************************************************************************
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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]; | 
					
						
							| 
									
										
										
										
											2024-10-14 08:10:17 +08:00
										 |  |  |     /* 这个可能会用来存放压缩前img的crc */ | 
					
						
							| 
									
										
										
										
											2024-09-28 14:24:04 +08:00
										 |  |  |     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. */ | 
					
						
							| 
									
										
										
										
											2024-10-14 08:10:17 +08:00
										 |  |  |     uint8_t     hdrVer; // imgheader版本,V1和V0位置相同
 | 
					
						
							| 
									
										
										
										
											2024-09-28 14:24:04 +08:00
										 |  |  |     uint32_t    imgVer; | 
					
						
							|  |  |  |     /* CRC32 for 'payload + pad for aligning' */ | 
					
						
							|  |  |  |     uint32_t    imgCRC; | 
					
						
							|  |  |  |     /* fixed, 0xa4e49a17 */ | 
					
						
							| 
									
										
										
										
											2024-10-14 08:10:17 +08:00
										 |  |  |     uint32_t    guard; // 通过这个值来确定是不是imgheader,V1和V0位置相同
 | 
					
						
							| 
									
										
										
										
											2024-09-28 14:24:04 +08:00
										 |  |  |     /* 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
 | 
					
						
							| 
									
										
										
										
											2024-10-25 19:37:32 +08:00
										 |  |  | // 如果没有32字节对齐 把大小扩展至32字节对齐
 | 
					
						
							| 
									
										
										
										
											2024-09-28 14:24:04 +08:00
										 |  |  | #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
 |