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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [ecos-2.0/] [packages/] [hal/] [mn10300/] [am33/] [v2_0/] [include/] [variant.inc] - Rev 174

Compare with Previous | Blame | View Log

#ifndef CYGONCE_HAL_VARIANT_INC
#define CYGONCE_HAL_VARIANT_INC
##=============================================================================
##
##      variant.inc
##
##      AM33 assembler header file
##
##=============================================================================
#####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, dmoseley
## Date:        1999-04-06
## Purpose:     AM33 definitions.
## Description: This file contains various definitions and macros that are
##              useful for writing assembly code for the AM33 CPU variant.
## Usage:
##              #include <cyg/hal/variant.inc>
##              ...
##              
##
######DESCRIPTIONEND####
##
##=============================================================================

#include <pkgconf/hal.h>

        .am33           # Enable AM33 instruction set

#include <cyg/hal/platform.inc>

#include CYGHWR_MEMORY_LAYOUT_H

#------------------------------------------------------------------------------
# Register definitions

#define NMICR   0xD4000000      // NMI control register
#define DCR     0xC0000030      // Debug control register
#define ISR     0xC0000034      // Interrupt control register
#define TBR     0xC0000024      // Trap Base Register
#define CHCTR   0xC0000070      // Cache Control Register

#define DCR_DE  0x0001          // DE bit in DCR

##-----------------------------------------------------------------------------
## Register addresses and initialization values

#define SDRAMCONFIG             0xDA000000

#define INIT_SDRAMCONFIG        0x0000002f

#define SC0ICR                  0xD4002004
#define SC1ICR                  0xD4002014
#define SC2ICR                  0xD4002024
#define TM0MD                   0xD4003000
#define TM1MD                   0xD4003001
#define TM2MD                   0xD4003002
#define TM3MD                   0xD4003003
#define TM4MD                   0xD4003080
#define TM5MD                   0xD4003082
#define TM6MD                   0xD4003084
#define TM7MD                   0xD4003086
#define TM8MD                   0xD4003088
#define TM9MD                   0xD400308A
#define TM10MD                  0xD400308C
#define TM11MD                  0xD400308E
#define DM0CTR                  0xD2000000
#define DM1CTR                  0xD2000100
#define DM2CTR                  0xD2000200
#define DM3CTR                  0xD2000300
#define WDCTR                   0xC0001002
#define RTCRB                   0xD860000B
        
#------------------------------------------------------------------------------
# AM33 specific CPU initialization:

        # Initialize CPU
        .macro  hal_cpu_init
        # Set up the PSW
#if CYGHWR_HAL_MN10300_AM33_REVISION == 2
        mov     0x00100700,d0           # Enable the FPU
#else
        mov     0x00000700,d0
#endif
        mov     d0,epsw
#ifndef CYGSEM_HAL_USE_ROM_MONITOR
// Don't change TBR for RAM startup if RAM base is not aligned for TBR.
// In that case, the only option is to rely on ROM startup TBR and patch
// into vectors through the hal_vsr_table.
//
#if !(defined(CYG_HAL_STARTUP_RAM) && (CYGMEM_REGION_ram & 0xffffff))
        mov     reset_vector,a0         # set TBR to vector table
        mov     a0,(TBR)
#endif
#endif

        # stop as many internal interrupt sources as possible
        mov     0,d0
        movhu   d0,(SC0ICR)
        movhu   d0,(SC1ICR)
        movhu   d0,(SC2ICR)
        movbu   d0,(TM0MD)
        movbu   d0,(TM1MD)
        movbu   d0,(TM2MD)
        movbu   d0,(TM3MD)
        movbu   d0,(TM4MD)
        movbu   d0,(TM5MD)
        movhu   d0,(TM6MD)
        movbu   d0,(TM7MD)
        movbu   d0,(TM8MD)
        movbu   d0,(TM9MD)
        movbu   d0,(TM10MD)
        movbu   d0,(TM11MD)
        movhu   d0,(WDCTR)

        movbu   (RTCRB),d0
        and     0x8F,d0
        movbu   d0,(RTCRB)

        mov     0x80000000,d0
        mov     d0,(DM0CTR)
        mov     d0,(DM1CTR)
        mov     d0,(DM2CTR)
        mov     d0,(DM3CTR)
        
        # disable all interrupts
        mov     _mn10300_interrupt_control,a0
        mov     _mn10300_interrupt_control+(41*4),a1
        mov     0x0010,d0
1:      movhu   d0,(a0)
        add     4,a0
        cmp     a0,a1
        bcc     1b
        .endm

#define CYGPKG_HAL_MN10300_CPU_INIT_DEFINED

#------------------------------------------------------------------------------
# CPU state save and restore macros

        .macro  hal_cpu_save_all
        movm    [all],(sp)                              # push all registers
        .endm

        .macro  hal_cpu_load_all
        movm    (sp),[all]                              # pop regs
        .endm

        .macro  hal_cpu_get_psw reg
        mov     epsw,\reg
        .endm

        .macro  hal_cpu_set_psw reg
        mov     \reg,epsw
        .endm

# Location of PC in saved context (HAL_SavedRegisters)
#define SAVED_CONTEXT_PC_OFFSET          104

#-----------------------------------------------------------------------------
# Clear the NMID bit in the epsw to allow NMIs to be delivered again.

        .macro  hal_cpu_clear_nmid
        and     0xFFFDFFFF,epsw                 # clear NMID bit
        .endm


#------------------------------------------------------------------------------
# MEMC macros.
        
#ifndef CYGPKG_HAL_MN10300_MEMC_DEFINED

        .macro  hal_memc_init
        mov     INIT_SDRAMCONFIG,d0
        mov     d0,(SDRAMCONFIG)
        .endm

#define CYGPKG_HAL_MN10300_MEMC_DEFINED

#endif  
        
#------------------------------------------------------------------------------
# Cache macros.
        
#ifndef CYGPKG_HAL_MN10300_CACHE_DEFINED

        .macro  hal_cache_init

#if defined(CYG_HAL_STARTUP_ROM)
    # Note that the hardware seems to come up with the
    # caches containing random data. Hence they must be
    # invalidated before being enabled.
    # However, we only do this if we are in ROM. If we are
    # in RAM, then we leave the caches in the state chosen
    # by the ROM monitor. If we enable them when the monitor
    # is not expecting it, we can end up breaking things if the
    # monitor is not doing cache flushes.
        mov     CHCTR,a0
        mov     0x0030,d0
        mov     d0,(a0)                         # Invalidate the ICACHE and DCACHE
        mov     0x0003,d0
        mov     d0,(a0)                         # Enable both caches
#else
        nop
#endif
        .endm

#define CYGPKG_HAL_MN10300_CACHE_DEFINED

#endif  

##-----------------------------------------------------------------------------
# Default interrupt decoding macros.

#ifndef CYGPKG_HAL_MN10300_INTC_DEFINED


        
        # initialize all interrupts to disabled
        .macro  hal_intc_init
        .endm

#define CYGPKG_HAL_MN10300_INTC_DEFINED

#endif

#ifndef CYGPKG_HAL_MN10300_INTC_DECODE_DEFINED

#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN

#define CYG_ISR_TABLE_SIZE      10

        .macro  hal_intc_decode dreg,areg,dreg1
        mov     _mn10300_interrupt_control,\areg
        movhu   (0x100,\areg),\dreg1            # dreg1 = IAGR
        mov     (0,a2),\dreg                    # dreg = vector priority
        mov     \dreg1,(0,a2)                   # store real vector in saved state
        asl     2,\dreg                         # dreg = byte index of isr
        add     12,\dreg                        # skip NMI vectors
        .endm

#else

#define CYG_ISR_TABLE_SIZE       57

        # decode the interrupt
        .macro  hal_intc_decode dreg,areg,dreg1
        mov     _mn10300_interrupt_control,\areg
        movhu   (0x100,\areg),\dreg             # dreg = IAGR
        mov     \dreg,(0,a2)                    # store real vector in saved state
        add     12,\dreg                        # skip NMI vectors
        .endm
                
#endif

#define CYGPKG_HAL_MN10300_INTC_DECODE_DEFINED

#endif


#------------------------------------------------------------------------------
# Diagnostics macros.
        
#ifndef CYGPKG_HAL_MN10300_DIAG_DEFINED

        .macro  hal_diag_init
        .endm

        .macro  hal_diag_excpt_start
        .endm

        .macro  hal_diag_intr_start
        .endm

        .macro  hal_diag_restore
        .endm

        .macro  hal_diag_led val
        movm    [d2,a2],(sp)
        mov     \val,d2
        movm    (sp),[d2,a2]
        .endm


#define CYGPKG_HAL_MN10300_DIAG_DEFINED

#endif  

#------------------------------------------------------------------------------
# Monitor initialization.
        
#ifndef CYGPKG_HAL_MN10300_MON_DEFINED

        .macro  hal_mon_init
        hal_mon_init_vectors
        hal_mon_init_vsr
        .endm

#if defined(CYG_HAL_STARTUP_ROM) || !defined(CYGSEM_HAL_USE_ROM_MONITOR)
        .macro  hal_mon_init_vectors
        # direct external interrupts
        mov     _mn10300_interrupt_vectors,a0
        mov     __hardware_vector_0,d0
        movhu   d0,(0,a0)
        mov     __hardware_vector_1,d0
        movhu   d0,(4,a0)
        mov     __hardware_vector_2,d0
        movhu   d0,(8,a0)
        mov     __hardware_vector_3,d0
        movhu   d0,(12,a0)
        mov     __hardware_vector_4,d0
        movhu   d0,(16,a0)
        mov     __hardware_vector_5,d0
        movhu   d0,(20,a0)
        mov     __hardware_vector_6,d0
        movhu   d0,(24,a0)
        .endm
#else
        .macro  hal_mon_init_vectors
        .endm
#endif

        .extern nmi_vsr_trampoline
        .extern nmi_sysef_trampoline

        # init vsr table in SRAM where the ROM
        # vectors the interrupts.

#if defined(CYG_HAL_STARTUP_ROM)
        .macro  hal_mon_init_vsr
        mov     _hal_vsr_table,a0
        mov     __default_interrupt_vsr,d0
        mov     d0,(0,a0)       
        mov     d0,(4,a0)
        mov     d0,(8,a0)
        mov     d0,(12,a0)      
        mov     d0,(16,a0)      
        mov     d0,(20,a0)      
        mov     d0,(24,a0)
        mov     nmi_vsr_trampoline,d0
        mov     d0,(28,a0)
        mov     __default_trap_vsr,d0
        mov     d0,(32,a0)
        mov     nmi_sysef_trampoline,d0
        mov     d0,(44,a0)
        mov     __default_nmi_vsr,d0
        mov     d0,(36,a0)
        mov     d0,(40,a0)
        mov     d0,(48,a0)
        mov     d0,(52,a0)
        mov     d0,(56,a0)
        mov     d0,(60,a0)
        mov     d0,(64,a0)
        mov     d0,(68,a0)
        mov     d0,(72,a0)
        mov     d0,(76,a0)
        mov     d0,(80,a0)
        mov     d0,(84,a0)
        mov     d0,(88,a0)
        mov     d0,(92,a0)
        mov     d0,(96,a0)
        mov     d0,(100,a0)
        mov     d0,(104,a0)
        mov     d0,(108,a0)
        .endm
#elif defined(CYG_HAL_STARTUP_RAM)
        .macro  hal_mon_init_vsr
        mov     _hal_vsr_table,a0
        mov     __default_interrupt_vsr,d0
        mov     d0,(0,a0)       
        mov     d0,(4,a0)
        mov     d0,(8,a0)
        mov     d0,(12,a0)      
        mov     d0,(16,a0)      
        mov     d0,(20,a0)      
        mov     d0,(24,a0)
#if !(defined(CYGSEM_HAL_USE_ROM_MONITOR_GDB_stubs))
        mov     nmi_vsr_trampoline,d0
        mov     d0,(28,a0)
        mov     nmi_sysef_trampoline,d0
        mov     d0,(44,a0)
#endif
        mov     __default_trap_vsr,d0
        mov     d0,(32,a0)
        mov     __default_nmi_vsr,d0
        mov     d0,(36,a0)
        mov     d0,(40,a0)
        mov     d0,(48,a0)
        mov     d0,(52,a0)
        mov     d0,(56,a0)
        mov     d0,(60,a0)
#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
        mov     d0,(64,a0)      # breakpoint VSR only if stubs included
#endif
        mov     d0,(68,a0)
        mov     d0,(72,a0)
        mov     d0,(76,a0)
        mov     d0,(80,a0)
        mov     d0,(84,a0)
        mov     d0,(88,a0)
        mov     d0,(92,a0)
        mov     d0,(96,a0)
        mov     d0,(100,a0)
        mov     d0,(104,a0)
        mov     d0,(108,a0)
        .endm
#else
        .macro  hal_mon_init_vsr
        .endif
#endif

#define CYGPKG_HAL_MN10300_MON_DEFINED

#define CYG_HAL_MN10300_VSR_TABLE_DEFINED

#endif  



#------------------------------------------------------------------------------
#endif // ifndef CYGONCE_HAL_VARIANT_INC
# end of variant.inc

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.