Mercurial > ecos
diff packages/hal/arm/xscale/uE250/current/include/hal_platform_setup.h @ 655:4ca0953b0734
New platform - NMI uE250 (Xscale PXA250)
| author | gthomas |
|---|---|
| date | Fri, 21 Feb 2003 18:17:32 +0000 |
| parents | |
| children | 74dbf4c3f2e1 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/hal/arm/xscale/uE250/current/include/hal_platform_setup.h @@ -0,0 +1,312 @@ +#ifndef CYGONCE_HAL_PLATFORM_SETUP_H +#define CYGONCE_HAL_PLATFORM_SETUP_H + +/*============================================================================= +// +// hal_platform_setup.h +// +// Platform specific support for HAL (assembly code) +// +//============================================================================= +//####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. +// Copyright (C) 2003 Gary Thomas <gary@mind.be> +// +// 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/system.h> // System-wide configuration info +#include CYGBLD_HAL_VARIANT_H // Variant specific configuration +#include CYGBLD_HAL_PLATFORM_H // Platform specific configuration +#include <cyg/hal/hal_pxa2x0.h> // Variant specific hardware definitions +#include <cyg/hal/hal_mmu.h> // MMU definitions +#include <cyg/hal/hal_mm.h> // more MMU definitions +#include <cyg/hal/uE250.h> // Platform specific hardware definitions +#include <cyg/hal/hal_spd.h> + +#define MDCNFG_VALUE 0x03001BC9 +// #define MDCNFG_VALUE 0x00001BC9 +#define MDMRS_VALUE 0x00000000 +#define MDREFR_VALUE_1 0x00494030 +#define MDREFR_VALUE_2 0x00094030 +#define MDREFR_VALUE_3 0x0009C030 + +#define GPCR0_VALUE 0xFFFFFFFF +#define GPCR1_VALUE 0xFFFFFFFF +#define GPCR2_VALUE 0xFFFFFFFF + +#define GPSR0_VALUE 0x00028000 +#define GPSR1_VALUE 0x00002122 +#define GPSR2_VALUE 0x0001C000 + +#define GPDR0_VALUE 0x03E3A080 +#define GPDR1_VALUE 0x00FFA963 +#define GPDR2_VALUE 0x0001C000 + +#define GAFR0_L_VALUE 0x88000000 +#define GAFR0_U_VALUE 0x001A8010 +#define GAFR1_L_VALUE 0x90900008 +#define GAFR1_U_VALUE 0x0005AAAA +#define GAFR2_L_VALUE 0xA0000000 +#define GAFR2_U_VALUE 0x00000002 + +#define PSSR_VALUE 0x20 +#define MSC0_VALUE_NONBURST 0x2FD0 +#define MSC0_VALUE_BURST 0x22D2 + +#if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM) +#define PLATFORM_SETUP1 _platform_setup1 +// #define PLATFORM_EXTRAS <cyg/hal/hal_platform_extras.h> +#define CYGHWR_HAL_ARM_HAS_MMU + +// This macro represents the initial startup code for the platform + .macro _platform_setup1 + // This is where we wind up immediately after reset. At this point, we + // are executing from the boot address (0x00000000), not the eventual + // flash address. Do some basic setup using position independent code + // then switch to real flash address + +// FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME +// This is a quick and dirty workaround to an apparent gas/ld +// bug. The computed UNMAPPED_PTR(reset_vector) is off by 0x20. + .rept 0x20/4 + nop + .endr +// FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME + + + // Set the direction of the LED GPIO's to 'output' + // This will disable the LED's (which are on at boot-time, so we + // can see we have safely landed here. + ldr r1, =PXA2X0_GPDR0 + ldr r2, =0x00600000 + str r2, [r1] + + + // Disable interrupts, by setting the Interrupt Mask Registers to all 0's + ldr r1,=PXA2X0_ICMR + mov r0,#0 + str r0,[r1] + + // disable MMU + mov r0, #0x0 + mcr p15, 0, r0, c1, c0, 0 + + // flush TLB + mov r0, #0x0 + mcr p15, 0, r0, c8, c7, 0 // Flush TLB + + // flush I&D caches and BTB + mov r0, #0x0 + mcr p15, 0, r0, c7, c7, 0 // Flush caches + + CPWAIT r0 + + // Enables access to coprocessor 0 (The only extra coprocessor on the PXA250) + ldr r0, =0x00000001 + mcr p15, 0, r0, c15, c1, 0 + + // Disable the IRQ's and FIQ's in the program status register and + // enable supervisor mode + ldr r0,=(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_SUPERVISOR_MODE) + msr cpsr, r0 + + // Set TURBO mode + + ldr r2, =0x00000321 + ldr r1, =PXA2X0_CCCR + str r2,[r1] + + ldr r1, =0x00000003 + mcr p14, 0, r1, c6, c0, 0 + + // Set-up memory according to NMI specs + + ldr r1,=PXA2X0_RAM_BANK0_BASE + ldr r2,[r1] + ldr r2,[r1] + ldr r2,[r1] + ldr r2,[r1] + ldr r2,[r1] + ldr r2,[r1] + ldr r2,[r1] + ldr r2,[r1] + + // Set DRAM Configuration Value + ldr r1,=PXA2X0_MDCNFG + ldr r2,=MDCNFG_VALUE + str r2,[r1] + + // Set MDMRS + ldr r1,=PXA2X0_MDMRS + ldr r2,=MDMRS_VALUE + str r2,[r1] + + // Set Refresh Values + ldr r1,=PXA2X0_MDREFR + ldr r2,=MDREFR_VALUE_1 + str r2,[r1] + + ldr r1,=PXA2X0_MDREFR + ldr r2,=MDREFR_VALUE_2 + str r2,[r1] + + ldr r1,=PXA2X0_MDREFR + ldr r2,=MDREFR_VALUE_3 + str r2,[r1] + + // Set Static memory registers + ldr r1,=PXA2X0_MSC0 + ldr r2,=MSC0_VALUE_NONBURST + str r2,[r1] + + // Setup GPIO clear registers + ldr r1, =PXA2X0_GPCR0 + ldr r2, =(GPCR0_VALUE) + str r2, [r1] + + ldr r1, =PXA2X0_GPCR1 + ldr r2, =(GPCR1_VALUE) + str r2, [r1] + + ldr r1, =PXA2X0_GPCR2 + ldr r2, =(GPCR2_VALUE) + str r2, [r1] + + // Setup GPIO set registers + ldr r1, =PXA2X0_GPSR0 + ldr r2, =(GPSR0_VALUE) + str r2, [r1] + + ldr r1, =PXA2X0_GPSR1 + ldr r2, =(GPSR1_VALUE) + str r2, [r1] + + ldr r1, =PXA2X0_GPSR2 + ldr r2, =(GPSR2_VALUE) + str r2, [r1] + + // Setup GPIO direction registers + ldr r1, =PXA2X0_GPDR0 + ldr r2, =(GPDR0_VALUE) + str r2, [r1] + + ldr r1, =PXA2X0_GPDR1 + ldr r2, =(GPDR1_VALUE) + str r2, [r1] + + ldr r1, =PXA2X0_GPDR2 + ldr r2, =(GPDR2_VALUE) + str r2, [r1] + + // Setup GPIO alternate function registers + ldr r1, =PXA2X0_GAFR0_L + ldr r2, =(GAFR0_L_VALUE) + str r2, [r1] + + ldr r1, =PXA2X0_GAFR0_U + ldr r2, =(GAFR0_U_VALUE) + str r2, [r1] + + ldr r1, =PXA2X0_GAFR1_L + ldr r2, =(GAFR1_L_VALUE) + str r2, [r1] + + ldr r1, =PXA2X0_GAFR1_U + ldr r2, =(GAFR1_U_VALUE) + str r2, [r1] + + ldr r1, =PXA2X0_GAFR2_L + ldr r2, =(GAFR2_L_VALUE) + str r2, [r1] + + ldr r1, =PXA2X0_GAFR2_U + ldr r2, =(GAFR2_U_VALUE) + str r2, [r1] + + ldr r1, =PXA2X0_PSSR + ldr r2, =(PSSR_VALUE) + str r2, [r1] + + // Enable the Icache + mrc p15, 0, r0, c1, c0, 0 + orr r0, r0, #MMU_Control_I + mcr p15, 0, r0, c1, c0, 0 + CPWAIT r0 + + // Turn on red led + ldr r1,=PXA2X0_GPSR0 + ldr r2,=0x00200000 + str r2,[r1] + + // Set up a stack [for calling C code] + ldr r1,=__startup_stack + ldr r2,=PXA2X0_RAM_BANK0_BASE + orr sp,r1,r2 + + // Create MMU tables + bl hal_mmu_init + + // Turn off red led + ldr r1,=PXA2X0_GPCR0 + ldr r2,=0x00200000 + str r2,[r1] + + // Enable MMU + ldr r2,=10f + ldr r1,=MMU_Control_Init|MMU_Control_M + mcr MMU_CP,0,r1,MMU_Control,c0 + mov pc, r2 + nop + nop + nop + +10: + // Turn on green led + ldr r1,=PXA2X0_GPSR0 + ldr r2,=0x00400000 + str r2,[r1] + + .endm + +#else // defined(CYG_HAL_STARTUP_ROM) +#define PLATFORM_SETUP1 +#endif + +#define PLATFORM_VECTORS _platform_vectors + .macro _platform_vectors + .globl hal_pcsr_cfg_retry +hal_pcsr_cfg_retry: .long 0 // Boot-time value of PCSR Retry bit. + .endm + +/*---------------------------------------------------------------------------*/ +/* end of hal_platform_setup.h */ +#endif /* CYGONCE_HAL_PLATFORM_SETUP_H */
