]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - lib_nios/board.c
Merge ../master/
[karo-tx-uboot.git] / lib_nios / board.c
index 0bbedfdaeec4efc8932adf102e22906dc5c66c0f..0a0d2e38fdacb72e7c070ac896c703712f7f6871 100644 (file)
 #include <devices.h>
 #include <watchdog.h>
 #include <net.h>
+#ifdef CONFIG_STATUS_LED
+#include <status_led.h>
+#endif
 
+DECLARE_GLOBAL_DATA_PTR;
 
 /*
  * All attempts to come up with a "common" initialization sequence
@@ -46,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"
@@ -87,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,
@@ -104,8 +107,6 @@ 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;
@@ -115,11 +116,10 @@ void board_init (void)
         * 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;
@@ -129,18 +129,23 @@ 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();
@@ -152,13 +157,20 @@ void board_init (void)
                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 ();
@@ -171,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 (;;);
 }