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
							 |