diff packages/hal/mips/jmr3904/current/src/hal_stub.c @ 0:3111d98ba7b3 ecos-v1_1-release

Initial commit of eCos version 1.1
author jlarmour
date Tue, 11 May 1999 11:16:07 +0000
parents
children
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/packages/hal/mips/jmr3904/current/src/hal_stub.c
@@ -0,0 +1,258 @@
+/* hal-stub.c - helper functions for stub, specific to ECC HAL
+ * 
+ * Copyright (c) 1998 Cygnus Support
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+
+#include <stddef.h>
+
+//#include <signal.h>
+//#include "board.h"
+
+#include <cyg/hal/hal_stub.h>
+
+#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+
+#include <cyg/hal/hal_arch.h>
+#include <cyg/hal/hal_io.h>
+#include <cyg/hal/hal_diag.h>
+#include <cyg/hal/hal_cache.h>
+
+/*---------------------------------------------------------------------------*/
+
+#define DIAG_BASE       0xfffff300
+#define DIAG_SLCR       (DIAG_BASE+0x00)
+#define DIAG_SLSR       (DIAG_BASE+0x04)
+#define DIAG_SLDICR     (DIAG_BASE+0x08)
+#define DIAG_SLDISR     (DIAG_BASE+0x0C)
+#define DIAG_SFCR       (DIAG_BASE+0x10)
+#define DIAG_SBRG       (DIAG_BASE+0x14)
+#define DIAG_TFIFO      (DIAG_BASE+0x20)
+#define DIAG_RFIFO      (DIAG_BASE+0x30)
+
+#define BRG_T0          0x0000
+#define BRG_T2          0x0100
+#define BRG_T4          0x0200
+#define BRG_T5          0x0300
+
+/*---------------------------------------------------------------------------*/
+
+/* External data */
+
+extern int output_debug;			/* dvemon.c */
+extern int (*read_vector) (int, char *, int); 	/* read.c */
+extern int (*write_vector) (int, char *, int); 	/* write.c */
+
+/* External functions */
+
+//int outbyte (unsigned char byte);	/* dvemon.c */
+//unsigned char inbyte ();		/* dvemon.c */
+//void general_exception (void);		/* tx39-exc.S */
+
+
+/* Local data */
+
+
+/* If ENABLED is non-zero, supply a memory fault handler that traps
+   subsequent memory errors and sets _mem_err to 1. Otherwise, memory
+   faults are processed as exceptions. */
+
+void __set_mem_fault_trap (int enable) {}
+
+static int serial_initialized = 0;
+
+static void serial_init()
+{
+//hal_diag_led(0x10);    
+    HAL_WRITE_UINT16( DIAG_SLCR , 0x0020 );
+
+    HAL_WRITE_UINT16( DIAG_SLDICR , 0x0000 );
+    
+    HAL_WRITE_UINT16( DIAG_SFCR , 0x0000 );
+    
+//    HAL_WRITE_UINT16( DIAG_SBRG , BRG_T2 | 20 );
+//    HAL_WRITE_UINT16( DIAG_SBRG , BRG_T2 | 10 );
+    HAL_WRITE_UINT16( DIAG_SBRG , BRG_T2 | 5 );    
+
+    serial_initialized = 1;
+    
+//hal_diag_led(0x10);
+}
+
+/* Write C to the current serial port. */
+
+void putDebugChar (int c)
+{
+#ifdef CYG_HAL_MIPS_SIM
+
+#else    
+    CYG_WORD16 disr;
+    
+//hal_diag_led(0x20);
+
+    if( !serial_initialized ) serial_init();
+    
+    for(;;)
+    {
+        HAL_READ_UINT16( DIAG_SLDISR , disr );
+
+        if( disr & 0x0002 ) break;
+    }
+
+    disr = disr & ~0x0002;
+    
+    HAL_WRITE_UINT8( DIAG_TFIFO, c );
+
+    HAL_WRITE_UINT16( DIAG_SLDISR , disr );    
+
+//hal_diag_led(0x20);
+//    HAL_DIAG_WRITE_CHAR( c );
+#endif    
+}
+
+/* Read one character from the current serial port. */
+
+int getDebugChar (void)
+{
+#ifdef CYG_HAL_MIPS_SIM
+    static char input[] = "+$s#73";
+    static int i = 0;
+    return input[i++];
+#else
+    char c;
+
+    CYG_WORD16 disr;
+
+    if( !serial_initialized ) serial_init();
+    
+//hal_diag_led(0x40);        
+    for(;;)
+    {
+        
+        HAL_READ_UINT16( DIAG_SLDISR , disr );
+
+        if( disr & 0x0001 ) break;
+    }
+
+    disr = disr & ~0x0001;
+    
+    HAL_READ_UINT8( DIAG_RFIFO, c );
+    
+    HAL_WRITE_UINT16( DIAG_SLDISR , disr );    
+
+//hal_diag_led(0x40);
+    
+//    HAL_DIAG_READ_CHAR(c);
+//    diag_printf("<%02x:%c>",c);
+
+    return c;
+    
+#endif    
+}
+
+
+/* Install the standard set of trap handlers for the stub. */
+
+void __install_traps (void)
+{
+    // Nothing to do, the HAL will call handle_exception when one occurs.
+}
+
+/* Flush the instruction cache. */
+void flush_i_cache (void) { HAL_ICACHE_INVALIDATE_ALL(); }
+
+
+/* Reset the board. */
+void __reset (void) {}
+
+
+/* Set the baud rate for the current serial port. */
+void __set_baud_rate (int baud) {}
+
+
+/* Initialize the hardware. */
+void initHardware (void) {}
+
+#if 0
+/* Alternate read function for use when stub is running.  It
+   reads the data for standard input from the remote GDB.  */
+
+int dve_read (int fd, char *buf, int nbytes)
+{
+  __get_gdb_input (buf, nbytes, 1);
+}
+
+/* Alternate write function for use when stub is running.  It
+   writes the data for standard output to the remote GDB.  */
+
+int dve_write (int fd, char *buf, int nbytes)
+{
+  __output_gdb_string (buf, nbytes);
+}
+
+#endif
+
+/* Install traps and otherwise initialize stub. */
+
+void set_debug_traps (void)
+{
+//  output_debug = 0;	/* disable control-O prefixing on output */
+  initialize_stub ();	/* will call __install_traps and initHardware */
+//  read_vector = dve_read;	/* alternate read() function for stub */
+//  write_vector = dve_write;	/* alternate write() function for stub */
+}
+
+
+/* This function will generate a breakpoint exception.  It is used at the
+   beginning of a program to sync up with a debugger and can be used
+   otherwise as a quick means to stop program execution and "break" into
+   the debugger. */
+
+void
+breakpoint()
+{
+#ifdef CYG_HAL_MIPS_SIM
+
+        // This code causes a fake breakpoint.
+        asm volatile (
+            "lui    $24,0x0000;"
+            "ori    $24,0x0024;"
+            "mtc0   $24,$13;"
+            "lui    $25,%%hi(1f);"
+            "ori    $25,$25,%%lo(1f);"
+            "j      other_vector;"
+            "nop;"
+            ".global _breakinst;"
+            "_breakinst:"
+            "1: nop;"
+            :
+            :
+            : "t8", "t9"
+            );    
+    
+#else
+        
+    HAL_BREAKPOINT(_breakinst);
+
+#endif
+  
+}
+
+
+/* This function returns the opcode for a 'break 5' instruction.  */
+
+unsigned long __break_opcode ()
+{
+  return HAL_BREAKINST;
+}
+
+#endif // CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS