Ejemplo n.º 1
0
/*---------------------------------------------------------- * 
* func name: get_system_version_info() 
* function : 得到当前系统的软件相关版本信息. 存放于systemversion
* calllist : sto_chunk_count() 
*            sto_chunk_goto()
*            sto_get_chunk_header()
*
* calledlist:  
* input    :  
* output   :  
* parameter: 无
* 			 
* return   : 0  获取内存失败
* 			 block_number  版本信息数目
* 			 
* 	 
* 
* notice   : systemversion内存要注意释放
*--------------------------------------------------------*/
unsigned int get_system_version_info(void)
{
    int    i = 0;
    UINT32 id;
    UINT32 mask;
    
    block_number = sto_chunk_count(0,0);
    if(0 == block_number)
        return 0;
    systemversion = (CHUNK_HEADER*)MALLOC(sizeof(CHUNK_HEADER)*block_number);
    if(NULL == systemversion)
    {
        libc_printf("Get Memorey fialed!!\n");
        return -1;
    }
    //bootloader, maincode,seecode,Radioback,Radiobg,cccam_prio,softcamkey
    //cccam_newcamd,defaultdb,userdb
    for(i = 0; i<block_number; i++)
    {
        id = mask = 0;
		sto_chunk_goto(&id,mask,i+1);
		sto_get_chunk_header(id, systemversion+i);
    }
    return block_number;
}
Ejemplo n.º 2
0
UINT8 gyca_mail_init(void)
{
	UINT32 chunk_id = CAS_MAIL_CHUNK_ID;
	CHUNK_HEADER chuck_hdr;

	/* get table info base addr by using chunk */
	if(sto_get_chunk_header(chunk_id, &chuck_hdr) == 0)
	{
		GYCAS_PRINTF("Err: %s get chunk header fail!\n", __FUNCTION__);
		return 1;
	}
	gyca_email_mutex = osal_mutex_create();
	if(gyca_email_mutex == OSAL_INVALID_ID)
	{
		GYCAS_PRINTF("Err: %s create mutex failed!\n", __FUNCTION__); 
	}
	gyca_email_start_addr = sto_chunk_goto(&chunk_id, 0xFFFFFFFF, 1) + CHUNK_HEADER_SIZE + SECTOR_SIZE;
	if(!gyca_check_flash_mail_head(gyca_email_start_addr))
		gyca_readmail_all_from_flash(gyca_email_start_addr, GYCA_MAIL_HEAD_SIZE);
	else
	{
		MEMSET(flashbuf, 0, sizeof(flashbuf));
		//gyca_mail_test();
		//gyca_delmail_all_flash(gyca_email_start_addr);
		//gyca_writemaill_all_to_flash(gyca_email_start_addr, GYCA_MAIL_HEAD_SIZE);
	}

}
Ejemplo n.º 3
0
static RET_CODE find_key(UINT32 type, unsigned long *paddr, CIPLUS_KEY_HDR *phdr)
{
	unsigned long addr, chunk_end;
	UINT32 chunk_len;
	UINT32 ch_id = CIPLUSKEY_CHUNK_ID;

	addr = sto_chunk_goto(&ch_id, 0xFFFFFFFF, 1);
    	if(addr & 0x80000000) 
		return RET_FAILURE;

	chunk_len = sto_fetch_long(addr + CHUNK_LENGTH);

	chunk_end = addr +16 + chunk_len;

	addr += CHUNK_HEADER_SIZE;

	while(addr < chunk_end)
	{

		phdr->type = sto_fetch_long(addr);
		phdr->len = sto_fetch_long(addr+4);
		if(phdr->type == type)
		{
			*paddr = addr+sizeof(CIPLUS_KEY_HDR);
			phdr->size = sto_fetch_long(addr+8);
			//phdr->reserved = sto_fetch_long(addr+12);
			return RET_SUCCESS;
		}
		addr += phdr->len;
	}

	return RET_FAILURE;
}
Ejemplo n.º 4
0
static INT32 command_transfer (INT32 index, void (*callback)(INT32 type, INT32 process, UINT8 *str))
{
	UINT32 id,transLen=0;
	UINT32 chunk_pos;
	BYTE *p = NULL;
	char strTmp[30];
	struct sto_device* sto_dev = NULL;

	id = pblock_list[index].id;
	chunk_pos = sto_chunk_goto(&id, 0xFFFFFFFF, 1);

	transLen = sto_fetch_long(chunk_pos + CHUNK_OFFSET);
	if(transLen == 0)
		transLen = sto_fetch_long(chunk_pos + CHUNK_LENGTH) + 16;

	if (chunk_pos == (UINT32)ERR_PARA || chunk_pos == (UINT32)ERR_FAILUE)
	{
		ComUniStrToAsc((UINT8 *)OSD_GetUnicodeString(RS_ERROR_601),strTmp);
		callback(2,0,strTmp);
		return !SUCCESS;
	}

	p = ((unsigned char *)FLASH_BASE) + chunk_pos;
	
	
	return (INT32)cmd_transfer(p, transLen, UpgradeProgress, get_exit_key);
}
Ejemplo n.º 5
0
 HRESULT DVTSTBCA_GetDataBufferAddr(long * lSize, char ** ppStartAddr)
{
	UINT32 chunk_id = CAS_CHUNK_ID;
	CHUNK_HEADER chuck_hdr;
	struct sto_device *sto_flash_dev = NULL;

	/* get table info base addr by using chunk */
	if(sto_get_chunk_header(chunk_id, &chuck_hdr) == 0)
	{
		CAS_NVMERR_PRINTF("Err: %s get chunk header fail!\n", __FUNCTION__);
		return CAS_FAIL;
	}
	
	CAS_flash_start_addr = sto_chunk_goto(&chunk_id, 0xFFFFFFFF, 1);
	CAS_flash_start_addr += CHUNK_HEADER_SIZE;
	
	*ppStartAddr = (UINT8 *)CAS_flash_start_addr;
	*lSize = CAS_FLASH_MAXSIZE;//CAS_CHUNK_SIZE/2;

	if (NULL == cas_flash_buff)
		cas_flash_buff = MALLOC(*lSize);
	if (NULL == cas_flash_buff)
		return CAS_FAIL;

	//copy the CA flash data to mem
	sto_flash_dev = (struct sto_device *)dev_get_by_type(NULL, HLD_DEV_TYPE_STO);
	if(NULL == sto_flash_dev)
	{
		CAS_NVMERR_PRINTF("TFSTBCA_WriteBuffer: dev_get_by_name failed!\n");
		return CAS_FAIL;
	}
	if (sto_open(sto_flash_dev) != SUCCESS)
	{
		CAS_NVMERR_PRINTF("%s: sto_open failed!\n", __FUNCTION__);
		return CAS_FAIL;
	}
	if( (INT32) CAS_flash_start_addr  != sto_lseek(sto_flash_dev, (INT32) CAS_flash_start_addr, STO_LSEEK_SET))
	{
		CAS_NVMERR_PRINTF("%s: lseek failed!\n", __FUNCTION__);
		return CAS_FAIL;
	}
	if (CAS_FLASH_MAXSIZE  != sto_read(sto_flash_dev, cas_flash_buff, CAS_FLASH_MAXSIZE))
	{
		CAS_NVMERR_PRINTF("%s: sto_read failed!\n", __FUNCTION__);
		return CAS_FAIL;
	}
		
	CAS_NVM_PRINTF("%s: flash StartAddr=%08x, Len:%08x\n", __FUNCTION__, *ppStartAddr, *lSize);
	return CAS_SUCCESS;
}
Ejemplo n.º 6
0
void clear_ca_data()
{
	INT32 ret;
	struct sto_device *sto_flash_dev;
	UINT32 param;
	UINT32 flash_cmd;
	CHUNK_HEADER chuck_hdr;
	UINT32 chunk_id = 0x08F70100;	

	ret = sto_get_chunk_header(chunk_id, &chuck_hdr);
	if (ret == 0)
	{
		libc_printf("%s(): CHUNK ID not found\n",__FUNCTION__,chunk_id);
		return;
	}
	
	sto_flash_dev = (struct sto_device *)dev_get_by_type(NULL, HLD_DEV_TYPE_STO);
	if(sto_flash_dev == NULL)
	{
		libc_printf("STBCA_WriteBuffer: dev_get_by_name failed!\n");
		return;
	}
	if (sto_open(sto_flash_dev) != SUCCESS)
	{
		libc_printf("STBCA_WriteBuffer: sto_open failed!\n");
		return;
	}
	

	UINT32 tmp_param[2];
	tmp_param[0] = (UINT32)sto_chunk_goto(&chunk_id, 0xFFFFFFFF, 1) + CHUNK_HEADER_SIZE;;
	tmp_param[1] = 0x20000 >> 10;
	param = (UINT32)tmp_param;
	flash_cmd = STO_DRIVER_SECTOR_ERASE_EXT;
	ret = sto_io_control(sto_flash_dev, flash_cmd, param);

	if(ret != SUCCESS)
	{
		libc_printf("STBCA_WriteBuffer: Erase failed!\n");
		return;
	}

}
Ejemplo n.º 7
0
UINT32 GetChunk(BYTE *buffer, UINT32 nLen)
{
	UINT8 *p, *pblock;
	UINT32 chunk_pos;
	struct sto_device *sto_dev = NULL;
	UINT8 sVer[16], hVer[16];
	INT32 i = 0;
	char strTmp[30];
#if (defined HDCP_IN_FLASH ||defined DIVX_CERT_ENABLE)
	INT32 temp_slave_blocks_number=0;
	CHUNK_HEADER *temp_pslave_list = NULL;
#endif
	
	switch((unsigned int)buffer[0])
	{
		case 1:
		case 2:
		case 7:
		case 10:
			slave_Flash_type = 0x80000;	//flash size
			break;
		case 3:
		case 4:
		case 8:
		case 9:
		case 11:
		case 13:
			slave_Flash_type = 0x100000;
			break;
		case 5:
		case 6:
		case 12:
		case 14:
		case 15:
		case 16:
		case 25:
		case 28:
		case 30:
			slave_Flash_type = 0x200000;
			break;
		case 17:
		case 18:
		case 19:
		case 33:
			slave_Flash_type = 0x400000;
			break;
		default:
			slave_Flash_type = 0x200000;/*For unkown flash type,default is 2M*/
			//return !SUCCESS;
	}

	slave_status = (unsigned int)buffer[1];
	if(slave_status==0)
		slave_blocks_number = (nLen -2)/CHUNK_HEADER_SIZE;
	else
		slave_blocks_number = 1;

	pslave_list= (CHUNK_HEADER *)MALLOC(sizeof(CHUNK_HEADER)*slave_blocks_number);
	if (pslave_list == NULL)
		return !SUCCESS;
	MEMSET((void *)pslave_list,0,sizeof(CHUNK_HEADER)*slave_blocks_number);

#if (defined HDCP_IN_FLASH ||defined DIVX_CERT_ENABLE)
#ifdef  HDCP_IN_FLASH
	if(m_allcode_include_bootloader==0)
#endif		
		{
			temp_pslave_list= (CHUNK_HEADER *)MALLOC(sizeof(CHUNK_HEADER)*slave_blocks_number);
			if (temp_pslave_list == NULL)
				return !SUCCESS;
			MEMSET((void *)temp_pslave_list,0,sizeof(CHUNK_HEADER)*slave_blocks_number);
		}
#endif

	pblock = &buffer[2];
	for(i=0; i<slave_blocks_number; i++)
	{
		p = pblock + CHUNK_ID;
		pslave_list[i].id = (*p<<24)+(*(p+1)<<16)+(*(p+2)<<8)+(*(p+3)<<0);

		p = pblock + CHUNK_LENGTH;
		pslave_list[i].len = (*p<<24)+(*(p+1)<<16)+(*(p+2)<<8)+(*(p+3)<<0);

		p = pblock + CHUNK_OFFSET;
		pslave_list[i].offset = (*p<<24)+(*(p+1)<<16)+(*(p+2)<<8)+(*(p+3)<<0);

		p = pblock + CHUNK_CRC;
		pslave_list[i].crc = (*p<<24)+(*(p+1)<<16)+(*(p+2)<<8)+(*(p+3)<<0);

		p = pblock + CHUNK_NAME;
		STRCPY((char *)pslave_list[i].name, (char *)p);

		p = pblock + CHUNK_VERSION;
		STRCPY((char *)pslave_list[i].version, (char *)p);

		p = pblock + CHUNK_TIME;
		STRCPY((char *)pslave_list[i].time, (char *)p);

#if (defined HDCP_IN_FLASH ||defined DIVX_CERT_ENABLE)
#ifdef HDCP_IN_FLASH
		if(m_allcode_include_bootloader==0)
#endif		
		{
			UINT32 special_type = 0;

#ifdef HDCP_IN_FLASH		
			if(pslave_list[i].id == HDCPKEY_CHUNK_ID)
			{
				special_type =1;
			}
#endif			
#ifdef DIVX_CERT_ENABLE		
			if(pslave_list[i].id == DIVX_CHUCK_ID)
			{
				special_type =1;
			}
#endif			
			if(special_type!=1)
			{
				MEMCPY((temp_pslave_list+temp_slave_blocks_number),(pslave_list+i),sizeof(CHUNK_HEADER));
				temp_slave_blocks_number++;			
			}
			else
			{ 
				if(i > 0)
				{
					temp_pslave_list[i-1].offset=(temp_pslave_list[i-1].offset+pslave_list[i].offset);
				}
			}
		}
#endif

		pblock += CHUNK_HEADER_SIZE;
	}

#if (defined HDCP_IN_FLASH ||defined DIVX_CERT_ENABLE)
#ifdef  HDCP_IN_FLASH
		if(m_allcode_include_bootloader==0)
#endif		
		{
			FREE(pslave_list);
			slave_blocks_number=temp_slave_blocks_number;
			pslave_list = (CHUNK_HEADER *)MALLOC(sizeof(CHUNK_HEADER)*slave_blocks_number);
			MEMCPY(pslave_list,temp_pslave_list,sizeof(CHUNK_HEADER)*slave_blocks_number);
			FREE(temp_pslave_list);
		}
#endif


	STRCPY(sVer, pslave_list[0].version);
	chunk_pos = sto_chunk_goto(&pblock_list[0].id, 0xFFFFFFFF, 1);
	sto_dev = (struct sto_device*)dev_get_by_id(HLD_DEV_TYPE_STO, 0);
	sto_open(sto_dev);
	sto_lseek(sto_dev, chunk_pos+CHUNK_VERSION, STO_LSEEK_SET);
	sto_read(sto_dev, hVer, 16);
	//sto_close(sto_dev);

#ifdef FORCE_UPGRADE_OLD_PROTOCOL_BOOTLOADER
	if(g_protocol_version < NEW_PROTOCOL_VERSION)
		return SUCCESS;
#endif
	if(CheckVersion(sVer, hVer) != SUCCESS)
	{
		ComUniStrToAsc((UINT8 *)OSD_GetUnicodeString(RS_STB_VERSION_NOT_COMPATIBLE),strTmp);
		callback_fun(2,0,strTmp);
		return !SUCCESS;
	}
}
Ejemplo n.º 8
0
static INT32 SlaveReorg(void (*callback)(INT32 type, INT32 process, UINT8 *str))
{
	UINT32 len,offset;
//	UINT8* p;
	UINT32 chunk_pos;
	INT32 i,j; 
	BOOL all_upg_flag = TRUE;
	char strTmp[30];
	char strTmp1[30];
#ifdef FORCE_UPGRADE_OLD_PROTOCOL_BOOTLOADER
	BOOL force_upgrade = FALSE;
#endif

	slave_reorg_size = 0;
	slave_burn_size = 0;

#ifdef FORCE_UPGRADE_OLD_PROTOCOL_BOOTLOADER
	// if upgrade protocol version is old protocol version 
	// and upgrade chunk include maincode or second loader
	// force upgrade bootloader
	if(g_protocol_version < NEW_PROTOCOL_VERSION)
	{
		for(i=1; i<block_number; i++)
		{
			if(pblock_list[i].upg_flag && 
				(((pblock_list[i].id & 0xFFFF0000) == 0x01FE0000)
				|| ((pblock_list[i].id & 0xFFFF0000) == 0x00FF0000)))
			{
				force_upgrade = TRUE;
				break;
			}
		}
		if(force_upgrade)
			pblock_list[0].upg_flag = 1;
	}

#endif

	for(i=1; i<block_number; i++)
	{
		if(pblock_list[i].upg_flag != 1)
		{
			all_upg_flag = FALSE;
			break;
		}
	}
	if((block_number != slave_blocks_number) && (!all_upg_flag))
	{
		return !SUCCESS;
	}
	if(all_upg_flag)
	{
		slave_reorg_number = block_number;

		pslave_reorg_list = (CHUNK_LIST2 *)MALLOC(sizeof(CHUNK_LIST2)*slave_reorg_number);
		if(pslave_reorg_list == NULL) return !SUCCESS;

		chunk_pos = sto_chunk_goto(&pblock_list[0].id, 0xFFFFFFFF, 1);
		offset = sto_fetch_long(chunk_pos + CHUNK_OFFSET);

		pslave_reorg_list[0].type = 1;  //move
		pslave_reorg_list[0].index= 0;
		pslave_reorg_list[0].offset = offset;

		for(i=1; i<block_number; i++)
		{
			chunk_pos = sto_chunk_goto(&pblock_list[i].id, 0xFFFFFFFF, 1);
			offset = sto_fetch_long(chunk_pos + CHUNK_OFFSET);
			pslave_reorg_list[i].type = 2;  //transfer
			pslave_reorg_list[i].index= i;
			pslave_reorg_list[i].offset = offset;
		}
	}
	else
	{
		slave_reorg_number = slave_blocks_number;
		for(i=1; i<block_number; i++)
		{
			if(pblock_list[i].upg_flag)
			{
				if(IsInSlave(pblock_list[i].id) != SUCCESS)
				{	
					return !SUCCESS;//slave_reorg_number++;   //add chunk
				}
			}
			else
			{
				if(slave_status != 0)
				{
					ComUniStrToAsc((UINT8 *)OSD_GetUnicodeString(RS_SLAVEDATA_DESTROY_UPDATE_ALLCODE),strTmp);
					callback(2,0,strTmp);
					return !SUCCESS;
				}
			}
		}

		pslave_reorg_list = (CHUNK_LIST2 *)MALLOC(sizeof(CHUNK_LIST2)*slave_reorg_number);
		if(pslave_reorg_list == NULL) return !SUCCESS;

		/*init pslave_reorg_list*/
		for(i=0; i<slave_reorg_number; i++)
		{
			pslave_reorg_list[i].type = 1;  //move chunk
			pslave_reorg_list[i].index= i;
			pslave_reorg_list[i].offset = pslave_list[i].offset;
		}

		for(i=1; i<block_number; i++)
		{
			if(pblock_list[i].upg_flag)
			{
				chunk_pos = sto_chunk_goto(&pblock_list[i].id, 0xFFFFFFFF, 1);
				offset = sto_fetch_long(chunk_pos + CHUNK_OFFSET);

				/*replace chunk*/
				for(j=0; j<slave_blocks_number; j++)
				{
					if(pslave_reorg_list[j].type == 1 && pslave_list[pslave_reorg_list[j].index].id == pblock_list[i].id)
					{
	                /*
	                //frank disnable
#if (SYS_CHIP_MODULE == ALI_M3327C && SYS_SDRAM_SIZE == 2)
						if(ID_TYPE(pblock_list[i].id)!=TEMPDB_ID || slave_status!=0)
#endif
	                */
						{
							pslave_reorg_list[j].type = 2;  //transfer
							pslave_reorg_list[j].index= i;
							pslave_reorg_list[j].offset = offset;
						}
						break;
					}
				}
			}
		}
	}
	/*upgrade bootloader*/
	if(((IsUpgBootloader(pslave_list[0].version)==SUCCESS) || m_allcode_include_bootloader) && (pblock_list[0].upg_flag==1))
	{
		chunk_pos = sto_chunk_goto(&pblock_list[0].id, 0xFFFFFFFF, 1);
		offset = sto_fetch_long(chunk_pos + CHUNK_OFFSET);

		pslave_reorg_list[0].type = 2;  //transfer
		pslave_reorg_list[0].index= 0;
		pslave_reorg_list[0].offset = offset;

		slave_reorg_size += offset;
		slave_burn_size += offset;
	}

	for(i=1; i<slave_reorg_number; i++)
	{
		if(pslave_reorg_list[i].type  == 1) //move
		{
            // Jie Wu, disable below line to let the progress bar move smoothly.
			//slave_reorg_size += pslave_list[pslave_reorg_list[i].index].len+16;
			if(pslave_reorg_list[i].offset == 0)
				slave_burn_size += pslave_list[pslave_reorg_list[i].index].len+16;
			else
				slave_burn_size += pslave_reorg_list[i].offset;
		}
		else //transfer
		{
			chunk_pos = sto_chunk_goto(&pblock_list[pslave_reorg_list[i].index].id, 0xFFFFFFFF, 1);
			len = sto_fetch_long(chunk_pos + CHUNK_OFFSET);
			if(len == 0)
				len = sto_fetch_long(chunk_pos + CHUNK_LENGTH) + 16;
			slave_reorg_size += len;

			if(pslave_reorg_list[i].offset == 0)
				slave_burn_size += len ;
			else
				slave_burn_size += pslave_reorg_list[i].offset;
		}
	}

	if(pslave_reorg_list[0].type == 2)  //transfer bootloader
	{
		if(slave_burn_size > slave_Flash_type)
		{
			ComUniStrToAsc((UINT8 *)OSD_GetUnicodeString(RS_UPDATE_DATE_LARGE_FAILED),strTmp1);
			callback(2,0,strTmp1);
			return !SUCCESS;
		}
	}
	else
	{
		if(pslave_list[0].offset+slave_burn_size > slave_Flash_type)
		{
			ComUniStrToAsc((UINT8 *)OSD_GetUnicodeString(RS_UPDATE_DATE_LARGE_FAILED),strTmp1);
			callback(2,0,strTmp1);
			return !SUCCESS;
		}
	}
	return SUCCESS;
}
Ejemplo n.º 9
0
static BOOL init_slave()
{
    UINT8 *ptr_data_buf, *ptr_temp_buf;
    UINT32 ptr_zip_pos;
    UINT8 zero_buf[16];
    UINT32 slave_addr;
    UINT32 total_len, len, chid;
    int ret;
    UINT32 i;
    char strTmp[30];
    char strTmp1[30];

	ComUniStrToAsc((UINT8 *)OSD_GetUnicodeString(RS_INIT_SLAVER),strTmp);
    callback_fun(2, 0, strTmp);
    P2PUPG_DBG("init_slave\n");

//     init slave sdram
    for(i=0; i<sizeof(m_SlaveConfig)/sizeof(m_SlaveConfig[0]); i++)
    {
        osal_task_sleep(50);
//        if(0xb8000029 == m_SlaveConfig[i].Address)
//        {
//		if(sys_ic_is_M3101())
//			m_SlaveConfig[i].Data = *((volatile UINT8 *)m_SlaveConfig[i].Address) & 0x07;
//		else
//			m_SlaveConfig[i].Data = *((volatile UINT8 *)m_SlaveConfig[i].Address) & 0x1c;
//        }
        erom_wm(m_SlaveConfig[i].Address, &m_SlaveConfig[i].Data, 1, 0);
    }

//     set upgrade param
    init_upgrade_param();
    for(i=0; i<sizeof(EROM_UPGRADE_PARAM); i+=sizeof(UINT32))
    {
        if(!send_upgrade_param(i))
        {
        	ComUniStrToAsc((UINT8 *)OSD_GetUnicodeString(RS_SEND_UPGRADE_PARAM_FAILED),strTmp1);
            callback_fun(2, 0,strTmp1);
            return FALSE;
        }
            

    }
    P2PUPG_DBG("send_upgrade_param OK\n");

    unsigned long chunk_id = g_upge_feature_config.chip_flashwr;
    ptr_zip_pos = (UINT8 *)sto_chunk_goto(&chunk_id, 0xFFFFFFFF, 1);
    unsigned long zip_size = sto_fetch_long(ptr_zip_pos + CHUNK_LENGTH);
    ptr_zip_pos += CHUNK_HEADER_SIZE;
    ptr_data_buf = (UINT8 *)bk_buff;   // 48KB for unzip buffer
    ptr_temp_buf = (UINT8 *)(bk_buff + 0xC000);    // 16KB for temp buffer
    P2PUPG_DBG("ptr_zip_pos = 0x%x\n ptr_data_buf = 0x%x\n ptr_temp_buf = 0x%x\n",ptr_zip_pos,ptr_data_buf,ptr_temp_buf);
    if(g_upge_feature_config.enable_lzma_out_read == TRUE)
        ret = un7zip(ptr_zip_pos+SYS_FLASH_BASE_ADDR, zip_size, ptr_temp_buf, 0x4000, ptr_data_buf, 0xC000, NULL);
    else
        ret = un7zip(ptr_zip_pos+SYS_FLASH_BASE_ADDR, ptr_data_buf, ptr_temp_buf);
    P2PUPG_DBG("un7zip ret=%d\n",ret);
    if(ret)
        return FALSE;
    P2PUPG_DBG("un7zip OK");
    MEMCPY(&total_len, ptr_temp_buf, sizeof(unsigned int));
    P2PUPG_DBG("total_len =%d\n",total_len);

    uart_high_speed_config(UART_SPEED_NORMAL);
    // download flashwr
    erom_download(FLASHWR_RUN_ADDR, ptr_data_buf, total_len);
    // init slave config buffer
        P2PUPG_DBG("erom_download1 OK\n");

    MEMSET(zero_buf, 0, sizeof(zero_buf));
    erom_download(FWCFG_START_ADDR, zero_buf, sizeof(zero_buf));
            P2PUPG_DBG("erom_download2 OK\n");

    // download config chunk
    chid = g_upge_feature_config.chip_config;
    if((chid!=0)&&(chid!=0xFFFFFFFF))
    {
        ptr_data_buf = sto_chunk_goto(&chid, 0xFFFFFFFF, 1);
        P2PUPG_DBG("ptr_data_buf=0x%x\n",ptr_data_buf);

        if(ptr_data_buf != NULL)
        {
            total_len = sto_fetch_long((unsigned long)(ptr_data_buf+CHUNK_OFFSET));
            erom_download(FWCFG_START_ADDR, ptr_data_buf, total_len);
        }
    }


    if(UPGRADE_SINGLE == upgrade_mode)
    {
        erom_setpc(FLASHWR_RUN_ADDR);
        osal_task_sleep(50);
        sci_mode_set(p2p_uart_id, 115200, SCI_PARITY_EVEN);
        osal_task_sleep(100);
        config_uart_speed(UART_DOWNLOAD_SPEED);
    }

    return TRUE;
}
Ejemplo n.º 10
0
static void display_sys_infomation(UINT8 flag)
{        
	CHUNK_HEADER blk_header;
	UINT8 i;
	UINT32 id,mask;
	char str[30];
	BYTE info_block_number;

	info_block_number = sto_chunk_count(0,0);
	for(i=0;i<info_block_number;i++)
	{
		id = mask = 0;
		sto_chunk_goto(&id,mask,i + 1);
		sto_get_chunk_header(id, &blk_header);

		set_info_con_rect(CON_L, CON_T + (CON_H + CON_GAP)*i,CON_W,CON_H);

		/* Name */
		OSD_SetTextFieldContent(&info_txt_name,STRING_ANSI, (UINT32)blk_header.name);


		if(flag == 0)
		{//show version & time

			/* Version */
			if(i==0)
				OSD_SetTextFieldContent(&info_txt1,STRING_ANSI, (UINT32)&blk_header.version[8]);
#ifdef UPGRADE_BY_CUSTOMER_ID
			else if(i == 1)/*main code version*/
			{
				if(blk_header.version[1] != '.')
				{
					OSD_SetTextFieldContent(&info_txt1,STRING_ANSI, (UINT32)&blk_header.version[CUSTOMER_ID_LENGTH]);
				}
				else
				{
					OSD_SetTextFieldContent(&info_txt1,STRING_ANSI, (UINT32)blk_header.version);
				}
			}
#endif
			else
				OSD_SetTextFieldContent(&info_txt1,STRING_ANSI, (UINT32)blk_header.version);

			/* Time */
			OSD_SetTextFieldContent(&info_txt2,STRING_ANSI, (UINT32)blk_header.time);
		}
		else
		{//show length & offset
		
			/*length*/
			sprintf(str,"0x%x",blk_header.len);
			OSD_SetTextFieldContent(&info_txt1,STRING_ANSI, (UINT32)str);
			
			/* Offset */
			sprintf(str,"0x%x",blk_header.offset);
			OSD_SetTextFieldContent(&info_txt2,STRING_ANSI, (UINT32)str);
		}

		OSD_DrawObject((POBJECT_HEAD )&info_item_con,C_UPDATE_ALL);
	}
        
}
Ejemplo n.º 11
0
static void win_rs232upg_load_chunk_info()
{
	CHUNK_HEADER blk_header;
	UINT32 id,mask;
	UINT8 chunk_number;
	UINT8 i;
	char strTmp[30];
	char strTmp1[30];
	char strTmp2[30];
	char strTmp3[30];
	char strTmp4[30];
	char strTmp5[30];
	char strTmp6[30];
	char strTmp7[30];
	char strTmp8[30];
#if (defined HDCP_IN_FLASH ||defined DIVX_CERT_ENABLE)
	UINT32 Block_id = 0, HDCP_key_ID = 0,divx_key_ID = 0,ciplus_key_ID = 0;
	UINT8 hdcp_chunk_index = 0;
   	UINT8 cipluskey_chunk_index = 0;
    
	BOOL has_hdcp_chunk = FALSE;
    	BOOL has_cipluskey_chunk = FALSE;
	UINT8 divx_chunk_index = 0;
	BOOL has_divx_chunk = FALSE;	
	UINT32 special_type =0;

#endif
//-a by wangyang del seecode upgrade {{
	UINT32 seecode_key_ID = 0;
	UINT8 seecode_chunk_index = 0;
    	BOOL has_seecodekey_chunk = FALSE;
//-a by wangyang del seecode upgrade }}

	chunk_number = sto_chunk_count(0,0);

	if(chunk_number == 0)
		return;

	if(InitBlockList() != SUCCESS)
		return;

	if(rs232upg_upgtype_chars != NULL)
		FREE(rs232upg_upgtype_chars);
	rs232upg_upgtype_chars = (UINT16**)MALLOC(sizeof(UINT16*)*chunk_number);
	if(rs232upg_upgtype_chars == NULL)
		ASSERT(0);
	for(i=0; i<chunk_number; i++)
	{
		rs232upg_upgtype_chars[i] = (UINT16*)MALLOC(16*sizeof(UINT16));
		if(rs232upg_upgtype_chars[i] == NULL)
			ASSERT(0);
	}
	
	
//	STRCPY(rs232upg_upgtype_chars[0],"allcode");
	{
			UINT16 *unistr=NULL;
         		unistr=OSD_GetUnicodeString(RS_TOTAL_FLASH);
            		ComUniStrCopyChar(rs232upg_upgtype_chars[0],(UINT16 *)unistr);
			//ComUniStrToAsc((UINT8 *)OSD_GetUnicodeString(RS_TOTAL_FLASH),strTmp);
			//STRCPY(rs232upg_upgtype_chars[0],strTmp);
        }
	
	for(i=1; i<chunk_number; i++)
	{
		id = mask = 0;
		sto_chunk_goto(&id,mask,i + 1);
		sto_get_chunk_header(id, &blk_header);

#if (defined HDCP_IN_FLASH ||defined DIVX_CERT_ENABLE || defined CI_PLUS_SUPPORT )
         special_type = 0;
#ifdef HDCP_IN_FLASH
		HDCP_key_ID = HDCPKEY_CHUNK_ID;
		if(((UINT32)blk_header.id) == HDCP_key_ID)
		{
			hdcp_chunk_index = i;
			has_hdcp_chunk = TRUE;
			special_type = 1;
		}
#endif
#ifdef DIVX_CERT_ENABLE
		divx_key_ID = DIVX_CHUCK_ID;
		if(((UINT32)blk_header.id) == divx_key_ID)
		{
			divx_chunk_index = i;
			has_divx_chunk = TRUE;
			special_type = 1;
		}
#endif
#ifdef CI_PLUS_SUPPORT
        ciplus_key_ID = CIPLUSKEY_CHUNK_ID;
        if(((UINT32)blk_header.id) == ciplus_key_ID)
        {
            cipluskey_chunk_index = i;
            has_cipluskey_chunk = TRUE;
            special_type = 1;
        }
#endif
//-a by wangyang del seecode upgrade {{
	seecode_key_ID =SEECODE_CHUNK_ID
        if(((UINT32)blk_header.id) == ciplus_key_ID)
        {
            seecode_chunk_index = i;
            has_seecodekey_chunk = TRUE;
            special_type = 1;
        }
//-a by wangyang del seecode upgrade }}
		if(special_type != 1)
			{
			STRCPY(rs232upg_upgtype_chars[i], blk_header.name);
//-a by wangyang del seecode upgrade {{
		if(i==1)
		{
			ComUniStrToAsc((UINT8 *)OSD_GetUnicodeString(RS_FIRMWARE),strTmp1);
			STRCPY(rs232upg_upgtype_chars[i], strTmp1);
		}
		else if (i == 2)
		{
			ComUniStrToAsc((UINT8 *)OSD_GetUnicodeString(RS_SEECODE),strTmp2);
			STRCPY(rs232upg_upgtype_chars[i],strTmp2);
		}
		else if (i == 3)
		{
			ComUniStrToAsc((UINT8 *)OSD_GetUnicodeString(RS_LOGO),strTmp3);
			STRCPY(rs232upg_upgtype_chars[i], strTmp3);
		}
		else if (i == 4)
		{
			ComUniStrToAsc((UINT8 *)OSD_GetUnicodeString(RS_CCCAM_PRIO),strTmp4);
			STRCPY(rs232upg_upgtype_chars[i], strTmp4);
		}
		else if (i == 5)
		{
			ComUniStrToAsc((UINT8 *)OSD_GetUnicodeString(RS_CCCAM_NEWCAM),strTmp5);
			STRCPY(rs232upg_upgtype_chars[i], strTmp5);
		}
		else if (i == 6)
		{
			ComUniStrToAsc((UINT8 *)OSD_GetUnicodeString(RS_DEFAULT_DATA),strTmp6);
			STRCPY(rs232upg_upgtype_chars[i], strTmp6);
		}
		else if (i == 7)
		{
			ComUniStrToAsc((UINT8 *)OSD_GetUnicodeString(RS_USER_DATA),strTmp7);
			STRCPY(rs232upg_upgtype_chars[i], strTmp7);
		}
//-a by wangyang del seecode upgrade }}
	}

#else
		STRCPY(rs232upg_upgtype_chars[i],blk_header.name);
//-a by wangyang del seecode upgrade {{
	seecode_key_ID =SEECODE_CHUNK_ID;
        if(((UINT32)blk_header.id) == seecode_key_ID)
        {
            seecode_chunk_index = i;
            has_seecodekey_chunk = TRUE;
            //special_type = 1;
        }
		if(i==1)
		{
			UINT16 *unistr=NULL;
         		unistr=OSD_GetUnicodeString(RS_FIRMWARE);
            		ComUniStrCopyChar(rs232upg_upgtype_chars[1],(UINT16 *)unistr);
			//ComUniStrToAsc((UINT8 *)OSD_GetUnicodeString(RS_FIRMWARE),strTmp1);
			//STRCPY(rs232upg_upgtype_chars[1], strTmp1);
        	}
		
		else if (i == 2)
		{
	//		ComUniStrToAsc((UINT8 *)OSD_GetUnicodeString(RS_SEECODE),strTmp2);
	//		STRCPY(rs232upg_upgtype_chars[i], strTmp2);
		}
		else if (i == 3)
		{
	//		ComUniStrToAsc((UINT8 *)OSD_GetUnicodeString(RS_LOGO),strTmp3);
	//		STRCPY(rs232upg_upgtype_chars[i],strTmp3);
		}
		else if (i == 4)
		{
	//		ComUniStrToAsc((UINT8 *)OSD_GetUnicodeString(RS_CCCAM_PRIO),strTmp4);
	//		STRCPY(rs232upg_upgtype_chars[i], strTmp4);
		}
		else if (i == 5)
		{
	//		ComUniStrToAsc((UINT8 *)OSD_GetUnicodeString(RS_CCCAM_NEWCAM),strTmp5);
	//		STRCPY(rs232upg_upgtype_chars[i], strTmp5);
		}
		else if (i == 6)
		{
		//	ComUniStrToAsc((UINT8 *)OSD_GetUnicodeString(RS_DEFAULT_DATA),strTmp6);
		//	STRCPY(rs232upg_upgtype_chars[i], strTmp6);
		}
		else if (i == 9)
		{
		//	ComUniStrToAsc((UINT8 *)OSD_GetUnicodeString(RS_USER_DATA),strTmp7);
		//	STRCPY(rs232upg_upgtype_chars[2],strTmp7);
		}
//-a by wangyang del seecode upgrade }}

#endif
	}
//-a by wangyang del seecode upgrade {{

	if(has_seecodekey_chunk == TRUE)
	{
		FREE(rs232upg_upgtype_chars[seecode_chunk_index]);
		for(i=seecode_chunk_index; i<chunk_number;i++)
			rs232upg_upgtype_chars[i] = rs232upg_upgtype_chars[i+1];
		chunk_number--;
  #ifdef HDCP_IN_FLASH
      if( (has_seecodekey_chunk == TRUE) && seecode_chunk_index < hdcp_chunk_index)
            hdcp_chunk_index --;
        if( (has_divx_chunk == TRUE) && seecode_chunk_index < cipluskey_chunk_index)
            cipluskey_chunk_index --;
        if( (has_divx_chunk == TRUE) && seecode_chunk_index < divx_chunk_index)
            divx_chunk_index --;
  #endif
      
	}
//-a by wangyang del seecode upgrade }}

	
#ifdef HDCP_IN_FLASH
	if(has_hdcp_chunk == TRUE)
	{
		FREE(rs232upg_upgtype_chars[hdcp_chunk_index]);
		for(i=hdcp_chunk_index; i<chunk_number;i++)
			rs232upg_upgtype_chars[i] = rs232upg_upgtype_chars[i+1];
		chunk_number--;
        if( (has_cipluskey_chunk == TRUE) && hdcp_chunk_index < cipluskey_chunk_index)
            cipluskey_chunk_index --;
        if( (has_divx_chunk == TRUE) && hdcp_chunk_index < divx_chunk_index)
            divx_chunk_index --;
        
	}
#endif

#ifdef DIVX_CERT_ENABLE
	if(has_divx_chunk == TRUE)
	{
		FREE(rs232upg_upgtype_chars[divx_chunk_index]);
		for(i=divx_chunk_index; i<chunk_number;i++)
			rs232upg_upgtype_chars[i] = rs232upg_upgtype_chars[i+1];
		chunk_number--;
        if( (has_cipluskey_chunk == TRUE) && divx_chunk_index < cipluskey_chunk_index)
            cipluskey_chunk_index --;
	}
#endif

#ifdef CI_PLUS_SUPPORT
        if(has_cipluskey_chunk == TRUE)
        {
            FREE(rs232upg_upgtype_chars[cipluskey_chunk_index]);
            for(i=cipluskey_chunk_index; i<chunk_number;i++)
                rs232upg_upgtype_chars[i] = rs232upg_upgtype_chars[i+1];
            chunk_number--;
        }
#endif

#if (defined HDCP_IN_FLASH ||defined DIVX_CERT_ENABLE || defined CI_PLUS_SUPPORT )
	OSD_SetMultiselSelTable(&rs232upg_sel_upgrade_type,rs232upg_upgtype_chars);
	OSD_SetMultiselCount(&rs232upg_sel_upgrade_type, chunk_number);
#else
	OSD_SetMultiselSelTable(&rs232upg_sel_upgrade_type,rs232upg_upgtype_chars);
	OSD_SetMultiselCount(&rs232upg_sel_upgrade_type, 2);
#endif
	
}
Ejemplo n.º 12
0
    //LIB_ASH_OC(argc & 0xFF);
    //LIB_ASH_OC(argv[1][0]);
    //LIB_ASH_OC(argv[1][1]);
    if( argc >= 2 && argv[1][0] == 0x2d && argv[1][1] == 0x72)//"-r"
    {
#ifdef TRANSFER_FORMAT2_SUPPORT
        LIB_ASH_OC((nVersion >> 8) & 0xFF);
        LIB_ASH_OC( nVersion & 0xFF);
#endif
    }
    
    
    /* collect information */
    n = sto_chunk_count(0, 0);
    of = sto_chunk_goto(&chid, 0, n);
    len = sto_fetch_long(of + CHUNK_LENGTH);

    /* send Length */
    data_len = n * CHUNK_HEADER_SIZE + 2;
    LIB_ASH_OC((data_len >> 8) & 0xFF);
    LIB_ASH_OC(data_len & 0xFF);

    crc = 0xFFFFFFFF;
    /* send Flash ID */
    LIB_ASH_OC(flash_id_val);
    crc = MG_Table_Driven_CRC(crc, &flash_id_val, 1);
    /* send Chunk Status */
    LIB_ASH_OC(g_crc_bad);
    crc = MG_Table_Driven_CRC(crc, &g_crc_bad, 1);
    /* send Chunks */