Beispiel #1
0
void start_armboot (void)
{
	init_fnc_t **init_fnc_ptr;
	char *s;
	int mmc_exist = 0;
#if defined(CONFIG_VFD) || defined(CONFIG_LCD)
	unsigned long addr;
#endif

	/* Pointer is writable since we allocated a register for it */
	gd = (gd_t*)(_armboot_start - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t));
	/* compiler optimization barrier needed for GCC >= 3.4 */
	__asm__ __volatile__("": : :"memory");

	memset ((void*)gd, 0, sizeof (gd_t));
	gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
	memset (gd->bd, 0, sizeof (bd_t));

//	gd->flags |= GD_FLG_RELOC;

	monitor_flash_len = _bss_start - _armboot_start;

	for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
		if ((*init_fnc_ptr)() != 0) {
			hang ();
		}
	}

	/* armboot_start is defined in the board-specific linker script */
	mem_malloc_init (_armboot_start - CONFIG_SYS_MALLOC_LEN,
			CONFIG_SYS_MALLOC_LEN);

#ifndef CONFIG_SYS_NO_FLASH
	/* configure available FLASH banks */
	display_flash_config (flash_init ());
#endif /* CONFIG_SYS_NO_FLASH */

#ifdef CONFIG_VFD
#	ifndef PAGE_SIZE
#	  define PAGE_SIZE 4096
#	endif
	/*
	 * reserve memory for VFD display (always full pages)
	 */
	/* bss_end is defined in the board-specific linker script */
	addr = (_bss_end + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);
	vfd_setmem (addr);
	gd->fb_base = addr;
#endif /* CONFIG_VFD */

#ifdef CONFIG_LCD
	/* board init may have inited fb_base */
	if (!gd->fb_base) {
#		ifndef PAGE_SIZE
#		  define PAGE_SIZE 4096
#		endif
		/*
		 * reserve memory for LCD display (always full pages)
		 */
		/* bss_end is defined in the board-specific linker script */
		addr = (_bss_end + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);
		lcd_setmem (addr);
		gd->fb_base = addr;
	}
#endif /* CONFIG_LCD */

#if defined(CONFIG_CMD_NAND)
	puts ("NAND:	");
	nand_init();		/* go init the NAND */
#endif

#if defined(CONFIG_CMD_ONENAND)
	onenand_init();
#endif

#ifdef CONFIG_GENERIC_MMC
	puts ("MMC:   ");
	mmc_exist = mmc_initialize (gd->bd);
	if (mmc_exist != 0)
	{
		puts ("0 MB\n");
	}

#endif


#ifdef CONFIG_HAS_DATAFLASH
	AT91F_DataflashInit();
	dataflash_print_info();
#endif

	/* initialize environment */
	env_relocate ();

#ifdef CONFIG_VFD
	/* must do this after the framebuffer is allocated */
	drv_vfd_init();
#endif /* CONFIG_VFD */

#ifdef CONFIG_SERIAL_MULTI
	serial_initialize();
#endif

	/* IP Address */
	gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");

	stdio_init ();	/* get the devices list going. */

	jumptable_init ();

#if defined(CONFIG_API)
	/* Initialize API */
	api_init ();
#endif

	console_init_r ();	/* fully init console as a device */

#if defined(CONFIG_ARCH_MISC_INIT)
	/* miscellaneous arch dependent initialisations */
	arch_misc_init ();
#endif
#if defined(CONFIG_MISC_INIT_R)
	/* miscellaneous platform dependent initialisations */
	misc_init_r ();
#endif

	/* enable exceptions */
	enable_interrupts ();

	/* Perform network card initialisation if necessary */
#ifdef CONFIG_DRIVER_TI_EMAC
	/* XXX: this needs to be moved to board init */
extern void davinci_eth_set_mac_addr (const u_int8_t *addr);
	if (getenv ("ethaddr")) {
		uchar enetaddr[6];
		eth_getenv_enetaddr("ethaddr", enetaddr);
		davinci_eth_set_mac_addr(enetaddr);
	}
#endif

#if defined(CONFIG_DRIVER_SMC91111) || defined (CONFIG_DRIVER_LAN91C96)
	/* XXX: this needs to be moved to board init */
	if (getenv ("ethaddr")) {
		uchar enetaddr[6];
		eth_getenv_enetaddr("ethaddr", enetaddr);
		smc_set_mac_addr(enetaddr);
	}
#endif /* CONFIG_DRIVER_SMC91111 || CONFIG_DRIVER_LAN91C96 */

	/* Initialize from environment */
	if ((s = getenv ("loadaddr")) != NULL) {
		load_addr = simple_strtoul (s, NULL, 16);
	}
#if defined(CONFIG_CMD_NET)
	if ((s = getenv ("bootfile")) != NULL) {
		copy_filename (BootFile, s, sizeof (BootFile));
	}
#endif

#ifdef BOARD_LATE_INIT
	board_late_init ();
#endif

#ifdef CONFIG_BITBANGMII
	bb_miiphy_init();
#endif
#if defined(CONFIG_CMD_NET)
#if defined(CONFIG_NET_MULTI)
	puts ("Net:   ");
#endif
	eth_initialize(gd->bd);
#if defined(CONFIG_RESET_PHY_R)
	debug ("Reset Ethernet PHY\n");
	reset_phy();
#endif
#endif
	/* main_loop() can return to retry autoboot, if so just run it again. */
	for (;;) {
		main_loop ();
	}

	/* NOTREACHED - no way out of command loop except booting */
}
Beispiel #2
0
void start_armboot (void)
{
	init_fnc_t **init_fnc_ptr;
	char *s;
	ulong size;
#if defined(CONFIG_VFD) || defined(CONFIG_LCD)
	unsigned long addr;
#endif

#ifdef CFG_UBOOT_PROFILING
    unsigned int time_start_armboot = get_timer(0);
    unsigned int time_init_sequence;
    unsigned int time_misc_init;
    unsigned int time_env;
    unsigned int time_nand;
    unsigned int time_bat;
    unsigned int time_show_logo;
    unsigned int time_backlight;
    unsigned int time_sw_env;
#endif

    #ifdef CFG_UBOOT_PROFILING
    boot_time = get_timer(0);
    #endif

	/* Pointer is writable since we allocated a register for it */
	gd = (gd_t*)(_armboot_start - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t));
	/* compiler optimization barrier needed for GCC >= 3.4 */
	__asm__ __volatile__("": : :"memory");

	memset ((void*)gd, 0, sizeof (gd_t));
	gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
	memset (gd->bd, 0, sizeof (bd_t));	

	monitor_flash_len = _bss_start - _armboot_start;

#ifdef CFG_UBOOT_PROFILING
      time_init_sequence = get_timer(0);
#endif
	for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) 
	{
		if ((*init_fnc_ptr)() != 0) {
			hang ();
		}
	}	
	/* armboot_start is defined in the board-specific linker script */
	mem_malloc_init (_armboot_start - CONFIG_SYS_MALLOC_LEN, CONFIG_SYS_MALLOC_LEN);
#ifdef CFG_UBOOT_PROFILING
      printf("[PROFILE] ------- init_sequence takes %d ms -------- \n", get_timer(time_init_sequence));
#endif

  

#ifndef CONFIG_SYS_NO_FLASH
	/* configure available FLASH banks */
	display_flash_config (flash_init ());
#endif /* CONFIG_SYS_NO_FLASH */

#ifdef CONFIG_VFD
#ifndef PAGE_SIZE
#define PAGE_SIZE 4096
#endif
	/*
	 * reserve memory for VFD display (always full pages)
	 */
	/* bss_end is defined in the board-specific linker script */
	addr = (_bss_end + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);
	size = vfd_setmem (addr);
	gd->fb_base = addr;
#endif /* CONFIG_VFD */

#ifdef CONFIG_LCD
  #ifndef PAGE_SIZE
    #define PAGE_SIZE 4096
  #endif
	/*
	 * reserve memory for LCD display (always full pages)
	 */
	/* bss_end is defined in the board-specific linker script */
	addr = (_bss_end + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);
	size = lcd_setmem (addr);
	gd->fb_base = addr;
#endif /* CONFIG_LCD */

#ifdef CONFIG_HAS_DATAFLASH
	AT91F_DataflashInit();
	dataflash_print_info();
#endif

#ifdef CFG_UBOOT_PROFILING
    time_env = get_timer(0);
#endif
	/* initialize environment */
	env_relocate ();
#ifdef CFG_UBOOT_PROFILING
      printf("[PROFILE] ------- env relocate takes %d ms -------- \n", get_timer(time_env));
#endif


#ifdef CONFIG_VFD
	/* must do this after the framebuffer is allocated */
	drv_vfd_init();
#endif /* CONFIG_VFD */

	/* IP Address */
	//gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");
	stdio_init ();	/* get the devices list going. */


#ifdef CONFIG_CMC_PU2
	load_sernum_ethaddr ();
#endif /* CONFIG_CMC_PU2 */

	jumptable_init ();

	//console_init_r ();	/* fully init console as a device */ //marked by hong-rong

	
#if defined(CONFIG_CMD_NAND)
    #ifdef CFG_UBOOT_PROFILING
      time_nand= get_timer(0);
    #endif
	puts ("NAND:  ");	
	nand_init();		/* go init the NAND */
	  #ifdef CFG_UBOOT_PROFILING
      printf("[PROFILE] ------- nand init takes %d ms -------- \n", get_timer(time_nand));
    #endif	
#endif
	
#if defined(CONFIG_ARCH_MISC_INIT)
	/* miscellaneous arch dependent initialisations */
	arch_misc_init ();
#endif

#ifdef CFG_UBOOT_PROFILING
      time_misc_init= get_timer(0);
#endif
#if defined(CONFIG_MISC_INIT_R)
	/* miscellaneous platform dependent initialisations */
	misc_init_r ();
#endif
#ifdef CFG_UBOOT_PROFILING
      printf("[PROFILE] ------- misc_init takes %d ms -------- \n", get_timer(time_misc_init));
#endif
  
	
#ifdef CONFIG_GENERIC_MMC
	puts ("MMC:   ");
	mmc_initialize (gd->bd);
#endif

#ifdef CFG_POWER_CHARGING
    #ifdef CFG_UBOOT_PROFILING
      time_bat= get_timer(0);
    #endif
  #if defined(MT6516)	
	  mt6516_bat_init();
	#else
	  mt65xx_bat_init();
	#endif    
	  #ifdef CFG_UBOOT_PROFILING
      printf("[PROFILE] ------- battery init takes %d ms -------- \n", get_timer(time_bat));
    #endif
#else
    /* NOTE: if define CFG_POWER_CHARGING, will rtc_boot_check() in mt65xx_bat_init() */
    rtc_boot_check(false);
#endif

#ifdef CFG_UBOOT_PROFILING
      time_show_logo= get_timer(0);
#endif
	// Some driver refresh RAM data to LCM after sleeping out.
	// LCM must sleep out before backlight on. Or Users may see the mess data in LCM in a instance.
	mt65xx_disp_power(1);
        if(g_boot_mode != ALARM_BOOT)
        {
	mt65xx_disp_show_boot_logo();
        }
#ifdef CFG_UBOOT_PROFILING
      printf("[PROFILE] ------- show logo takes %d ms -------- \n", get_timer(time_show_logo));
#endif

#ifdef CFG_UBOOT_PROFILING
      time_show_logo= get_timer(0);
#endif
	
#ifdef CFG_UBOOT_PROFILING
      time_backlight= get_timer(0);
#endif	
	mt65xx_backlight_on();
#ifdef CFG_UBOOT_PROFILING
      printf("[PROFILE] ------- backlight takes %d ms -------- \n", get_timer(time_backlight));
#endif


#ifdef CFG_UBOOT_PROFILING
      time_sw_env= get_timer(0);
#endif		
	//*****************
	//* prepare mt65xx sw enviroment	
	#if defined(MT6516)
	  mt6516_sw_env();
	#else
	  mt65xx_sw_env();
	#endif
#ifdef CFG_UBOOT_PROFILING
      printf("[PROFILE] ------- sw_env takes %d ms -------- \n", get_timer(time_sw_env));
#endif	
	
#ifdef CFG_UBOOT_PROFILING
    printf("[PROFILE] ------- start_armboot takes %d ms -------- \n", get_timer(time_start_armboot));
#endif
    
    /* main_loop() can return to retry autoboot, if so just run it again */
	for (;;) {
		main_loop ();
	}
	
	/* NOTREACHED - no way out of command loop except booting */
}