From a355e3ea982d7bb8a8cb5a67f810c66cbfc78330 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Tue, 22 May 2001 23:07:09 +0000 Subject: 2001-05-22 Greg Menke * Assisted in design and debug by Joel Sherrill . * clock/clockdrv.c, console/conscfg.c: Corrected. * include/bsp.h: Support for tm27 and addition of CPU_CLOCK_RATE. * startup/bspstart.c: Properly set initial status register and pending interrupts. * timer/timer.c: Works now. --- c/src/lib/libbsp/mips/genmongoosev/ChangeLog | 9 +++ .../lib/libbsp/mips/genmongoosev/clock/clockdrv.c | 30 ++++----- .../lib/libbsp/mips/genmongoosev/console/conscfg.c | 8 +-- c/src/lib/libbsp/mips/genmongoosev/include/bsp.h | 48 +++++++++++--- .../libbsp/mips/genmongoosev/startup/bspstart.c | 74 ++++++++++++++++------ c/src/lib/libbsp/mips/genmongoosev/timer/timer.c | 37 ++++++----- 6 files changed, 142 insertions(+), 64 deletions(-) (limited to 'c') diff --git a/c/src/lib/libbsp/mips/genmongoosev/ChangeLog b/c/src/lib/libbsp/mips/genmongoosev/ChangeLog index 3567e0c042..617bfaf187 100644 --- a/c/src/lib/libbsp/mips/genmongoosev/ChangeLog +++ b/c/src/lib/libbsp/mips/genmongoosev/ChangeLog @@ -1,3 +1,12 @@ +2001-05-22 Greg Menke + + * Assisted in design and debug by Joel Sherrill . + * clock/clockdrv.c, console/conscfg.c: Corrected. + * include/bsp.h: Support for tm27 and addition of CPU_CLOCK_RATE. + * startup/bspstart.c: Properly set initial status register and + pending interrupts. + * timer/timer.c: Works now. + 2001-05-10 Ralf Corsepius * configure.in: Use RTEMS_PROG_CC_FOR_TARGET([-ansi -fasm]). diff --git a/c/src/lib/libbsp/mips/genmongoosev/clock/clockdrv.c b/c/src/lib/libbsp/mips/genmongoosev/clock/clockdrv.c index e948b7ee4f..7d47945864 100644 --- a/c/src/lib/libbsp/mips/genmongoosev/clock/clockdrv.c +++ b/c/src/lib/libbsp/mips/genmongoosev/clock/clockdrv.c @@ -23,14 +23,16 @@ #define CLOCK_VECTOR MONGOOSEV_IRQ_TIMER1 #endif + + /* reset Timeout (TO) bit */ + #define Clock_driver_support_at_tick() \ - MONGOOSEV_WRITE_REGISTER( \ - CLOCK_BASE, \ - MONGOOSEV_TIMER_CONTROL_REGISTER, \ - (MONGOOSEV_TIMER_CONTROL_COUNTER_ENABLE | \ - MONGOOSEV_TIMER_CONTROL_INTERRUPT_ENABLE) \ - ); + do { \ + MONGOOSEV_WRITE_REGISTER( CLOCK_BASE, MONGOOSEV_TIMER_CONTROL_REGISTER, \ + (MONGOOSEV_TIMER_CONTROL_COUNTER_ENABLE | MONGOOSEV_TIMER_CONTROL_INTERRUPT_ENABLE)); \ + } while(0) + #define Clock_driver_support_install_isr( _new, _old ) \ do { \ @@ -38,20 +40,12 @@ } while(0) -extern int ClockRate; - -#define CLICKS (((unsigned32) &ClockRate) / 1000000 ) #define Clock_driver_support_initialize_hardware() \ - do { \ - unsigned32 _clicks; \ - _clicks = CLICKS * rtems_configuration_get_microseconds_per_tick(); \ - MONGOOSEV_WRITE_REGISTER( \ - CLOCK_BASE, \ - MONGOOSEV_TIMER_INITIAL_COUNTER_REGISTER, \ - _clicks \ - ); \ + do { \ + unsigned32 _clicks = CPU_CLOCK_RATE_MHZ * rtems_configuration_get_microseconds_per_tick(); \ + MONGOOSEV_WRITE_REGISTER( CLOCK_BASE, MONGOOSEV_TIMER_INITIAL_COUNTER_REGISTER, _clicks ); \ Clock_driver_support_at_tick(); \ - } while(0) + } while(0) #define Clock_driver_support_shutdown_hardware() \ MONGOOSEV_WRITE_REGISTER( CLOCK_BASE, MONGOOSEV_TIMER_CONTROL_REGISTER, 0 ) diff --git a/c/src/lib/libbsp/mips/genmongoosev/console/conscfg.c b/c/src/lib/libbsp/mips/genmongoosev/console/conscfg.c index a36fe3c1c0..ae76d5efb6 100644 --- a/c/src/lib/libbsp/mips/genmongoosev/console/conscfg.c +++ b/c/src/lib/libbsp/mips/genmongoosev/console/conscfg.c @@ -18,14 +18,14 @@ #include #include -#if (CONSOLE_USE_INTERRUPTS) +/* #define CONSOLE_USE_INTERRUPTS */ + +#ifdef CONSOLE_USE_INTERRUPTS #define MG5UART_FUNCTIONS &mg5uart_fns #else #define MG5UART_FUNCTIONS &mg5uart_fns_polled #endif -extern int ClockRate; -#define CLOCK_RATE (unsigned32) &ClockRate console_tbl Console_Port_Tbl[] = { { @@ -91,5 +91,3 @@ void GENMG5_output_char(char c) { write( 2, &c, 1 ); } BSP_output_char_function_type BSP_output_char = GENMG5_output_char; BSP_polling_getchar_function_type BSP_poll_char = NULL; - - diff --git a/c/src/lib/libbsp/mips/genmongoosev/include/bsp.h b/c/src/lib/libbsp/mips/genmongoosev/include/bsp.h index ae7a76612e..3bfe597445 100644 --- a/c/src/lib/libbsp/mips/genmongoosev/include/bsp.h +++ b/c/src/lib/libbsp/mips/genmongoosev/include/bsp.h @@ -26,6 +26,34 @@ extern "C" { #include #include + +#ifndef CPU_CLOCK_RATE +#define CLOCK_RATE 12000000 +#endif + +#define CPU_CLOCK_RATE_HZ CLOCK_RATE +#define CPU_CLOCK_RATE_MHZ (CLOCK_RATE/1000000) + + +/* + * Useful defines set here so we can avoid duplicating them all over + * creation. + * + */ + + + +/* + * assertSoftwareInt defined in vectorisrs.c the prototype is here so + * userspace code can get to it directly. + * */ + +extern void assertSoftwareInterrupt(unsigned32); + + + + + /* * Define the time limits for RTEMS Test Suite test durations. * Long test and short test duration limits are provided. These @@ -44,23 +72,28 @@ extern "C" { * */ + +#define CLOCK_VECTOR MONGOOSEV_IRQ_TIMER1 + + #define MUST_WAIT_FOR_INTERRUPT 1 -#if 0 +#if 1 + #define Install_tm27_vector( handler ) \ - (void) set_vector( handler, MONGOOSEV_IRQ_SOFTWARE_1, 1 ); \ + (void) set_vector( handler, MONGOOSEV_IRQ_SOFTWARE_1, 1 ); -#define Cause_tm27_intr() \ - asm volatile ( "syscall 0x01" : : ); -#define CLOCK_VECTOR MONGOOSEV_IRQ_TMR0 -#define Clear_tm27_intr() +#define Cause_tm27_intr() assertSoftwareInterrupt(0); +#define Clear_tm27_intr() #define Lower_tm27_intr() + #else + #define Install_tm27_vector( handler ) \ - (void) set_vector( handler, MONGOOSEV_IRQ_TMR0, 1 ); \ + (void) set_vector( handler, MONGOOSEV_IRQ_TIMER1, 1 ); #define Cause_tm27_intr() \ do { \ @@ -68,7 +101,6 @@ extern "C" { } while(0) #define Clear_tm27_intr() - #define Lower_tm27_intr() #endif diff --git a/c/src/lib/libbsp/mips/genmongoosev/startup/bspstart.c b/c/src/lib/libbsp/mips/genmongoosev/startup/bspstart.c index 002aea0cb3..20104a95b3 100644 --- a/c/src/lib/libbsp/mips/genmongoosev/startup/bspstart.c +++ b/c/src/lib/libbsp/mips/genmongoosev/startup/bspstart.c @@ -21,6 +21,8 @@ #include #include + + /* * The original table from the application and our copy of it with * some changes. @@ -57,18 +59,22 @@ void bsp_libc_init( void *, unsigned32, int ); void bsp_pretasking_hook(void) { - extern int HeapBase; - extern int HeapSize; + extern int HeapBase; + extern int HeapSize; void *heapStart = &HeapBase; unsigned long heapSize = (unsigned long)&HeapSize; + unsigned long ramSpace; bsp_libc_init(heapStart, (unsigned32) heapSize, 0); #ifdef RTEMS_DEBUG rtems_debug_enable( RTEMS_DEBUG_ALL_MASK ); #endif + } - + + + /* * bsp_start * @@ -79,33 +85,65 @@ void bsp_start( void ) { extern int _end; extern int WorkspaceBase; - extern int _RamSize, _RamBase; - int ram_left; - ram_left = (unsigned32) &_RamSize - - (unsigned32)&WorkspaceBase - (unsigned32) &_RamBase; + /* Configure Number of Register Caches */ Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */ Cpu_table.postdriver_hook = bsp_postdriver_hook; Cpu_table.interrupt_stack_size = 4096; - if ( BSP_Configuration.work_space_size > ram_left ) - _sys_exit( 1 ); + /* HACK -- tied to value linkcmds */ + if ( BSP_Configuration.work_space_size >(4096*1024) ) + _sys_exit( 1 ); BSP_Configuration.work_space_start = (void *) &WorkspaceBase; - /* Clear all pending peripheral interrupts and mask them. */ - - MONGOOSEV_WRITE( MONGOOSEV_PERIPHERAL_FUNCTION_INTERRUPT_CAUSE_REGISTER, 0 ); + MONGOOSEV_WRITE( MONGOOSEV_WATCHDOG, 0xA0 ); + + /* reset the config register & clear any pending peripheral interrupts */ + MONGOOSEV_WRITE( MONGOOSEV_PERIPHERAL_COMMAND_REGISTER, 0 ); + MONGOOSEV_WRITE( MONGOOSEV_PERIPHERAL_COMMAND_REGISTER, MONGOOSEV_UART_CMD_RESET_BOTH_PORTS ); + MONGOOSEV_WRITE( MONGOOSEV_PERIPHERAL_COMMAND_REGISTER, 0 ); + + /* reset both timers */ + MONGOOSEV_WRITE_REGISTER( MONGOOSEV_TIMER1_BASE, MONGOOSEV_TIMER_INITIAL_COUNTER_REGISTER, 0xffffffff ); + MONGOOSEV_WRITE_REGISTER( MONGOOSEV_TIMER1_BASE, MONGOOSEV_TIMER_CONTROL_REGISTER, 0); + + MONGOOSEV_WRITE_REGISTER( MONGOOSEV_TIMER2_BASE, MONGOOSEV_TIMER_INITIAL_COUNTER_REGISTER, 0xffffffff ); + MONGOOSEV_WRITE_REGISTER( MONGOOSEV_TIMER2_BASE, MONGOOSEV_TIMER_CONTROL_REGISTER, 0); + MONGOOSEV_WRITE( MONGOOSEV_PERIPHERAL_FUNCTION_INTERRUPT_MASK_REGISTER, 0 ); + MONGOOSEV_WRITE( MONGOOSEV_PERIPHERAL_STATUS_REGISTER, 0xffffffff ); - /* - * Enable coprocessors. - * Disable external interrupts. - * Enable software interrupts. - */ + /* clear any writable bits in the cause register */ + mips_set_cause( 0 ); - mips_set_sr( (SR_CU0 | SR_CU1 | SR_IBIT1 | SR_IBIT2) ); + /*all interrupts unmasked but globally off. depend on the IRC to take care of things */ + mips_set_sr( (SR_CU0 | SR_CU1 | 0xff00) ); mips_install_isr_entries(); } + + +void clear_cache( void *address, size_t n ) +{ +} + +/* Structure filled in by get_mem_info. Only the size field is + actually used (to clear bss), so the others aren't even filled in. */ + +struct s_mem +{ + unsigned int size; + unsigned int icsize; + unsigned int dcsize; +}; + + +void +get_mem_info (mem) + struct s_mem *mem; +{ + mem->size = 0x1000000; /* XXX figure out something here */ +} + diff --git a/c/src/lib/libbsp/mips/genmongoosev/timer/timer.c b/c/src/lib/libbsp/mips/genmongoosev/timer/timer.c index 154ab66230..16c6ba20cb 100644 --- a/c/src/lib/libbsp/mips/genmongoosev/timer/timer.c +++ b/c/src/lib/libbsp/mips/genmongoosev/timer/timer.c @@ -37,20 +37,21 @@ void Timer_initialize() * the compare register is set to the maximum value. */ - MONGOOSEV_WRITE_REGISTER( - TIMER_BASE, - MONGOOSEV_TIMER_INITIAL_COUNTER_REGISTER, - 0xffffffff - ); - MONGOOSEV_WRITE_REGISTER( - TIMER_BASE, - MONGOOSEV_TIMER_CONTROL_REGISTER, - MONGOOSEV_TIMER_CONTROL_COUNTER_ENABLE - ); + MONGOOSEV_WRITE_REGISTER( TIMER_BASE, MONGOOSEV_TIMER_CONTROL_REGISTER, 0); + + MONGOOSEV_WRITE_REGISTER( TIMER_BASE, + MONGOOSEV_TIMER_INITIAL_COUNTER_REGISTER, + 0xffffffff ); + + MONGOOSEV_WRITE_REGISTER( TIMER_BASE, + MONGOOSEV_TIMER_CONTROL_REGISTER, + MONGOOSEV_TIMER_CONTROL_COUNTER_ENABLE ); + } #define AVG_OVERHEAD 0 /* It typically takes N instructions */ /* to start/stop the timer. */ + #define LEAST_VALID 1 /* Don't trust a value lower than this */ /* mongoose-v can count cycles. :) */ #include @@ -61,13 +62,16 @@ int Read_timer() rtems_unsigned32 total; rtems_unsigned32 tcr; - clicks = MONGOOSEV_READ_REGISTER( - TIMER_BASE, - MONGOOSEV_TIMER_INITIAL_COUNTER_REGISTER - ); + clicks = MONGOOSEV_READ_REGISTER( TIMER_BASE, + MONGOOSEV_TIMER_INITIAL_COUNTER_REGISTER ); total = 0xffffffff - clicks; tcr = MONGOOSEV_READ_REGISTER( TIMER_BASE, MONGOOSEV_TIMER_CONTROL_REGISTER ); + + MONGOOSEV_WRITE_REGISTER( TIMER_BASE, + MONGOOSEV_TIMER_CONTROL_REGISTER, + 0 ); + if ( tcr & MONGOOSEV_TIMER_CONTROL_TIMEOUT ) printk( "MG5 timer overran\n" ); @@ -77,7 +81,7 @@ int Read_timer() if ( total < LEAST_VALID ) return 0; /* below timer resolution */ - return total - AVG_OVERHEAD; + return (total - AVG_OVERHEAD) / CPU_CLOCK_RATE_MHZ; } rtems_status_code Empty_function( void ) @@ -91,3 +95,6 @@ void Set_find_average_overhead( { Timer_driver_Find_average_overhead = find_flag; } + + +/* eof */ -- cgit v1.2.3