示例#1
0
BOOL keyupg_burnflash(UINT32 chunk_id, char *buffer_adr,UINT32 buffer_size)
{
	UINT32 chunk_len,chunk_addr;
	UINT32 param;	
	struct sto_device *f_dev;
	UINT32 sector_count=0;


	api_get_chuck_addlen(chunk_id, &chunk_addr, &chunk_len);//chunk_addr is the real data addr not include header

	if ((f_dev = (struct sto_device *)dev_get_by_id(HLD_DEV_TYPE_STO, 0)) == NULL)
	{
		libc_printf("ERROR: Not found Flash device!\n");
		return FALSE;
	}
	
	if(chunk_id==HDCPKEY_CHUNK_ID)
	{
		//hdcp key,need rewrite bootloader
		UINT8	*bootloader_sector = NULL;	
		CHUNK_HEADER bloader_chuck_hdr;
		
		sto_get_chunk_header(BLOADER_CHUNK_ID,&bloader_chuck_hdr);
		bootloader_sector = (UINT8 *)MALLOC(sizeof(UINT8)*(bloader_chuck_hdr.offset));

		sto_lseek(f_dev, 0x00, STO_LSEEK_SET);
		sto_read(f_dev, bootloader_sector, bloader_chuck_hdr.offset);
		
		/*
		param = 0x00;
		param = param << 10;
		param +=( (SECTOR_SIZE*(bloader_chuck_hdr.offset/SECTOR_SIZE+1)) >> 10);
		sto_io_control(f_dev, STO_DRIVER_SECTOR_ERASE, param);
		*/
		for(sector_count=0;sector_count< ((bloader_chuck_hdr.offset-1)/SECTOR_SIZE+1);sector_count++)
		{
			param = 0x00+sector_count*SECTOR_SIZE;
			param = param << 10;	/* Lower 10 bits of LSB is length in K bytes*/
			param += SECTOR_SIZE >> 10;
			sto_io_control(f_dev, STO_DRIVER_SECTOR_ERASE_EXT, param);
		}
				
		sto_lseek(f_dev, 0x00, STO_LSEEK_SET);
		sto_write(f_dev, bootloader_sector, bloader_chuck_hdr.offset);

		CHUNK_HEADER hdcp_chuck_hdr;
		//sto_get_chunk_header(chunk_id,&hdcp_chuck_hdr);
		hdcp_chuck_hdr.id = data_change_for_sto(chunk_id);
		hdcp_chuck_hdr.len = data_change_for_sto(buffer_size);
	       hdcp_chuck_hdr.offset = data_change_for_sto(0x200);
	      	hdcp_chuck_hdr.crc = data_change_for_sto(0x4e435243);
		strcpy(hdcp_chuck_hdr.name,"HDCPKey");
		strcpy(hdcp_chuck_hdr.version,"Encrypted");
		strcpy(hdcp_chuck_hdr.time,"2010.09.01");
		sto_write(f_dev,&hdcp_chuck_hdr,sizeof(CHUNK_HEADER));
		sto_write(f_dev,buffer_adr, buffer_size);
		
		FREE(bootloader_sector);	
	}
示例#2
0
static INT32 BackupDatabase()
{
	struct sto_device *sto_dev = m_StoDevice;
    INT32 er;

	if(sto_lseek(sto_dev, (INT32)m_ota_info.user_db_addr_offset, STO_LSEEK_SET) !=  (INT32)m_ota_info.user_db_addr_offset)
        return ERR_FAILED;
	if(sto_read(sto_dev, (UINT8 *)m_ota_info.backup_db_addr, (INT32)m_ota_info.user_db_len) != (INT32)m_ota_info.user_db_len)
        return ERR_FAILED;
    return SUCCESS;
}
示例#3
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;
}
示例#4
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;
	}
}