void copy_code_to_dram(void)
{
	unsigned long ch;
	void (*BL2)(void);
	ch = *(volatile unsigned int *)(0xD0037488);

	// 函数指针
	copy_sd_mmc_to_mem copy_bl2 = (copy_sd_mmc_to_mem) (*(unsigned int *) (0xD0037F98));

	unsigned int ret;
	
	// 通道0
	if (ch == 0xEB000000)
	{
		// 0:channel 0
		// 49:源,代码位于扇区49,1 sector = 512 bytes
		// 32:长度,拷贝32 sector,即16K
		// 0x23E00000:目的,链接地址0x23E00000
		ret = copy_bl2(0, 49, 32,(unsigned int *)0x23E00000, 0);
	}
	// 通道2
	else if (ch == 0xEB200000)
	{
		ret = copy_bl2(2, 49, 32,(unsigned int *)0x23E00000, 0);
	}
	else
		return;

	// 跳转到DRAM
    BL2 = (void *)0x23E00000;
    (*BL2)();
}
示例#2
0
int spl_mmc_load_image(void)
{
	ulong ch;

	ch = *(volatile u32 *)(0xD0037488);
	copy_sd_mmc_to_mem copy_bl2 =
	    (copy_sd_mmc_to_mem) (*(u32 *) (0xD0037F98));

	//print ch
	uart_puts("ch=");
	debug_reg(ch);

	u32 ret;
	if (ch == 0xEB000000) {
		ret = copy_bl2(0, 49, 1024, CFG_PHY_UBOOT_BASE, 0);
	}
	else if (ch == 0xEB200000) {
		ret = copy_bl2(2, 49, 1024, CFG_PHY_UBOOT_BASE, 0);
	}
	else{
		//
		uart_puts("ch error\r\n");
		return -1;
	}

	if (ret == 0){
		//
		uart_puts("copy error\r\n");
		return -1;
	}
	else
		return 0;
}
示例#3
0
void emmc_bl2_copy(void)
{
	copy_emmc_to_mem copy_bl2 =
	    (copy_emmc_to_mem) (*(u32 *) (0xD0037F9C));

#if defined(CONFIG_SECURE)
	volatile u32 * pub_key;
	int secure_booting;
	int i;
	ulong rv;
#endif

	u32 ret;
	copy_bl2(0, MOVI_BL2_BLKCNT, CFG_PHY_UBOOT_BASE, 4);

#if defined(CONFIG_SECURE)
		pub_key = (volatile u32 *)SECURE_KEY_ADDRESS;
			secure_booting = 0;

		for(i=0;i<33;i++){
			if( *(pub_key+i) != 0x0) secure_booting = 1;
		}
	
		if (secure_booting == 1) {
			/* do security check */
			rv = Check_IntegrityOfImage( (SecureBoot_CTX *)SECURE_KEY_ADDRESS, (unsigned char*)CFG_PHY_UBOOT_BASE,
			(1024*512-128), (unsigned char*)(CFG_PHY_UBOOT_BASE+(1024*512-128)), 128 );
			
			if (rv != 0){
				while(1);
			}
		}
#endif
	return;
}
示例#4
0
void movi_bl2_copy(void)
{
	unsigned long bl2_addr; 
	copy_sd_mmc_to_mem copy_bl2;

	if(CHIP_VER == 1)	
		bl2_addr = (0x00002360);
	else
		bl2_addr = (0x00001908);
       
	
	copy_bl2 = (copy_sd_mmc_to_mem)(bl2_addr);

	copy_bl2(MOVI_BL2_POS, MOVI_BL2_BLKCNT, CFG_PHY_UBOOT_BASE);

#if defined(CONFIG_SECURE_BOOT)
 unsigned int rv;
        /* do integrity check */
        rv = Check_Signature( (SB20_CONTEXT *)SECURE_BOOT_CONTEXT_ADDR,
                              (unsigned char *)(0x27e00000),(1024*512-256),
                              (unsigned char *)((0x27e00000)+(1024*512-256)), 256 );

        if (rv != 0) {
                while(1);
        }
       
#endif
}
示例#5
0
void movi_bl2_copy(void)
{
	copy_sd_mmc_to_mem copy_bl2 = (copy_sd_mmc_to_mem)(*(u32*)(0xD00213E8));
	u32 ret;

	ret = copy_bl2(0, MOVI_BL2_POS, MOVI_BL2_BLKCNT, CFG_PHY_UBOOT_BASE, 0);

	if(ret == 0)
		while(1);
	else
		return;
}
示例#6
0
void movi_bl2_copy(void)
{
	ulong ch;
#if defined(CONFIG_EVT1)
	ch = *(volatile u32 *)(0xD0037488);
	copy_sd_mmc_to_mem copy_bl2 = (copy_sd_mmc_to_mem)(*(u32*)(0xD0037F98));
#else
	ch = *(volatile u32 *)(0xD003A508);
	copy_sd_mmc_to_mem copy_bl2 = (copy_sd_mmc_to_mem)(*(u32*)(0xD003E008));
#endif
	u32 ret;
	if (ch == 0xEB000000)
		ret = copy_bl2(0, MOVI_BL2_POS, MOVI_BL2_BLKCNT, CFG_PHY_UBOOT_BASE, 0);
	else if (ch == 0xEB200000)
		ret = copy_bl2(2, MOVI_BL2_POS, MOVI_BL2_BLKCNT, CFG_PHY_UBOOT_BASE, 0);
	else
		printf("u-boot image must be exist at SD/MMC channel 0 or 2\n");

	if(ret == 0)
		while(1);
	else
		return;
}
示例#7
0
void movi_bl2_copy(void)
{
#ifdef SMDK6440_EVT0
	copy_sd_mmc_to_mem copy_bl2 = (copy_sd_mmc_to_mem)(*(u32*)(0xD0021C08));
#endif
#ifdef SMDK6440_EVT1
	copy_sd_mmc_to_mem copy_bl2 = (copy_sd_mmc_to_mem)(*(u32*)(0xD0021FE0));
#endif
	u32 ret;

	ret = copy_bl2(0, MOVI_BL2_POS, MOVI_BL2_BLKCNT, CFG_PHY_UBOOT_BASE, 0);

	if(ret == 0)
		while(1);
	else
		return;
}
示例#8
0
文件: spl_boot.c 项目: JamesAng/ub
/*
* Copy U-boot from mmc to RAM:
* COPY_BL2_FNPTR_ADDR: Address in iRAM, which Contains
* Pointer to API (Data transfer from mmc to ram)
*/
void copy_uboot_to_ram(void)
{
	spi_copy_func_t spi_copy;
	usb_copy_func_t usb_copy;

	int is_cr_z_set;
	unsigned int sec_boot_check;
	enum boot_mode bootmode = BOOT_MODE_OM;
	u32 (*copy_bl2)(u32, u32, u32);

	/* Read iRAM location to check for secondary USB boot mode */
	sec_boot_check = readl(EXYNOS_IRAM_SECONDARY_BASE);
	if (sec_boot_check == EXYNOS_USB_SECONDARY_BOOT)
		bootmode = BOOT_MODE_USB;

	if (bootmode == BOOT_MODE_OM)
		bootmode = readl(EXYNOS5_POWER_BASE) & OM_STAT;

	switch (bootmode) {
	case BOOT_MODE_SERIAL:
		spi_copy = *(spi_copy_func_t *)EXYNOS_COPY_SPI_FNPTR_ADDR;
		spi_copy(SPI_FLASH_UBOOT_POS, CONFIG_BL2_SIZE,
						CONFIG_SYS_TEXT_BASE);
		break;
	case BOOT_MODE_MMC:
		copy_bl2 = (void *) *(u32 *)COPY_BL2_FNPTR_ADDR;
		copy_bl2(BL2_START_OFFSET, BL2_SIZE_BLOC_COUNT,
						CONFIG_SYS_TEXT_BASE);
		break;
	case BOOT_MODE_USB:
		/*
		 * iROM needs program flow prediction to be disabled
		 * before copy from USB device to RAM
		 */
		is_cr_z_set = config_branch_prediction(0);
		usb_copy = *(usb_copy_func_t *)
				EXYNOS_COPY_USB_FNPTR_ADDR;
		usb_copy();
		config_branch_prediction(is_cr_z_set);
		break;
	default:
		break;
	}
}
示例#9
0
void copy_code_to_dram(void)
{
	unsigned long ch;
	void (*BL2)(void);
	ch = *(volatile unsigned int *)(0xD0037488);
	unsigned char channel = 0;
	
	printf("\n\rBL1 Ver:1307020\n\r");
	printf("Start cp \n\r");

	// 函数指针
	copy_sd_mmc_to_mem copy_bl2 = (copy_sd_mmc_to_mem) (*(unsigned int *) (0xD0037F98));

	unsigned int ret;
	
	// 通道0
	if (ch == 0xEB000000)
		channel = 0;

	// 通道2
	else if (ch == 0xEB200000)
		channel = 2;
		
	else
		return;
		
	// 0:channel 0
	// 33:源,代码位于扇区33,1 sector = 512 bytes
	// COPY_BL2_SIZE/512:长度,拷贝COPY_BL2_SIZE/512 sector,即COPY_BL2_SIZE K
	// CONFIG_SYS_TEXT_BASE:目的,链接地址CONFIG_SYS_TEXT_BASE	
	ret = copy_bl2(channel, 33, COPY_BL2_SIZE/512,(unsigned int *)CONFIG_SYS_TEXT_BASE, 0);

	printf("Running! \n\r");
	
	// 跳转到DRAM
	BL2 = (void *)CONFIG_SYS_TEXT_BASE;
	(*BL2)();
}
示例#10
0
void movi_bl2_copy(void)
{
	ulong ch;
#if defined(CONFIG_EVT1)
	ch = *(volatile u32 *)(0xD0037488);
	copy_sd_mmc_to_mem copy_bl2 =
	    (copy_sd_mmc_to_mem) (*(u32 *) (0xD0037F98));

	#if defined(CONFIG_SECURE)
	volatile u32 * pub_key;
	int secure_booting;
	int i;
	ulong rv;
	#endif
#else
	ch = *(volatile u32 *)(0xD003A508);
	copy_sd_mmc_to_mem copy_bl2 =
	    (copy_sd_mmc_to_mem) (*(u32 *) (0xD003E008));
#endif
	u32 ret;
	if (ch == 0xEB000000) {
		ret = copy_bl2(0, MOVI_BL2_POS, MOVI_BL2_BLKCNT,
			CFG_PHY_UBOOT_BASE, 0);

#if defined(CONFIG_SECURE)
		pub_key = (volatile u32 *)SECURE_KEY_ADDRESS;
			secure_booting = 0;

				for(i=0;i<33;i++){
						if( *(pub_key+i) != 0x0) secure_booting = 1;
				}
	
		if (secure_booting == 1) {
			/* do security check */
			rv = Check_IntegrityOfImage( (SecureBoot_CTX *)SECURE_KEY_ADDRESS, (unsigned char*)CFG_PHY_UBOOT_BASE,
			(1024*512-128), (unsigned char*)(CFG_PHY_UBOOT_BASE+(1024*512-128)), 128 );
			
			if (rv != 0){
				while(1);
			}
		}
#endif

	}
	else if (ch == 0xEB200000) {
		ret = copy_bl2(2, MOVI_BL2_POS, MOVI_BL2_BLKCNT,
			CFG_PHY_UBOOT_BASE, 0);
		
#if defined(CONFIG_SECURE)
		pub_key = (volatile unsigned long *)SECURE_KEY_ADDRESS;
			secure_booting = 0;

				for(i=0;i<33;i++){
						if( *(pub_key+i) != 0x0) secure_booting = 1;
				}

		if (secure_booting == 1) {
			/* do security check */
			rv = Check_IntegrityOfImage( (SecureBoot_CTX *)SECURE_KEY_ADDRESS, (unsigned char*)CFG_PHY_UBOOT_BASE,
			(1024*512-128), (unsigned char*)(CFG_PHY_UBOOT_BASE+(1024*512-128)), 128 );
			
			if (rv != 0){
				while(1);
		
			}
		}
#endif
	}
	else
		return;

	if (ret == 0)
		while (1)
			;
	else
		return;
}
示例#11
0
/*
* Copy U-boot from mmc to RAM:
* COPY_BL2_FNPTR_ADDR: Address in iRAM, which Contains
* API (Data transfer from mmc to ram)
*/
void copy_uboot_to_ram(void)
{
	u32 (*copy_bl2)(u32, u32, u32) = (void *)COPY_BL2_FNPTR_ADDR;

	copy_bl2(BL2_START_OFFSET, BL2_SIZE_BLOC_COUNT, CONFIG_SYS_TEXT_BASE);
}