summaryrefslogtreecommitdiffstats
path: root/c/src/lib
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2001-05-22 23:07:09 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2001-05-22 23:07:09 +0000
commita355e3ea982d7bb8a8cb5a67f810c66cbfc78330 (patch)
treec6400f1b326f859d8bc027ce12e8a5bb78c953cc /c/src/lib
parent2001-05-22 Greg Menke <gregory.menke@gsfc.nasa.gov> (diff)
downloadrtems-a355e3ea982d7bb8a8cb5a67f810c66cbfc78330.tar.bz2
2001-05-22 Greg Menke <gregory.menke@gsfc.nasa.gov>
* Assisted in design and debug by Joel Sherrill <joel@OARcorp.com>. * 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.
Diffstat (limited to 'c/src/lib')
-rw-r--r--c/src/lib/libbsp/mips/genmongoosev/ChangeLog9
-rw-r--r--c/src/lib/libbsp/mips/genmongoosev/clock/clockdrv.c30
-rw-r--r--c/src/lib/libbsp/mips/genmongoosev/console/conscfg.c8
-rw-r--r--c/src/lib/libbsp/mips/genmongoosev/include/bsp.h48
-rw-r--r--c/src/lib/libbsp/mips/genmongoosev/startup/bspstart.c74
-rw-r--r--c/src/lib/libbsp/mips/genmongoosev/timer/timer.c37
6 files changed, 142 insertions, 64 deletions
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 <gregory.menke@gsfc.nasa.gov>
+
+ * Assisted in design and debug by Joel Sherrill <joel@OARcorp.com>.
+ * 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 <corsepiu@faw.uni-ulm.de>
* 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 <libchip/serial.h>
#include <libchip/mg5uart.h>
-#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 <clockdrv.h>
#include <libcpu/mongoose-v.h>
+
+#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 <rtems/libcsupport.h>
#include <libcpu/mongoose-v.h>
+
+
/*
* 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 <bspIo.h>
@@ -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 */