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

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [rtos/] [ecos-2.0/] [packages/] [hal/] [m68k/] [arch/] [v2_0/] [src/] [hal_startup.c] - Rev 174

Compare with Previous | Blame | View Log

//==========================================================================
//####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####
//==========================================================================
 
#include <pkgconf/hal.h>
#include <cyg/hal/hal_startup.h>
#include <cyg/hal/hal_memmap.h>
#include <cyg/hal/hal_intr.h>
#include <cyg/hal/hal_diag.h>           // hal_diag_init
#include <cyg/infra/diag.h>             // diag_printf
#include <string.h>                     // memcpy, memset
 
externC void cyg_start(void);
externC void hw_vsr_reset(void);
 
#define CYG_HAL_RESET_DEBUG_ENABLE
#ifdef CYG_HAL_RESET_DEBUG_ENABLE
#define CYG_HAL_RESET_DEBUG diag_printf
#else
#define CYG_HAL_RESET_DEBUG()
#endif // CYG_HAL_RESET_DEBUG_ENABLE
 
/*****************************************************************************
hal_vsr_init -- Initialize the vector table
 
INPUT:
 
OUTPUT:
 
RETURN VALUE:
 
     None
 
*****************************************************************************/
static void hal_vsr_init(void)
{
 
    /*   Initialize the HAL's vector table with the ROM vector table.       */
 
    memcpy((void*)cyg_hal_vsr_table, __romvec_start,
                (size_t)sizeof(cyg_hal_vsr_table));
 
}
 
/*****************************************************************************
hal_vsr_init -- Initialize the ISRs
 
INPUT:
 
OUTPUT:
 
RETURN VALUE:
 
     None
 
*****************************************************************************/
static void hal_isr_init(void)
{
    int_t i;
 
    //   Initialize all ISR entries to default.
 
    for (i = 0; i < CYGNUM_HAL_ISR_COUNT; i++)
    {
        cyg_hal_interrupt_handlers[i] = (CYG_ADDRESS) &hal_default_isr;
        cyg_hal_interrupt_data[i] = (CYG_ADDRWORD)0;
        cyg_hal_interrupt_objects[i] = (CYG_ADDRESS)0;
    }
}
 
/*****************************************************************************
hal_init_ram_sections -- Initialize the RAM sections
 
     Initialize all RAM sections that  the C  code relies  on.  data,  bss,
sbss.
 
INPUT:
 
OUTPUT:
 
RETURN VALUE:
 
     None
 
*****************************************************************************/
static void hal_init_ram_sections(void)
{
 
    //   Initialize the RAM data section  from  the  ROM  image  of  the  data
    // section.
 
    memcpy(__ram_data_start, __rom_data_start, (size_t)__ram_data_size);
 
    //   Initialize the bss and sbss sections to zero.
 
    memset(__bss_start, 0, (size_t)__bss_size);
    memset(__sbss_start, 0, (size_t)__sbss_size);
}
 
/*****************************************************************************
cyg_hal_invoke_constructors -- Call static constructors
 
INPUT:
 
OUTPUT:
 
RETURN VALUE:
 
     None
 
*****************************************************************************/
#ifdef CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG
cyg_bool cyg_hal_stop_constructors;
#endif
 
typedef void (*pfunc) (void);
extern pfunc __CTOR_LIST__[];
extern pfunc __CTOR_END__[];
 
static void cyg_hal_invoke_constructors(void)
{
#ifdef CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG
    static pfunc *p = &__CTOR_END__[-1];
 
    cyg_hal_stop_constructors = 0;
    for (; p >= __CTOR_LIST__; p--) {
        (*p) ();
        if (cyg_hal_stop_constructors) {
            p--;
            break;
        }
    }
#else
    pfunc *p;
 
    for (p = &__CTOR_END__[-1]; p >= __CTOR_LIST__; p--)
        (*p) ();
#endif
}
 
/*****************************************************************************
hal_reset -- Reset vector routine
 
     This routine must be  called with interrupts  disabled and will  never
return.
 
     Only the assembly reset vector routine should call this routine.
 
INPUT:
 
OUTPUT:
 
RETURN VALUE:
 
     None
 
*****************************************************************************/
void hal_reset(void) CYGBLD_ATTRIB_NORET;
void hal_reset(void)
{
    const char * fname;
 
    fname = __FUNCTION__;
 
    //   Initialize the RAM sections that the rest of the C code requires.
 
    hal_init_ram_sections();
 
    //   It is now safe  to call  C functions  which may  rely on  initialized
    // data.
 
    //   Initialize the ISR and VSR tables.
 
    hal_isr_init();
    hal_vsr_init();
 
    //   Do any variant-specific reset initialization.
 
    var_reset();
 
    //   Initialize the diagnostics IO.
 
    HAL_DIAG_INIT();
    CYG_HAL_RESET_DEBUG("%s: RESET\r\n", fname);
 
    //   Call C++ constructors.
 
    CYG_HAL_RESET_DEBUG("%s: calling cyg_hal_invoke_constructors\r\n", fname);
    cyg_hal_invoke_constructors();
 
    //   It should be safe to enable interrupts now.
 
    CYG_HAL_RESET_DEBUG("%s: lowering interrupt mask\r\n", fname);
    HAL_ENABLE_INTERRUPTS();
 
    //   Call cyg_start.  This routine should not return.
 
    CYG_HAL_RESET_DEBUG("%s: calling cyg_start\r\n", fname);
    cyg_start();
 
    //   If we return, loop and print out a message.
 
    HAL_DIAG_INIT();
    for (;;)
    {
        CYG_HAL_RESET_DEBUG("%s: cyg_start returned!\r\n", fname);
    }
}
 
/*****************************************************************************
hal_hw_reset -- Simulate a hardware reset
 
     This routine will never return.
 
INPUT:
 
OUTPUT:
 
RETURN VALUE:
 
     None
 
*****************************************************************************/
void hal_hw_reset(void)
{
 
    //   Give control to the reset vector handler.
 
    hw_vsr_reset();
}
 
 

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.