uboot/arch/sh/lib/board.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2007, 2008, 2010
   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 <stdio_dev.h>
  25#include <version.h>
  26#include <watchdog.h>
  27#include <net.h>
  28#include <environment.h>
  29
  30#ifdef CONFIG_BITBANGMII
  31#include <miiphy.h>
  32#endif
  33
  34DECLARE_GLOBAL_DATA_PTR;
  35
  36extern int cpu_init(void);
  37extern int board_init(void);
  38extern int dram_init(void);
  39extern int timer_init(void);
  40
  41unsigned long monitor_flash_len = CONFIG_SYS_MONITOR_LEN;
  42
  43#ifndef CONFIG_SYS_NO_FLASH
  44static int sh_flash_init(void)
  45{
  46        gd->bd->bi_flashsize = flash_init();
  47
  48        if (gd->bd->bi_flashsize >= (1024 * 1024))
  49                printf("Flash: %ldMB\n", gd->bd->bi_flashsize / (1024*1024));
  50        else
  51                printf("Flash: %ldKB\n", gd->bd->bi_flashsize / 1024);
  52
  53        return 0;
  54}
  55#endif /* CONFIG_SYS_NO_FLASH */
  56
  57#if defined(CONFIG_CMD_NAND)
  58# include <nand.h>
  59# define INIT_FUNC_NAND_INIT nand_init,
  60#else
  61# define INIT_FUNC_NAND_INIT
  62#endif /* CONFIG_CMD_NAND */
  63
  64#if defined(CONFIG_WATCHDOG)
  65extern int watchdog_init(void);
  66extern int watchdog_disable(void);
  67# define INIT_FUNC_WATCHDOG_INIT        watchdog_init,
  68# define WATCHDOG_DISABLE               watchdog_disable
  69#else
  70# define INIT_FUNC_WATCHDOG_INIT
  71# define WATCHDOG_DISABLE
  72#endif /* CONFIG_WATCHDOG */
  73
  74#if defined(CONFIG_CMD_IDE)
  75# include <ide.h>
  76# define INIT_FUNC_IDE_INIT     ide_init,
  77#else
  78# define INIT_FUNC_IDE_INIT
  79#endif /* CONFIG_CMD_IDE */
  80
  81#if defined(CONFIG_PCI)
  82#include <pci.h>
  83static int sh_pci_init(void)
  84{
  85        pci_init();
  86        return 0;
  87}
  88# define INIT_FUNC_PCI_INIT sh_pci_init,
  89#else
  90# define INIT_FUNC_PCI_INIT
  91#endif /* CONFIG_PCI */
  92
  93static int sh_mem_env_init(void)
  94{
  95        mem_malloc_init(CONFIG_SYS_TEXT_BASE - GENERATED_GBL_DATA_SIZE -
  96                        CONFIG_SYS_MALLOC_LEN, CONFIG_SYS_MALLOC_LEN - 16);
  97        env_relocate();
  98        jumptable_init();
  99        return 0;
 100}
 101
 102#if defined(CONFIG_CMD_NET)
 103static int sh_net_init(void)
 104{
 105        gd->bd->bi_ip_addr = getenv_IPaddr("ipaddr");
 106        return 0;
 107}
 108#endif
 109
 110#if defined(CONFIG_CMD_MMC)
 111static int sh_mmc_init(void)
 112{
 113        puts("MMC:   ");
 114        mmc_initialize(gd->bd);
 115        return 0;
 116}
 117#endif
 118
 119typedef int (init_fnc_t) (void);
 120
 121init_fnc_t *init_sequence[] =
 122{
 123        cpu_init,               /* basic cpu dependent setup */
 124        board_init,             /* basic board dependent setup */
 125        interrupt_init, /* set up exceptions */
 126        env_init,               /* event init */
 127        serial_init,    /* SCIF init */
 128        INIT_FUNC_WATCHDOG_INIT /* watchdog init */
 129        console_init_f,
 130        display_options,
 131        checkcpu,
 132        checkboard,             /* Check support board */
 133        dram_init,              /* SDRAM init */
 134        timer_init,             /* SuperH Timer (TCNT0 only) init */
 135        sh_mem_env_init,
 136#ifndef CONFIG_SYS_NO_FLASH
 137        sh_flash_init,  /* Flash memory init*/
 138#endif
 139        INIT_FUNC_NAND_INIT/* Flash memory (NAND) init */
 140        INIT_FUNC_PCI_INIT      /* PCI init */
 141        stdio_init,
 142        console_init_r,
 143        interrupt_init,
 144#ifdef BOARD_LATE_INIT
 145        board_late_init,
 146#endif
 147#if defined(CONFIG_CMD_NET)
 148        sh_net_init,            /* SH specific eth init */
 149#endif
 150#if defined(CONFIG_CMD_MMC)
 151        sh_mmc_init,
 152#endif
 153        NULL                    /* Terminate this list */
 154};
 155
 156void sh_generic_init(void)
 157{
 158        bd_t *bd;
 159        init_fnc_t **init_fnc_ptr;
 160
 161        memset(gd, 0, GENERATED_GBL_DATA_SIZE);
 162
 163        gd->flags |= GD_FLG_RELOC;      /* tell others: relocation done */
 164
 165        gd->bd = (bd_t *)(gd + 1);      /* At end of global data */
 166        gd->baudrate = CONFIG_BAUDRATE;
 167
 168        gd->cpu_clk = CONFIG_SYS_CLK_FREQ;
 169
 170        bd = gd->bd;
 171        bd->bi_memstart = CONFIG_SYS_SDRAM_BASE;
 172        bd->bi_memsize = CONFIG_SYS_SDRAM_SIZE;
 173#ifndef CONFIG_SYS_NO_FLASH
 174        bd->bi_flashstart = CONFIG_SYS_FLASH_BASE;
 175#endif
 176#if defined(CONFIG_SYS_SRAM_BASE) && defined(CONFIG_SYS_SRAM_SIZE)
 177        bd->bi_sramstart = CONFIG_SYS_SRAM_BASE;
 178        bd->bi_sramsize = CONFIG_SYS_SRAM_SIZE;
 179#endif
 180        bd->bi_baudrate = CONFIG_BAUDRATE;
 181
 182        for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
 183                WATCHDOG_RESET();
 184                if ((*init_fnc_ptr) () != 0)
 185                        hang();
 186        }
 187
 188#ifdef CONFIG_WATCHDOG
 189        /* disable watchdog if environment is set */
 190        {
 191                char *s = getenv("watchdog");
 192                if (s != NULL)
 193                        if (strncmp(s, "off", 3) == 0)
 194                                WATCHDOG_DISABLE();
 195        }
 196#endif /* CONFIG_WATCHDOG*/
 197
 198
 199#ifdef CONFIG_BITBANGMII
 200        bb_miiphy_init();
 201#endif
 202#if defined(CONFIG_CMD_NET)
 203        {
 204                char *s;
 205                puts("Net:   ");
 206                eth_initialize(gd->bd);
 207
 208                s = getenv("bootfile");
 209                if (s != NULL)
 210                        copy_filename(BootFile, s, sizeof(BootFile));
 211        }
 212#endif /* CONFIG_CMD_NET */
 213
 214        while (1) {
 215                WATCHDOG_RESET();
 216                main_loop();
 217        }
 218}
 219
 220/***********************************************************************/
 221
 222void hang(void)
 223{
 224        puts("Board ERROR\n");
 225        for (;;)
 226                ;
 227}
 228