Exemplo n.º 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);	
	}
Exemplo n.º 2
0
static INT32 BurnBlock(UINT8 *pBuffer, UINT32 Pos, UINT8 NumSectors)
{
	struct sto_device *sto_dev = m_StoDevice;
    UINT32 param;
    INT32 offset, er = SUCCESS;
    UINT8 i;
    OTA_PRINTF("user_db_start_sector == %d \n", m_ota_info.user_db_start_sector);
     OTA_PRINTF("user_db_sectors == %d \n", m_ota_info.user_db_sectors);
    OTA_PRINTF("ota_bin_sectors == %d \n", m_ota_info.ota_bin_sectors);
    OTA_PRINTF("ota_upg_sectors == %d \n", m_ota_info.ota_upg_sectors);
   for(i=0; i<NumSectors; i++)
    {
        offset = (Pos + i) * C_SECTOR_SIZE;
        param = ((UINT32)offset) << 10; // upper 22 bits is offset based on SYS_FLASH_BASE_ADDR
        param += C_SECTOR_SIZE >> 10;   // lower 10 bits is length in K bytes
        OTA_PRINTF("%s: erase sector %d\n", __FUNCTION__, Pos+i);
        er = sto_io_control(sto_dev, STO_DRIVER_SECTOR_ERASE, param);
        if(er != SUCCESS)
        {
            OTA_PRINTF("%s: erase sector %d failed\n", __FUNCTION__, i);
            break;
        }

        if(pBuffer)
        {
            OTA_PRINTF("%s: seek sector %d, offset = %xh\n", __FUNCTION__, Pos+i,offset);
            if(sto_lseek(sto_dev, offset, STO_LSEEK_SET) != offset)
            {
                OTA_PRINTF("%s: seek sector %d failed\n", __FUNCTION__, i);
                er = ERR_FAILED;
                break;
            }

            OTA_PRINTF("%s: write sector %d, src = %xh\n", __FUNCTION__, Pos+i,&pBuffer[C_SECTOR_SIZE * i]);
            if(sto_write(sto_dev, &pBuffer[C_SECTOR_SIZE * i], C_SECTOR_SIZE) != C_SECTOR_SIZE)
            {
                OTA_PRINTF("%s: write sector %d failed\n", __FUNCTION__, i);
                er = ERR_FAILED;
                break;
            }
        }
        
        StepBurningProgress();
    }
   OTA_PRINTF("er == %d\n",er);
    return er;
}