2006-07-11 Joel Sherrill <joel@OARcorp.com>

* clock/ckinit.c, timer/timer.c: Make sure LEON3_Timer_Regs is
	initialized for the timer driver.
This commit is contained in:
Joel Sherrill
2006-07-11 14:53:07 +00:00
parent daf46560dc
commit 72baf56520
3 changed files with 45 additions and 21 deletions

View File

@@ -1,3 +1,8 @@
2006-07-11 Joel Sherrill <joel@OARcorp.com>
* clock/ckinit.c, timer/timer.c: Make sure LEON3_Timer_Regs is
initialized for the timer driver.
2006-07-11 Jerry Needell <jerry.needell@unh.edu>
* ChangeLog, Makefile.am, clock/ckinit.c, include/amba.h,

View File

@@ -60,6 +60,38 @@ void Clock_exit( void );
rtems_device_major_number rtems_clock_major = ~0;
rtems_device_minor_number rtems_clock_minor;
/*
* LEON3_Find_timer
*
* This method searches for the timer on the AMBA bus.
*
* Input parameters: NONE
*
* Output parameters: NONE
*
* Return values: NONE
*/
void LEON3_Find_timer(void)
{
int i = 0;
unsigned int iobar, conf;
while (i < amba_conf.apbslv.devnr)
{
conf = amba_get_confword(amba_conf.apbslv, i, 0);
if ((amba_vendor(conf) == VENDOR_GAISLER) &&
(amba_device(conf) == GAISLER_GPTIMER)) {
iobar = amba_apb_get_membar(amba_conf.apbslv, i);
LEON3_Timer_Regs = (volatile LEON3_Timer_Regs_Map *)
amba_iobar_start(amba_conf.apbmst, iobar);
break;
}
i++;
}
}
/*
* Clock_isr
*
@@ -123,35 +155,18 @@ void Install_clock(
rtems_isr_entry clock_isr
)
{
int i;
unsigned int iobar, conf;
Clock_driver_ticks = 0;
/* Find GP Timer */
i = 0;
while (i < amba_conf.apbslv.devnr)
{
conf = amba_get_confword(amba_conf.apbslv, i, 0);
if ((amba_vendor(conf) == VENDOR_GAISLER) &&
(amba_device(conf) == GAISLER_GPTIMER)) {
iobar = amba_apb_get_membar(amba_conf.apbslv, i);
LEON3_Timer_Regs = (volatile LEON3_Timer_Regs_Map *)
amba_iobar_start(amba_conf.apbmst, iobar);
break;
}
i++;
}
clkirq = (LEON3_Timer_Regs->status & 0xfc) >> 3;
if ( BSP_Configuration.ticks_per_timeslice ) {
Old_ticker = (rtems_isr_entry) set_vector( clock_isr, LEON_TRAP_TYPE(clkirq), 1 );
Old_ticker = (rtems_isr_entry)
set_vector( clock_isr, LEON_TRAP_TYPE(clkirq), 1 );
LEON3_Timer_Regs->reload_t0 = CPU_SPARC_CLICKS_PER_TICK - 1;
LEON3_Timer_Regs->conf_t0 = LEON3_GPTIMER_EN | LEON3_GPTIMER_RL | LEON3_GPTIMER_LD | LEON3_GPTIMER_IRQEN;
LEON3_Timer_Regs->conf_t0 = LEON3_GPTIMER_EN | LEON3_GPTIMER_RL |
LEON3_GPTIMER_LD | LEON3_GPTIMER_IRQEN;
atexit( Clock_exit );
}

View File

@@ -27,9 +27,13 @@ rtems_boolean Timer_driver_Find_average_overhead;
rtems_boolean Timer_driver_Is_initialized = FALSE;
extern volatile LEON3_Timer_Regs_Map *LEON3_Timer_Regs;
extern void LEON3_Find_timer(void);
void Timer_initialize()
{
LEON3_Find_timer();
/*
* Timer runs long and accurate enough not to require an interrupt.
*/