mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-24 13:43:28 +00:00
sh: First support code of SuperH.
Signed-off-by: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
This commit is contained in:
parent
abca901869
commit
0b135cfc2e
31 changed files with 2257 additions and 1 deletions
5
CREDITS
5
CREDITS
|
@ -479,3 +479,8 @@ N: Michal Simek
|
|||
E: monstr@monstr.eu
|
||||
D: Support for Microblaze, ML401, XUPV2P board
|
||||
W: www.monstr.eu
|
||||
|
||||
N: Nobuhiro Iwamatsu
|
||||
E: iwamatsu@nigauri.org
|
||||
D: Support for SuperH, MS7750SE01 , MS7780SE03 board
|
||||
W: www.nigauri.org
|
||||
|
|
3
Makefile
3
Makefile
|
@ -151,6 +151,9 @@ endif
|
|||
ifeq ($(ARCH),avr32)
|
||||
CROSS_COMPILE = avr32-linux-
|
||||
endif
|
||||
ifeq ($(ARCH),sh)
|
||||
CROSS_COMPILE = sh4-linux-
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
|
|
|
@ -267,6 +267,8 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
|||
if (hdr->ih_arch != IH_CPU_NIOS2)
|
||||
#elif defined(__PPC__)
|
||||
if (hdr->ih_arch != IH_CPU_PPC)
|
||||
#elif defined(__sh__)
|
||||
if (hdr->ih_arch != IH_CPU_SH)
|
||||
#else
|
||||
# error Unknown CPU type
|
||||
#endif
|
||||
|
|
46
cpu/sh4/Makefile
Normal file
46
cpu/sh4/Makefile
Normal file
|
@ -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
|
||||
|
||||
#########################################################################
|
28
cpu/sh4/config.mk
Normal file
28
cpu/sh4/config.mk
Normal file
|
@ -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
|
67
cpu/sh4/cpu.c
Normal file
67
cpu/sh4/cpu.c
Normal file
|
@ -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;
|
||||
}
|
39
cpu/sh4/interrupts.c
Normal file
39
cpu/sh4/interrupts.c
Normal file
|
@ -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;
|
||||
}
|
||||
|
75
cpu/sh4/start.S
Normal file
75
cpu/sh4/start.S
Normal file
|
@ -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
|
||||
|
94
cpu/sh4/time.c
Normal file
94
cpu/sh4/time.c
Normal file
|
@ -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;
|
||||
}
|
||||
|
50
cpu/sh4/watchdog.c
Normal file
50
cpu/sh4/watchdog.c
Normal file
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
@ -41,7 +41,7 @@ COBJS = 3c589.o 5701rls.o ali512x.o atmel_usart.o \
|
|||
rtl8019.o rtl8139.o rtl8169.o \
|
||||
s3c4510b_eth.o s3c4510b_uart.o \
|
||||
sed13806.o sed156x.o \
|
||||
serial.o serial_max3100.o \
|
||||
serial.o serial_max3100.o serial_sh.o \
|
||||
serial_pl010.o serial_pl011.o serial_xuartlite.o \
|
||||
sl811_usb.o sm501.o smc91111.o smiLynxEM.o \
|
||||
status_led.o sym53c8xx.o systemace.o ahci.o \
|
||||
|
|
177
drivers/serial_sh.c
Normal file
177
drivers/serial_sh.c
Normal file
|
@ -0,0 +1,177 @@
|
|||
/*
|
||||
* SuperH SCIF device driver.
|
||||
* Copyright (c) 2007 Nobuhiro Iwamatsu
|
||||
*
|
||||
* 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>
|
||||
|
||||
#ifdef CFG_SCIF_CONSOLE
|
||||
|
||||
#if defined (CONFIG_CONS_SCIF0)
|
||||
#define SCIF_BASE SCIF0_BASE
|
||||
#elif defined (CONFIG_CONS_SCIF1)
|
||||
#define SCIF_BASE SCIF1_BASE
|
||||
#else
|
||||
#error "Default SCIF doesn't set....."
|
||||
#endif
|
||||
|
||||
#define SCSMR (volatile unsigned short *)(SCIF_BASE + 0x0)
|
||||
#define SCBRR (volatile unsigned char *)(SCIF_BASE + 0x4)
|
||||
#define SCSCR (volatile unsigned short *)(SCIF_BASE + 0x8)
|
||||
#define SCFTDR (volatile unsigned char *)(SCIF_BASE + 0xC)
|
||||
#define SCFSR (volatile unsigned short *)(SCIF_BASE + 0x10)
|
||||
#define SCFRDR (volatile unsigned char *)(SCIF_BASE + 0x14)
|
||||
#define SCFCR (volatile unsigned short *)(SCIF_BASE + 0x18)
|
||||
#define SCFDR (volatile unsigned short *)(SCIF_BASE + 0x1C)
|
||||
#if defined(CONFIG_SH4A)
|
||||
#define SCRFDR (volatile unsigned short *)(SCIF_BASE + 0x20)
|
||||
#define SCSPTR (volatile unsigned short *)(SCIF_BASE + 0x24)
|
||||
#define SCLSR (volatile unsigned short *)(SCIF_BASE + 0x28)
|
||||
#define SCRER (volatile unsigned short *)(SCIF_BASE + 0x2C)
|
||||
#elif defined (CONFIG_SH4)
|
||||
#define SCSPTR (volatile unsigned short *)(SCIF_BASE + 0x20)
|
||||
#define SCLSR (volatile unsigned short *)(SCIF_BASE + 0x24)
|
||||
#elif defined (CONFIG_SH3)
|
||||
#define SCLSR (volatile unsigned short *)(SCIF_BASE + 0x24)
|
||||
#endif
|
||||
|
||||
#define SCR_RE (1 << 4)
|
||||
#define SCR_TE (1 << 5)
|
||||
#define FCR_RFRST (1 << 1) /* RFCL */
|
||||
#define FCR_TFRST (1 << 2) /* TFCL */
|
||||
#define FSR_DR (1 << 0)
|
||||
#define FSR_RDF (1 << 1)
|
||||
#define FSR_FER (1 << 3)
|
||||
#define FSR_BRK (1 << 4)
|
||||
#define FSR_FER (1 << 3)
|
||||
#define FSR_TEND (1 << 6)
|
||||
#define FSR_ER (1 << 7)
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
void serial_setbrg (void)
|
||||
{
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
int divisor = gd->baudrate * 32;
|
||||
|
||||
*SCBRR = (CONFIG_SYS_CLK_FREQ + (divisor / 2)) /
|
||||
(gd->baudrate * 32) - 1;
|
||||
}
|
||||
|
||||
int serial_init (void)
|
||||
{
|
||||
*SCSCR = (SCR_RE | SCR_TE);
|
||||
*SCSMR = 0 ;
|
||||
*SCSMR = 0;
|
||||
*SCFCR = (FCR_RFRST | FCR_TFRST);
|
||||
*SCFCR;
|
||||
*SCFCR = 0;
|
||||
|
||||
serial_setbrg();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int serial_tx_fifo_level (void)
|
||||
{
|
||||
return (*SCFDR >> 8) & 0x1F;
|
||||
}
|
||||
|
||||
static int serial_rx_fifo_level (void)
|
||||
{
|
||||
return (*SCFDR >> 0) & 0x1F;
|
||||
}
|
||||
|
||||
void serial_raw_putc (const char c)
|
||||
{
|
||||
unsigned int fsr_bits_to_clear;
|
||||
|
||||
while (1) {
|
||||
if (*SCFSR & FSR_TEND) { /* Tx fifo is empty */
|
||||
fsr_bits_to_clear = FSR_TEND;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
*SCFTDR = c;
|
||||
if (fsr_bits_to_clear != 0)
|
||||
*SCFSR &= ~fsr_bits_to_clear;
|
||||
}
|
||||
|
||||
void serial_putc (const char c)
|
||||
{
|
||||
if (c == '\n')
|
||||
serial_raw_putc ('\r');
|
||||
serial_raw_putc (c);
|
||||
}
|
||||
|
||||
void serial_puts (const char *s)
|
||||
{
|
||||
char c;
|
||||
while ((c = *s++) != 0)
|
||||
serial_putc (c);
|
||||
}
|
||||
|
||||
int serial_tstc (void)
|
||||
{
|
||||
return serial_rx_fifo_level() ? 1 : 0;
|
||||
}
|
||||
|
||||
#define FSR_ERR_CLEAR 0x0063
|
||||
#define RDRF_CLEAR 0x00fc
|
||||
#define LSR_ORER 1
|
||||
void handle_error( void ){
|
||||
|
||||
(void)*SCFSR ;
|
||||
*SCFSR = FSR_ERR_CLEAR ;
|
||||
(void)*SCLSR ;
|
||||
*SCLSR = 0x00 ;
|
||||
}
|
||||
|
||||
int serial_getc_check( void ){
|
||||
unsigned short status;
|
||||
|
||||
status = *SCFSR ;
|
||||
|
||||
if (status & (FSR_FER | FSR_FER | FSR_ER | FSR_BRK))
|
||||
handle_error();
|
||||
if( *SCLSR & LSR_ORER )
|
||||
handle_error();
|
||||
return (status & ( FSR_DR | FSR_RDF ));
|
||||
}
|
||||
|
||||
int serial_getc (void)
|
||||
{
|
||||
unsigned short status ;
|
||||
char ch;
|
||||
while(!serial_getc_check());
|
||||
|
||||
ch = *SCFRDR;
|
||||
status = *SCFSR ;
|
||||
|
||||
*SCFSR = RDRF_CLEAR ;
|
||||
|
||||
if (status & (FSR_FER | FSR_FER | FSR_ER | FSR_BRK))
|
||||
handle_error();
|
||||
|
||||
if( *SCLSR & LSR_ORER )
|
||||
handle_error();
|
||||
|
||||
return ch ;
|
||||
}
|
||||
|
||||
#endif /* CFG_SCIF_CONSOLE */
|
|
@ -61,6 +61,11 @@ ifeq ($(ARCH),avr32)
|
|||
LOAD_ADDR = 0x00000000
|
||||
endif
|
||||
|
||||
ifeq ($(ARCH),sh)
|
||||
LOAD_ADDR = 0x8C000000
|
||||
endif
|
||||
|
||||
|
||||
include $(TOPDIR)/config.mk
|
||||
|
||||
ELF = hello_world
|
||||
|
|
|
@ -151,6 +151,22 @@ gd_t *global_data;
|
|||
: \
|
||||
: "i"(offsetof(gd_t, jt)), "i"(XF_ ##x) \
|
||||
: "r8");
|
||||
#elif defined(CONFIG_SH)
|
||||
/*
|
||||
* r13 holds the pointer to the global_data. r1 is a call clobbered.
|
||||
*/
|
||||
#define EXPORT_FUNC(x) \
|
||||
asm volatile ( \
|
||||
" .align 2\n" \
|
||||
" .globl " #x "\n" \
|
||||
#x ":\n" \
|
||||
" mov r13, r1\n" \
|
||||
" add %0, r1\n" \
|
||||
" add %1, r1\n" \
|
||||
" jmp @r1\n" \
|
||||
" nop\n" \
|
||||
" nop\n" \
|
||||
: : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "r1");
|
||||
#else
|
||||
#error stubs definition missing for this architecture
|
||||
#endif
|
||||
|
|
13
include/asm-sh/bitops.h
Normal file
13
include/asm-sh/bitops.h
Normal file
|
@ -0,0 +1,13 @@
|
|||
#ifndef __ASM_SH_BITOPS_H_
|
||||
#define __ASM_SH_BITOPS_H_
|
||||
|
||||
extern void set_bit(int nr, volatile void * a);
|
||||
extern void clear_bit(int nr, volatile void * a);
|
||||
extern int test_and_clear_bit(int nr, volatile void * a);
|
||||
extern void change_bit(unsigned long nr, volatile void *addr);
|
||||
extern int test_and_set_bit(int nr, volatile void * a);
|
||||
extern int test_and_change_bit(int nr, volatile void * addr);
|
||||
extern int test_bit(int nr, volatile void * a);
|
||||
extern int ffs(int i);
|
||||
|
||||
#endif
|
31
include/asm-sh/byteorder.h
Normal file
31
include/asm-sh/byteorder.h
Normal file
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef __ASM_SH_BYTEORDER_H_
|
||||
#define __ASM_SH_BYTEORDER_H_
|
||||
|
||||
#include <config.h>
|
||||
#include <asm/types.h>
|
||||
|
||||
#ifdef __LITTLE_ENDIAN__
|
||||
#include <linux/byteorder/little_endian.h>
|
||||
#else
|
||||
#include <linux/byteorder/big_endian.h>
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
10
include/asm-sh/cpu_sh4.h
Normal file
10
include/asm-sh/cpu_sh4.h
Normal file
|
@ -0,0 +1,10 @@
|
|||
#ifndef _ASM_CPU_SH4_H_
|
||||
#define _ASM_CPU_SH4_H_
|
||||
#if defined (CONFIG_CPU_SH7750)
|
||||
#include <asm/cpu_sh7750.h>
|
||||
#elif defined (CONFIG_CPU_SH7780)
|
||||
#include <asm/cpu_sh7780.h>
|
||||
#else
|
||||
#error "Unknown SH4 variant"
|
||||
#endif
|
||||
#endif
|
145
include/asm-sh/cpu_sh7750.h
Normal file
145
include/asm-sh/cpu_sh7750.h
Normal file
|
@ -0,0 +1,145 @@
|
|||
#ifndef _ASM_CPU_SH7750_H_
|
||||
#define _ASM_CPU_SH7750_H_
|
||||
|
||||
#define PTEH 0xFF000000
|
||||
#define PTEL 0xFF000004
|
||||
#define TTB 0xFF000008
|
||||
#define TEA 0xFF00000C
|
||||
#define MMUCR 0xFF000010
|
||||
#define BASRA 0xFF000014
|
||||
#define BASRB 0xFF000018
|
||||
#define CCR 0xFF00001C
|
||||
#define TRA 0xFF000020
|
||||
#define EXPEVT 0xFF000024
|
||||
#define INTEVT 0xFF000028
|
||||
#define PTEA 0xFF000034
|
||||
#define QACR0 0xFF000038
|
||||
#define QACR1 0xFF00003C
|
||||
#define BARA 0xFF200000
|
||||
#define BAMRA 0xFF200004
|
||||
#define BBRA 0xFF200008
|
||||
#define BARB 0xFF20000C
|
||||
#define BAMRB 0xFF200010
|
||||
#define BBRB 0xFF200014
|
||||
#define BDRB 0xFF200018
|
||||
#define BDMRB 0xFF20001C
|
||||
#define BRCR 0xFF200020
|
||||
|
||||
#define BCR1 0xFF800000
|
||||
#define BCR2 0xFF800004
|
||||
#define BCR3 0xFF800050
|
||||
#define BCR4 0xFE0A00F0
|
||||
#define WCR1 0xFF800008
|
||||
#define WCR2 0xFF80000C
|
||||
#define WCR3 0xFF800010
|
||||
#define MCR 0xFF800014
|
||||
#define PCR 0xFF800018
|
||||
#define RTCSR 0xFF80001C
|
||||
#define RTCNT 0xFF800020
|
||||
#define RTCOR 0xFF800024
|
||||
#define RFCR 0xFF800028
|
||||
#define PCTRA 0xFF80002C
|
||||
#define PDTRA 0xFF800030
|
||||
#define PCTRB 0xFF800040
|
||||
#define PDTRB 0xFF800044
|
||||
#define GPIOIC 0xFF800048
|
||||
#define SAR0 0xFFA00000
|
||||
#define DAR0 0xFFA00004
|
||||
#define DMATCR0 0xFFA00008
|
||||
#define CHCR0 0xFFA0000C
|
||||
#define SAR1 0xFFA00010
|
||||
#define DAR1 0xFFA00014
|
||||
#define DMATCR1 0xFFA00018
|
||||
#define CHCR1 0xFFA0001C
|
||||
#define SAR2 0xFFA00020
|
||||
#define DAR2 0xFFA00024
|
||||
#define DMATCR2 0xFFA00028
|
||||
#define CHCR2 0xFFA0002C
|
||||
#define SAR3 0xFFA00030
|
||||
#define DAR3 0xFFA00034
|
||||
#define DMATCR3 0xFFA00038
|
||||
#define CHCR3 0xFFA0003C
|
||||
#define DMAOR 0xFFA00040
|
||||
#define SAR4 0xFFA00050
|
||||
#define DAR4 0xFFA00054
|
||||
#define DMATCR4 0xFFA00058
|
||||
|
||||
#define FRQCR 0xFFC00000
|
||||
#define STBCR 0xFFC00004
|
||||
#define WTCNT 0xFFC00008
|
||||
#define WTCSR 0xFFC0000C
|
||||
#define STBCR2 0xFFC00010
|
||||
#define R64CNT 0xFFC80000
|
||||
#define RSECCNT 0xFFC80004
|
||||
#define RMINCNT 0xFFC80008
|
||||
#define RHRCNT 0xFFC8000C
|
||||
#define RWKCNT 0xFFC80010
|
||||
#define RDAYCNT 0xFFC80014
|
||||
#define RMONCNT 0xFFC80018
|
||||
#define RYRCNT 0xFFC8001C
|
||||
#define RSECAR 0xFFC80020
|
||||
#define RMINAR 0xFFC80024
|
||||
#define RHRAR 0xFFC80028
|
||||
#define RWKAR 0xFFC8002C
|
||||
#define RDAYAR 0xFFC80030
|
||||
#define RMONAR 0xFFC80034
|
||||
#define RCR1 0xFFC80038
|
||||
#define RCR2 0xFFC8003C
|
||||
#define RCR3 0xFFC80050
|
||||
#define RYRAR 0xFFC80054
|
||||
#define ICR 0xFFD00000
|
||||
#define IPRA 0xFFD00004
|
||||
#define IPRB 0xFFD00008
|
||||
#define IPRC 0xFFD0000C
|
||||
#define IPRD 0xFFD00010
|
||||
#define INTPRI 0xFE080000
|
||||
#define INTREQ 0xFE080020
|
||||
#define INTMSK 0xFE080040
|
||||
#define INTMSKCL 0xFE080060
|
||||
#define CLKSTP 0xFE0A0000
|
||||
#define CLKSTPCLR 0xFE0A0008
|
||||
#define TSTR2 0xFE100004
|
||||
#define TCOR3 0xFE100008
|
||||
#define TCNT3 0xFE10000C
|
||||
#define TCR3 0xFE100010
|
||||
#define TCOR4 0xFE100014
|
||||
#define TCNT4 0xFE100018
|
||||
#define TCR4 0xFE10001C
|
||||
#define TOCR 0xFFD80000
|
||||
#define TSTR0 0xFFD80004
|
||||
#define TCOR0 0xFFD80008
|
||||
#define TCNT0 0xFFD8000C
|
||||
#define TCR0 0xFFD80010
|
||||
#define TCOR1 0xFFD80014
|
||||
#define TCNT1 0xFFD80018
|
||||
#define TCR1 0xFFD8001C
|
||||
#define TCOR2 0xFFD80020
|
||||
#define TCNT2 0xFFD80024
|
||||
#define TCR2 0xFFD80028
|
||||
#define TCPR2 0xFFD8002C
|
||||
#define SCSMR1 0xFFE00000
|
||||
#define SCBRR1 0xFFE00004
|
||||
#define SCSCR1 0xFFE00008
|
||||
#define SCTDR1 0xFFE0000C
|
||||
#define SCSSR1 0xFFE00010
|
||||
#define SCRDR1 0xFFE00014
|
||||
#define SCSCMR1 0xFFE00018
|
||||
#define SCSPTR1 0xFFE0001C
|
||||
#define SCF0_BASE SCSMR1
|
||||
#define SCSMR2 0xFFE80000
|
||||
#define SCBRR2 0xFFE80004
|
||||
#define SCSCR2 0xFFE80008
|
||||
#define SCFTDR2 0xFFE8000C
|
||||
#define SCFSR2 0xFFE80010
|
||||
#define SCFRDR2 0xFFE80014
|
||||
#define SCFCR2 0xFFE80018
|
||||
#define SCFDR2 0xFFE8001C
|
||||
#define SCSPTR2 0xFFE80020
|
||||
#define SCLSR2 0xFFE80024
|
||||
#define SCIF1_BASE SCSMR2
|
||||
#define SDIR 0xFFF00000
|
||||
#define SDDR 0xFFF00008
|
||||
#define SDINT 0xFFF00014
|
||||
|
||||
#endif /* _ASM_CPU_SH7750_H_ */
|
||||
|
50
include/asm-sh/global_data.h
Normal file
50
include/asm-sh/global_data.h
Normal file
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* (C) Copyright 2002
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef __ASM_SH_GLOBALDATA_H_
|
||||
#define __ASM_SH_GLOBALDATA_H_
|
||||
|
||||
typedef struct global_data
|
||||
{
|
||||
bd_t *bd;
|
||||
unsigned long flags;
|
||||
unsigned long baudrate;
|
||||
unsigned long cpu_clk; /* CPU clock in Hz! */
|
||||
unsigned long have_console; /* serial_init() was called */
|
||||
unsigned long ram_size; /* RAM size */
|
||||
unsigned long reloc_off; /* Relocation Offset */
|
||||
unsigned long env_addr; /* Address of Environment struct */
|
||||
unsigned long env_valid; /* Checksum of Environment valid */
|
||||
void **jt; /* Standalone app jump table */
|
||||
}gd_t;
|
||||
|
||||
#define GD_FLG_RELOC 0x00001 /* Code was relocated to RAM */
|
||||
#define GD_FLG_DEVINIT 0x00002 /* Devices have been initialized */
|
||||
#define GD_FLG_SILENT 0x00004 /* Silent mode */
|
||||
|
||||
#define DECLARE_GLOBAL_DATA_PTR register gd_t *gd asm ("r13")
|
||||
|
||||
#endif /* __ASM_SH_GLOBALDATA_H_ */
|
292
include/asm-sh/io.h
Normal file
292
include/asm-sh/io.h
Normal file
|
@ -0,0 +1,292 @@
|
|||
/*
|
||||
* linux/include/asm-sh/io.h
|
||||
*
|
||||
* Copyright (C) 1996-2000 Russell King
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* Modifications:
|
||||
* 16-Sep-1996 RMK Inlined the inx/outx functions & optimised for both
|
||||
* constant addresses and variable addresses.
|
||||
* 04-Dec-1997 RMK Moved a lot of this stuff to the new architecture
|
||||
* specific IO header files.
|
||||
* 27-Mar-1999 PJB Second parameter of memcpy_toio is const..
|
||||
* 04-Apr-1999 PJB Added check_signature.
|
||||
* 12-Dec-1999 RMK More cleanups
|
||||
* 18-Jun-2000 RMK Removed virt_to_* and friends definitions
|
||||
*/
|
||||
#ifndef __ASM_SH_IO_H
|
||||
#define __ASM_SH_IO_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
/*
|
||||
* Generic virtual read/write. Note that we don't support half-word
|
||||
* read/writes. We define __arch_*[bl] here, and leave __arch_*w
|
||||
* to the architecture specific code.
|
||||
*/
|
||||
#define __arch_getb(a) (*(volatile unsigned char *)(a))
|
||||
#define __arch_getw(a) (*(volatile unsigned short *)(a))
|
||||
#define __arch_getl(a) (*(volatile unsigned int *)(a))
|
||||
|
||||
#define __arch_putb(v,a) (*(volatile unsigned char *)(a) = (v))
|
||||
#define __arch_putw(v,a) (*(volatile unsigned short *)(a) = (v))
|
||||
#define __arch_putl(v,a) (*(volatile unsigned int *)(a) = (v))
|
||||
|
||||
extern void __raw_writesb(unsigned int addr, const void *data, int bytelen);
|
||||
extern void __raw_writesw(unsigned int addr, const void *data, int wordlen);
|
||||
extern void __raw_writesl(unsigned int addr, const void *data, int longlen);
|
||||
|
||||
extern void __raw_readsb(unsigned int addr, void *data, int bytelen);
|
||||
extern void __raw_readsw(unsigned int addr, void *data, int wordlen);
|
||||
extern void __raw_readsl(unsigned int addr, void *data, int longlen);
|
||||
|
||||
#define __raw_writeb(v,a) __arch_putb(v,a)
|
||||
#define __raw_writew(v,a) __arch_putw(v,a)
|
||||
#define __raw_writel(v,a) __arch_putl(v,a)
|
||||
|
||||
#define __raw_readb(a) __arch_getb(a)
|
||||
#define __raw_readw(a) __arch_getw(a)
|
||||
#define __raw_readl(a) __arch_getl(a)
|
||||
|
||||
/*
|
||||
* The compiler seems to be incapable of optimising constants
|
||||
* properly. Spell it out to the compiler in some cases.
|
||||
* These are only valid for small values of "off" (< 1<<12)
|
||||
*/
|
||||
#define __raw_base_writeb(val,base,off) __arch_base_putb(val,base,off)
|
||||
#define __raw_base_writew(val,base,off) __arch_base_putw(val,base,off)
|
||||
#define __raw_base_writel(val,base,off) __arch_base_putl(val,base,off)
|
||||
|
||||
#define __raw_base_readb(base,off) __arch_base_getb(base,off)
|
||||
#define __raw_base_readw(base,off) __arch_base_getw(base,off)
|
||||
#define __raw_base_readl(base,off) __arch_base_getl(base,off)
|
||||
|
||||
/*
|
||||
* Now, pick up the machine-defined IO definitions
|
||||
*/
|
||||
#if 0 /* XXX###XXX */
|
||||
#include <asm/arch/io.h>
|
||||
#endif /* XXX###XXX */
|
||||
|
||||
/*
|
||||
* IO port access primitives
|
||||
* -------------------------
|
||||
*
|
||||
* The SH doesn't have special IO access instructions; all IO is memory
|
||||
* mapped. Note that these are defined to perform little endian accesses
|
||||
* only. Their primary purpose is to access PCI and ISA peripherals.
|
||||
*
|
||||
* The machine specific io.h include defines __io to translate an "IO"
|
||||
* address to a memory address.
|
||||
*
|
||||
* Note that we prevent GCC re-ordering or caching values in expressions
|
||||
* by introducing sequence points into the in*() definitions. Note that
|
||||
* __raw_* do not guarantee this behaviour.
|
||||
*
|
||||
* The {in,out}[bwl] macros are for emulating x86-style PCI/ISA IO space.
|
||||
*/
|
||||
#ifdef __io
|
||||
#define outb(v,p) __raw_writeb(v,__io(p))
|
||||
#define outw(v,p) __raw_writew(cpu_to_le16(v),__io(p))
|
||||
#define outl(v,p) __raw_writel(cpu_to_le32(v),__io(p))
|
||||
|
||||
#define inb(p) ({ unsigned int __v = __raw_readb(__io(p)); __v; })
|
||||
#define inw(p) ({ unsigned int __v = le16_to_cpu(__raw_readw(__io(p))); __v; })
|
||||
#define inl(p) ({ unsigned int __v = le32_to_cpu(__raw_readl(__io(p))); __v; })
|
||||
|
||||
#define outsb(p,d,l) __raw_writesb(__io(p),d,l)
|
||||
#define outsw(p,d,l) __raw_writesw(__io(p),d,l)
|
||||
#define outsl(p,d,l) __raw_writesl(__io(p),d,l)
|
||||
|
||||
#define insb(p,d,l) __raw_readsb(__io(p),d,l)
|
||||
#define insw(p,d,l) __raw_readsw(__io(p),d,l)
|
||||
#define insl(p,d,l) __raw_readsl(__io(p),d,l)
|
||||
#endif
|
||||
|
||||
#define outb_p(val,port) outb((val),(port))
|
||||
#define outw_p(val,port) outw((val),(port))
|
||||
#define outl_p(val,port) outl((val),(port))
|
||||
#define inb_p(port) inb((port))
|
||||
#define inw_p(port) inw((port))
|
||||
#define inl_p(port) inl((port))
|
||||
|
||||
#define outsb_p(port,from,len) outsb(port,from,len)
|
||||
#define outsw_p(port,from,len) outsw(port,from,len)
|
||||
#define outsl_p(port,from,len) outsl(port,from,len)
|
||||
#define insb_p(port,to,len) insb(port,to,len)
|
||||
#define insw_p(port,to,len) insw(port,to,len)
|
||||
#define insl_p(port,to,len) insl(port,to,len)
|
||||
|
||||
/*
|
||||
* ioremap and friends.
|
||||
*
|
||||
* ioremap takes a PCI memory address, as specified in
|
||||
* linux/Documentation/IO-mapping.txt. If you want a
|
||||
* physical address, use __ioremap instead.
|
||||
*/
|
||||
extern void * __ioremap(unsigned long offset, size_t size, unsigned long flags);
|
||||
extern void __iounmap(void *addr);
|
||||
|
||||
/*
|
||||
* Generic ioremap support.
|
||||
*
|
||||
* Define:
|
||||
* iomem_valid_addr(off,size)
|
||||
* iomem_to_phys(off)
|
||||
*/
|
||||
#ifdef iomem_valid_addr
|
||||
#define __arch_ioremap(off,sz,nocache) \
|
||||
({ \
|
||||
unsigned long _off = (off), _size = (sz); \
|
||||
void *_ret = (void *)0; \
|
||||
if (iomem_valid_addr(_off, _size)) \
|
||||
_ret = __ioremap(iomem_to_phys(_off),_size,0); \
|
||||
_ret; \
|
||||
})
|
||||
|
||||
#define __arch_iounmap __iounmap
|
||||
#endif
|
||||
|
||||
#define ioremap(off,sz) __arch_ioremap((off),(sz),0)
|
||||
#define ioremap_nocache(off,sz) __arch_ioremap((off),(sz),1)
|
||||
#define iounmap(_addr) __arch_iounmap(_addr)
|
||||
|
||||
/*
|
||||
* DMA-consistent mapping functions. These allocate/free a region of
|
||||
* uncached, unwrite-buffered mapped memory space for use with DMA
|
||||
* devices. This is the "generic" version. The PCI specific version
|
||||
* is in pci.h
|
||||
*/
|
||||
extern void *consistent_alloc(int gfp, size_t size, dma_addr_t *handle);
|
||||
extern void consistent_free(void *vaddr, size_t size, dma_addr_t handle);
|
||||
extern void consistent_sync(void *vaddr, size_t size, int rw);
|
||||
|
||||
/*
|
||||
* String version of IO memory access ops:
|
||||
*/
|
||||
extern void _memcpy_fromio(void *, unsigned long, size_t);
|
||||
extern void _memcpy_toio(unsigned long, const void *, size_t);
|
||||
extern void _memset_io(unsigned long, int, size_t);
|
||||
|
||||
extern void __readwrite_bug(const char *fn);
|
||||
|
||||
/*
|
||||
* If this architecture has PCI memory IO, then define the read/write
|
||||
* macros. These should only be used with the cookie passed from
|
||||
* ioremap.
|
||||
*/
|
||||
#ifdef __mem_pci
|
||||
|
||||
#define readb(c) ({ unsigned int __v = __raw_readb(__mem_pci(c)); __v; })
|
||||
#define readw(c) ({ unsigned int __v = le16_to_cpu(__raw_readw(__mem_pci(c))); __v; })
|
||||
#define readl(c) ({ unsigned int __v = le32_to_cpu(__raw_readl(__mem_pci(c))); __v; })
|
||||
|
||||
#define writeb(v,c) __raw_writeb(v,__mem_pci(c))
|
||||
#define writew(v,c) __raw_writew(cpu_to_le16(v),__mem_pci(c))
|
||||
#define writel(v,c) __raw_writel(cpu_to_le32(v),__mem_pci(c))
|
||||
|
||||
#define memset_io(c,v,l) _memset_io(__mem_pci(c),(v),(l))
|
||||
#define memcpy_fromio(a,c,l) _memcpy_fromio((a),__mem_pci(c),(l))
|
||||
#define memcpy_toio(c,a,l) _memcpy_toio(__mem_pci(c),(a),(l))
|
||||
|
||||
#define eth_io_copy_and_sum(s,c,l,b) \
|
||||
eth_copy_and_sum((s),__mem_pci(c),(l),(b))
|
||||
|
||||
static inline int
|
||||
check_signature(unsigned long io_addr, const unsigned char *signature,
|
||||
int length)
|
||||
{
|
||||
int retval = 0;
|
||||
do {
|
||||
if (readb(io_addr) != *signature)
|
||||
goto out;
|
||||
io_addr++;
|
||||
signature++;
|
||||
length--;
|
||||
} while (length);
|
||||
retval = 1;
|
||||
out:
|
||||
return retval;
|
||||
}
|
||||
|
||||
#elif !defined(readb)
|
||||
|
||||
#define readb(addr) (__readwrite_bug("readb"),0)
|
||||
#define readw(addr) (__readwrite_bug("readw"),0)
|
||||
#define readl(addr) (__readwrite_bug("readl"),0)
|
||||
#define writeb(v,addr) __readwrite_bug("writeb")
|
||||
#define writew(v,addr) __readwrite_bug("writew")
|
||||
#define writel(v,addr) __readwrite_bug("writel")
|
||||
|
||||
#define eth_io_copy_and_sum(a,b,c,d) __readwrite_bug("eth_io_copy_and_sum")
|
||||
|
||||
#define check_signature(io,sig,len) (0)
|
||||
|
||||
#endif /* __mem_pci */
|
||||
|
||||
/*
|
||||
* If this architecture has ISA IO, then define the isa_read/isa_write
|
||||
* macros.
|
||||
*/
|
||||
#ifdef __mem_isa
|
||||
|
||||
#define isa_readb(addr) __raw_readb(__mem_isa(addr))
|
||||
#define isa_readw(addr) __raw_readw(__mem_isa(addr))
|
||||
#define isa_readl(addr) __raw_readl(__mem_isa(addr))
|
||||
#define isa_writeb(val,addr) __raw_writeb(val,__mem_isa(addr))
|
||||
#define isa_writew(val,addr) __raw_writew(val,__mem_isa(addr))
|
||||
#define isa_writel(val,addr) __raw_writel(val,__mem_isa(addr))
|
||||
#define isa_memset_io(a,b,c) _memset_io(__mem_isa(a),(b),(c))
|
||||
#define isa_memcpy_fromio(a,b,c) _memcpy_fromio((a),__mem_isa(b),(c))
|
||||
#define isa_memcpy_toio(a,b,c) _memcpy_toio(__mem_isa((a)),(b),(c))
|
||||
|
||||
#define isa_eth_io_copy_and_sum(a,b,c,d) \
|
||||
eth_copy_and_sum((a),__mem_isa(b),(c),(d))
|
||||
|
||||
static inline int
|
||||
isa_check_signature(unsigned long io_addr, const unsigned char *signature,
|
||||
int length)
|
||||
{
|
||||
int retval = 0;
|
||||
do {
|
||||
if (isa_readb(io_addr) != *signature)
|
||||
goto out;
|
||||
io_addr++;
|
||||
signature++;
|
||||
length--;
|
||||
} while (length);
|
||||
retval = 1;
|
||||
out:
|
||||
return retval;
|
||||
}
|
||||
|
||||
#else /* __mem_isa */
|
||||
|
||||
#define isa_readb(addr) (__readwrite_bug("isa_readb"),0)
|
||||
#define isa_readw(addr) (__readwrite_bug("isa_readw"),0)
|
||||
#define isa_readl(addr) (__readwrite_bug("isa_readl"),0)
|
||||
#define isa_writeb(val,addr) __readwrite_bug("isa_writeb")
|
||||
#define isa_writew(val,addr) __readwrite_bug("isa_writew")
|
||||
#define isa_writel(val,addr) __readwrite_bug("isa_writel")
|
||||
#define isa_memset_io(a,b,c) __readwrite_bug("isa_memset_io")
|
||||
#define isa_memcpy_fromio(a,b,c) __readwrite_bug("isa_memcpy_fromio")
|
||||
#define isa_memcpy_toio(a,b,c) __readwrite_bug("isa_memcpy_toio")
|
||||
|
||||
#define isa_eth_io_copy_and_sum(a,b,c,d) \
|
||||
__readwrite_bug("isa_eth_io_copy_and_sum")
|
||||
|
||||
#define isa_check_signature(io,sig,len) (0)
|
||||
|
||||
static inline void sync(void)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* __mem_isa */
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* __ASM_SH_IO_H */
|
123
include/asm-sh/posix_types.h
Normal file
123
include/asm-sh/posix_types.h
Normal file
|
@ -0,0 +1,123 @@
|
|||
#ifndef __ASM_SH_POSIX_TYPES_H
|
||||
#define __ASM_SH_POSIX_TYPES_H
|
||||
|
||||
/*
|
||||
* This file is generally used by user-level software, so you need to
|
||||
* be a little careful about namespace pollution etc. Also, we cannot
|
||||
* assume GCC is being used.
|
||||
*/
|
||||
|
||||
typedef unsigned short __kernel_dev_t;
|
||||
typedef unsigned long __kernel_ino_t;
|
||||
typedef unsigned short __kernel_mode_t;
|
||||
typedef unsigned short __kernel_nlink_t;
|
||||
typedef long __kernel_off_t;
|
||||
typedef int __kernel_pid_t;
|
||||
typedef unsigned short __kernel_ipc_pid_t;
|
||||
typedef unsigned short __kernel_uid_t;
|
||||
typedef unsigned short __kernel_gid_t;
|
||||
typedef unsigned int __kernel_size_t;
|
||||
typedef int __kernel_ssize_t;
|
||||
typedef int __kernel_ptrdiff_t;
|
||||
typedef long __kernel_time_t;
|
||||
typedef long __kernel_suseconds_t;
|
||||
typedef long __kernel_clock_t;
|
||||
typedef int __kernel_timer_t;
|
||||
typedef int __kernel_clockid_t;
|
||||
typedef int __kernel_daddr_t;
|
||||
typedef char * __kernel_caddr_t;
|
||||
typedef unsigned short __kernel_uid16_t;
|
||||
typedef unsigned short __kernel_gid16_t;
|
||||
typedef unsigned int __kernel_uid32_t;
|
||||
typedef unsigned int __kernel_gid32_t;
|
||||
|
||||
typedef unsigned short __kernel_old_uid_t;
|
||||
typedef unsigned short __kernel_old_gid_t;
|
||||
typedef unsigned short __kernel_old_dev_t;
|
||||
|
||||
#ifdef __GNUC__
|
||||
typedef long long __kernel_loff_t;
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
#if defined(__KERNEL__) || defined(__USE_ALL)
|
||||
int val[2];
|
||||
#else /* !defined(__KERNEL__) && !defined(__USE_ALL) */
|
||||
int __val[2];
|
||||
#endif /* !defined(__KERNEL__) && !defined(__USE_ALL) */
|
||||
} __kernel_fsid_t;
|
||||
|
||||
#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2)
|
||||
|
||||
#undef __FD_SET
|
||||
static __inline__ void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp)
|
||||
{
|
||||
unsigned long __tmp = __fd / __NFDBITS;
|
||||
unsigned long __rem = __fd % __NFDBITS;
|
||||
__fdsetp->fds_bits[__tmp] |= (1UL<<__rem);
|
||||
}
|
||||
|
||||
#undef __FD_CLR
|
||||
static __inline__ void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp)
|
||||
{
|
||||
unsigned long __tmp = __fd / __NFDBITS;
|
||||
unsigned long __rem = __fd % __NFDBITS;
|
||||
__fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem);
|
||||
}
|
||||
|
||||
|
||||
#undef __FD_ISSET
|
||||
static __inline__ int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__p)
|
||||
{
|
||||
unsigned long __tmp = __fd / __NFDBITS;
|
||||
unsigned long __rem = __fd % __NFDBITS;
|
||||
return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This will unroll the loop for the normal constant case (8 ints,
|
||||
* for a 256-bit fd_set)
|
||||
*/
|
||||
#undef __FD_ZERO
|
||||
static __inline__ void __FD_ZERO(__kernel_fd_set *__p)
|
||||
{
|
||||
unsigned long *__tmp = __p->fds_bits;
|
||||
int __i;
|
||||
|
||||
if (__builtin_constant_p(__FDSET_LONGS)) {
|
||||
switch (__FDSET_LONGS) {
|
||||
case 16:
|
||||
__tmp[ 0] = 0; __tmp[ 1] = 0;
|
||||
__tmp[ 2] = 0; __tmp[ 3] = 0;
|
||||
__tmp[ 4] = 0; __tmp[ 5] = 0;
|
||||
__tmp[ 6] = 0; __tmp[ 7] = 0;
|
||||
__tmp[ 8] = 0; __tmp[ 9] = 0;
|
||||
__tmp[10] = 0; __tmp[11] = 0;
|
||||
__tmp[12] = 0; __tmp[13] = 0;
|
||||
__tmp[14] = 0; __tmp[15] = 0;
|
||||
return;
|
||||
|
||||
case 8:
|
||||
__tmp[ 0] = 0; __tmp[ 1] = 0;
|
||||
__tmp[ 2] = 0; __tmp[ 3] = 0;
|
||||
__tmp[ 4] = 0; __tmp[ 5] = 0;
|
||||
__tmp[ 6] = 0; __tmp[ 7] = 0;
|
||||
return;
|
||||
|
||||
case 4:
|
||||
__tmp[ 0] = 0; __tmp[ 1] = 0;
|
||||
__tmp[ 2] = 0; __tmp[ 3] = 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
__i = __FDSET_LONGS;
|
||||
while (__i) {
|
||||
__i--;
|
||||
*__tmp = 0;
|
||||
__tmp++;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) */
|
||||
|
||||
#endif /* __ASM_SH_POSIX_TYPES_H */
|
8
include/asm-sh/processor.h
Normal file
8
include/asm-sh/processor.h
Normal file
|
@ -0,0 +1,8 @@
|
|||
#ifndef _ASM_SH_PROCESSOR_H_
|
||||
#define _ASM_SH_PROCESSOR_H_
|
||||
#if defined CONFIG_SH3
|
||||
# include <asm/cpu_sh3.h>
|
||||
#elif defined (CONFIG_SH4)
|
||||
# include <asm/cpu_sh4.h>
|
||||
#endif
|
||||
#endif
|
112
include/asm-sh/ptrace.h
Normal file
112
include/asm-sh/ptrace.h
Normal file
|
@ -0,0 +1,112 @@
|
|||
#ifndef __ASM_SH_PTRACE_H
|
||||
#define __ASM_SH_PTRACE_H
|
||||
|
||||
/*
|
||||
* Copyright (C) 1999, 2000 Niibe Yutaka
|
||||
* from linux kernel code.
|
||||
*/
|
||||
|
||||
/*
|
||||
* GCC defines register number like this:
|
||||
* -----------------------------
|
||||
* 0 - 15 are integer registers
|
||||
* 17 - 22 are control/special registers
|
||||
* 24 - 39 fp registers
|
||||
* 40 - 47 xd registers
|
||||
* 48 - fpscr register
|
||||
* -----------------------------
|
||||
*
|
||||
* We follows above, except:
|
||||
* 16 --- program counter (PC)
|
||||
* 22 --- syscall #
|
||||
* 23 --- floating point communication register
|
||||
*/
|
||||
#define REG_REG0 0
|
||||
#define REG_REG15 15
|
||||
|
||||
#define REG_PC 16
|
||||
|
||||
#define REG_PR 17
|
||||
#define REG_SR 18
|
||||
#define REG_GBR 19
|
||||
#define REG_MACH 20
|
||||
#define REG_MACL 21
|
||||
|
||||
#define REG_SYSCALL 22
|
||||
|
||||
#define REG_FPREG0 23
|
||||
#define REG_FPREG15 38
|
||||
#define REG_XFREG0 39
|
||||
#define REG_XFREG15 54
|
||||
|
||||
#define REG_FPSCR 55
|
||||
#define REG_FPUL 56
|
||||
|
||||
/* options set using PTRACE_SETOPTIONS */
|
||||
#define PTRACE_O_TRACESYSGOOD 0x00000001
|
||||
|
||||
/*
|
||||
* This struct defines the way the registers are stored on the
|
||||
* kernel stack during a system call or other kernel entry.
|
||||
*/
|
||||
struct pt_regs {
|
||||
unsigned long regs[16];
|
||||
unsigned long pc;
|
||||
unsigned long pr;
|
||||
unsigned long sr;
|
||||
unsigned long gbr;
|
||||
unsigned long mach;
|
||||
unsigned long macl;
|
||||
long tra;
|
||||
};
|
||||
|
||||
/*
|
||||
* This struct defines the way the DSP registers are stored on the
|
||||
* kernel stack during a system call or other kernel entry.
|
||||
*/
|
||||
struct pt_dspregs {
|
||||
unsigned long a1;
|
||||
unsigned long a0g;
|
||||
unsigned long a1g;
|
||||
unsigned long m0;
|
||||
unsigned long m1;
|
||||
unsigned long a0;
|
||||
unsigned long x0;
|
||||
unsigned long x1;
|
||||
unsigned long y0;
|
||||
unsigned long y1;
|
||||
unsigned long dsr;
|
||||
unsigned long rs;
|
||||
unsigned long re;
|
||||
unsigned long mod;
|
||||
};
|
||||
|
||||
#define PTRACE_GETDSPREGS 55
|
||||
#define PTRACE_SETDSPREGS 56
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#define user_mode(regs) (((regs)->sr & 0x40000000)==0)
|
||||
#define instruction_pointer(regs) ((regs)->pc)
|
||||
extern void show_regs(struct pt_regs *);
|
||||
|
||||
#ifdef CONFIG_SH_DSP
|
||||
#define task_pt_regs(task) \
|
||||
((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE \
|
||||
- sizeof(struct pt_dspregs) - sizeof(unsigned long)) - 1)
|
||||
#else
|
||||
#define task_pt_regs(task) \
|
||||
((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE \
|
||||
- sizeof(unsigned long)) - 1)
|
||||
#endif
|
||||
|
||||
static inline unsigned long profile_pc(struct pt_regs *regs)
|
||||
{
|
||||
unsigned long pc = instruction_pointer(regs);
|
||||
|
||||
if (pc >= 0xa0000000UL && pc < 0xc0000000UL)
|
||||
pc -= 0x20000000;
|
||||
return pc;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __ASM_SH_PTRACE_H */
|
132
include/asm-sh/string.h
Normal file
132
include/asm-sh/string.h
Normal file
|
@ -0,0 +1,132 @@
|
|||
#ifndef __ASM_SH_STRING_H
|
||||
#define __ASM_SH_STRING_H
|
||||
|
||||
/*
|
||||
* Copyright (C) 1999 Niibe Yutaka
|
||||
* But consider these trivial functions to be public domain.
|
||||
*
|
||||
* from linux kernel code.
|
||||
*/
|
||||
|
||||
#define __HAVE_ARCH_STRCPY
|
||||
static inline char *strcpy(char *__dest, const char *__src)
|
||||
{
|
||||
register char *__xdest = __dest;
|
||||
unsigned long __dummy;
|
||||
|
||||
__asm__ __volatile__("1:\n\t"
|
||||
"mov.b @%1+, %2\n\t"
|
||||
"mov.b %2, @%0\n\t"
|
||||
"cmp/eq #0, %2\n\t"
|
||||
"bf/s 1b\n\t"
|
||||
" add #1, %0\n\t"
|
||||
: "=r" (__dest), "=r" (__src), "=&z" (__dummy)
|
||||
: "0" (__dest), "1" (__src)
|
||||
: "memory", "t");
|
||||
|
||||
return __xdest;
|
||||
}
|
||||
|
||||
#define __HAVE_ARCH_STRNCPY
|
||||
static inline char *strncpy(char *__dest, const char *__src, size_t __n)
|
||||
{
|
||||
register char *__xdest = __dest;
|
||||
unsigned long __dummy;
|
||||
|
||||
if (__n == 0)
|
||||
return __xdest;
|
||||
|
||||
__asm__ __volatile__(
|
||||
"1:\n"
|
||||
"mov.b @%1+, %2\n\t"
|
||||
"mov.b %2, @%0\n\t"
|
||||
"cmp/eq #0, %2\n\t"
|
||||
"bt/s 2f\n\t"
|
||||
" cmp/eq %5,%1\n\t"
|
||||
"bf/s 1b\n\t"
|
||||
" add #1, %0\n"
|
||||
"2:"
|
||||
: "=r" (__dest), "=r" (__src), "=&z" (__dummy)
|
||||
: "0" (__dest), "1" (__src), "r" (__src+__n)
|
||||
: "memory", "t");
|
||||
|
||||
return __xdest;
|
||||
}
|
||||
|
||||
#define __HAVE_ARCH_STRCMP
|
||||
static inline int strcmp(const char *__cs, const char *__ct)
|
||||
{
|
||||
register int __res;
|
||||
unsigned long __dummy;
|
||||
|
||||
__asm__ __volatile__(
|
||||
"mov.b @%1+, %3\n"
|
||||
"1:\n\t"
|
||||
"mov.b @%0+, %2\n\t"
|
||||
"cmp/eq #0, %3\n\t"
|
||||
"bt 2f\n\t"
|
||||
"cmp/eq %2, %3\n\t"
|
||||
"bt/s 1b\n\t"
|
||||
" mov.b @%1+, %3\n\t"
|
||||
"add #-2, %1\n\t"
|
||||
"mov.b @%1, %3\n\t"
|
||||
"sub %3, %2\n"
|
||||
"2:"
|
||||
: "=r" (__cs), "=r" (__ct), "=&r" (__res), "=&z" (__dummy)
|
||||
: "0" (__cs), "1" (__ct)
|
||||
: "t");
|
||||
|
||||
return __res;
|
||||
}
|
||||
|
||||
#define __HAVE_ARCH_STRNCMP
|
||||
static inline int strncmp(const char *__cs, const char *__ct, size_t __n)
|
||||
{
|
||||
register int __res;
|
||||
unsigned long __dummy;
|
||||
|
||||
if (__n == 0)
|
||||
return 0;
|
||||
|
||||
__asm__ __volatile__(
|
||||
"mov.b @%1+, %3\n"
|
||||
"1:\n\t"
|
||||
"mov.b @%0+, %2\n\t"
|
||||
"cmp/eq %6, %0\n\t"
|
||||
"bt/s 2f\n\t"
|
||||
" cmp/eq #0, %3\n\t"
|
||||
"bt/s 3f\n\t"
|
||||
" cmp/eq %3, %2\n\t"
|
||||
"bt/s 1b\n\t"
|
||||
" mov.b @%1+, %3\n\t"
|
||||
"add #-2, %1\n\t"
|
||||
"mov.b @%1, %3\n"
|
||||
"2:\n\t"
|
||||
"sub %3, %2\n"
|
||||
"3:"
|
||||
:"=r" (__cs), "=r" (__ct), "=&r" (__res), "=&z" (__dummy)
|
||||
: "0" (__cs), "1" (__ct), "r" (__cs+__n)
|
||||
: "t");
|
||||
|
||||
return __res;
|
||||
}
|
||||
|
||||
#undef __HAVE_ARCH_MEMSET
|
||||
extern void *memset(void *__s, int __c, size_t __count);
|
||||
|
||||
#undef __HAVE_ARCH_MEMCPY
|
||||
extern void *memcpy(void *__to, __const__ void *__from, size_t __n);
|
||||
|
||||
#undef __HAVE_ARCH_MEMMOVE
|
||||
extern void *memmove(void *__dest, __const__ void *__src, size_t __n);
|
||||
|
||||
#undef __HAVE_ARCH_MEMCHR
|
||||
extern void *memchr(const void *__s, int __c, size_t __n);
|
||||
|
||||
#undef __HAVE_ARCH_STRLEN
|
||||
extern size_t strlen(const char *);
|
||||
|
||||
/* arch/sh/lib/strcasecmp.c */
|
||||
extern int strcasecmp(const char *, const char *);
|
||||
|
||||
#endif /* __ASM_SH_STRING_H */
|
275
include/asm-sh/system.h
Normal file
275
include/asm-sh/system.h
Normal file
|
@ -0,0 +1,275 @@
|
|||
#ifndef __ASM_SH_SYSTEM_H
|
||||
#define __ASM_SH_SYSTEM_H
|
||||
|
||||
/*
|
||||
* Copyright (C) 1999, 2000 Niibe Yutaka & Kaz Kojima
|
||||
* Copyright (C) 2002 Paul Mundt
|
||||
*
|
||||
* from linux kernel code.
|
||||
*/
|
||||
|
||||
#include <linux/irqflags.h>
|
||||
#include <asm/types.h>
|
||||
|
||||
/*
|
||||
* switch_to() should switch tasks to task nr n, first
|
||||
*/
|
||||
|
||||
#define switch_to(prev, next, last) do { \
|
||||
struct task_struct *__last; \
|
||||
register unsigned long *__ts1 __asm__ ("r1") = &prev->thread.sp; \
|
||||
register unsigned long *__ts2 __asm__ ("r2") = &prev->thread.pc; \
|
||||
register unsigned long *__ts4 __asm__ ("r4") = (unsigned long *)prev; \
|
||||
register unsigned long *__ts5 __asm__ ("r5") = (unsigned long *)next; \
|
||||
register unsigned long *__ts6 __asm__ ("r6") = &next->thread.sp; \
|
||||
register unsigned long __ts7 __asm__ ("r7") = next->thread.pc; \
|
||||
__asm__ __volatile__ (".balign 4\n\t" \
|
||||
"stc.l gbr, @-r15\n\t" \
|
||||
"sts.l pr, @-r15\n\t" \
|
||||
"mov.l r8, @-r15\n\t" \
|
||||
"mov.l r9, @-r15\n\t" \
|
||||
"mov.l r10, @-r15\n\t" \
|
||||
"mov.l r11, @-r15\n\t" \
|
||||
"mov.l r12, @-r15\n\t" \
|
||||
"mov.l r13, @-r15\n\t" \
|
||||
"mov.l r14, @-r15\n\t" \
|
||||
"mov.l r15, @r1 ! save SP\n\t" \
|
||||
"mov.l @r6, r15 ! change to new stack\n\t" \
|
||||
"mova 1f, %0\n\t" \
|
||||
"mov.l %0, @r2 ! save PC\n\t" \
|
||||
"mov.l 2f, %0\n\t" \
|
||||
"jmp @%0 ! call __switch_to\n\t" \
|
||||
" lds r7, pr ! with return to new PC\n\t" \
|
||||
".balign 4\n" \
|
||||
"2:\n\t" \
|
||||
".long __switch_to\n" \
|
||||
"1:\n\t" \
|
||||
"mov.l @r15+, r14\n\t" \
|
||||
"mov.l @r15+, r13\n\t" \
|
||||
"mov.l @r15+, r12\n\t" \
|
||||
"mov.l @r15+, r11\n\t" \
|
||||
"mov.l @r15+, r10\n\t" \
|
||||
"mov.l @r15+, r9\n\t" \
|
||||
"mov.l @r15+, r8\n\t" \
|
||||
"lds.l @r15+, pr\n\t" \
|
||||
"ldc.l @r15+, gbr\n\t" \
|
||||
: "=z" (__last) \
|
||||
: "r" (__ts1), "r" (__ts2), "r" (__ts4), \
|
||||
"r" (__ts5), "r" (__ts6), "r" (__ts7) \
|
||||
: "r3", "t"); \
|
||||
last = __last; \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* On SMP systems, when the scheduler does migration-cost autodetection,
|
||||
* it needs a way to flush as much of the CPU's caches as possible.
|
||||
*
|
||||
* TODO: fill this in!
|
||||
*/
|
||||
static inline void sched_cacheflush(void)
|
||||
{
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CPU_SH4A
|
||||
#define __icbi() \
|
||||
{ \
|
||||
unsigned long __addr; \
|
||||
__addr = 0xa8000000; \
|
||||
__asm__ __volatile__( \
|
||||
"icbi %0\n\t" \
|
||||
: /* no output */ \
|
||||
: "m" (__m(__addr))); \
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline unsigned long tas(volatile int *m)
|
||||
{
|
||||
unsigned long retval;
|
||||
|
||||
__asm__ __volatile__ ("tas.b @%1\n\t"
|
||||
"movt %0"
|
||||
: "=r" (retval): "r" (m): "t", "memory");
|
||||
return retval;
|
||||
}
|
||||
|
||||
/*
|
||||
* A brief note on ctrl_barrier(), the control register write barrier.
|
||||
*
|
||||
* Legacy SH cores typically require a sequence of 8 nops after
|
||||
* modification of a control register in order for the changes to take
|
||||
* effect. On newer cores (like the sh4a and sh5) this is accomplished
|
||||
* with icbi.
|
||||
*
|
||||
* Also note that on sh4a in the icbi case we can forego a synco for the
|
||||
* write barrier, as it's not necessary for control registers.
|
||||
*
|
||||
* Historically we have only done this type of barrier for the MMUCR, but
|
||||
* it's also necessary for the CCR, so we make it generic here instead.
|
||||
*/
|
||||
#ifdef CONFIG_CPU_SH4A
|
||||
#define mb() __asm__ __volatile__ ("synco": : :"memory")
|
||||
#define rmb() mb()
|
||||
#define wmb() __asm__ __volatile__ ("synco": : :"memory")
|
||||
#define ctrl_barrier() __icbi()
|
||||
#define read_barrier_depends() do { } while(0)
|
||||
#else
|
||||
#define mb() __asm__ __volatile__ ("": : :"memory")
|
||||
#define rmb() mb()
|
||||
#define wmb() __asm__ __volatile__ ("": : :"memory")
|
||||
#define ctrl_barrier() __asm__ __volatile__ ("nop;nop;nop;nop;nop;nop;nop;nop")
|
||||
#define read_barrier_depends() do { } while(0)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#define smp_mb() mb()
|
||||
#define smp_rmb() rmb()
|
||||
#define smp_wmb() wmb()
|
||||
#define smp_read_barrier_depends() read_barrier_depends()
|
||||
#else
|
||||
#define smp_mb() barrier()
|
||||
#define smp_rmb() barrier()
|
||||
#define smp_wmb() barrier()
|
||||
#define smp_read_barrier_depends() do { } while(0)
|
||||
#endif
|
||||
|
||||
#define set_mb(var, value) do { xchg(&var, value); } while (0)
|
||||
|
||||
/*
|
||||
* Jump to P2 area.
|
||||
* When handling TLB or caches, we need to do it from P2 area.
|
||||
*/
|
||||
#define jump_to_P2() \
|
||||
do { \
|
||||
unsigned long __dummy; \
|
||||
__asm__ __volatile__( \
|
||||
"mov.l 1f, %0\n\t" \
|
||||
"or %1, %0\n\t" \
|
||||
"jmp @%0\n\t" \
|
||||
" nop\n\t" \
|
||||
".balign 4\n" \
|
||||
"1: .long 2f\n" \
|
||||
"2:" \
|
||||
: "=&r" (__dummy) \
|
||||
: "r" (0x20000000)); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Back to P1 area.
|
||||
*/
|
||||
#define back_to_P1() \
|
||||
do { \
|
||||
unsigned long __dummy; \
|
||||
ctrl_barrier(); \
|
||||
__asm__ __volatile__( \
|
||||
"mov.l 1f, %0\n\t" \
|
||||
"jmp @%0\n\t" \
|
||||
" nop\n\t" \
|
||||
".balign 4\n" \
|
||||
"1: .long 2f\n" \
|
||||
"2:" \
|
||||
: "=&r" (__dummy)); \
|
||||
} while (0)
|
||||
|
||||
static inline unsigned long xchg_u32(volatile u32 *m, unsigned long val)
|
||||
{
|
||||
unsigned long flags, retval;
|
||||
|
||||
local_irq_save(flags);
|
||||
retval = *m;
|
||||
*m = val;
|
||||
local_irq_restore(flags);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static inline unsigned long xchg_u8(volatile u8 *m, unsigned long val)
|
||||
{
|
||||
unsigned long flags, retval;
|
||||
|
||||
local_irq_save(flags);
|
||||
retval = *m;
|
||||
*m = val & 0xff;
|
||||
local_irq_restore(flags);
|
||||
return retval;
|
||||
}
|
||||
|
||||
extern void __xchg_called_with_bad_pointer(void);
|
||||
|
||||
#define __xchg(ptr, x, size) \
|
||||
({ \
|
||||
unsigned long __xchg__res; \
|
||||
volatile void *__xchg_ptr = (ptr); \
|
||||
switch (size) { \
|
||||
case 4: \
|
||||
__xchg__res = xchg_u32(__xchg_ptr, x); \
|
||||
break; \
|
||||
case 1: \
|
||||
__xchg__res = xchg_u8(__xchg_ptr, x); \
|
||||
break; \
|
||||
default: \
|
||||
__xchg_called_with_bad_pointer(); \
|
||||
__xchg__res = x; \
|
||||
break; \
|
||||
} \
|
||||
\
|
||||
__xchg__res; \
|
||||
})
|
||||
|
||||
#define xchg(ptr,x) \
|
||||
((__typeof__(*(ptr)))__xchg((ptr),(unsigned long)(x), sizeof(*(ptr))))
|
||||
|
||||
static inline unsigned long __cmpxchg_u32(volatile int * m, unsigned long old,
|
||||
unsigned long new)
|
||||
{
|
||||
__u32 retval;
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
retval = *m;
|
||||
if (retval == old)
|
||||
*m = new;
|
||||
local_irq_restore(flags); /* implies memory barrier */
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* This function doesn't exist, so you'll get a linker error
|
||||
* if something tries to do an invalid cmpxchg(). */
|
||||
extern void __cmpxchg_called_with_bad_pointer(void);
|
||||
|
||||
#define __HAVE_ARCH_CMPXCHG 1
|
||||
|
||||
static inline unsigned long __cmpxchg(volatile void * ptr, unsigned long old,
|
||||
unsigned long new, int size)
|
||||
{
|
||||
switch (size) {
|
||||
case 4:
|
||||
return __cmpxchg_u32(ptr, old, new);
|
||||
}
|
||||
__cmpxchg_called_with_bad_pointer();
|
||||
return old;
|
||||
}
|
||||
|
||||
#define cmpxchg(ptr,o,n) \
|
||||
({ \
|
||||
__typeof__(*(ptr)) _o_ = (o); \
|
||||
__typeof__(*(ptr)) _n_ = (n); \
|
||||
(__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_, \
|
||||
(unsigned long)_n_, sizeof(*(ptr))); \
|
||||
})
|
||||
|
||||
extern void *set_exception_table_vec(unsigned int vec, void *handler);
|
||||
|
||||
static inline void *set_exception_table_evt(unsigned int evt, void *handler)
|
||||
{
|
||||
return set_exception_table_vec(evt >> 5, handler);
|
||||
}
|
||||
|
||||
/* XXX
|
||||
* disable hlt during certain critical i/o operations
|
||||
*/
|
||||
#define HAVE_DISABLE_HLT
|
||||
void disable_hlt(void);
|
||||
void enable_hlt(void);
|
||||
|
||||
#define arch_align_stack(x) (x)
|
||||
|
||||
#endif
|
59
include/asm-sh/types.h
Normal file
59
include/asm-sh/types.h
Normal file
|
@ -0,0 +1,59 @@
|
|||
#ifndef __ASM_SH_TYPES_H
|
||||
#define __ASM_SH_TYPES_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
typedef unsigned short umode_t;
|
||||
|
||||
/*
|
||||
* __xx is ok: it doesn't pollute the POSIX namespace. Use these in the
|
||||
* header files exported to user space
|
||||
*/
|
||||
|
||||
typedef __signed__ char __s8;
|
||||
typedef unsigned char __u8;
|
||||
|
||||
typedef __signed__ short __s16;
|
||||
typedef unsigned short __u16;
|
||||
|
||||
typedef __signed__ int __s32;
|
||||
typedef unsigned int __u32;
|
||||
|
||||
#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
|
||||
typedef __signed__ long long __s64;
|
||||
typedef unsigned long long __u64;
|
||||
#endif
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
/*
|
||||
* These aren't exported outside the kernel to avoid name space clashes
|
||||
*/
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#define BITS_PER_LONG 32
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
|
||||
typedef __signed__ char s8;
|
||||
typedef unsigned char u8;
|
||||
|
||||
typedef __signed__ short s16;
|
||||
typedef unsigned short u16;
|
||||
|
||||
typedef __signed__ int s32;
|
||||
typedef unsigned int u32;
|
||||
|
||||
typedef __signed__ long long s64;
|
||||
typedef unsigned long long u64;
|
||||
|
||||
/* Dma addresses are 32-bits wide. */
|
||||
|
||||
typedef u32 dma_addr_t;
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* __ASM_SH_TYPES_H */
|
44
include/asm-sh/u-boot.h
Normal file
44
include/asm-sh/u-boot.h
Normal file
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* 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
|
||||
*
|
||||
********************************************************************
|
||||
* NOTE: This header file defines an interface to U-Boot. Including
|
||||
* this (unmodified) header file in another file is considered normal
|
||||
* use of U-Boot, and does *not* fall under the heading of "derived
|
||||
* work".
|
||||
********************************************************************
|
||||
*/
|
||||
|
||||
#ifndef __ASM_SH_U_BOOT_H_
|
||||
#define __ASM_SH_U_BOOT_H_
|
||||
|
||||
|
||||
typedef struct bd_info {
|
||||
unsigned long bi_memstart; /* start of DRAM memory */
|
||||
unsigned long bi_memsize; /* size of DRAM memory in bytes */
|
||||
unsigned long bi_flashstart; /* start of FLASH memory */
|
||||
unsigned long bi_flashsize; /* size of FLASH memory */
|
||||
unsigned long bi_flashoffset; /* reserved area for startup monitor */
|
||||
unsigned long bi_sramstart; /* start of SRAM memory */
|
||||
unsigned long bi_sramsize; /* size of SRAM memory */
|
||||
unsigned long bi_ip_addr; /* IP Address */
|
||||
unsigned char bi_enetaddr[6]; /* Ethernet adress */
|
||||
unsigned long bi_baudrate; /* Console Baudrate */
|
||||
unsigned long bi_boot_params; /* where this board expects params */
|
||||
} bd_t;
|
||||
|
||||
#endif
|
||||
|
42
lib_sh/Makefile
Normal file
42
lib_sh/Makefile
Normal file
|
@ -0,0 +1,42 @@
|
|||
#
|
||||
# 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 $(TOPDIR)/config.mk
|
||||
|
||||
LIB = $(obj)lib$(ARCH).a
|
||||
|
||||
SOBJS =
|
||||
|
||||
COBJS = board.o sh_linux.o # time.o
|
||||
|
||||
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS))
|
||||
|
||||
$(LIB): $(obj).depend $(OBJS)
|
||||
$(AR) $(ARFLAGS) $@ $(OBJS)
|
||||
|
||||
#########################################################################
|
||||
|
||||
# defines $(obj).depend target
|
||||
include $(SRCTREE)/rules.mk
|
||||
|
||||
sinclude $(obj).depend
|
||||
|
||||
#########################################################################
|
163
lib_sh/board.c
Normal file
163
lib_sh/board.c
Normal file
|
@ -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 (;;);
|
||||
}
|
74
lib_sh/sh_linux.c
Normal file
74
lib_sh/sh_linux.c
Normal file
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
* (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 <command.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
extern image_header_t header; /* common/cmd_bootm.c */
|
||||
|
||||
/* The SH kernel reads arguments from the empty zero page at location
|
||||
* 0 at the start of SDRAM. The following are copied from
|
||||
* arch/sh/kernel/setup.c and may require tweaking if the kernel sources
|
||||
* change.
|
||||
*/
|
||||
#define PARAM ((unsigned char *)CFG_SDRAM_BASE + 0x1000)
|
||||
|
||||
#define MOUNT_ROOT_RDONLY (*(unsigned long *) (PARAM+0x000))
|
||||
#define RAMDISK_FLAGS (*(unsigned long *) (PARAM+0x004))
|
||||
#define ORIG_ROOT_DEV (*(unsigned long *) (PARAM+0x008))
|
||||
#define LOADER_TYPE (*(unsigned long *) (PARAM+0x00c))
|
||||
#define INITRD_START (*(unsigned long *) (PARAM+0x010))
|
||||
#define INITRD_SIZE (*(unsigned long *) (PARAM+0x014))
|
||||
/* ... */
|
||||
#define COMMAND_LINE ((char *) (PARAM+0x100))
|
||||
|
||||
#define RAMDISK_IMAGE_START_MASK 0x07FF
|
||||
|
||||
#ifdef CFG_DEBUG
|
||||
static void hexdump (unsigned char *buf, int len)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
if ((i % 16) == 0)
|
||||
printf ("%s%08x: ", i ? "\n" : "", (unsigned int) &buf[i]);
|
||||
printf ("%02x ", buf[i]);
|
||||
}
|
||||
printf ("\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
|
||||
ulong addr, ulong *len_ptr, int verify)
|
||||
{
|
||||
image_header_t *hdr = &header;
|
||||
char *bootargs = getenv("bootargs");
|
||||
void (*kernel) (void) = (void (*)(void)) ntohl (hdr->ih_ep);
|
||||
|
||||
/* Setup parameters */
|
||||
memset(PARAM, 0, 0x1000); /* Clear zero page */
|
||||
strcpy(COMMAND_LINE, bootargs);
|
||||
kernel();
|
||||
}
|
||||
|
76
lib_sh/time.c
Normal file
76
lib_sh/time.c
Normal file
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
* Copyright (c) 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 <asm/processer.h>
|
||||
|
||||
static void tmu_timer_start (unsigned int timer)
|
||||
{
|
||||
if (timer > 2)
|
||||
return;
|
||||
|
||||
*((volatile unsigned char *) TSTR0) |= (1 << timer);
|
||||
}
|
||||
|
||||
int timer_init (void)
|
||||
{
|
||||
*(volatile u16 *)TCR0 = 0;
|
||||
|
||||
tmu_timer_start (0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned long long get_ticks (void)
|
||||
{
|
||||
return (0 - *((volatile unsigned int *) TCNT0));
|
||||
}
|
||||
|
||||
unsigned long get_timer (unsigned long base)
|
||||
{
|
||||
return ((0 - *((volatile unsigned int *) TCNT0)) - 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 = start + (usec * ((CFG_HZ + 500000) / 1000000));
|
||||
|
||||
while (get_timer (0) < end)
|
||||
continue;
|
||||
}
|
||||
|
||||
unsigned long get_tbclk (void)
|
||||
{
|
||||
return CFG_HZ;
|
||||
}
|
||||
|
Loading…
Reference in a new issue