view packages/hal/powerpc/ec555/current/src/ec555.S @ 1616:126cd98e4832

* src/ec555.S: Corrected typo in initialisation of SYPCR to make sure watchdog no longer ticks when FREEZE is asserted. Changed initialisation of TBSCR to make sure timebase continues ticking when FREEZE is asserted. * src/ec555.S: Removed definition of memory segments. We do not need them afterall. * include/pkgconf/mlt_powerpc_ec555_f02_s01_ram.h: * include/pkgconf/mlt_powerpc_ec555_f02_s01_ram.ldi: * include/pkgconf/mlt_powerpc_ec555_f02_s01_rom.ldi: * include/pkgconf/mlt_powerpc_ec555_f04_s02_ram.h: * include/pkgconf/mlt_powerpc_ec555_f04_s02_ram.ldi: * include/pkgconf/mlt_powerpc_ec555_f04_s02_rom.ldi: * include/pkgconf/mlt_powerpc_ec555_f08_s04_ram.h: * include/pkgconf/mlt_powerpc_ec555_f08_s04_ram.ldi: * include/pkgconf/mlt_powerpc_ec555_f08_s04_rom.ldi: * include/pkgconf/mlt_powerpc_ec555_f08_s08_ram.h: * include/pkgconf/mlt_powerpc_ec555_f08_s08_ram.ldi: * include/pkgconf/mlt_powerpc_ec555_f08_s08_rom.ldi: Reserved a block of 64K at the beginning of external ram for use by RedBoot. Only really necessary if network support is wanted. * include/pkgconf/mlt_powerpc_ec555_ram.h: * include/pkgconf/mlt_powerpc_ec555_ram.ldi: * include/pkgconf/mlt_powerpc_ec555_rom.h: * include/pkgconf/mlt_powerpc_ec555_rom.ldi: Permanently removed * include/pkgconf/mlt_powerpc_ec555_f02_s01_ram.h: New file * include/pkgconf/mlt_powerpc_ec555_f04_s02_ram.h: New file * include/pkgconf/mlt_powerpc_ec555_f08_s04_ram.h: New file * include/pkgconf/mlt_powerpc_ec555_f08_s08_ram.h: New file * include/pkgconf/mlt_powerpc_ec555_f02_s01_ram.ldi: New file * include/pkgconf/mlt_powerpc_ec555_f04_s02_ram.ldi: New file * include/pkgconf/mlt_powerpc_ec555_f08_s04_ram.ldi: New file * include/pkgconf/mlt_powerpc_ec555_f08_s08_ram.ldi: New file * include/pkgconf/mlt_powerpc_ec555_f02_s01_rom.h: New file * include/pkgconf/mlt_powerpc_ec555_f04_s02_rom.h: New file * include/pkgconf/mlt_powerpc_ec555_f08_s04_rom.h: New file * include/pkgconf/mlt_powerpc_ec555_f08_s08_rom.h: New file * include/pkgconf/mlt_powerpc_ec555_f02_s01_rom.ldi: New file * include/pkgconf/mlt_powerpc_ec555_f04_s02_rom.ldi: New file * include/pkgconf/mlt_powerpc_ec555_f08_s04_rom.ldi: New file * include/pkgconf/mlt_powerpc_ec555_f08_s08_rom.ldi: New file * cdl/hal_powerpc_ec555.cdl, src/ec555.S, plf_misc.c: Added support for all four different variants of the ec555 board. Notice that we had to change the memory map. 16 MB flashes simply did not fit in the one we defined previously.
author jlarmour
date Thu, 29 Apr 2004 06:53:27 +0000
parents 9c818dd5d9fa
children
line wrap: on
line source

##=============================================================================
##
##      ec555.S
##
##      ec555 board hardware setup
##
##=============================================================================
#####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):   Bob Koninckx
## Contributors:Bob Koninckx
## Date:        2002-01-01
## Purpose:     ec555 board hardware setup
## Description: This file contains any code needed to initialize the
##              hardware on a ec555 mpc555 board.
##
######DESCRIPTIONEND####
##
##=============================================================================

#include <pkgconf/hal.h>
        
#include <cyg/hal/ppc_regs.h>
#include <cyg/hal/arch.inc>

#include <pkgconf/system.h>
#ifdef CYGPKG_DEVS_ETH_POWERPC_EC555
#include <pkgconf/devs_eth_powerpc_ec555.h>
#endif

## FIXME
## The following probably belongs in the variant hal rather than the board specifics ... 
#ifdef CYGPKG_DEVICES_WATCHDOG_MPC5xx
#include <pkgconf/devices_watchdog_mpc5xx.h>
#define CYG_SYPCR 0x0000ff8e | (CYGNUM_DEVICES_WATCHDOG_POWERPC_MPC5XX_RELOAD << 16) | CYGDAT_DEVICES_WATCHDOG_POWERPC_MPC5XX_PRESCALE
#else
#define CYG_SYPCR 0x0000ff88
#endif

#define ADDRESS_MASK_1MB         0xfff00000
#define ADDRESS_MASK_2MB         0xffe00000
#define ADDRESS_MASK_4MB         0xffc00000
#define ADDRESS_MASK_8MB         0xff800000
#define ADDRESS_MASK_16MB        0xff000000

#define EC555_RAM_BASE_ADDRESS   0x01000000
#define EC555_FLASH_BASE_ADDRESS 0x02000000
#define EC555_CS2_BASE_ADDRESS   0x04000000
#define EC555_CS3_BASE_ADDRESS   0x08000000

#if defined(CYGHWR_HAL_EC555_BOARD_VARIANT_F02_S01)
#define EC555_RAM_ADDRESS_MASK   ADDRESS_MASK_1MB
#define EC555_FLASH_ADDRESS_MASK ADDRESS_MASK_2MB
#elif defined(CYGHWR_HAL_EC555_BOARD_VARIANT_F04_S02)
#define EC555_RAM_ADDRESS_MASK   ADDRESS_MASK_2MB
#define EC555_FLASH_ADDRESS_MASK ADDRESS_MASK_4MB
#elif defined(CYGHWR_HAL_EC555_BOARD_VARIANT_F08_S04)
#define EC555_RAM_ADDRESS_MASK   ADDRESS_MASK_4MB
#define EC555_FLASH_ADDRESS_MASK ADDRESS_MASK_8MB
#elif defined(CYGHWR_HAL_EC555_BOARD_VARIANT_F08_S08)
#define EC555_RAM_ADDRESS_MASK   ADDRESS_MASK_8MB
#define EC555_FLASH_ADDRESS_MASK ADDRESS_MASK_16MB
#else
#error "EC555 Board variant unspecified"
#endif

#define EC555_CS2_ADDRESS_MASK   0xffff8000
#define EC555_CS3_ADDRESS_MASK   0xffff8000

#------------------------------------------------------------------------------
                
        .globl  hal_hardware_init
hal_hardware_init:
#if defined(CYGPKG_HAL_POWERPC_EC555) && defined(CYGPKG_HAL_POWERPC_MPC5xx)
        lwi     r3, CYGARC_REG_IMM_BASE             # Base address of control registers

#if defined(CYG_HAL_STARTUP_ROM)
        // Burst enable
        lwi     r0, 0x00002000
        mtspr   560, r0
       
        // FIXME
        // The following probably belongs in the variant hal rather than the board specifics ... 
        // Disable / enable the Watchdog
        lwi     r4, CYG_SYPCR
        stw     r4, (CYGARC_REG_IMM_SYPCR-CYGARC_REG_IMM_BASE)(r3)
        lwi     r4, 0x00000000
        stw     r4, (CYGARC_REG_IMM_SIUMCR-CYGARC_REG_IMM_BASE)(r3)

        // Unlock locked registers
        lwi     r4, 0x55ccaa33
        stw     r4, (CYGARC_REG_IMM_TBSCRK-CYGARC_REG_IMM_BASE)(r3)
        stw     r4, (CYGARC_REG_IMM_TBREF0K-CYGARC_REG_IMM_BASE)(r3)
        stw     r4, (CYGARC_REG_IMM_TBREF1K-CYGARC_REG_IMM_BASE)(r3)
        stw     r4, (CYGARC_REG_IMM_TBK-CYGARC_REG_IMM_BASE)(r3)
        stw     r4, (CYGARC_REG_IMM_RTCSCK-CYGARC_REG_IMM_BASE)(r3)
        stw     r4, (CYGARC_REG_IMM_RTCK-CYGARC_REG_IMM_BASE)(r3)
        stw     r4, (CYGARC_REG_IMM_RTSECK-CYGARC_REG_IMM_BASE)(r3)
        stw     r4, (CYGARC_REG_IMM_RTCALK-CYGARC_REG_IMM_BASE)(r3)
        stw     r4, (CYGARC_REG_IMM_PISCRK-CYGARC_REG_IMM_BASE)(r3)
        stw     r4, (CYGARC_REG_IMM_PITCK-CYGARC_REG_IMM_BASE)(r3)
        stw     r4, (CYGARC_REG_IMM_SCCRK-CYGARC_REG_IMM_BASE)(r3)
        stw     r4, (CYGARC_REG_IMM_PLPRCRK-CYGARC_REG_IMM_BASE)(r3)
        stw     r4, (CYGARC_REG_IMM_RSRK-CYGARC_REG_IMM_BASE)(r3)

        // Either Redboot or BDM will have already done it otherwise
        // Boost the clock to 40MHz
        lwi     r4, 0x03000000
        stw     r4, (CYGARC_REG_IMM_SCCR-CYGARC_REG_IMM_BASE)(r3)
        lwi     r4, 0x009150c0
        stw     r4, (CYGARC_REG_IMM_PLPRCR-CYGARC_REG_IMM_BASE)(r3)
        lwi     r4, 0x0080
        sth     r4, (CYGARC_REG_IMM_COLIR-CYGARC_REG_IMM_BASE)(r3)

        // Set up the memory map
        // Do NOT write protect the flash memory, flash drivers won't work 
        // if we do

        // flash banks
        lwi     r4, (EC555_FLASH_BASE_ADDRESS | 0x00000003)
        stw     r4, (CYGARC_REG_IMM_BR0-CYGARC_REG_IMM_BASE)(r3)
        lwi     r4, (EC555_FLASH_ADDRESS_MASK | 0x00000530)
        stw     r4, (CYGARC_REG_IMM_OR0-CYGARC_REG_IMM_BASE)(r3)

        // ram banks
        lwi     r4, (EC555_RAM_BASE_ADDRESS | 0x00000011)
        stw     r4, (CYGARC_REG_IMM_BR1-CYGARC_REG_IMM_BASE)(r3)
        lwi     r4, (EC555_RAM_ADDRESS_MASK | 0x00000000)
        stw     r4, (CYGARC_REG_IMM_OR1-CYGARC_REG_IMM_BASE)(r3)
#endif

#ifdef CYGPKG_DEVS_ETH_POWERPC_EC555
#if   (CYGNUM_DEVS_ETH_POWERPC_EC555_ETH0_CS == 2)
        lwi     r4, (EC555_CS2_BASE_ADDRESS | 0x00000803)
        stw     r4, (CYGARC_REG_IMM_BR2-CYGARC_REG_IMM_BASE)(r3)
        lwi     r4, 0xffff8e60
        stw     r4, (CYGARC_REG_IMM_OR2-CYGARC_REG_IMM_BASE)(r3)

        lwi     r4, EC555_CS3_BASE_ADDRESS
        stw     r4, (CYGARC_REG_IMM_BR3-CYGARC_REG_IMM_BASE)(r3)
        lwi     r4, EC555_CS3_ADDRESS_MASK
        stw     r4, (CYGARC_REG_IMM_OR3-CYGARC_REG_IMM_BASE)(r3)
#elif (CYGNUM_DEVS_ETH_POWERPC_EC555_ETH0_CS == 3)
        lwi     r4, EC555_CS2_BASE_ADDRESS
        stw     r4, (CYGARC_REG_IMM_BR2-CYGARC_REG_IMM_BASE)(r3)
        lwi     r4, EC555_CS2_ADDRESS_MASK
        stw     r4, (CYGARC_REG_IMM_OR2-CYGARC_REG_IMM_BASE)(r3)

        lwi     r4, (EC555_CS3_BASE_ADDRESS | 0x00000803)
        stw     r4, (CYGARC_REG_IMM_BR3-CYGARC_REG_IMM_BASE)(r3)
        lwi     r4, 0xffff8e60
        stw     r4, (CYGARC_REG_IMM_OR3-CYGARC_REG_IMM_BASE)(r3)
#else
#error "Invalid chip select for ethernet card specified"
#endif
#else
        lwi     r4, EC555_CS2_BASE_ADDRESS
        stw     r4, (CYGARC_REG_IMM_BR2-CYGARC_REG_IMM_BASE)(r3)
        lwi     r4, EC555_CS2_ADDRESS_MASK
        stw     r4, (CYGARC_REG_IMM_OR2-CYGARC_REG_IMM_BASE)(r3)

        lwi     r4, EC555_CS3_BASE_ADDRESS
        stw     r4, (CYGARC_REG_IMM_BR3-CYGARC_REG_IMM_BASE)(r3)
        lwi     r4, EC555_CS3_ADDRESS_MASK
        stw     r4, (CYGARC_REG_IMM_OR3-CYGARC_REG_IMM_BASE)(r3)
#endif

#if defined(CYGSEM_HAL_POWERPC_MPC5XX_IFLASH_DUAL_MAP)
        lwi     r4, 1
#else
        lwi     r4, 0
#endif
        stw     r4, (CYGARC_REG_IMM_DMBR-CYGARC_REG_IMM_BASE)(r3)
        lwi     r4, 0
        stw     r4, (CYGARC_REG_IMM_DMOR-CYGARC_REG_IMM_BASE)(r3)

        // Enable the time base, but do _not_ set the freeze flag
        lwi     r4, 0xc1
        sth     r4, (CYGARC_REG_IMM_TBSCR-CYGARC_REG_IMM_BASE)(r3)

        // RTC is clocked by 4MHz crystal, set the freeze flag
        lwi     r4, 0xd2
        sth     r4, (CYGARC_REG_IMM_RTCSC-CYGARC_REG_IMM_BASE)(r3)

        // Set the freeze flag for the Periodic interrupt timer
        lwi     r4, 0x82
        sth     r4, (CYGARC_REG_IMM_PISCR-CYGARC_REG_IMM_BASE)(r3)

        // USIU rest.
        lwi     r4, 0x00000000
        lwi     r5, (CYGARC_REG_IMM_SGPIODT1-CYGARC_REG_IMM_BASE)
        stwx    r4, r3, r5
        lwi     r5, (CYGARC_REG_IMM_SGPIODT2-CYGARC_REG_IMM_BASE)
        stwx    r4, r3, r5
        lwi     r5, (CYGARC_REG_IMM_SGPIOCR-CYGARC_REG_IMM_BASE)
        stwx    r4, r3, r5
        lwi     r4, 0x00000ac6
        lwi     r5, (CYGARC_REG_IMM_EMCR-CYGARC_REG_IMM_BASE)
        stwx    r4, r3, r5

        // Dual ported TPU RAM
        lwi     r4, 0x0000
        lwi     r5, (CYGARC_REG_IMM_DPTMCR-CYGARC_REG_IMM_BASE)
        sthx    r4, r3, r5

        lwi     r4, 0xffa0
        lwi     r5, (CYGARC_REG_IMM_RAMBAR-CYGARC_REG_IMM_BASE)
        sthx    r4, r3, r5

        lwi     r4, 0x00
        lwi     r5, (CYGARC_REG_IMM_PORTQS-CYGARC_REG_IMM_BASE)
        sthx    r4, r3, r5

        lwi     r4, 0x00
        lwi     r5, (CYGARC_REG_IMM_PQSPAR_DDRQST-CYGARC_REG_IMM_BASE)
        sthx    r4, r3, r5
        lwi     r5, (CYGARC_REG_IMM_MPIOSMDR-CYGARC_REG_IMM_BASE)
        sthx    r4, r3, r5
        lwi     r5, (CYGARC_REG_IMM_MPIOSMDDR-CYGARC_REG_IMM_BASE)
        sthx    r4, r3, r5
        lwi     r5, (CYGARC_REG_IMM_SRAMMCR_A-CYGARC_REG_IMM_BASE)
        sthx    r4, r3, r5
        
        // They are assigned OCD functionality on this board
        // Change the following to anything else  and BDM will not work anymore
        // on the ec555. This is not true for all MPC555 based boards, eg. cme555
        // does not have this requirement
        lwi     r4, 0x3
        lwi     r5, (CYGARC_REG_IMM_MIOS1TPCR-CYGARC_REG_IMM_BASE)
        sthx    r4, r3, r5

        // Enable 32 interrupt priorities on the IMB3 unit
        lwi     r4, 0x60000000
        lwi     r5, (CYGARC_REG_IMM_UMCR-CYGARC_REG_IMM_BASE)
        stwx    r4, r3, r5
#endif                
        sync
        blr

#------------------------------------------------------------------------------
# end of ec555.S