diff packages/hal/mips/jmr3904/current/src/plf_misc.c @ 6:d376b777e2ce ecos-sw-1999-05-14

Merge from eCos master repository on 1999-05-14-19:27:43-BST
author jlarmour
date Fri, 14 May 1999 12:20:00 +0000
parents
children d3fbcdfa1b2f
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/packages/hal/mips/jmr3904/current/src/plf_misc.c
@@ -0,0 +1,217 @@
+//==========================================================================
+//
+//      plf_misc.c
+//
+//      HAL platform miscellaneous functions
+//
+//==========================================================================
+//####COPYRIGHTBEGIN####
+//
+// -------------------------------------------
+// The contents of this file are subject to the Cygnus eCos Public License
+// Version 1.0 (the "License"); you may not use this file except in
+// compliance with the License.  You may obtain a copy of the License at
+// http://sourceware.cygnus.com/ecos
+// 
+// Software distributed under the License is distributed on an "AS IS"
+// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the
+// License for the specific language governing rights and limitations under
+// the License.
+// 
+// The Original Code is eCos - Embedded Cygnus Operating System, released
+// September 30, 1998.
+// 
+// The Initial Developer of the Original Code is Cygnus.  Portions created
+// by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions.  All Rights Reserved.
+// -------------------------------------------
+//
+//####COPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    nickg
+// Contributors: nickg, jlarmour
+// Date:         1999-01-21
+// Purpose:      HAL miscellaneous functions
+// Description:  This file contains miscellaneous functions provided by the
+//               HAL.
+//
+//####DESCRIPTIONEND####
+//
+//========================================================================*/
+
+#include <pkgconf/hal.h>
+
+#include <cyg/infra/cyg_type.h>         // Base types
+#include <cyg/infra/cyg_trac.h>         // tracing macros
+#include <cyg/infra/cyg_ass.h>          // assertion macros
+
+#include <cyg/hal/hal_arch.h>           // architectural definitions
+
+#include <cyg/hal/hal_intr.h>           // Interrupt handling
+
+#include <cyg/hal/hal_cache.h>          // Cache handling
+
+/*------------------------------------------------------------------------*/
+
+extern void patch_dbg_syscalls(void * vector);
+
+/*------------------------------------------------------------------------*/
+
+void hal_platform_init(void)
+{
+    // On the real hardware we also enable the cache.
+    // doing this here is a temporary measure until we
+    // have a proper platform specific place to do it.
+    
+#if !defined(CYGHWR_HAL_TX39_JMR3904_ENABLE_TOE)
+
+    HAL_ICACHE_INVALIDATE_ALL();    
+    HAL_ICACHE_ENABLE();
+    HAL_DCACHE_INVALIDATE_ALL();
+    HAL_DCACHE_ENABLE();
+
+    HAL_TX39_DEBUG_TOE_DISABLE();
+
+#else
+
+    // If TOE is enabled, caches are disabled by default
+    // until spurious Bus Timeout problem is fixed.
+
+    HAL_ICACHE_INVALIDATE_ALL();    
+    HAL_ICACHE_DISABLE();
+    HAL_DCACHE_INVALIDATE_ALL();
+    HAL_DCACHE_DISABLE();
+
+    HAL_TX39_DEBUG_TOE_ENABLE();
+
+#endif
+
+#if 0
+#if defined(CYG_HAL_USE_ROM_MONITOR)            && \
+    !defined(CYGDBG_INFRA_DIAG_USE_DEVICE)      && \
+        defined(CYG_HAL_TX39_JMR3904)
+
+        {
+            static void hal_init_ctrlc_intr(void);
+            hal_init_ctrlc_intr();
+        }
+
+#endif
+#endif
+        
+#if defined(CYGFUN_HAL_COMMON_KERNEL_SUPPORT)   && \
+    defined(CYG_HAL_USE_ROM_MONITOR)            && \
+    defined(CYG_HAL_USE_ROM_MONITOR_CYGMON)
+    {
+        patch_dbg_syscalls( (void *)(&hal_vsr_table[0]) );
+    }
+#endif
+    
+}
+
+/*------------------------------------------------------------------------*/
+/* Functions to support the detection and execution of a user provoked    */
+/* program break. These are usually called from interrupt routines.       */
+
+cyg_bool cyg_hal_is_break(char *buf, int size)
+{
+    while( size )
+        if( buf[--size] == 0x03 ) return true;
+
+    return false;
+}
+
+void cyg_hal_user_break( CYG_ADDRWORD *regs )
+{
+#if defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS)
+
+    // Ctrl-C: breakpoint.
+    extern void breakpoint(void);
+    breakpoint();
+
+#elif defined(CYG_HAL_USE_ROM_MONITOR) && defined(CYG_HAL_USE_ROM_MONITOR_GDB_STUBS)
+
+    // Ctrl-C: breakpoint.
+    typedef void bpt_fn(void);
+    bpt_fn *bfn = ((bpt_fn **)0x80000100)[61];
+    bfn();
+
+#elif defined(CYG_HAL_USE_ROM_MONITOR) && defined(CYG_HAL_USE_ROM_MONITOR_CYGMON)
+
+    // Ctrl-C: breakpoint.
+    typedef void install_bpt_fn(void *epc);
+    HAL_SavedRegisters *sreg = (HAL_SavedRegisters *)regs;
+    install_bpt_fn *ibp = (install_bpt_fn *)hal_vsr_table[35];
+    if( ibp != NULL ) ibp((void *)sreg->pc);
+
+#endif
+
+}
+
+/*------------------------------------------------------------------------*/
+/* This code installs an interrupt handler to capture Ctrl-C.             */
+
+#if 0
+#if defined(CYG_HAL_USE_ROM_MONITOR) && \
+    !defined(CYGDBG_INFRA_DIAG_USE_DEVICE)    && \
+    defined(CYG_HAL_TX39_JMR3904)
+
+#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
+    
+static cyg_uint32 hal_ctrlc_isr(CYG_ADDRWORD vector, CYG_ADDRWORD data, CYG_ADDRWORD regs)
+{
+    char c;
+    CYG_WORD16 disr;
+    
+    HAL_READ_UINT16( DIAG_SLDISR , disr );
+
+    if( disr & 0x0001 )
+    {
+
+        disr = disr & ~0x0001;
+    
+        HAL_READ_UINT8( DIAG_RFIFO, c );
+    
+        HAL_WRITE_UINT16( DIAG_SLDISR , disr );
+        
+        if( cyg_hal_is_break( &c , 1 ) )
+            cyg_hal_user_break( regs );
+    }
+
+    return 0;
+}
+
+    
+static void hal_init_ctrlc_intr(void)
+{
+    CYG_WORD16 dicr;
+    
+    HAL_INTERRUPT_ATTACH( CYGNUM_HAL_INTERRUPT_SIO_0, hal_ctrlc_isr, NULL,
+                          NULL );
+
+    HAL_INTERRUPT_UNMASK( CYGNUM_HAL_INTERRUPT_SIO_0 );
+
+    HAL_READ_UINT16( DIAG_SLDICR , dicr );
+    dicr = 0x0001;
+    HAL_WRITE_UINT16( DIAG_SLDICR , dicr );    
+}
+
+#endif
+#endif
+
+/*------------------------------------------------------------------------*/
+/* End of plf_misc.c                                                      */