uboot/lib_sh/board.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2007,2008
   3 * Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
   4 *
   5 * This program is free software; you can redistribute it and/or
   6 * modify it under the terms of the GNU General Public License as
   7 * published by the Free Software Foundation; either version 2 of
   8 * the License, or (at your option) any later version.
   9 *
  10 * This program is distributed in the hope that it will be useful,
  11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 * GNU General Public License for more details.
  14 *
  15 * You should have received a copy of the GNU General Public License
  16 * along with this program; if not, write to the Free Software
  17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  18 * MA 02111-1307 USA
  19 */
  20
  21#include <common.h>
  22#include <command.h>
  23#include <malloc.h>
  24#include <devices.h>
  25#include <timestamp.h>
  26#include <version.h>
  27#include <watchdog.h>
  28#include <net.h>
  29#include <environment.h>
  30
  31extern void malloc_bin_reloc (void);
  32extern int cpu_init(void);
  33extern int board_init(void);
  34extern int dram_init(void);
  35extern int timer_init(void);
  36
  37const char version_string[] = U_BOOT_VERSION" ("U_BOOT_DATE" - "U_BOOT_TIME")";
  38
  39unsigned long monitor_flash_len = CONFIG_SYS_MONITOR_LEN;
  40
  41static unsigned long mem_malloc_start;
  42static unsigned long mem_malloc_end;
  43static unsigned long mem_malloc_brk;
  44
  45static void mem_malloc_init(void)
  46{
  47
  48        mem_malloc_start = (TEXT_BASE - CONFIG_SYS_GBL_DATA_SIZE - CONFIG_SYS_MALLOC_LEN);
  49        mem_malloc_end = (mem_malloc_start + CONFIG_SYS_MALLOC_LEN - 16);
  50        mem_malloc_brk = mem_malloc_start;
  51        memset((void *) mem_malloc_start, 0,
  52                (mem_malloc_end - mem_malloc_start));
  53}
  54
  55void *sbrk(ptrdiff_t increment)
  56{
  57        unsigned long old = mem_malloc_brk;
  58        unsigned long new = old + increment;
  59
  60        if ((new < mem_malloc_start) ||
  61            (new > mem_malloc_end)) {
  62                return NULL;
  63        }
  64
  65        mem_malloc_brk = new;
  66        return (void *) old;
  67}
  68
  69static int sh_flash_init(void)
  70{
  71        DECLARE_GLOBAL_DATA_PTR;
  72
  73        gd->bd->bi_flashsize = flash_init();
  74        printf("FLASH: %ldMB\n", gd->bd->bi_flashsize / (1024*1024));
  75
  76        return 0;
  77}
  78
  79#if defined(CONFIG_CMD_NAND)
  80# include <nand.h>
  81# define INIT_FUNC_NAND_INIT nand_init,
  82#else
  83# define INIT_FUNC_NAND_INIT
  84#endif /* CONFIG_CMD_NAND */
  85
  86#if defined(CONFIG_WATCHDOG)
  87extern int watchdog_init(void);
  88extern int watchdog_disable(void);
  89# define INIT_FUNC_WATCHDOG_INIT        watchdog_init,
  90# define WATCHDOG_DISABLE               watchdog_disable
  91#else
  92# define INIT_FUNC_WATCHDOG_INIT
  93# define WATCHDOG_DISABLE
  94#endif /* CONFIG_WATCHDOG */
  95
  96#if defined(CONFIG_CMD_IDE)
  97# include <ide.h>
  98# define INIT_FUNC_IDE_INIT     ide_init,
  99#else
 100# define INIT_FUNC_IDE_INIT
 101#endif /* CONFIG_CMD_IDE */
 102
 103#if defined(CONFIG_PCI)
 104#include <pci.h>
 105static int sh_pci_init(void)
 106{
 107        pci_init();
 108        return 0;
 109}
 110# define INIT_FUNC_PCI_INIT sh_pci_init,
 111#else
 112# define INIT_FUNC_PCI_INIT
 113#endif /* CONFIG_PCI */
 114
 115static int sh_mem_env_init(void)
 116{
 117        mem_malloc_init();
 118        malloc_bin_reloc();
 119        env_relocate();
 120        jumptable_init();
 121        return 0;
 122}
 123
 124#if defined(CONFIG_CMD_NET)
 125static int sh_net_init(void)
 126{
 127        DECLARE_GLOBAL_DATA_PTR;
 128        char *s, *e;
 129        int i;
 130
 131        gd->bd->bi_ip_addr = getenv_IPaddr("ipaddr");
 132        s = getenv("ethaddr");
 133        for (i = 0; i < 6; ++i) {
 134                gd->bd->bi_enetaddr[i] = s ? simple_strtoul(s, &e, 16) : 0;
 135                if (s)
 136                        s = (*e) ? e + 1 : e;
 137        }
 138
 139        return 0;
 140}
 141#endif
 142
 143typedef int (init_fnc_t) (void);
 144
 145init_fnc_t *init_sequence[] =
 146{
 147        cpu_init,               /* basic cpu dependent setup */
 148        board_init,             /* basic board dependent setup */
 149        interrupt_init, /* set up exceptions */
 150        env_init,               /* event init */
 151        serial_init,    /* SCIF init */
 152        INIT_FUNC_WATCHDOG_INIT /* watchdog init */
 153        console_init_f,
 154        display_options,
 155        checkcpu,
 156        checkboard,             /* Check support board */
 157        dram_init,              /* SDRAM init */
 158        timer_init,             /* SuperH Timer (TCNT0 only) init */
 159        sh_flash_init,  /* Flash memory(NOR) init*/
 160        sh_mem_env_init,
 161        INIT_FUNC_NAND_INIT/* Flash memory (NAND) init */
 162        INIT_FUNC_PCI_INIT      /* PCI init */
 163        devices_init,
 164        console_init_r,
 165        interrupt_init,
 166#ifdef BOARD_LATE_INIT
 167        board_late_init,
 168#endif
 169#if defined(CONFIG_CMD_NET)
 170        sh_net_init,            /* SH specific eth init */
 171#endif
 172        NULL                    /* Terminate this list */
 173};
 174
 175void sh_generic_init(void)
 176{
 177        DECLARE_GLOBAL_DATA_PTR;
 178
 179        bd_t *bd;
 180        init_fnc_t **init_fnc_ptr;
 181
 182        memset(gd, 0, CONFIG_SYS_GBL_DATA_SIZE);
 183
 184        gd->flags |= GD_FLG_RELOC;      /* tell others: relocation done */
 185
 186        gd->bd = (bd_t *)(gd + 1);      /* At end of global data */
 187        gd->baudrate = CONFIG_BAUDRATE;
 188
 189        gd->cpu_clk = CONFIG_SYS_CLK_FREQ;
 190
 191        bd = gd->bd;
 192        bd->bi_memstart = CONFIG_SYS_SDRAM_BASE;
 193        bd->bi_memsize = CONFIG_SYS_SDRAM_SIZE;
 194        bd->bi_flashstart = CONFIG_SYS_FLASH_BASE;
 195#if defined(CONFIG_SYS_SRAM_BASE) && defined(CONFIG_SYS_SRAM_SIZE)
 196        bd->bi_sramstart = CONFIG_SYS_SRAM_BASE;
 197        bd->bi_sramsize = CONFIG_SYS_SRAM_SIZE;
 198#endif
 199        bd->bi_baudrate = CONFIG_BAUDRATE;
 200
 201        for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
 202                WATCHDOG_RESET();
 203                if ((*init_fnc_ptr) () != 0)
 204                        hang();
 205        }
 206
 207#ifdef CONFIG_WATCHDOG
 208        /* disable watchdog if environment is set */
 209        {
 210                char *s = getenv("watchdog");
 211                if (s != NULL)
 212                        if (strncmp(s, "off", 3) == 0)
 213                                WATCHDOG_DISABLE();
 214        }
 215#endif /* CONFIG_WATCHDOG*/
 216
 217
 218#if defined(CONFIG_CMD_NET)
 219        {
 220                char *s;
 221                puts("Net:   ");
 222                eth_initialize(gd->bd);
 223
 224                s = getenv("bootfile");
 225                if (s != NULL)
 226                        copy_filename(BootFile, s, sizeof(BootFile));
 227        }
 228#endif /* CONFIG_CMD_NET */
 229
 230        while (1) {
 231                WATCHDOG_RESET();
 232                main_loop();
 233        }
 234}
 235
 236/***********************************************************************/
 237
 238void hang(void)
 239{
 240        puts("Board ERROR\n");
 241        for (;;)
 242                ;
 243}
 244