@@ -646,6 +646,7 @@ static int ramUartRecieve(rbuf *buf)
 
		
	
		
			
				        return  0 ; 
 
		
	
		
			
				 
		
	
		
			
				    /* Recieve from uart */ 
 
		
	
		
			
				    // 这里每一个数据包都会发送字符 'C'  
 
		
	
		
			
				size  =  xModemReciveframe ( buf - > write ,  curPkg & 0xFF ,  newStart ) ;  
		
	
		
			
				 
		
	
		
			
				    if ( xmRT_Finish  = =  size  | | xmRT_Error  = =  size ) 
 
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -697,8 +698,10 @@ static char* ramDataRead(rbuf *buf, int size)
 
		
	
		
			
				    char  * s ,  * p ; 
 
		
	
		
			
				    int  len ; 
 
		
	
		
			
				 
		
	
		
			
				    // buf->read_step 是上一次读取的长度 
 
		
	
		
			
				if ( buf - > read  +  buf - > read_step  >  buf - > end )  
		
	
		
			
				    { 
 
		
	
		
			
				        // 如果超出buf长度限制了,  
 
		
	
		
			
				buf - > read  =  buf - > start  +  ( buf - > read_step  -  ( buf - > end  -  buf - > read ) ) ;  
		
	
		
			
				    } 
 
		
	
		
			
				    else 
 
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -706,6 +709,7 @@ static char* ramDataRead(rbuf *buf, int size)
 
		
	
		
			
				        buf - > read  + =  buf - > read_step ; 
 
		
	
		
			
				    } 
 
		
	
		
			
				 
		
	
		
			
				    // 这部分已经被读取了,减去相应数据量 
 
		
	
		
			
				buf - > data_len  - =  buf - > read_step ;  
		
	
		
			
				    buf - > read_step  = 0 ; 
 
		
	
		
			
				 
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -718,6 +722,7 @@ static char* ramDataRead(rbuf *buf, int size)
 
		
	
		
			
				 
		
	
		
			
				    if ( buf - > read  + size  >  buf - > end ) 
 
		
	
		
			
				    { 
 
		
	
		
			
				        // 如果本次读取长度超出限制,把开始位置的数据复制到末尾 
 
		
	
		
			
				len  =  size  -  ( buf - > end  -  buf - > read ) ;  
		
	
		
			
				        s  =  buf - > start ; 
 
		
	
		
			
				        p  =  buf - > end ; 
 
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -738,6 +743,7 @@ static int ramDeviceWrite(struct image_info *tb, rbuf* buf, int offset, int len)
 
		
	
		
			
				 
		
	
		
			
				    curOffset  =  offset ; 
 
		
	
		
			
				 
		
	
		
			
				    // 除了 imgEFUSE 分区,都是包含imgheader一起写入 
 
		
	
		
			
				if ( imgEFUSE  = =  tb - > type )  
		
	
		
			
				    { 
 
		
	
		
			
				        /* write all */ 
 
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -782,6 +788,7 @@ static int ramDeviceWrite(struct image_info *tb, rbuf* buf, int offset, int len)
 
		
	
		
			
				 
		
	
		
			
				        busy  =  0 ; 
 
		
	
		
			
				 
		
	
		
			
				        // 一次最多只写入一个page的数据 
 
		
	
		
			
				tmp  =  ( PAGE_PROGRAM_SIZE  < =  len )  ?  PAGE_PROGRAM_SIZE  :  len ;  
		
	
		
			
				 
		
	
		
			
				        if ( ( RAM_RBUF_DATA_LEN ( buf )  <  tmp ) ) 
 
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -799,6 +806,7 @@ static int ramDeviceWrite(struct image_info *tb, rbuf* buf, int offset, int len)
 
		
	
		
			
				    } 
 
		
	
		
			
				}  
		
	
		
			
				 
		
	
		
			
				// 把参数和值存入 param  
		
	
		
			
				static  int  ramParamGenerate ( dev_param_t  * param ,  const  char  * name ,  char  * value )  
		
	
		
			
				{  
		
	
		
			
				    int  len  =  iot_strlen ( name ) ; 
 
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -823,6 +831,8 @@ static int ramParamGenerate(dev_param_t *param, const char *name, char *value)
 
		
	
		
			
				    return  0 ; 
 
		
	
		
			
				}  
		
	
		
			
				 
		
	
		
			
				// 把参数存入全局变量  
		
	
		
			
				// 如果存在这个变量名则覆盖其值,如果不存在则添加  
		
	
		
			
				static  int  ramParamSetValue ( dev_param_t  * param )  
		
	
		
			
				{  
		
	
		
			
				    int  i ; 
 
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -846,6 +856,7 @@ static int ramParamSetValue(dev_param_t *param)
 
		
	
		
			
				    return  - 1 ; 
 
		
	
		
			
				}  
		
	
		
			
				 
		
	
		
			
				// 设置并保存参数到flash中  
		
	
		
			
				static  int  ramSaveDevParam ( const  char  * name ,  char  * value )  
		
	
		
			
				{  
		
	
		
			
				    int  i ; 
 
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -858,6 +869,7 @@ static int ramSaveDevParam(const char *name, char *value)
 
		
	
		
			
				 
		
	
		
			
				    iot_layout_get_part_offset ( PART_NUM_PARAM ,  & offset ) ; 
 
		
	
		
			
				 
		
	
		
			
				    // 从flash中读取参数存放到全局变量 
 
		
	
		
			
				for  ( i  =  0 ;  i  <  PARAM_MAX_LENGTH ;  i + + )  {  
		
	
		
			
				        os_mem_cpy ( dev_param ,  ( uint8_t * ) ( base + offset ) ,  sizeof ( dev_param_t ) ) ; 
 
		
	
		
			
				        if  ( dev_param - > end  ! =  PARAM_END_CHAR )  { 
 
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -877,6 +889,7 @@ static int ramSaveDevParam(const char *name, char *value)
 
		
	
		
			
				    flash_write_param . sw_mode  =  MOD_SW_MODE_DIS ; 
 
		
	
		
			
				    iot_layout_get_part_offset ( PART_NUM_PARAM ,  & offset ) ; 
 
		
	
		
			
				 
		
	
		
			
				    // 把参数写入flash 
 
		
	
		
			
				if  ( HAL_ERROR  ! =  
		
	
		
			
				        flash_write ( g_dev_param ,  offset ,  sizeof ( g_dev_param ) ,  & flash_write_param ) )  { //todo 
 
		
	
		
			
				return  - 1 ;  /* flash write error. */  
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -919,6 +932,7 @@ static int ramImageDecompressToFlash(int run_addr, int img_off)
 
		
	
		
			
				    } 
 
		
	
		
			
				    if  ( iot_imghdr_get_hdrVer ( & hdr )  = =  hdrVer_10 )  { 
 
		
	
		
			
				        /* kl3 compressed image contain of image header */ 
 
		
	
		
			
				        // 把原始bin的imgheader也压缩进去了,所以这里需要把imgheader的空间留出来 
 
		
	
		
			
				dst =  ( uint8_t * ) ( run_addr  -  HEADER_TOLTAL_SIZE ) ;  
		
	
		
			
				        if  ( ramImageDecompress ( src  +  HEADER_TOLTAL_SIZE ,  dst , 
 
		
	
		
			
				            iot_imghdr_get_imgSize ( & hdr ) )  ! =  0  )  { 
 
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -926,6 +940,7 @@ static int ramImageDecompressToFlash(int run_addr, int img_off)
 
		
	
		
			
				            ram_printf ( " \r \n fw image decompressed ERROR! \r \n " ) ; 
 
		
	
		
			
				            return  - 1 ; 
 
		
	
		
			
				        }  else  { 
 
		
	
		
			
				            // 校验解压后的img crc 
 
		
	
		
			
				img_header_construct ( & hdr ,  ( char * ) dst ) ;  
		
	
		
			
				            imgSize  =  iot_imghdr_get_imgSize ( & hdr ) ; 
 
		
	
		
			
				            imgSize  =  IMAGE_LEN_FOR_CRC ( imgSize ) ; 
 
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -938,6 +953,8 @@ static int ramImageDecompressToFlash(int run_addr, int img_off)
 
		
	
		
			
				            /* fw image decompressed into flash. */ 
 
		
	
		
			
				        } 
 
		
	
		
			
				    }  else  { 
 
		
	
		
			
				        // kunlun1的layout中只有一个run_addr,所以解压一定是解压到这个地址 
 
		
	
		
			
				// 这里获取这个地址  
		
	
		
			
				iot_layout_get_part_offset ( PART_NUM_RUN ,  ( uint32_t  * ) & run_addr ) ;  
		
	
		
			
				        run_addr  + =  base  +  HEADER_TOLTAL_SIZE ; 
 
		
	
		
			
				        /* unzip the firmware to run address for kl1/kl2 */ 
 
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -946,11 +963,15 @@ static int ramImageDecompressToFlash(int run_addr, int img_off)
 
		
	
		
			
				            /* fw image decompressed ERROR! */ 
 
		
	
		
			
				            return  - 1 ; 
 
		
	
		
			
				        }  else  { 
 
		
	
		
			
				            // 如果存在crc则这里校验一下crc 
 
		
	
		
			
				if  ( iot_imghdr_get_fwCRC ( & hdr )  ! =  0  )  {  
		
	
		
			
				                if  ( iot_getcrc32 ( dst ,  iot_imghdr_get_fwSize ( & hdr ) )  ! =  iot_imghdr_get_fwCRC ( & hdr ) )  { 
 
		
	
		
			
				                    /* fw crc error. */ 
 
		
	
		
			
				                    ram_printf ( " \r \n fw crc ERROR. \r \n " ) ; 
 
		
	
		
			
				                    return  - 1 ; 
 
		
	
		
			
				                } 
 
		
	
		
			
				            } else { 
 
		
	
		
			
				                ram_printf ( " \r \n fw CRC not found. \r \n " ) ; 
 
		
	
		
			
				            } 
 
		
	
		
			
				            /* fw image decompressed into flash. */ 
 
		
	
		
			
				        } 
 
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -1236,9 +1257,11 @@ static int ramDownloadPackage(void)
 
		
	
		
			
				 
		
	
		
			
				    xbuf . start  =  xbuf . read  =  xbuf . write  =  ( char  * ) ( RAM_SHA_IMAGE_ADDR ) ; 
 
		
	
		
			
				    /* Reserve more than PAGE_PROGRAM_SIZE & aligned with xmFRMTYPE_1K */ 
 
		
	
		
			
				    // 这里留足16k的余量,在数据截断的情况下,可以把start的数据直接复制到end而不会导致数组溢出 
 
		
	
		
			
				xbuf . end  =  xbuf . start  
		
	
		
			
				    +  ( ( RAM_SHA_BUFFER_LEN  -  PAGE_PROGRAM_SIZE )  /  xmFRMTYPE_16K )  *  xmFRMTYPE_16K ; 
 
		
	
		
			
				    xbuf . read_step  =  0 ; 
 
		
	
		
			
				    // xmodem 传输结束之后 xbuf.source_out_flag 会置位 
 
		
	
		
			
				xbuf . source_out_flag  = 0 ;  
		
	
		
			
				    xbuf . data_len  = 0 ; 
 
		
	
		
			
				 
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -1250,6 +1273,8 @@ static int ramDownloadPackage(void)
 
		
	
		
			
				            goto  ERROR_OUT ; 
 
		
	
		
			
				        } 
 
		
	
		
			
				 
		
	
		
			
				        // 传输结束的时候如果imgRemainSize比已接收的数据大,则发生了数据丢失 
 
		
	
		
			
				// 因为imgRemainSize会随着写入的进行逐渐减小,所以最后应该是0  
		
	
		
			
				if  ( ( RAM_RBUF_SOURCE_OUT ( & xbuf ) )  
		
	
		
			
				            & &  ( imgRemainSize  >  RAM_RBUF_DATA_LEN ( & xbuf ) ) )  { 
 
		
	
		
			
				            ram_error_no  | =  RAM_PKG_DATA_MISS_ERR ; 
 
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -1258,6 +1283,7 @@ static int ramDownloadPackage(void)
 
		
	
		
			
				        } 
 
		
	
		
			
				 
		
	
		
			
				        if  ( imgRemainSize )  { 
 
		
	
		
			
				            // offset是在后文 解析imgheader的时候指定的 
 
		
	
		
			
				curWrite  =  ramDeviceWrite  
		
	
		
			
				                ( & images [ imgNo  -  1 ] ,  & xbuf ,  offset ,  imgRemainSize ) ; 
 
		
	
		
			
				            if  ( - 1  = =  curWrite )  { 
 
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -1268,6 +1294,7 @@ static int ramDownloadPackage(void)
 
		
	
		
			
				            imgRemainSize  - =  curWrite ; 
 
		
	
		
			
				        }  else  { 
 
		
	
		
			
				            /* Search the next header */ 
 
		
	
		
			
				            // 每次读取一个imgheader的长度 
 
		
	
		
			
				while  ( NULL  ! =  ( pbuf  =  ramDataRead ( & xbuf ,  IMAGE_ALIGNED_SIZE ) ) )  {  
		
	
		
			
				                /* Check if it is image header. */ 
 
		
	
		
			
				                if  ( 0  = =  ramCheckImageHeader ( pbuf ) )  { 
 
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -1337,6 +1364,8 @@ static int ramDownloadPackage(void)
 
		
	
		
			
				                    } 
 
		
	
		
			
				 
		
	
		
			
				                    /* reload burn table */ 
 
		
	
		
			
				                    // 根据layout重新加载烧录地址,烧录地址写在ram_hw.c中,这个可以根据layout更新 
 
		
	
		
			
				// 对于fw来说,烧录地址和运行地址不同  
		
	
		
			
				if  ( ! reload_table_done_flag )  {  
		
	
		
			
				                        if  ( iot_imghdr_get_hdrVer ( & curHdr )  >  hdrVer_01 )  { 
 
		
	
		
			
				                            layout_index  =  iot_imghdr_get_layout_idx ( & curHdr ) ; 
 
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -1355,6 +1384,7 @@ static int ramDownloadPackage(void)
 
		
	
		
			
				                    } 
 
		
	
		
			
				 
		
	
		
			
				                    imgRemainSize  =  iot_imghdr_get_imgSize ( & curHdr ) ; 
 
		
	
		
			
				                    // imgSize 要32字节对齐 
 
		
	
		
			
				imgRemainSize  =  IMAGE_LEN_FOR_CRC ( imgRemainSize )  +  HEADER_TOLTAL_SIZE ;  
		
	
		
			
				                    packgeWrote  + =  imgRemainSize ; 
 
		
	
		
			
				                    toltalRecieved  + =  imgRemainSize ; 
 
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -1368,11 +1398,12 @@ static int ramDownloadPackage(void)
 
		
	
		
			
				                    images [ imgNo ] . zip_type  =  iot_imghdr_get_zipType ( & curHdr ) ; 
 
		
	
		
			
				                    images [ imgNo ] . run_offset  =  iot_imghdr_get_runAddr ( & curHdr ) ; 
 
		
	
		
			
				                    imgNo + + ; 
 
		
	
		
			
				 
		
	
		
			
				                    // 找到imgheader之后退出循环,开始数据写入 
 
		
	
		
			
				break ;  
		
	
		
			
				                } 
 
		
	
		
			
				                toltalRecieved  + =  IMAGE_ALIGNED_SIZE ; 
 
		
	
		
			
				 
		
	
		
			
				                // 接收了一个imgheader长度,能到这里来只能是pkgheader 
 
		
	
		
			
				if  ( toltalRecieved  = =  IMAGE_ALIGNED_SIZE )  {  
		
	
		
			
				                    pkg_hdr  =  ( iot_pkg_hdr_t * ) pbuf ; 
 
		
	
		
			
				                    if  ( IOT_MAGIC_NO  ! = 
 
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -1392,6 +1423,7 @@ static int ramDownloadPackage(void)
 
		
	
		
			
				                        ram_error_no  | =  RAM_IMAGE_MISMATCH_ERR ; 
 
		
	
		
			
				                        goto  ERROR_OUT ; 
 
		
	
		
			
				                    } 
 
		
	
		
			
				                // 接收了3个imgheader长度,是pkgheader 
 
		
	
		
			
				}  else  if  ( toltalRecieved  = =  3  *  IMAGE_ALIGNED_SIZE )  {  
		
	
		
			
				                    pkg_hdr_fw_type  =  pkg_hdr - > img_type ; 
 
		
	
		
			
				                    pkg_hdr_flash_size  =  ( pkg_hdr - > img_flag  > >  4 )  &  0x0F ; 
 
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -1523,10 +1555,12 @@ static int ramDownloadPackage(void)
 
		
	
		
			
				                    goto  ERROR_OUT ; 
 
		
	
		
			
				                } 
 
		
	
		
			
				                /* SP SHA256 stamp */ 
 
		
	
		
			
				                // 把sp复制倒share_addr 
 
		
	
		
			
				if  ( 0  ! =  ramImageCopy ( images [ offset ] . type ,  RAM_SHA_IMAGE_ADDR ) )  {  
		
	
		
			
				                    ram_error_no  | =  RAM_IMAGE_HEADER_ERR ; 
 
		
	
		
			
				                    goto  ERROR_OUT ; 
 
		
	
		
			
				                } 
 
		
	
		
			
				                // 这里好像是生成sha256 
 
		
	
		
			
				ramImageSecurityStamp ( RAM_SHA_IMAGE_ADDR ) ;  
		
	
		
			
				            }  else  if  ( imgEFUSE  = =  images [ offset ] . type )  { 
 
		
	
		
			
				                /* CRC before writing */ 
 
		
	
	
		
			
				
					
					
						
					 
				
			
			@@ -1548,6 +1582,8 @@ static int ramDownloadPackage(void)
 
		
	
		
			
				 
		
	
		
			
				        for  ( offset  =  0 ;  offset  <  imgNo ;  offset + + )  { 
 
		
	
		
			
				            /* compressed image that run in flash, need decompress */ 
 
		
	
		
			
				            // kunlun1中 imgType=imgCFRW1或imgCFRW4F 时需要解压 
 
		
	
		
			
				// kunlun3中 不局限于imgType 只要 zip_type不为0 以及指定了run_addr时 就需要解压  
		
	
		
			
				if  ( imgCFRW1  = =  images [ offset ] . type  | |  \ 
		
	
		
			
				                imgCFRW4F  = =  images [ offset ] . type  | |  \
 
		
	
		
			
				                ( ( images [ offset ] . zip_type  ! =  0 )  & &  FLASH_RUN_ADDR_CHECK ( images [ offset ] . run_offset ) ) )  {