diff options
Diffstat (limited to 'cpu')
| -rw-r--r-- | cpu/sh4/Makefile | 46 | ||||
| -rw-r--r-- | cpu/sh4/config.mk | 28 | ||||
| -rw-r--r-- | cpu/sh4/cpu.c | 67 | ||||
| -rw-r--r-- | cpu/sh4/interrupts.c | 39 | ||||
| -rw-r--r-- | cpu/sh4/start.S | 75 | ||||
| -rw-r--r-- | cpu/sh4/time.c | 94 | ||||
| -rw-r--r-- | cpu/sh4/watchdog.c | 50 | 
7 files changed, 399 insertions, 0 deletions
| diff --git a/cpu/sh4/Makefile b/cpu/sh4/Makefile new file mode 100644 index 000000000..b24a280db --- /dev/null +++ b/cpu/sh4/Makefile @@ -0,0 +1,46 @@ +# +# (C) Copyright 2000-2006 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# (C) Copyright 2007 +# Nobuhiro Iwamatsu <iwamatsu@nigauri.org> +# +# See file CREDITS for list of people who contributed to this +# project. +# +# 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 $(TOPDIR)/config.mk + +LIB	= $(obj)lib$(CPU).a + +START	= start.o +OBJS	= cpu.o interrupts.o watchdog.o time.o  + +all:	.depend $(START) $(LIB) + +$(LIB):	$(OBJS) +	$(AR) crv $@ $(OBJS) + +######################################################################### + +.depend:	Makefile $(START:.o=.S) $(OBJS:.o=.c) +		$(CC) -M $(CFLAGS) $(START:.o=.S) $(OBJS:.o=.c) > $@ + +sinclude .depend + +######################################################################### diff --git a/cpu/sh4/config.mk b/cpu/sh4/config.mk new file mode 100644 index 000000000..2dc7b918d --- /dev/null +++ b/cpu/sh4/config.mk @@ -0,0 +1,28 @@ +# +# (C) Copyright 2000-2004 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# (C) Copyright 2007 +# Nobuhiro Iwamatsu <iwamatsu@nigauri.org> +#    +# See file CREDITS for list of people who contributed to this +# project. +# +# 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 +# +# +PLATFORM_CPPFLAGS += -m4-nofpu +PLATFORM_RELFLAGS += -ffixed-r13 diff --git a/cpu/sh4/cpu.c b/cpu/sh4/cpu.c new file mode 100644 index 000000000..70df45ef9 --- /dev/null +++ b/cpu/sh4/cpu.c @@ -0,0 +1,67 @@ +/* + * (C) Copyright 2007 + * Nobuhiro Iwamatsu <iwamatsu@nigauri.org> + * + * See file CREDITS for list of people who contributed to this + * project. + * + * 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> + +int checkcpu(void) +{ +	puts("CPU: SH4\n"); +	return 0; +} + +int cpu_init (void) +{ +	return 0; +} + +int cleanup_before_linux (void) +{ +	disable_interrupts(); +	return 0; +} + +int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ +	disable_interrupts(); +	reset_cpu (0); +	return 0; +} + +void flush_cache (unsigned long addr, unsigned long size){} + +void icache_enable (void) +{ + +} + +void icache_disable (void) +{ + +} + + +int icache_status (void) +{ +	return 0;  +} diff --git a/cpu/sh4/interrupts.c b/cpu/sh4/interrupts.c new file mode 100644 index 000000000..d310dd2c1 --- /dev/null +++ b/cpu/sh4/interrupts.c @@ -0,0 +1,39 @@ +/* + * (C) Copyright 2007 + * Nobuhiro Iwamatsu <iwamatsu@nigauri.org> + * + * See file CREDITS for list of people who contributed to this + * project. + * + * 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> + +int interrupt_init (void) +{ +	return 0;  +} + +void enable_interrupts (void) +{ + +} + +int disable_interrupts (void){  +	return 0;  +} + diff --git a/cpu/sh4/start.S b/cpu/sh4/start.S new file mode 100644 index 000000000..d88b705ef --- /dev/null +++ b/cpu/sh4/start.S @@ -0,0 +1,75 @@ +/* + * (C) Copyright 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 <config.h> +#include <version.h> + +	.text +	.align	2 + +	.global	_start +_start: +	mov.l	._lowlevel_init, r0 +100:	bsrf	r0 +	nop + +	bsr	1f +	nop +1:	sts	pr, r5 +	mov.l	._reloc_dst, r4	 +	add	#(_start-1b), r5	 +	mov.l	._reloc_dst_end, r6	 + +2:	mov.l	@r5+, r1 +	mov.l	r1, @r4 +	add	#4, r4 +	cmp/hs	r6, r4 +	bf	2b +	 +	mov.l	._bss_start, r4	 +	mov.l	._bss_end, r5		 +	mov	#0, r1 + +3:	mov.l	r1, @r4			/* bss clear */	 +	add	#4, r4 +	cmp/hs	r5, r4 +	bf	3b + +	mov.l	._gd_init, r13		/* global data */ +	mov.l	._stack_init, r15	/* stack */ + +	mov.l	._sh_generic_init, r0 +	jsr	@r0			 +	nop				 + +loop: +	bra	loop + +	.align	2 + +._lowlevel_init:	.long	(lowlevel_init - (100b + 4)) +._reloc_dst:		.long	reloc_dst +._reloc_dst_end:	.long	reloc_dst_end +._bss_start:		.long	bss_start +._bss_end:		.long	bss_end +._gd_init:		.long	(_start - CFG_GBL_DATA_SIZE) +._stack_init:		.long	(_start - CFG_GBL_DATA_SIZE - CFG_MALLOC_LEN - 16) +._sh_generic_init:	.long	sh_generic_init + diff --git a/cpu/sh4/time.c b/cpu/sh4/time.c new file mode 100644 index 000000000..b6e4d0246 --- /dev/null +++ b/cpu/sh4/time.c @@ -0,0 +1,94 @@ +/* + * (C) Copyright 2003 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * 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 <asm/processor.h> + +#define TMU_MAX_COUNTER (~0UL) + +static void tmu_timer_start (unsigned int timer) +{ +	if (timer > 2) +		return; + +	*((volatile unsigned char *) TSTR0) |= (1 << timer); +} + +int timer_init (void) +{ +	/* Divide clock by 4 */ +	*(volatile u16 *)TCR0 = 0; + +	tmu_timer_start (0); +	return 0; +} + +/* +   In theory we should return a true 64bit value (ie something that doesn't +   overflow). However, we don't. Therefore if TMU runs at fastest rate of +   6.75 MHz this value will wrap after u-boot has been running for approx +   10 minutes. +*/ +unsigned long long get_ticks (void) +{ +	return (0 - *((volatile unsigned int *) TCNT0)); +} + +unsigned long get_timer (unsigned long base) +{ +	unsigned long n =  +		*((volatile unsigned int *)TCNT0) ; +	 +	return ((int)n - base ) < 0 ? ( TMU_MAX_COUNTER - ( base -n )):(n - base ); +} + +void set_timer (unsigned long t) +{ +	*((volatile unsigned int *) TCNT0) = (0 - t); +} + +void reset_timer (void) +{ +	set_timer (0); +} + +void udelay (unsigned long usec) +{ +	unsigned int start = get_timer (0); +	unsigned int end = 0; +	if (usec > 1000000) +		end = ((usec/100000) * CFG_HZ) / 10; +	else if (usec > 1000) +		end = ((usec/100) * CFG_HZ) / 10000; +	else +		end = (usec * CFG_HZ) / 1000000; + +	while (get_timer (0) < end) +		continue; +} + +unsigned long get_tbclk (void) +{ +	return CFG_HZ; +} + diff --git a/cpu/sh4/watchdog.c b/cpu/sh4/watchdog.c new file mode 100644 index 000000000..e2bc82031 --- /dev/null +++ b/cpu/sh4/watchdog.c @@ -0,0 +1,50 @@ +/* + * 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 <asm/processor.h> + +#define WDT_BASE	WTCNT + +static unsigned char cnt_read (void){ +	return *((volatile unsigned char *)(WDT_BASE + 0x00)); +} + +static unsigned char csr_read (void){ +	return *((volatile unsigned char *)(WDT_BASE + 0x04)); +} + +static void cnt_write (unsigned char value){ +	while (csr_read() & (1 << 5)) { +		/* delay */ +	} +	*((volatile unsigned short *)(WDT_BASE + 0x00)) = ((unsigned short) value) | 0x5A00; +} + +static void csr_write (unsigned char value){ +	*((volatile unsigned short *)(WDT_BASE + 0x04)) = ((unsigned short) value) | 0xA500; +} + + +int watchdog_init (void){ return 0; } + +void reset_cpu (unsigned long ignored) +{ +	while(1); +} + + |