OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [rtos/] [ecos-2.0/] [packages/] [hal/] [i386/] [pc/] [v2_0/] [src/] [plf_misc.c] - Rev 249

Go to most recent revision | Compare with Previous | Blame | View Log

//==========================================================================
//
//      plf_misc.c
//
//      HAL platform miscellaneous functions
//
//==========================================================================
//####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later version.
//
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with eCos; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
//
// As a special exception, if other files instantiate templates or use macros
// or inline functions from this file, or you compile this file and link it
// with other works to produce a work based on this file, this file does not
// by itself cause the resulting work to be covered by the GNU General Public
// License. However the source code for this file must still be made available
// in accordance with section (3) of the GNU General Public License.
//
// This exception does not invalidate any other reasons why a work based on
// this file might be covered by the GNU General Public License.
//
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
// at http://sources.redhat.com/ecos/ecos-license/
// -------------------------------------------
//####ECOSGPLCOPYRIGHTEND####
//==========================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s):    nickg
// Contributors: nickg, jlarmour, pjo
// 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
 
#include <cyg/hal/plf_misc.h>
 
#include <cyg/hal/hal_io.h>
 
#ifdef  CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT
#include <cyg/hal/hal_if.h>
#endif
 
#ifdef CYGPKG_KERNEL
#include <pkgconf/kernel.h>
#include <cyg/kernel/ktypes.h>
#include <cyg/kernel/kapi.h>
#endif /* CYGPKG_KERNEL */
 
/*------------------------------------------------------------------------*/
 
extern void patch_dbg_syscalls(void * vector);
 
extern void hal_pcmb_init(void);
 
#ifdef CYGPKG_HAL_SMP_SUPPORT
__externC void cyg_hal_smp_init(void);
#endif
 
//----------------------------------------------------------------------------
// ISR tables
 
volatile CYG_ADDRESS    hal_interrupt_handlers[CYGNUM_HAL_ISR_COUNT];
volatile CYG_ADDRWORD   hal_interrupt_data[CYGNUM_HAL_ISR_COUNT];
volatile CYG_ADDRESS    hal_interrupt_objects[CYGNUM_HAL_ISR_COUNT];
 
//-----------------------------------------------------------------------------
// IDT interrupt gate initialization
 
externC void cyg_hal_pc_set_idt_entry(CYG_ADDRESS routine,short *idtEntry)
{  
 
   idtEntry[0]=routine & 0xFFFF;
   idtEntry[1]=8;
   idtEntry[2]=0x8E00;
   idtEntry[3]=routine >> 16;
}
 
/*------------------------------------------------------------------------*/
 
void hal_platform_init(void)
{
    int vector;
 
    HAL_ICACHE_INVALIDATE_ALL();    
    HAL_ICACHE_ENABLE();
    HAL_DCACHE_INVALIDATE_ALL();
    HAL_DCACHE_ENABLE();
 
    // Call motherboard init function
    hal_pcmb_init();
 
    // ISR table setup: plant the default ISR in all interrupt handlers
    // and the default interrupt VSR in the equivalent VSR table slots.
    for (vector = CYGNUM_HAL_ISR_MIN; vector <= CYGNUM_HAL_ISR_MAX; vector++)        
    {
        cyg_uint32 index;
        HAL_TRANSLATE_VECTOR( vector, index );
        hal_interrupt_handlers[index] = (CYG_ADDRESS) HAL_DEFAULT_ISR;
        HAL_VSR_SET( vector, &__default_interrupt_vsr, NULL );
    }
 
#if !defined(CYG_HAL_STARTUP_RAM)
    for (vector = CYGNUM_HAL_EXCEPTION_MIN;
         vector <= CYGNUM_HAL_EXCEPTION_MAX;
         vector++)        
    {
#if defined(CYGHWR_HAL_I386_FPU_SWITCH_LAZY)
        // If we are doing lazy FPU switching, the FPU switch VSR has
        // already been installed, so avoid overwriting it.
        if( vector != CYGNUM_HAL_VECTOR_NO_DEVICE )
#endif
        {
            HAL_VSR_SET( vector, &__default_exception_vsr, NULL );
        }
    }
#endif
 
#ifdef CYGPKG_REDBOOT
 
    // Start the timer device running if we are in a RedBoot
    // configuration. 
 
    HAL_CLOCK_INITIALIZE( CYGNUM_HAL_RTC_PERIOD );
 
#endif    
 
    hal_if_init();
 
#if defined(CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT) || \
    defined(CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT)
    {
        void hal_ctrlc_isr_init(void);
        hal_ctrlc_isr_init();
    }
 
#endif
 
#ifdef CYGPKG_HAL_SMP_SUPPORT
 
    cyg_hal_smp_init();
 
#endif
 
}
 
/*------------------------------------------------------------------------*/
 
void hal_pc_reset(void)
{
    /* Use Intel's IDT triple-fault trick. */
    asm("movl $badIdt, %eax\n"
        "lidt (%eax)\n"
        "int $3\n"
        "hlt\n"
 
        ".align 4\n"
 
        "badIdt:\n"
        ".word		0\n"
        ".long		0\n"
        ) ;
}
 
/*------------------------------------------------------------------------*/
 
void 
hal_delay_us(int us)
{
    while( us > 0 )
    {
        cyg_uint32 us1 = us;
        cyg_int32 ticks;
        cyg_uint32 cval1, cval2;
 
        // Wait in bursts of 1s to avoid overflow problems with the
        // multiply by 1000 below.
 
        if( us1 > 1000000 )
            us1 = 1000000;
 
        us -= us1;
 
        // The PC clock ticks at 838ns per tick. So we convert the us
        // value we were given to clock ticks and wait for that many
        // to pass.
 
        ticks = (us1 * 1000UL) / 838UL;
 
        HAL_CLOCK_READ( &cval1 );
 
        // We just loop, waiting for clock ticks to happen,
        // and subtracting them from ticks when they do.
 
        while( ticks > 0 )
        {
            cyg_int32 diff;
            HAL_CLOCK_READ( &cval2 );
 
            diff = cval2 - cval1;
 
            // Cope with counter wrap-around.
            if( diff < 0 )
                diff += CYGNUM_HAL_RTC_PERIOD;
 
            ticks -= diff;
            cval1 = cval2;
 
        }
    }
}
 
 
/*------------------------------------------------------------------------*/
/* End of plf_misc.c                                                      */
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.