diff options
| author | Nobuhiro Iwamatsu <iwamatsu@rahute.(none)> | 2007-05-13 20:58:00 +0900 | 
|---|---|---|
| committer | Nobuhiro Iwamatsu <iwamatsu@rahute.(none)> | 2007-05-13 20:58:00 +0900 | 
| commit | 0b135cfc2e524dc249b75057b55dd4cc09842e27 (patch) | |
| tree | a342e571738e4777bbb2b66246412e9d9aaa81c2 /lib_sh/board.c | |
| parent | abca901869c3760b6c5fecb825db6c1d91a78a93 (diff) | |
| download | olio-uboot-2014.01-0b135cfc2e524dc249b75057b55dd4cc09842e27.tar.xz olio-uboot-2014.01-0b135cfc2e524dc249b75057b55dd4cc09842e27.zip | |
sh: First support code of SuperH.
Signed-off-by: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
Diffstat (limited to 'lib_sh/board.c')
| -rw-r--r-- | lib_sh/board.c | 163 | 
1 files changed, 163 insertions, 0 deletions
| diff --git a/lib_sh/board.c b/lib_sh/board.c new file mode 100644 index 000000000..c3f846257 --- /dev/null +++ b/lib_sh/board.c @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2007 + * Nobuhiro Iwamatsu <iwamatsu@nigauri.org> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <command.h> +#include <malloc.h> +#include <devices.h> +#include <version.h> +#include <net.h> +#include <environment.h> + +extern void malloc_bin_reloc (void); +extern int cpu_init(void); +extern int board_init(void); +extern int dram_init(void); +extern int watchdog_init(void); +extern int timer_init(void); + +const char version_string[] = U_BOOT_VERSION" (" __DATE__ " - " __TIME__ ")"; + +unsigned long monitor_flash_len = CFG_MONITOR_LEN; + +static unsigned long mem_malloc_start; +static unsigned long mem_malloc_end; +static unsigned long mem_malloc_brk; + +static void mem_malloc_init (void) +{ + +	mem_malloc_start = (TEXT_BASE - CFG_GBL_DATA_SIZE - CFG_MALLOC_LEN); +	mem_malloc_end = (mem_malloc_start + CFG_MALLOC_LEN - 16); +	mem_malloc_brk = mem_malloc_start; +	memset ((void *) mem_malloc_start, 0,  +		(mem_malloc_end - mem_malloc_start)); +} + +void *sbrk (ptrdiff_t increment) +{ +	unsigned long old = mem_malloc_brk; +	unsigned long new = old + increment; + +	if ((new < mem_malloc_start) || +	    (new > mem_malloc_end)) { +		return NULL; +	} + +	mem_malloc_brk = new; +	return (void *) old; +} + +typedef int (init_fnc_t) (void); + +init_fnc_t *init_sequence[] = +{ +	cpu_init,		/* basic cpu dependent setup */ +	board_init,		/* basic board dependent setup */ +	interrupt_init,		/* set up exceptions */ +	env_init,		/* event init */ +	serial_init,		/* SCIF init */ +	watchdog_init, +	console_init_f, +	display_options, +	checkcpu, +	checkboard, +	dram_init,		/* SDRAM init */ +	NULL			/* Terminate this list */ +}; + +void sh_generic_init (void) +{ +	DECLARE_GLOBAL_DATA_PTR; + +	bd_t *bd; +	init_fnc_t **init_fnc_ptr; +	char *s, *e; +	int i; + +	memset (gd, 0, CFG_GBL_DATA_SIZE); + +	gd->flags |= GD_FLG_RELOC;	/* tell others: relocation done */ + +	gd->bd = (bd_t *) (gd + 1);		/* At end of global data */ +	gd->baudrate = CONFIG_BAUDRATE; + +	gd->cpu_clk = CONFIG_SYS_CLK_FREQ; + +	bd = gd->bd; +	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) { +		if ((*init_fnc_ptr) () != 0) { +			hang(); +		} +	} +	 +	timer_init(); +	 +	/* flash_init need timer_init().(TMU) */ +	bd->bi_flashsize = flash_init(); +	printf("FLASH: %dMB\n", bd->bi_flashsize / (1024*1024)); + +	mem_malloc_init(); +	malloc_bin_reloc(); +	env_relocate(); + +#if  (CONFIG_COMMANDS & CFG_CMD_NET) +	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; +	} +#endif +	devices_init(); +	jumptable_init(); +	console_init_r(); +	interrupt_init(); +#ifdef BOARD_LATE_INIT +	board_late_init (); +#endif +#if (CONFIG_COMMANDS & CFG_CMD_NET) +#if defined(CONFIG_NET_MULTI) +	puts ("Net:   "); +#endif +	eth_initialize(gd->bd); +#endif +	while (1) { +		main_loop(); +	} +} + + +/***********************************************************************/ + +void hang (void) +{ +	puts ("Board ERROR \n"); +	for (;;); +} |