/* ********************************************************************** Copyright (c)2009 Arkmicro Technologies Inc. All Rights Reserved Filename: boot.c Version : 1.00 Date : 2010.06.29 Author : Donier Abstract: Ark2116 SoC boot rom code file. Note : The size the code(*.bin) loaded should never exceed 10K Bytes. History : From the ark2116 SoC boot rom code file. *********************************************************************** */ #include "typedef.h" #include "amt630h.h" #include "BootModeSel.h" #include "UartPrint.h" #include "timer.h" #include "mmu.h" #include "sysinfo.h" #include "spi.h" #define PROJECT_FOR_DDR_INIT 0 #define PROJECT_FOR_SPIFLASH_LOADER 1 #define PROJECT_FOR_SD_UPDATE 2 #define PROJECT_FOR_JTAG_UPDATE 3 #define PROJECT_FOR_EMMC_LOADER 4 #define PROJECT_FOR_LAUNCH_EMMC 5 #define PROJECT_PURPOSE PROJECT_FOR_JTAG_UPDATE #if PROJECT_PURPOSE == PROJECT_FOR_EMMC_LOADER || PROJECT_PURPOSE == PROJECT_FOR_LAUNCH_EMMC #if DEVICE_TYPE_SELECT != EMMC_FLASH #error "you should select emmc flash device type!" #endif #endif //ok //err//ok //ok //err//ok //ok #define SYSPLL_CLK 400 //550//600//550//400//500//300//400 #define CPUPLL_CLK 550 //550//550//550//550//500//550//550 #define DDRPLL_CLK 600 //700//700//700//600//700//700//700 (RGB屏超过600M低温卡死,lvds屏正常) #define VPUPLL_CLK 240 //240//240//240//240//240//240//240 #define CLK_APB_FREQ (SYSPLL_CLK * 1000000 / 2) #define OSC_FREQ 24000000 #define tref 1560 //(unsigned int)((3900*DDR_CLK)/1000) #define cas 6 #define twl 5 #define tmrd 4 #define tras 19 //13 //(unsigned int)((45*DDR_CLK)/1000) #define trc 28 //16 //(unsigned int)((60*DDR_CLK)/1000) #define trcd 6 //(unsigned int)((15*DDR_CLK)/1000) #define trfc 45 //37 //(unsigned int)((105*DDR_CLK)/1000) #define trp 6 //(unsigned int)((15*DDR_CLK)/1000) #define trrd 5 //(unsigned int)((10*DDR_CLK)/1000) #define twr 6 //(unsigned int)((15*DDR_CLK)/1000) #define twtr 4 //(unsigned int)((8*DDR_CLK)/1000) #define txp 4 #define txsr 200 #define tesr 6 #define tfaw 18 //(unsigned int)((45*DDR_CLK)/1000) extern void SetSysPLL(unsigned int freq); extern void SetCpuPLL(unsigned int freq); extern void SetDDRPLL(unsigned int freq); extern void SetVPUPLL(unsigned int freq); extern void SetXclkAHBclkAPBclk(void); extern void SetSpiclk(void); extern void SetGpuclk(void); extern void SetMfcclk(void); extern void SwitchTo24MHz(void); extern void updateFromSD(int chipid); extern void FlashBurn(void *buf, unsigned int offset, unsigned int size); extern int wdt_init(unsigned int clk_freq); extern int EmmcInit(int chipid); extern void launchEMMC(int chipid); extern int EmmcBurn(void *buf, unsigned int offset, unsigned int size, int show_progress); static void delay(volatile UINT32 count ) { while(count--); } void ddr_rd_clk_config() { unsigned int i; rSYS_DDRCTL1_CFG = 0x01; //reset pll delay(1000); rSYS_DDRCTL1_CFG = 0x00; //enable pll delay(100000); i = 0x01 << 1 | 200 << 8; rSYS_DDRCTL1_CFG = i; delay(100000); } void ddr_training_one(void) { int value = 0; rSYS_DDRCTL_CFG = (1<<15); // value = (0x1c<<0) |(0x1c<<8)|(0x30<<16); // value = (0x1c<<0) |(0x1c<<8)|(0x18<<16); fail 25 // value = (0x1c<<0) |(0x1c<<8)|(0x20<<16); 25 ok // value = (0x1c<<0) |(0x1c<<8)|(0x28<<16); 25 ok // value = (0x1c<<0) |(0x1c<<8)|(0x30<<16); // value = (0x1c<<0) |(0x1c<<8)|(0x26<<16); //4 ok // value = (0x1c<<0) |(0x1c<<8)|(0x20<<16); //1 ok // value = (0x1c<<0) |(0x1c<<8)|(0x30<<16); //4 ok 0514 value = (0x1c<<0) |(0x1c<<8)|(0x33<<16); //4 ok // value = (0x1c<<0) |(0x1c<<8)|(0x3b<<16); //4 ok rSYS_DDRCTL1_CFG =value; rSYS_DDRCTL2_CFG =value; } #if 0 #define DDR_TOTAL 0x10000 int DDR3_RW_Test(void) { unsigned int i=0; unsigned int data_char; for (i=0; iapp_checksum = header->checksum; sysinfo->stepldr_offset = STEPLDRA_OFFSET; sysinfo->stepldr_size = STEPLDR_MAX_SIZE; sysinfo->update_status = UPDATE_STATUS_END; sysinfo->image_offset = IMAGE_OFFSET; sysinfo->loader_offset = LOADER_OFFSET; sysinfo->loader_size = LOADER_MAX_SIZE; #if DEVICE_TYPE_SELECT != EMMC_FLASH SendUartString("burn loader start... \r\n"); FlashBurn((void*)loader_addr, LOADER_OFFSET, LOADER_MAX_SIZE); SendUartString("burn loader end. \r\n"); SendUartString("burn stepldr start... \r\n"); FlashBurn((void*)stepldr_addr, STEPLDRA_OFFSET, STEPLDR_MAX_SIZE); SendUartString("burn stepldr end. \r\n"); SendUartString("burn app start... \r\n"); FlashBurn((void*)app_addr, IMAGE_OFFSET, header->size); SendUartString("burn app end. \r\n"); #else EmmcInit(0); SendUartString("burn launch start... \r\n"); FlashBurn((void*)launch_addr, LOADER_OFFSET, LOADER_MAX_SIZE); SendUartString("burn launch end. \r\n"); SendUartString("burn loader start... \r\n"); EmmcBurn((void*)loader_addr, LOADER_OFFSET, LOADER_MAX_SIZE, 0); SendUartString("burn loader end. \r\n"); SendUartString("burn stepldr start... \r\n"); EmmcBurn((void*)stepldr_addr, STEPLDRA_OFFSET, STEPLDR_MAX_SIZE, 0); SendUartString("burn stepldr end. \r\n"); SendUartString("burn app start... \r\n"); EmmcBurn((void*)app_addr, IMAGE_OFFSET, header->size, 0); SendUartString("burn app end. \r\n"); #endif SaveSysInfo(sysinfo); SendUartString("Update is finished. Please reset. \r\n"); while(1); } void main(void) { unsigned int val; //set all io drive to 4ma(default 8ma). rSYS_IO_DRIVER00=0x55555555; rSYS_IO_DRIVER01=0x55555555; rSYS_IO_DRIVER02=0x55555555; rSYS_IO_DRIVER03=0x55555555; rSYS_IO_DRIVER04=0x55555555; rSYS_IO_DRIVER05=0x55555555; rSYS_IO_DRIVER06=0x55555555; #if PROJECT_PURPOSE == PROJECT_FOR_LAUNCH_EMMC timer_init(); InitUart(115200); SendUartString("\nARK AMT630Hv100 launch emmc from norflash\r\n"); wdt_init(OSC_FREQ); launchEMMC(0); #endif SwitchTo24MHz(); timer_init(); InitUart(115200); SendUartString("\nARK AMT630Hv100 AMTLDR 0906_700M\n"); /* val = rSYS_ANA1_CFG; val |= (1 << 4)|(5 << 1); rSYS_ANA1_CFG = val; udelay(300); val = rSYS_ANA1_CFG; val &= ~(0x1 <<5); rSYS_ANA1_CFG = val; */ #if 1 //低电压2.8V复位 rSYS_ANA1_CFG |= (1 << 4)|(5 << 1); udelay(300); rSYS_ANA1_CFG |= (1 << 5); udelay(100); #else //低电压2.5V复位 rSYS_ANA1_CFG |= (1 << 4)|(0 << 1); udelay(3000); rSYS_ANA1_CFG |= (1 << 5); udelay(1000); #endif val = rSYS_ANA2_CFG; val = (0x3F <<6)|(1 << 2)|(1 << 0); rSYS_ANA2_CFG = val; SetSysPLL(SYSPLL_CLK); SetCpuPLL(CPUPLL_CLK); SetDDRPLL(DDRPLL_CLK); SetVPUPLL(VPUPLL_CLK); udelay(500); SetXclkAHBclkAPBclk(); SetSpiclk(); SetGpuclk(); SetMfcclk(); mdelay(50); //50 #if PROJECT_PURPOSE == PROJECT_FOR_SPIFLASH_LOADER || PROJECT_PURPOSE == PROJECT_FOR_EMMC_LOADER wdt_init(CLK_APB_FREQ); #endif ddr3_sdramc_init(); mdelay(50); //80//100 SendUartString("\nDDR init over2!!_m50\n"); SpiInit(); #ifdef MMU_ENABLE MMU_Init(); #endif #if PROJECT_PURPOSE == PROJECT_FOR_DDR_INIT while(1); #elif PROJECT_PURPOSE == PROJECT_FOR_SPIFLASH_LOADER bootFromSPI(); #elif PROJECT_PURPOSE == PROJECT_FOR_SD_UPDATE SetDefaultSysInfo(); SaveSysInfo(0); updateFromSD(0); bootFromSPI(); #elif PROJECT_PURPOSE == PROJECT_FOR_JTAG_UPDATE updateFromJtag(); #elif PROJECT_PURPOSE == PROJECT_FOR_EMMC_LOADER bootFromEMMC(0); #endif }