Example #1
0
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;
}
Example #2
0
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

}
Example #3
0
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;
}