X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=lib_nios%2Fboard.c;h=0a0d2e38fdacb72e7c070ac896c703712f7f6871;hb=24f868433b50ecbaa88e118aadc7bd254013c6ae;hp=c81c0011e252a123f02ca4bbb21ff36a5f68a380;hpb=4a5517094dd30bb1f271403b62e23053301668e6;p=u-boot diff --git a/lib_nios/board.c b/lib_nios/board.c index c81c0011e2..0a0d2e38fd 100644 --- a/lib_nios/board.c +++ b/lib_nios/board.c @@ -27,7 +27,12 @@ #include #include #include +#include +#ifdef CONFIG_STATUS_LED +#include +#endif +DECLARE_GLOBAL_DATA_PTR; /* * All attempts to come up with a "common" initialization sequence @@ -45,7 +50,6 @@ extern void malloc_bin_reloc (void); typedef int (init_fnc_t) (void); -extern unsigned _vectors[]; /* * Begin and End of memory area for malloc(), and current "brk" @@ -86,8 +90,8 @@ void *sbrk (ptrdiff_t increment) init_fnc_t *init_sequence[] = { -#if defined(CONFIG_BOARD_PRE_INIT) - board_pre_init, /* Call board-specific init code early.*/ +#if defined(CONFIG_BOARD_EARLY_INIT_F) + board_early_init_f, /* Call board-specific init code early.*/ #endif env_init, @@ -103,20 +107,19 @@ init_fnc_t *init_sequence[] = { /***********************************************************************/ void board_init (void) { - DECLARE_GLOBAL_DATA_PTR; - bd_t *bd; init_fnc_t **init_fnc_ptr; + char *s, *e; + int i; /* Pointer is writable since we allocated a register for it. * Nios treats CFG_GBL_DATA_OFFSET as an address. */ gd = (gd_t *)CFG_GBL_DATA_OFFSET; - memset( gd, 0, CFG_GBL_DATA_SIZE ); + /* compiler optimization barrier needed for GCC >= 3.4 */ + __asm__ __volatile__("": : :"memory"); - /* Copy exception vectors to the correct location. - */ - memcpy( (void *)CFG_VECT_BASE, _vectors, 256 ); + memset( gd, 0, CFG_GBL_DATA_SIZE ); gd->bd = (bd_t *)(gd+1); /* At end of global data */ gd->baudrate = CONFIG_BAUDRATE; @@ -126,29 +129,48 @@ void board_init (void) bd->bi_memstart = CFG_SDRAM_BASE; bd->bi_memsize = CFG_SDRAM_SIZE; bd->bi_flashstart = CFG_FLASH_BASE; +#if defined(CFG_SRAM_BASE) && defined(CFG_SRAM_SIZE) bd->bi_sramstart= CFG_SRAM_BASE; bd->bi_sramsize = CFG_SRAM_SIZE; +#endif bd->bi_baudrate = CONFIG_BAUDRATE; for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { + WATCHDOG_RESET (); if ((*init_fnc_ptr) () != 0) { hang (); } } + WATCHDOG_RESET (); bd->bi_flashsize = flash_init(); + WATCHDOG_RESET (); mem_malloc_init(); malloc_bin_reloc(); env_relocate(); + bd->bi_ip_addr = getenv_IPaddr ("ipaddr"); + s = getenv ("ethaddr"); + for (i = 0; i < 6; ++i) { + bd->bi_enetaddr[i] = s ? simple_strtoul (s, &e, 16) : 0; + if (s) s = (*e) ? e + 1 : e; + } + + WATCHDOG_RESET (); devices_init(); jumptable_init(); console_init_r(); /* */ + WATCHDOG_RESET (); interrupt_init (); + +#ifdef CONFIG_STATUS_LED + status_led_set(STATUS_LED_BOOT, STATUS_LED_BLINKING); +#endif + /* main_loop */ for (;;) { WATCHDOG_RESET (); @@ -161,6 +183,10 @@ void board_init (void) void hang (void) { +#ifdef CONFIG_STATUS_LED + status_led_set(STATUS_LED_BOOT, STATUS_LED_OFF); + status_led_set(STATUS_LED_RED, STATUS_LED_BLINKING); +#endif puts("### ERROR ### Please reset board ###\n"); for (;;); }