static BOOL SetupOtaParameters() { UINT32 addr; UINT32 len; // get unzip size; m_ota_info.uncompressed_len = (UINT32)get_unzip_size((UINT8 *)m_ota_info.compressed_addr); chunk_init(m_ota_info.uncompressed_addr,m_ota_info.uncompressed_len); if(!get_chuck_add_len(0x04FB0100, &addr, &len)) return FALSE; // find the firmware position m_ota_info.ota_fw_addr = m_ota_info.uncompressed_addr; m_ota_info.ota_fw_size = addr + len - m_ota_info.ota_fw_addr; // find ota.bin position. m_ota_info.ota_bin_addr = m_ota_info.ota_fw_addr + m_ota_info.ota_fw_size; m_ota_info.ota_bin_size = m_ota_info.uncompressed_len - m_ota_info.ota_fw_size; m_ota_info.ota_bin_sectors = m_ota_info.ota_bin_size/C_SECTOR_SIZE; if(len % C_SECTOR_SIZE) m_ota_info.ota_bin_sectors++; // calculate upgrade sectors. m_ota_info.ota_upg_addr = m_ota_info.ota_fw_addr + C_SECTOR_SIZE; //skip bootloader sector. m_ota_info.ota_upg_size = m_ota_info.ota_fw_size - len - C_SECTOR_SIZE; //skip bootloader and user_db m_ota_info.ota_upg_sectors = m_ota_info.ota_upg_size/C_SECTOR_SIZE; if(m_ota_info.ota_upg_size % C_SECTOR_SIZE) m_ota_info.ota_upg_sectors++; m_ota_info.update_secotrs_index = 0; #ifdef _BUILD_OTA_E_ m_ota_info.update_total_sectors = m_ota_info.ota_upg_sectors + \ m_ota_info.user_db_sectors; #else m_ota_info.update_total_sectors = m_ota_info.ota_upg_sectors + \ m_ota_info.ota_bin_sectors + m_ota_info.user_db_sectors; #endif // find ota_cfg chunk. chunk_init(m_ota_info.ota_bin_addr,m_ota_info.ota_bin_size); UINT32 chid = 0x15Fa0200; UINT8 *p = (UINT8*)chunk_goto(&chid, 0xFFFFFFFF, 1); if(p) { m_ota_info.ota_bin_cfg_addr = (UINT32)p; ota_save_parameter(p); } return TRUE; }
static BOOL SetupOtaParameters() { UINT32 addr,address; UINT32 len, lenth; #if 1 UINT32 chid_key = 0x07F80100; UINT32 chid_db = 0x04FB0100; UINT32 chid = 0x01FE0101; m_ota_info.uncompressed_len = (UINT32)get_unzip_size((UINT8 *)m_ota_info.compressed_addr); chunk_init(m_ota_info.uncompressed_addr,m_ota_info.uncompressed_len); if ((UINT8*)chunk_goto(&chid, 0xFFFFFFFF, 1) != NULL) { // get unzip size; if(!get_chuck_add_len(0x04FB0100, &addr, &len)) { OTA_PRINTF("--------get_chuck_add_len failed -------- \n"); return FALSE; } // find the firmware position m_ota_info.ota_fw_addr = m_ota_info.uncompressed_addr; m_ota_info.ota_fw_size = addr + len - m_ota_info.ota_fw_addr; // find ota.bin position. m_ota_info.ota_bin_addr = m_ota_info.ota_fw_addr + m_ota_info.ota_fw_size; m_ota_info.ota_bin_size = m_ota_info.uncompressed_len - m_ota_info.ota_fw_size; m_ota_info.ota_bin_sectors = m_ota_info.ota_bin_size/C_SECTOR_SIZE; if(len % C_SECTOR_SIZE) m_ota_info.ota_bin_sectors++; // calculate upgrade sectors. m_ota_info.ota_upg_addr = m_ota_info.ota_fw_addr + C_SECTOR_SIZE; //skip bootloader sector. m_ota_info.ota_upg_size = m_ota_info.ota_fw_size - len - C_SECTOR_SIZE; //skip bootloader and user_db m_ota_info.ota_upg_sectors = m_ota_info.ota_upg_size/C_SECTOR_SIZE; if(m_ota_info.ota_upg_size % C_SECTOR_SIZE) m_ota_info.ota_upg_sectors++; m_ota_info.update_secotrs_index = 0; #ifdef _BUILD_OTA_E_ m_ota_info.update_total_sectors = m_ota_info.ota_upg_sectors + \ m_ota_info.user_db_sectors; #else m_ota_info.update_total_sectors = m_ota_info.ota_upg_sectors + \ m_ota_info.ota_bin_sectors + m_ota_info.user_db_sectors; #endif // find ota_cfg chunk. chunk_init(m_ota_info.ota_bin_addr,m_ota_info.ota_bin_size); UINT32 chid = 0x15Fa0200; UINT8 *p = (UINT8*)chunk_goto(&chid, 0xFFFFFFFF, 1); if(p) { m_ota_info.ota_bin_cfg_addr = (UINT32)p; ota_save_parameter(p); } OTA_PRINTF("ota_bin_sectors1111111111 == %d \n", m_ota_info.ota_bin_sectors); OTA_PRINTF("ota_bin_size1111111111 == %d \n", m_ota_info.ota_bin_size); burning_flag = 1; return TRUE; } else { //key if( (UINT8*)chunk_goto(&chid_key, 0xFFFFFFFF, 1) != NULL && (UINT8*)chunk_goto(&chid_db, 0xFFFFFFFF, 1) == NULL) { m_ota_info.uncompressed_len = (UINT32)get_unzip_size((UINT8 *)m_ota_info.compressed_addr); chunk_init(m_ota_info.uncompressed_addr,m_ota_info.uncompressed_len); if(!get_chuck_add_len(0x07F80100, &addr, &len)) { OTA_PRINTF("--------get_chuck_add_len failed -------- \n"); return FALSE; } m_ota_info.ota_fw_addr = m_ota_info.uncompressed_addr; m_ota_info.ota_fw_size = addr + len - m_ota_info.ota_fw_addr; m_ota_info.ota_upg_addr = m_ota_info.ota_fw_addr + 0*C_SECTOR_SIZE; m_ota_info.ota_upg_size = len; m_ota_info.ota_upg_sectors = 1; m_ota_info.update_secotrs_index = 0; m_ota_info.update_total_sectors = 1 ; api_get_chuck_addlen(0x07F80100, &addr, &len); m_ota_info.ota_fw_size = addr/C_SECTOR_SIZE;//now ,ota_fw_size is key block num chunk_init(m_ota_info.ota_bin_addr,m_ota_info.ota_bin_size); UINT32 chid = 0x15Fa0200; UINT8 *p = (UINT8*)chunk_goto(&chid, 0xFFFFFFFF, 1); if(p) { m_ota_info.ota_bin_cfg_addr = (UINT32)p; ota_save_parameter(p); } OTA_PRINTF("ota_fw_size == 0x%08x \n", m_ota_info.ota_fw_size); OTA_PRINTF("ota_upg_addr1111111111 == 0x%08x \n", m_ota_info.ota_upg_addr); OTA_PRINTF("ota_upg_size1111111111 == 0x%08x \n", m_ota_info.ota_upg_size); OTA_PRINTF("ota_upg_sectors1111111111 == %d \n", m_ota_info.ota_upg_sectors); burning_flag = 2; return TRUE; } //db if( (UINT8*)chunk_goto(&chid_key, 0xFFFFFFFF, 1) == NULL && (UINT8*)chunk_goto(&chid_db, 0xFFFFFFFF, 1) != NULL) { //OTA_PRINTF("ttttttttttttt \n"); m_ota_info.uncompressed_len = (UINT32)get_unzip_size((UINT8 *)m_ota_info.compressed_addr); chunk_init(m_ota_info.uncompressed_addr,m_ota_info.uncompressed_len); if(!get_chuck_add_len(0x04FB0100, &addr, &len)) { return FALSE; } OTA_PRINTF("addr == 0x%08x \n", addr); OTA_PRINTF("len == 0x%08x \n", len); m_ota_info.ota_fw_addr = m_ota_info.uncompressed_addr; m_ota_info.ota_fw_size = addr + len - m_ota_info.ota_fw_addr; m_ota_info.ota_upg_addr = m_ota_info.ota_fw_addr; m_ota_info.ota_upg_size = m_ota_info.ota_fw_size; //m_ota_info.ota_upg_size = len; m_ota_info.ota_upg_sectors = m_ota_info.ota_upg_size/C_SECTOR_SIZE; //if(m_ota_info.ota_upg_size % C_SECTOR_SIZE) // m_ota_info.ota_upg_sectors++; m_ota_info.update_secotrs_index = 0; m_ota_info.update_total_sectors = m_ota_info.ota_upg_sectors ; chunk_init(m_ota_info.ota_bin_addr,m_ota_info.ota_bin_size); UINT32 chid = 0x15Fa0200; UINT8 *p = (UINT8*)chunk_goto(&chid, 0xFFFFFFFF, 1); if(p) { m_ota_info.ota_bin_cfg_addr = (UINT32)p; ota_save_parameter(p); } burning_2 =2; //OTA_PRINTF("burning_2 == %d \n", burning_2); OTA_PRINTF("ota_upg_addr1111111111 == 0x%08x \n", m_ota_info.ota_upg_addr); OTA_PRINTF("ota_upg_size1111111111 == 0x%08x \n", m_ota_info.ota_upg_size); OTA_PRINTF("ota_upg_sectors1111111111 == %d \n", m_ota_info.ota_upg_sectors); return TRUE; } //key + db if( (UINT8*)chunk_goto(&chid_key, 0xFFFFFFFF, 1) != NULL && (UINT8*)chunk_goto(&chid_db, 0xFFFFFFFF, 1) != NULL) { m_ota_info.uncompressed_len = (UINT32)get_unzip_size((UINT8 *)m_ota_info.compressed_addr); chunk_init(m_ota_info.uncompressed_addr,m_ota_info.uncompressed_len); if(!get_chuck_add_len(0x04FB0100, &addr, &len)) { return FALSE; } if(!get_chuck_add_len(0x07F80100, &address, &lenth)) { return FALSE; } m_ota_info.ota_fw_addr = m_ota_info.uncompressed_addr; m_ota_info.ota_fw_size = lenth; m_ota_info.ota_upg_addr = m_ota_info.ota_fw_addr; m_ota_info.ota_upg_size = lenth; m_ota_info.ota_upg_sectors = 1; //if(m_ota_info.ota_upg_size % C_SECTOR_SIZE) // m_ota_info.ota_upg_sectors++; //m_ota_info.ota_fw_addr2 = m_ota_info.uncompressed_addr; m_ota_info.ota_fw_size2 = len; m_ota_info.ota_upg_addr2 = addr; m_ota_info.ota_upg_size2 = len; m_ota_info.ota_upg_sectors2 = m_ota_info.ota_upg_size2/C_SECTOR_SIZE; if(m_ota_info.ota_upg_size2 % C_SECTOR_SIZE) m_ota_info.ota_upg_sectors2++; m_ota_info.update_secotrs_index = 0; m_ota_info.update_total_sectors = m_ota_info.ota_upg_sectors +m_ota_info.ota_upg_sectors2 ; api_get_chuck_addlen(0x07F80100, &address, &lenth); m_ota_info.ota_fw_size = address/C_SECTOR_SIZE;//now ,ota_fw_size is key block num chunk_init(m_ota_info.ota_bin_addr,m_ota_info.ota_bin_size); UINT32 chid = 0x15Fa0200; UINT8 *p = (UINT8*)chunk_goto(&chid, 0xFFFFFFFF, 1); if(p) { m_ota_info.ota_bin_cfg_addr = (UINT32)p; ota_save_parameter(p); } OTA_PRINTF("ota_fw_addr == 0x%08x \n", m_ota_info.ota_fw_addr); OTA_PRINTF("ota_fw_size1111111111 == 0x%08x \n", m_ota_info.ota_fw_size); OTA_PRINTF("ota_upg_addr1111111111 == 0x%08x \n", m_ota_info.ota_upg_addr); OTA_PRINTF("ota_upg_size1111111111 == 0x%08x \n", m_ota_info.ota_upg_size); OTA_PRINTF("ota_upg_sectors1111111111 == %d \n", m_ota_info.ota_upg_sectors); OTA_PRINTF("ota_upg_addr2 == 0x%08x \n", m_ota_info.ota_upg_addr2); OTA_PRINTF("ota_upg_size2 == 0x%08x \n", m_ota_info.ota_upg_size2); OTA_PRINTF("ota_upg_sectors2 == %d \n", m_ota_info.ota_upg_sectors2); burning_flag = 3 ; return TRUE; } } #else // get unzip size; m_ota_info.uncompressed_len = (UINT32)get_unzip_size((UINT8 *)m_ota_info.compressed_addr); chunk_init(m_ota_info.uncompressed_addr,m_ota_info.uncompressed_len); if(!get_chuck_add_len(0x04FB0100, &addr, &len)) { OTA_PRINTF("--------get_chuck_add_len failed -------- \n"); return FALSE; } // find the firmware position m_ota_info.ota_fw_addr = m_ota_info.uncompressed_addr; m_ota_info.ota_fw_size = addr + len - m_ota_info.ota_fw_addr; // find ota.bin position. m_ota_info.ota_bin_addr = m_ota_info.ota_fw_addr + m_ota_info.ota_fw_size; m_ota_info.ota_bin_size = m_ota_info.uncompressed_len - m_ota_info.ota_fw_size; m_ota_info.ota_bin_sectors = m_ota_info.ota_bin_size/C_SECTOR_SIZE; if(len % C_SECTOR_SIZE) m_ota_info.ota_bin_sectors++; // calculate upgrade sectors. m_ota_info.ota_upg_addr = m_ota_info.ota_fw_addr + C_SECTOR_SIZE; //skip bootloader sector. m_ota_info.ota_upg_size = m_ota_info.ota_fw_size - len - C_SECTOR_SIZE; //skip bootloader and user_db m_ota_info.ota_upg_sectors = m_ota_info.ota_upg_size/C_SECTOR_SIZE; if(m_ota_info.ota_upg_size % C_SECTOR_SIZE) m_ota_info.ota_upg_sectors++; m_ota_info.update_secotrs_index = 0; #ifdef _BUILD_OTA_E_ m_ota_info.update_total_sectors = m_ota_info.ota_upg_sectors + \ m_ota_info.user_db_sectors; #else m_ota_info.update_total_sectors = m_ota_info.ota_upg_sectors + \ m_ota_info.ota_bin_sectors + m_ota_info.user_db_sectors; #endif // find ota_cfg chunk. chunk_init(m_ota_info.ota_bin_addr,m_ota_info.ota_bin_size); UINT32 chid = 0x15Fa0200; UINT8 *p = (UINT8*)chunk_goto(&chid, 0xFFFFFFFF, 1); if(p) { m_ota_info.ota_bin_cfg_addr = (UINT32)p; ota_save_parameter(p); } OTA_PRINTF("ota_bin_sectors1111111111 == %d \n", m_ota_info.ota_bin_sectors); OTA_PRINTF("ota_bin_size1111111111 == %d \n", m_ota_info.ota_bin_size); return TRUE; #endif }
int un7zip(unsigned char *in, unsigned int in_size, unsigned char *buf, unsigned int buf_size, unsigned char *out, unsigned int out_size, UN7ZIP_OUT_CALLBACK outCallback) { unsigned int lzmaInternalSize, dictSize; int lc, lp, pb; unsigned int nowPos, unzipSize, outSizeProcessed; int ret; // 1) Read first byte of properties for LZMA compressed stream, // check that it has correct value and calculate three // LZMA property variables: unsigned char prop0 = in[0]; if(prop0 >= ( 9 * 5 * 5)) { //PRINTF("properties error\n"); return LZMA_RESULT_DATA_ERROR; } for(pb = 0; prop0 >= (9 * 5); pb++, prop0 -= (9 * 5)); for(lp = 0; prop0 >= 9; lp++, prop0 -= 9); lc = prop0; // 2) Calculate required amount for LZMA lzmaInternalSize: lzmaInternalSize = (UNZIP_BASE_SIZE + (UNZIP_LIT_SIZE << (lc + lp))) * sizeof(unsigned short) + 100; if(lzmaInternalSize > buf_size) return LZMA_RESULT_NOT_ENOUGH_MEM; // 3) Get decompressed data dictionary size: dictSize = get_dictionary_size(in); if(dictSize > m_dict_size) return LZMA_RESULT_NOT_ENOUGH_MEM; unzipSize = get_unzip_size(in); if(!outCallback && unzipSize > out_size) return LZMA_RESULT_NOT_ENOUGH_MEM; // 4) Init decoder ret = LzmaDecoderInit(buf, lzmaInternalSize, lc, lp, pb, m_dict_buffer, dictSize, in+13, in_size-13); if(ret != LZMA_RESULT_OK) return ret; // 4) Decompress data: for(nowPos=0; nowPos<unzipSize; nowPos+=outSizeProcessed) { UInt32 blockSize = unzipSize - nowPos; if(blockSize > out_size) blockSize = out_size; ret = LzmaDecode(buf, out, blockSize, &outSizeProcessed); if(ret != LZMA_RESULT_OK || !outSizeProcessed) break; if(outCallback) { out_size = outSizeProcessed; if(outCallback(&out, &out_size)) break; } } if(!ret) { for(lc=0; lc<(int)sizeof(unsigned int); lc++) buf[lc] = ((unsigned char *)&nowPos)[lc]; } return ret; }