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)(); }
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; }
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; }
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 }
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; }
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; }
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; }
/* * 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; } }
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)(); }
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; }
/* * 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); }