[U-Boot-Users] [PATCH 1/8] ColdFire: Add MCF547x_8x cpu arch

Guennadi Liakhovetski lg at denx.de
Sat Jan 12 22:49:17 CET 2008


On Fri, 11 Jan 2008, TsiChung Liew wrote:

> diff --git a/cpu/mcf547x_8x/slicetimer.c b/cpu/mcf547x_8x/slicetimer.c
> new file mode 100644
> index 0000000..10418fa
> --- /dev/null
> +++ b/cpu/mcf547x_8x/slicetimer.c
> @@ -0,0 +1,132 @@
> +/*
> + * (C) Copyright 2007 Freescale Semiconductor, Inc.
> + * TsiChung Liew (Tsi-Chung.Liew at freescale.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 <asm/timer.h>
> +#include <asm/immap.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +static ulong timestamp;
> +
> +#if defined(CONFIG_SLTTMR)
> +#ifndef CFG_UDELAY_BASE
> +#	error	"uDelay base not defined!"
> +#endif
> +
> +#if !defined(CFG_TMR_BASE) || !defined(CFG_INTR_BASE) || !defined
> (CFG_TMRINTR_NO) || !defined(CFG_TMRINTR_MASK)

At least this patch seems line-wrapped to me. Above is just one example.

> +#	error	"TMR_BASE, INTR_BASE, TMRINTR_NO or TMRINTR_MASk not defined!"
> +#endif
> +extern void dtimer_intr_setup(void);
> +
> +void udelay(unsigned long usec)
> +{
> +	volatile slt_t *timerp = (slt_t *) (CFG_UDELAY_BASE);
> +	u32 now, freq;
> +
> +	/* 1 us period */
> +	freq = CFG_TIMER_PRESCALER;
> +
> +	timerp->cr = 0;		/* Disable */
> +	timerp->tcnt = usec * freq;
> +	timerp->cr = SLT_CR_TEN;
> +
> +	now = timerp->cnt;
> +	while (now != 0)
> +		now = timerp->cnt;
> +
> +	timerp->sr |= SLT_SR_ST;
> +	timerp->cr = 0;
> +}
> +
> +void dtimer_interrupt(void *not_used)
> +{
> +	volatile slt_t *timerp = (slt_t *) (CFG_TMR_BASE);
> +
> +	/* check for timer interrupt asserted */
> +	if ((CFG_TMRPND_REG & CFG_TMRINTR_MASK) == CFG_TMRINTR_PEND) {
> +		timerp->sr |= SLT_SR_ST;
> +		timestamp++;
> +		return;
> +	}
> +}
> +
> +void timer_init(void)
> +{
> +	volatile slt_t *timerp = (slt_t *) (CFG_TMR_BASE);
> +
> +	timestamp = 0;
> +
> +	timerp->cr = 0;		/* disable timer */
> +	timerp->tcnt = 0;
> +	timerp->sr = SLT_SR_BE | SLT_SR_ST;	/* clear status */
> +
> +	/* initialize and enable timer interrupt */
> +	irq_install_handler(CFG_TMRINTR_NO, dtimer_interrupt, 0);
> +
> +	/* Interrupt every ms */
> +	timerp->tcnt = 1000 * CFG_TIMER_PRESCALER;
> +
> +	dtimer_intr_setup();
> +
> +	/* set a period of 1us, set timer mode to restart and
> +	   enable timer and interrupt */
> +	timerp->cr = SLT_CR_RUN | SLT_CR_IEN | SLT_CR_TEN;
> +}
> +
> +void reset_timer(void)
> +{
> +	timestamp = 0;
> +}
> +
> +ulong get_timer(ulong base)
> +{
> +	return (timestamp - base);
> +}
> +
> +void set_timer(ulong t)
> +{
> +	timestamp = t;
> +}
> +#endif				/* CONFIG_SLTTMR */
> +
> +/*
> + * This function is derived from PowerPC code (read timebase as long
> long).

And here's another one

> + * On M68K it just returns the timer value.
> + */

Is this really the correct comment here? I see the code is copied from 
lib_m68k/time.c. Isn't lib_m68k going to be linked with this board? Won't 
symbols conflict then? Obviously they don't, as you are running this code, 
just I don't see immediately how this works. And if CONFIG_SLTTMR is not 
defined, looks like get_timer will be undefined, right? Is this the 
intended behaviour?

> +unsigned long long get_ticks(void)
> +{
> +	return get_timer(0);
> +}
> +
> +/*
> + * This function is derived from PowerPC code (timebase clock
> frequency).

and another one

> + * On M68K it returns the number of timer ticks per second.
> + */

and the comment is from lib_m68k/time.c again.

> +ulong get_tbclk(void)
> +{
> +	ulong tbclk;
> +	tbclk = CFG_HZ;
> +	return tbclk;
> +}
> +	movec	%d0, %ACR2
> +	movec	%d0, %ACR3
> +
> +	/* initialize general use internal ram */
> +	move.l #0, %d0
> +	move.l #(ICACHE_STATUS), %a1	/* icache */
> +	move.l #(DCACHE_STATUS), %a2	/* icache */
> +	move.l #(CACR_STATUS), %a3	/* CACR */
> +	move.l %d0, (%a1)
> +	move.l %d0, (%a2)
> +	move.l %d0, (%a3)
> +
> +	/* set stackpointer to end of internal ram to get some stackspace for
> the

Strange, this line is wrapped

> +	   first c-code */
> +	move.l	#(CFG_INIT_RAM_ADDR + CFG_INIT_SP_OFFSET), %sp
> +	clr.l %sp at -
> +
> +	move.l #__got_start, %a5	/* put relocation table address to a5 */
> +
> +	bsr cpu_init_f			/* run low-level CPU init code (from flash) */
> +	bsr board_init_f		/* run low-level board init code (from flash) */

but these longer ones are not.

Thanks
Guennadi
---
Guennadi Liakhovetski, Ph.D.

DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-0 Fax: +49-8142-66989-80  Email: office at denx.de




More information about the U-Boot mailing list