Apply SoC concept to arm926ejs CPUs, i.e. move the SoC specific timer and
cpu_reset code from cpu/$(CPU) into the new cpu/$(CPU)/$(SOC) directories Patch by Andreas Engel, 13 Mar 2006
This commit is contained in:
parent
86f5f0342d
commit
ff7fefe679
@ -2,6 +2,11 @@
|
|||||||
Changes since U-Boot 1.1.4:
|
Changes since U-Boot 1.1.4:
|
||||||
======================================================================
|
======================================================================
|
||||||
|
|
||||||
|
* Apply SoC concept to arm926ejs CPUs, i.e. move the SoC specific
|
||||||
|
timer and cpu_reset code from cpu/$(CPU) into the new
|
||||||
|
cpu/$(CPU)/$(SOC) directories
|
||||||
|
Patch by Andreas Engel, 13 Mar 2006
|
||||||
|
|
||||||
* Change max size of uncompressed uImage's to 8MByte and add
|
* Change max size of uncompressed uImage's to 8MByte and add
|
||||||
CFG_BOOTM_LEN to adjust this setting.
|
CFG_BOOTM_LEN to adjust this setting.
|
||||||
|
|
||||||
|
6
Makefile
6
Makefile
@ -1514,7 +1514,7 @@ omap1510inn_config : unconfig
|
|||||||
@./mkconfig $(@:_config=) arm arm925t omap1510inn
|
@./mkconfig $(@:_config=) arm arm925t omap1510inn
|
||||||
|
|
||||||
omap5912osk_config : unconfig
|
omap5912osk_config : unconfig
|
||||||
@./mkconfig $(@:_config=) arm arm926ejs omap5912osk
|
@./mkconfig $(@:_config=) arm arm926ejs omap5912osk NULL omap
|
||||||
|
|
||||||
omap1610inn_config \
|
omap1610inn_config \
|
||||||
omap1610inn_cs0boot_config \
|
omap1610inn_cs0boot_config \
|
||||||
@ -1534,7 +1534,7 @@ omap1610h2_cs_autoboot_config: unconfig
|
|||||||
echo "#define CONFIG_CS3_BOOT" >> ./include/config.h ; \
|
echo "#define CONFIG_CS3_BOOT" >> ./include/config.h ; \
|
||||||
echo "... configured for CS3 boot"; \
|
echo "... configured for CS3 boot"; \
|
||||||
fi;
|
fi;
|
||||||
@./mkconfig -a $(call xtract_omap1610xxx,$@) arm arm926ejs omap1610inn
|
@./mkconfig -a $(call xtract_omap1610xxx,$@) arm arm926ejs omap1610inn NULL omap
|
||||||
|
|
||||||
omap730p2_config \
|
omap730p2_config \
|
||||||
omap730p2_cs0boot_config \
|
omap730p2_cs0boot_config \
|
||||||
@ -1546,7 +1546,7 @@ omap730p2_cs3boot_config : unconfig
|
|||||||
echo "#define CONFIG_CS3_BOOT" >> ./include/config.h ; \
|
echo "#define CONFIG_CS3_BOOT" >> ./include/config.h ; \
|
||||||
echo "... configured for CS3 boot"; \
|
echo "... configured for CS3 boot"; \
|
||||||
fi;
|
fi;
|
||||||
@./mkconfig -a $(call xtract_omap730p2,$@) arm arm926ejs omap730p2
|
@./mkconfig -a $(call xtract_omap730p2,$@) arm arm926ejs omap730p2 NULL omap
|
||||||
|
|
||||||
scb9328_config : unconfig
|
scb9328_config : unconfig
|
||||||
@./mkconfig $(@:_config=) arm arm920t scb9328 NULL imx
|
@./mkconfig $(@:_config=) arm arm920t scb9328 NULL imx
|
||||||
|
@ -36,5 +36,5 @@ fi
|
|||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
# Complete the configuration
|
# Complete the configuration
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
./mkconfig -a versatile arm arm926ejs versatile
|
./mkconfig -a versatile arm arm926ejs versatile NULL versatile
|
||||||
echo "Variant:: $variant"
|
echo "Variant:: $variant"
|
||||||
|
@ -39,16 +39,6 @@
|
|||||||
#include <arm926ejs.h>
|
#include <arm926ejs.h>
|
||||||
#include <asm/proc-armv/ptrace.h>
|
#include <asm/proc-armv/ptrace.h>
|
||||||
|
|
||||||
#define TIMER_LOAD_VAL 0xffffffff
|
|
||||||
|
|
||||||
/* macro to read the 32 bit timer */
|
|
||||||
#ifdef CONFIG_OMAP
|
|
||||||
#define READ_TIMER (*(volatile ulong *)(CFG_TIMERBASE+8))
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_VERSATILE
|
|
||||||
#define READ_TIMER (*(volatile ulong *)(CFG_TIMERBASE+4))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_USE_IRQ
|
#ifdef CONFIG_USE_IRQ
|
||||||
/* enable IRQ interrupts */
|
/* enable IRQ interrupts */
|
||||||
void enable_interrupts (void)
|
void enable_interrupts (void)
|
||||||
@ -188,146 +178,14 @@ void do_irq (struct pt_regs *pt_regs)
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
static ulong timestamp;
|
|
||||||
static ulong lastdec;
|
|
||||||
|
|
||||||
/* nothing really to do with interrupts, just starts up a counter. */
|
/* nothing really to do with interrupts, just starts up a counter. */
|
||||||
int interrupt_init (void)
|
int interrupt_init (void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_OMAP
|
extern void timer_init(void);
|
||||||
int32_t val;
|
|
||||||
|
|
||||||
/* Start the decrementer ticking down from 0xffffffff */
|
timer_init();
|
||||||
*((int32_t *) (CFG_TIMERBASE + LOAD_TIM)) = TIMER_LOAD_VAL;
|
|
||||||
val = MPUTIM_ST | MPUTIM_AR | MPUTIM_CLOCK_ENABLE | (CFG_PVT << MPUTIM_PTV_BIT);
|
|
||||||
*((int32_t *) (CFG_TIMERBASE + CNTL_TIMER)) = val;
|
|
||||||
#endif /* CONFIG_OMAP */
|
|
||||||
|
|
||||||
#ifdef CONFIG_VERSATILE
|
return 0;
|
||||||
*(volatile ulong *)(CFG_TIMERBASE + 0) = CFG_TIMER_RELOAD; /* TimerLoad */
|
|
||||||
*(volatile ulong *)(CFG_TIMERBASE + 4) = CFG_TIMER_RELOAD; /* TimerValue */
|
|
||||||
*(volatile ulong *)(CFG_TIMERBASE + 8) = 0x8C;
|
|
||||||
#endif /* CONFIG_VERSATILE */
|
|
||||||
|
|
||||||
/* init the timestamp and lastdec value */
|
|
||||||
reset_timer_masked();
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* timer without interrupts
|
|
||||||
*/
|
|
||||||
|
|
||||||
void reset_timer (void)
|
|
||||||
{
|
|
||||||
reset_timer_masked ();
|
|
||||||
}
|
|
||||||
|
|
||||||
ulong get_timer (ulong base)
|
|
||||||
{
|
|
||||||
return get_timer_masked () - base;
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_timer (ulong t)
|
|
||||||
{
|
|
||||||
timestamp = t;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* delay x useconds AND perserve advance timstamp value */
|
|
||||||
void udelay (unsigned long usec)
|
|
||||||
{
|
|
||||||
ulong tmo, tmp;
|
|
||||||
|
|
||||||
if(usec >= 1000){ /* if "big" number, spread normalization to seconds */
|
|
||||||
tmo = usec / 1000; /* start to normalize for usec to ticks per sec */
|
|
||||||
tmo *= CFG_HZ; /* find number of "ticks" to wait to achieve target */
|
|
||||||
tmo /= 1000; /* finish normalize. */
|
|
||||||
}else{ /* else small number, don't kill it prior to HZ multiply */
|
|
||||||
tmo = usec * CFG_HZ;
|
|
||||||
tmo /= (1000*1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
tmp = get_timer (0); /* get current timestamp */
|
|
||||||
if( (tmo + tmp + 1) < tmp ) /* if setting this fordward will roll time stamp */
|
|
||||||
reset_timer_masked (); /* reset "advancing" timestamp to 0, set lastdec value */
|
|
||||||
else
|
|
||||||
tmo += tmp; /* else, set advancing stamp wake up time */
|
|
||||||
|
|
||||||
while (get_timer_masked () < tmo)/* loop till event */
|
|
||||||
/*NOP*/;
|
|
||||||
}
|
|
||||||
|
|
||||||
void reset_timer_masked (void)
|
|
||||||
{
|
|
||||||
/* reset time */
|
|
||||||
lastdec = READ_TIMER; /* capure current decrementer value time */
|
|
||||||
timestamp = 0; /* start "advancing" time stamp from 0 */
|
|
||||||
}
|
|
||||||
|
|
||||||
ulong get_timer_masked (void)
|
|
||||||
{
|
|
||||||
ulong now = READ_TIMER; /* current tick value */
|
|
||||||
|
|
||||||
if (lastdec >= now) { /* normal mode (non roll) */
|
|
||||||
/* normal mode */
|
|
||||||
timestamp += lastdec - now; /* move stamp fordward with absoulte diff ticks */
|
|
||||||
} else { /* we have overflow of the count down timer */
|
|
||||||
/* nts = ts + ld + (TLV - now)
|
|
||||||
* ts=old stamp, ld=time that passed before passing through -1
|
|
||||||
* (TLV-now) amount of time after passing though -1
|
|
||||||
* nts = new "advancing time stamp"...it could also roll and cause problems.
|
|
||||||
*/
|
|
||||||
timestamp += lastdec + TIMER_LOAD_VAL - now;
|
|
||||||
}
|
|
||||||
lastdec = now;
|
|
||||||
|
|
||||||
return timestamp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* waits specified delay value and resets timestamp */
|
|
||||||
void udelay_masked (unsigned long usec)
|
|
||||||
{
|
|
||||||
ulong tmo;
|
|
||||||
ulong endtime;
|
|
||||||
signed long diff;
|
|
||||||
|
|
||||||
if (usec >= 1000) { /* if "big" number, spread normalization to seconds */
|
|
||||||
tmo = usec / 1000; /* start to normalize for usec to ticks per sec */
|
|
||||||
tmo *= CFG_HZ; /* find number of "ticks" to wait to achieve target */
|
|
||||||
tmo /= 1000; /* finish normalize. */
|
|
||||||
} else { /* else small number, don't kill it prior to HZ multiply */
|
|
||||||
tmo = usec * CFG_HZ;
|
|
||||||
tmo /= (1000*1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
endtime = get_timer_masked () + tmo;
|
|
||||||
|
|
||||||
do {
|
|
||||||
ulong now = get_timer_masked ();
|
|
||||||
diff = endtime - now;
|
|
||||||
} while (diff >= 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This function is derived from PowerPC code (read timebase as long long).
|
|
||||||
* On ARM it just returns the timer value.
|
|
||||||
*/
|
|
||||||
unsigned long long get_ticks(void)
|
|
||||||
{
|
|
||||||
return get_timer(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This function is derived from PowerPC code (timebase clock frequency).
|
|
||||||
* On ARM it returns the number of timer ticks per second.
|
|
||||||
*/
|
|
||||||
ulong get_tbclk (void)
|
|
||||||
{
|
|
||||||
ulong tbclk;
|
|
||||||
|
|
||||||
tbclk = CFG_HZ;
|
|
||||||
return tbclk;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_INTEGRATOR */
|
#endif /* CONFIG_INTEGRATOR */
|
||||||
|
43
cpu/arm926ejs/omap/Makefile
Normal file
43
cpu/arm926ejs/omap/Makefile
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#
|
||||||
|
# (C) Copyright 2000-2005
|
||||||
|
# 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 $(TOPDIR)/config.mk
|
||||||
|
|
||||||
|
LIB = lib$(SOC).a
|
||||||
|
|
||||||
|
OBJS = timer.o
|
||||||
|
SOBJS = reset.o
|
||||||
|
|
||||||
|
all: .depend $(LIB)
|
||||||
|
|
||||||
|
$(LIB): $(OBJS) $(SOBJS)
|
||||||
|
$(AR) crv $@ $(OBJS) $(SOBJS)
|
||||||
|
|
||||||
|
#########################################################################
|
||||||
|
|
||||||
|
.depend: Makefile $(OBJS:.o=.c)
|
||||||
|
$(CC) -M $(CFLAGS) $(OBJS:.o=.c) > $@
|
||||||
|
|
||||||
|
sinclude .depend
|
||||||
|
|
||||||
|
#########################################################################
|
45
cpu/arm926ejs/omap/reset.S
Normal file
45
cpu/arm926ejs/omap/reset.S
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* armboot - Startup Code for ARM926EJS CPU-core
|
||||||
|
*
|
||||||
|
* Copyright (c) 2003 Texas Instruments
|
||||||
|
*
|
||||||
|
* ----- Adapted for OMAP1610 OMAP730 from ARM925t code ------
|
||||||
|
*
|
||||||
|
* Copyright (c) 2001 Marius Gröger <mag@sysgo.de>
|
||||||
|
* Copyright (c) 2002 Alex Züpke <azu@sysgo.de>
|
||||||
|
* Copyright (c) 2002 Gary Jennejohn <gj@denx.de>
|
||||||
|
* Copyright (c) 2003 Richard Woodruff <r-woodruff2@ti.com>
|
||||||
|
* Copyright (c) 2003 Kshitij <kshitij@ti.com>
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
.align 5
|
||||||
|
.globl reset_cpu
|
||||||
|
reset_cpu:
|
||||||
|
ldr r1, rstctl1 /* get clkm1 reset ctl */
|
||||||
|
mov r3, #0x0
|
||||||
|
strh r3, [r1] /* clear it */
|
||||||
|
mov r3, #0x8
|
||||||
|
strh r3, [r1] /* force dsp+arm reset */
|
||||||
|
_loop_forever:
|
||||||
|
b _loop_forever
|
||||||
|
|
||||||
|
rstctl1:
|
||||||
|
.word 0xfffece10
|
177
cpu/arm926ejs/omap/timer.c
Normal file
177
cpu/arm926ejs/omap/timer.c
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
/*
|
||||||
|
* (C) Copyright 2003
|
||||||
|
* Texas Instruments <www.ti.com>
|
||||||
|
*
|
||||||
|
* (C) Copyright 2002
|
||||||
|
* Sysgo Real-Time Solutions, GmbH <www.elinos.com>
|
||||||
|
* Marius Groeger <mgroeger@sysgo.de>
|
||||||
|
*
|
||||||
|
* (C) Copyright 2002
|
||||||
|
* Sysgo Real-Time Solutions, GmbH <www.elinos.com>
|
||||||
|
* Alex Zuepke <azu@sysgo.de>
|
||||||
|
*
|
||||||
|
* (C) Copyright 2002-2004
|
||||||
|
* Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
|
||||||
|
*
|
||||||
|
* (C) Copyright 2004
|
||||||
|
* Philippe Robin, ARM Ltd. <philippe.robin@arm.com>
|
||||||
|
*
|
||||||
|
* 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 <arm926ejs.h>
|
||||||
|
|
||||||
|
#define TIMER_LOAD_VAL 0xffffffff
|
||||||
|
|
||||||
|
/* macro to read the 32 bit timer */
|
||||||
|
#define READ_TIMER (*(volatile ulong *)(CFG_TIMERBASE+8))
|
||||||
|
|
||||||
|
static ulong timestamp;
|
||||||
|
static ulong lastdec;
|
||||||
|
|
||||||
|
int timer_init (void)
|
||||||
|
{
|
||||||
|
int32_t val;
|
||||||
|
|
||||||
|
/* Start the decrementer ticking down from 0xffffffff */
|
||||||
|
*((int32_t *) (CFG_TIMERBASE + LOAD_TIM)) = TIMER_LOAD_VAL;
|
||||||
|
val = MPUTIM_ST | MPUTIM_AR | MPUTIM_CLOCK_ENABLE | (CFG_PVT << MPUTIM_PTV_BIT);
|
||||||
|
*((int32_t *) (CFG_TIMERBASE + CNTL_TIMER)) = val;
|
||||||
|
|
||||||
|
/* init the timestamp and lastdec value */
|
||||||
|
reset_timer_masked();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* timer without interrupts
|
||||||
|
*/
|
||||||
|
|
||||||
|
void reset_timer (void)
|
||||||
|
{
|
||||||
|
reset_timer_masked ();
|
||||||
|
}
|
||||||
|
|
||||||
|
ulong get_timer (ulong base)
|
||||||
|
{
|
||||||
|
return get_timer_masked () - base;
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_timer (ulong t)
|
||||||
|
{
|
||||||
|
timestamp = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* delay x useconds AND perserve advance timstamp value */
|
||||||
|
void udelay (unsigned long usec)
|
||||||
|
{
|
||||||
|
ulong tmo, tmp;
|
||||||
|
|
||||||
|
if(usec >= 1000){ /* if "big" number, spread normalization to seconds */
|
||||||
|
tmo = usec / 1000; /* start to normalize for usec to ticks per sec */
|
||||||
|
tmo *= CFG_HZ; /* find number of "ticks" to wait to achieve target */
|
||||||
|
tmo /= 1000; /* finish normalize. */
|
||||||
|
}else{ /* else small number, don't kill it prior to HZ multiply */
|
||||||
|
tmo = usec * CFG_HZ;
|
||||||
|
tmo /= (1000*1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp = get_timer (0); /* get current timestamp */
|
||||||
|
if( (tmo + tmp + 1) < tmp ) /* if setting this fordward will roll time stamp */
|
||||||
|
reset_timer_masked (); /* reset "advancing" timestamp to 0, set lastdec value */
|
||||||
|
else
|
||||||
|
tmo += tmp; /* else, set advancing stamp wake up time */
|
||||||
|
|
||||||
|
while (get_timer_masked () < tmo)/* loop till event */
|
||||||
|
/*NOP*/;
|
||||||
|
}
|
||||||
|
|
||||||
|
void reset_timer_masked (void)
|
||||||
|
{
|
||||||
|
/* reset time */
|
||||||
|
lastdec = READ_TIMER; /* capure current decrementer value time */
|
||||||
|
timestamp = 0; /* start "advancing" time stamp from 0 */
|
||||||
|
}
|
||||||
|
|
||||||
|
ulong get_timer_masked (void)
|
||||||
|
{
|
||||||
|
ulong now = READ_TIMER; /* current tick value */
|
||||||
|
|
||||||
|
if (lastdec >= now) { /* normal mode (non roll) */
|
||||||
|
/* normal mode */
|
||||||
|
timestamp += lastdec - now; /* move stamp fordward with absoulte diff ticks */
|
||||||
|
} else { /* we have overflow of the count down timer */
|
||||||
|
/* nts = ts + ld + (TLV - now)
|
||||||
|
* ts=old stamp, ld=time that passed before passing through -1
|
||||||
|
* (TLV-now) amount of time after passing though -1
|
||||||
|
* nts = new "advancing time stamp"...it could also roll and cause problems.
|
||||||
|
*/
|
||||||
|
timestamp += lastdec + TIMER_LOAD_VAL - now;
|
||||||
|
}
|
||||||
|
lastdec = now;
|
||||||
|
|
||||||
|
return timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* waits specified delay value and resets timestamp */
|
||||||
|
void udelay_masked (unsigned long usec)
|
||||||
|
{
|
||||||
|
ulong tmo;
|
||||||
|
ulong endtime;
|
||||||
|
signed long diff;
|
||||||
|
|
||||||
|
if (usec >= 1000) { /* if "big" number, spread normalization to seconds */
|
||||||
|
tmo = usec / 1000; /* start to normalize for usec to ticks per sec */
|
||||||
|
tmo *= CFG_HZ; /* find number of "ticks" to wait to achieve target */
|
||||||
|
tmo /= 1000; /* finish normalize. */
|
||||||
|
} else { /* else small number, don't kill it prior to HZ multiply */
|
||||||
|
tmo = usec * CFG_HZ;
|
||||||
|
tmo /= (1000*1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
endtime = get_timer_masked () + tmo;
|
||||||
|
|
||||||
|
do {
|
||||||
|
ulong now = get_timer_masked ();
|
||||||
|
diff = endtime - now;
|
||||||
|
} while (diff >= 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function is derived from PowerPC code (read timebase as long long).
|
||||||
|
* On ARM it just returns the timer value.
|
||||||
|
*/
|
||||||
|
unsigned long long get_ticks(void)
|
||||||
|
{
|
||||||
|
return get_timer(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function is derived from PowerPC code (timebase clock frequency).
|
||||||
|
* On ARM it returns the number of timer ticks per second.
|
||||||
|
*/
|
||||||
|
ulong get_tbclk (void)
|
||||||
|
{
|
||||||
|
ulong tbclk;
|
||||||
|
|
||||||
|
tbclk = CFG_HZ;
|
||||||
|
return tbclk;
|
||||||
|
}
|
@ -392,25 +392,3 @@ fiq:
|
|||||||
bl do_fiq
|
bl do_fiq
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# ifdef CONFIG_INTEGRATOR
|
|
||||||
|
|
||||||
/* Satisfied by Integrator routine (AP or CP) */
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
.align 5
|
|
||||||
.globl reset_cpu
|
|
||||||
reset_cpu:
|
|
||||||
ldr r1, rstctl1 /* get clkm1 reset ctl */
|
|
||||||
mov r3, #0x0
|
|
||||||
strh r3, [r1] /* clear it */
|
|
||||||
mov r3, #0x8
|
|
||||||
strh r3, [r1] /* force dsp+arm reset */
|
|
||||||
_loop_forever:
|
|
||||||
b _loop_forever
|
|
||||||
|
|
||||||
rstctl1:
|
|
||||||
.word 0xfffece10
|
|
||||||
|
|
||||||
#endif /* #ifdef CONFIG_INTEGRATOR */
|
|
||||||
|
43
cpu/arm926ejs/versatile/Makefile
Normal file
43
cpu/arm926ejs/versatile/Makefile
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#
|
||||||
|
# (C) Copyright 2000-2005
|
||||||
|
# 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 $(TOPDIR)/config.mk
|
||||||
|
|
||||||
|
LIB = lib$(SOC).a
|
||||||
|
|
||||||
|
OBJS = timer.o
|
||||||
|
SOBJS = reset.o
|
||||||
|
|
||||||
|
all: .depend $(LIB)
|
||||||
|
|
||||||
|
$(LIB): $(OBJS) $(SOBJS)
|
||||||
|
$(AR) crv $@ $(OBJS) $(SOBJS)
|
||||||
|
|
||||||
|
#########################################################################
|
||||||
|
|
||||||
|
.depend: Makefile $(OBJS:.o=.c)
|
||||||
|
$(CC) -M $(CFLAGS) $(OBJS:.o=.c) > $@
|
||||||
|
|
||||||
|
sinclude .depend
|
||||||
|
|
||||||
|
#########################################################################
|
45
cpu/arm926ejs/versatile/reset.S
Normal file
45
cpu/arm926ejs/versatile/reset.S
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* armboot - Startup Code for ARM926EJS CPU-core
|
||||||
|
*
|
||||||
|
* Copyright (c) 2003 Texas Instruments
|
||||||
|
*
|
||||||
|
* ----- Adapted for OMAP1610 OMAP730 from ARM925t code ------
|
||||||
|
*
|
||||||
|
* Copyright (c) 2001 Marius Gröger <mag@sysgo.de>
|
||||||
|
* Copyright (c) 2002 Alex Züpke <azu@sysgo.de>
|
||||||
|
* Copyright (c) 2002 Gary Jennejohn <gj@denx.de>
|
||||||
|
* Copyright (c) 2003 Richard Woodruff <r-woodruff2@ti.com>
|
||||||
|
* Copyright (c) 2003 Kshitij <kshitij@ti.com>
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
.align 5
|
||||||
|
.globl reset_cpu
|
||||||
|
reset_cpu:
|
||||||
|
ldr r1, rstctl1 /* get clkm1 reset ctl */
|
||||||
|
mov r3, #0x0
|
||||||
|
strh r3, [r1] /* clear it */
|
||||||
|
mov r3, #0x8
|
||||||
|
strh r3, [r1] /* force dsp+arm reset */
|
||||||
|
_loop_forever:
|
||||||
|
b _loop_forever
|
||||||
|
|
||||||
|
rstctl1:
|
||||||
|
.word 0xfffece10
|
175
cpu/arm926ejs/versatile/timer.c
Normal file
175
cpu/arm926ejs/versatile/timer.c
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
/*
|
||||||
|
* (C) Copyright 2003
|
||||||
|
* Texas Instruments <www.ti.com>
|
||||||
|
*
|
||||||
|
* (C) Copyright 2002
|
||||||
|
* Sysgo Real-Time Solutions, GmbH <www.elinos.com>
|
||||||
|
* Marius Groeger <mgroeger@sysgo.de>
|
||||||
|
*
|
||||||
|
* (C) Copyright 2002
|
||||||
|
* Sysgo Real-Time Solutions, GmbH <www.elinos.com>
|
||||||
|
* Alex Zuepke <azu@sysgo.de>
|
||||||
|
*
|
||||||
|
* (C) Copyright 2002-2004
|
||||||
|
* Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
|
||||||
|
*
|
||||||
|
* (C) Copyright 2004
|
||||||
|
* Philippe Robin, ARM Ltd. <philippe.robin@arm.com>
|
||||||
|
*
|
||||||
|
* 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 <arm926ejs.h>
|
||||||
|
|
||||||
|
#define TIMER_LOAD_VAL 0xffffffff
|
||||||
|
|
||||||
|
/* macro to read the 32 bit timer */
|
||||||
|
#define READ_TIMER (*(volatile ulong *)(CFG_TIMERBASE+4))
|
||||||
|
|
||||||
|
static ulong timestamp;
|
||||||
|
static ulong lastdec;
|
||||||
|
|
||||||
|
/* nothing really to do with interrupts, just starts up a counter. */
|
||||||
|
int timer_init (void)
|
||||||
|
{
|
||||||
|
*(volatile ulong *)(CFG_TIMERBASE + 0) = CFG_TIMER_RELOAD; /* TimerLoad */
|
||||||
|
*(volatile ulong *)(CFG_TIMERBASE + 4) = CFG_TIMER_RELOAD; /* TimerValue */
|
||||||
|
*(volatile ulong *)(CFG_TIMERBASE + 8) = 0x8C;
|
||||||
|
|
||||||
|
/* init the timestamp and lastdec value */
|
||||||
|
reset_timer_masked();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* timer without interrupts
|
||||||
|
*/
|
||||||
|
|
||||||
|
void reset_timer (void)
|
||||||
|
{
|
||||||
|
reset_timer_masked ();
|
||||||
|
}
|
||||||
|
|
||||||
|
ulong get_timer (ulong base)
|
||||||
|
{
|
||||||
|
return get_timer_masked () - base;
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_timer (ulong t)
|
||||||
|
{
|
||||||
|
timestamp = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* delay x useconds AND perserve advance timstamp value */
|
||||||
|
void udelay (unsigned long usec)
|
||||||
|
{
|
||||||
|
ulong tmo, tmp;
|
||||||
|
|
||||||
|
if(usec >= 1000){ /* if "big" number, spread normalization to seconds */
|
||||||
|
tmo = usec / 1000; /* start to normalize for usec to ticks per sec */
|
||||||
|
tmo *= CFG_HZ; /* find number of "ticks" to wait to achieve target */
|
||||||
|
tmo /= 1000; /* finish normalize. */
|
||||||
|
}else{ /* else small number, don't kill it prior to HZ multiply */
|
||||||
|
tmo = usec * CFG_HZ;
|
||||||
|
tmo /= (1000*1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp = get_timer (0); /* get current timestamp */
|
||||||
|
if( (tmo + tmp + 1) < tmp ) /* if setting this fordward will roll time stamp */
|
||||||
|
reset_timer_masked (); /* reset "advancing" timestamp to 0, set lastdec value */
|
||||||
|
else
|
||||||
|
tmo += tmp; /* else, set advancing stamp wake up time */
|
||||||
|
|
||||||
|
while (get_timer_masked () < tmo)/* loop till event */
|
||||||
|
/*NOP*/;
|
||||||
|
}
|
||||||
|
|
||||||
|
void reset_timer_masked (void)
|
||||||
|
{
|
||||||
|
/* reset time */
|
||||||
|
lastdec = READ_TIMER; /* capure current decrementer value time */
|
||||||
|
timestamp = 0; /* start "advancing" time stamp from 0 */
|
||||||
|
}
|
||||||
|
|
||||||
|
ulong get_timer_masked (void)
|
||||||
|
{
|
||||||
|
ulong now = READ_TIMER; /* current tick value */
|
||||||
|
|
||||||
|
if (lastdec >= now) { /* normal mode (non roll) */
|
||||||
|
/* normal mode */
|
||||||
|
timestamp += lastdec - now; /* move stamp fordward with absoulte diff ticks */
|
||||||
|
} else { /* we have overflow of the count down timer */
|
||||||
|
/* nts = ts + ld + (TLV - now)
|
||||||
|
* ts=old stamp, ld=time that passed before passing through -1
|
||||||
|
* (TLV-now) amount of time after passing though -1
|
||||||
|
* nts = new "advancing time stamp"...it could also roll and cause problems.
|
||||||
|
*/
|
||||||
|
timestamp += lastdec + TIMER_LOAD_VAL - now;
|
||||||
|
}
|
||||||
|
lastdec = now;
|
||||||
|
|
||||||
|
return timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* waits specified delay value and resets timestamp */
|
||||||
|
void udelay_masked (unsigned long usec)
|
||||||
|
{
|
||||||
|
ulong tmo;
|
||||||
|
ulong endtime;
|
||||||
|
signed long diff;
|
||||||
|
|
||||||
|
if (usec >= 1000) { /* if "big" number, spread normalization to seconds */
|
||||||
|
tmo = usec / 1000; /* start to normalize for usec to ticks per sec */
|
||||||
|
tmo *= CFG_HZ; /* find number of "ticks" to wait to achieve target */
|
||||||
|
tmo /= 1000; /* finish normalize. */
|
||||||
|
} else { /* else small number, don't kill it prior to HZ multiply */
|
||||||
|
tmo = usec * CFG_HZ;
|
||||||
|
tmo /= (1000*1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
endtime = get_timer_masked () + tmo;
|
||||||
|
|
||||||
|
do {
|
||||||
|
ulong now = get_timer_masked ();
|
||||||
|
diff = endtime - now;
|
||||||
|
} while (diff >= 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function is derived from PowerPC code (read timebase as long long).
|
||||||
|
* On ARM it just returns the timer value.
|
||||||
|
*/
|
||||||
|
unsigned long long get_ticks(void)
|
||||||
|
{
|
||||||
|
return get_timer(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function is derived from PowerPC code (timebase clock frequency).
|
||||||
|
* On ARM it returns the number of timer ticks per second.
|
||||||
|
*/
|
||||||
|
ulong get_tbclk (void)
|
||||||
|
{
|
||||||
|
ulong tbclk;
|
||||||
|
|
||||||
|
tbclk = CFG_HZ;
|
||||||
|
return tbclk;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user