127 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|     
 | |
| 
 | |
| #ifndef _IMGHDR_H_
 | |
| #define _IMGHDR_H_
 | |
| 
 | |
| #include <stdint.h>
 | |
| 
 | |
| typedef enum
 | |
| {
 | |
|     devKunlun    = 0xDC01,
 | |
|     devMAX    = 0xFFFF
 | |
| }dvcType;
 | |
| 
 | |
| typedef enum
 | |
| {
 | |
|     imgROM    = 0x0000,    /* Maybe,ROM doesn't need a imgType */
 | |
|     imgSP     = 0xFC00,
 | |
|     imgSBL    = 0xFC01,
 | |
|     imgFRW    = 0xFC02,
 | |
|     imgCFG    = 0xFC03,
 | |
|     imgEFUSE    = 0xFC04,
 | |
|     imgMAX    = 0xFFFF
 | |
| }imgType;
 | |
| 
 | |
| 
 | |
| /*
 | |
| 
 | |
| 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 :
 | |
| 0                                                                                                 64
 | |
| ___________________________________________________________________________________________________
 | |
| | _dvcType | _imgType | _imgSize | _imgVer | _bltTimeS | _bltTimeB | _imgCRC | rev[12] | sha256[32]|
 | |
| ----------------------------------------------------------------------------------------------------
 | |
| |  2Byte   |  2Byte   |  4Byte   |  2Byte  |  2Byte    |  4Byte    |  4Byte  |  12Byte|  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    8
 | |
| #define SHA256_SIZE      32
 | |
| #pragma pack (1)
 | |
| typedef struct
 | |
| {
 | |
|     unsigned short _dvcType;    /* Refrence to enum dvcType. */
 | |
|     unsigned short _imgType;    /* Refrence to enum imgType. _dvcType + _imgType -> MagicNum. */
 | |
|     unsigned int _imgSize;    /* Size of Payload only.NOT include imgHdr or data for aligning */
 | |
|     unsigned short _imgVer;    /* Version. 0xA1C8 stands for V 10.1.200 (0x F.F.FF).V 15.15.255 is maximum. */
 | |
|     unsigned short _bltTimeS;    /* Built small time. */
 | |
|     unsigned int _bltTimeB;    /* Built big time.If _bltTimeB=0x01234567 and _bltTimeS=0x89AB,
 | |
|                        we got a big num 0x012_3_45_67_89_AB. Y_M_D_H_M_S <- 0xFFF_F_FF_FF_FF_FF */
 | |
|     unsigned int _imgCRC;    /* CRC32 for 'payload + pad for aligning' */
 | |
|     unsigned int _guard; /* fixed, 0xa4e49a17 */
 | |
|     unsigned char rev[HEADER_REV_SIZE];        /* Futrue use. */
 | |
|     unsigned char sha256[SHA256_SIZE];     /* sha256 for 'payload + pad for aligning' */
 | |
| } imgHdr;    /* 64Bytes-len */
 | |
| #pragma pack ()
 | |
| 
 | |
| #define HEADER_TOLTAL_SIZE    64
 | |
| #define IMAGE_ALIGNED_SIZE  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 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_BTIMS(p)    UINT16_GET(p, 10)
 | |
| #define IMGHDR_GET_BTIMB(p)    UINT32_GET(p, 12)
 | |
| #define IMGHDR_GET_CRC(p)    UINT32_GET(p, 16)
 | |
| #define IMGHDR_GET_GUARD(p)    UINT32_GET(p, 20)
 | |
| 
 | |
| void static inline img_header_construct(imgHdr *pHr, char *pStr)
 | |
| {
 | |
|     int cnt;
 | |
|     
 | |
|     pHr->_dvcType     = IMGHDR_GET_DEVTYPE(pStr);
 | |
|     pHr->_imgType    = IMGHDR_GET_IMGTYPE(pStr);
 | |
|     pHr->_imgSize    = IMGHDR_GET_IMGSIZE(pStr);
 | |
|     pHr->_imgVer    = IMGHDR_GET_IMGVER(pStr);
 | |
|     pHr->_bltTimeS    = IMGHDR_GET_BTIMS(pStr);
 | |
|     pHr->_bltTimeB    = IMGHDR_GET_BTIMB(pStr);
 | |
|     pHr->_imgCRC    = IMGHDR_GET_CRC(pStr);
 | |
|     pHr->_guard     = IMGHDR_GET_GUARD(pStr);
 | |
|     
 | |
|     for(cnt=0; cnt<HEADER_REV_SIZE; cnt++)
 | |
|     {
 | |
|         pHr->rev[cnt]   = (unsigned char)pStr[20+cnt];
 | |
|     }
 | |
|     
 | |
|     for(cnt=0; cnt<SHA256_SIZE; cnt++)
 | |
|     {
 | |
|         pHr->sha256[cnt]   = (unsigned char)pStr[32+cnt];
 | |
|     }
 | |
| 
 | |
|     return ;
 | |
| }
 | |
| 
 | |
| #endif
 |