@@ -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 ) ) ) {