1*10465441SEvalZero;/* 2*10465441SEvalZero; * Copyright (c) 2006-2018, RT-Thread Development Team 3*10465441SEvalZero; * 4*10465441SEvalZero; * SPDX-License-Identifier: Apache-2.0 5*10465441SEvalZero; * 6*10465441SEvalZero; * Change Logs: 7*10465441SEvalZero; * Date Author Notes 8*10465441SEvalZero; */ 9*10465441SEvalZero; 10*10465441SEvalZero;/*****************************************************************************/ 11*10465441SEvalZero;/* LPC2400.S: Startup file for Philips LPC2400 device series */ 12*10465441SEvalZero;/*****************************************************************************/ 13*10465441SEvalZero;/* <<< Use Configuration Wizard in Context Menu >>> */ 14*10465441SEvalZero;/*****************************************************************************/ 15*10465441SEvalZero;/* This file is part of the uVision/ARM development tools. */ 16*10465441SEvalZero;/* Copyright (c) 2007-2008 Keil - An ARM Company. All rights reserved. */ 17*10465441SEvalZero;/* This software may only be used under the terms of a valid, current, */ 18*10465441SEvalZero;/* end user licence from KEIL for a compatible version of KEIL software */ 19*10465441SEvalZero;/* development tools. Nothing else gives you the right to use this software. */ 20*10465441SEvalZero;/*****************************************************************************/ 21*10465441SEvalZero 22*10465441SEvalZero;/* 23*10465441SEvalZero; * The LPC2400.S code is executed after CPU Reset. This file may be 24*10465441SEvalZero; * translated with the following SET symbols. In uVision these SET 25*10465441SEvalZero; * symbols are entered under Options - ASM - Define. 26*10465441SEvalZero; * 27*10465441SEvalZero; * NO_CLOCK_SETUP: when set the startup code will not initialize Clock 28*10465441SEvalZero; * (used mostly when clock is already initialized from script .ini 29*10465441SEvalZero; * file). 30*10465441SEvalZero; * 31*10465441SEvalZero; * NO_EMC_SETUP: when set the startup code will not initialize 32*10465441SEvalZero; * External Bus Controller. 33*10465441SEvalZero; * 34*10465441SEvalZero; * RAM_INTVEC: when set the startup code copies exception vectors 35*10465441SEvalZero; * from on-chip Flash to on-chip RAM. 36*10465441SEvalZero; * 37*10465441SEvalZero; * REMAP: when set the startup code initializes the register MEMMAP 38*10465441SEvalZero; * which overwrites the settings of the CPU configuration pins. The 39*10465441SEvalZero; * startup and interrupt vectors are remapped from: 40*10465441SEvalZero; * 0x00000000 default setting (not remapped) 41*10465441SEvalZero; * 0x40000000 when RAM_MODE is used 42*10465441SEvalZero; * 0x80000000 when EXTMEM_MODE is used 43*10465441SEvalZero; * 44*10465441SEvalZero; * EXTMEM_MODE: when set the device is configured for code execution 45*10465441SEvalZero; * from external memory starting at address 0x80000000. 46*10465441SEvalZero; * 47*10465441SEvalZero; * RAM_MODE: when set the device is configured for code execution 48*10465441SEvalZero; * from on-chip RAM starting at address 0x40000000. 49*10465441SEvalZero; */ 50*10465441SEvalZero 51*10465441SEvalZero 52*10465441SEvalZero; Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs 53*10465441SEvalZero 54*10465441SEvalZeroMode_USR EQU 0x10 55*10465441SEvalZeroMode_FIQ EQU 0x11 56*10465441SEvalZeroMode_IRQ EQU 0x12 57*10465441SEvalZeroMode_SVC EQU 0x13 58*10465441SEvalZeroMode_ABT EQU 0x17 59*10465441SEvalZeroMode_UND EQU 0x1B 60*10465441SEvalZeroMode_SYS EQU 0x1F 61*10465441SEvalZeroI_Bit EQU 0x80 ; when I bit is set, IRQ is disabled 62*10465441SEvalZeroF_Bit EQU 0x40 ; when F bit is set, FIQ is disabled 63*10465441SEvalZero 64*10465441SEvalZero;----------------------- Memory Definitions ------------------------------------ 65*10465441SEvalZero 66*10465441SEvalZero; Internal Memory Base Addresses 67*10465441SEvalZeroFLASH_BASE EQU 0x00000000 68*10465441SEvalZeroRAM_BASE EQU 0x40000000 69*10465441SEvalZeroEXTMEM_BASE EQU 0x80000000 70*10465441SEvalZero 71*10465441SEvalZero; External Memory Base Addresses 72*10465441SEvalZeroSTA_MEM0_BASE EQU 0x80000000 73*10465441SEvalZeroSTA_MEM1_BASE EQU 0x81000000 74*10465441SEvalZeroSTA_MEM2_BASE EQU 0x82000000 75*10465441SEvalZeroSTA_MEM3_BASE EQU 0x83000000 76*10465441SEvalZeroDYN_MEM0_BASE EQU 0xA0000000 77*10465441SEvalZeroDYN_MEM1_BASE EQU 0xB0000000 78*10465441SEvalZeroDYN_MEM2_BASE EQU 0xC0000000 79*10465441SEvalZeroDYN_MEM3_BASE EQU 0xD0000000 80*10465441SEvalZero 81*10465441SEvalZero 82*10465441SEvalZero;----------------------- Stack and Heap Definitions ---------------------------- 83*10465441SEvalZero 84*10465441SEvalZero;// <h> Stack Configuration (Stack Sizes in Bytes) 85*10465441SEvalZero;// <o0> Undefined Mode <0x0-0xFFFFFFFF:8> 86*10465441SEvalZero;// <o1> Supervisor Mode <0x0-0xFFFFFFFF:8> 87*10465441SEvalZero;// <o2> Abort Mode <0x0-0xFFFFFFFF:8> 88*10465441SEvalZero;// <o3> Fast Interrupt Mode <0x0-0xFFFFFFFF:8> 89*10465441SEvalZero;// <o4> Interrupt Mode <0x0-0xFFFFFFFF:8> 90*10465441SEvalZero;// <o5> User/System Mode <0x0-0xFFFFFFFF:8> 91*10465441SEvalZero;// </h> 92*10465441SEvalZero 93*10465441SEvalZeroUND_Stack_Size EQU 0x00000000 94*10465441SEvalZeroSVC_Stack_Size EQU 0x00000100 95*10465441SEvalZeroABT_Stack_Size EQU 0x00000000 96*10465441SEvalZeroFIQ_Stack_Size EQU 0x00000000 97*10465441SEvalZeroIRQ_Stack_Size EQU 0x00000100 98*10465441SEvalZeroUSR_Stack_Size EQU 0x00000100 99*10465441SEvalZero 100*10465441SEvalZeroISR_Stack_Size EQU (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + \ 101*10465441SEvalZero FIQ_Stack_Size + IRQ_Stack_Size) 102*10465441SEvalZero 103*10465441SEvalZero AREA STACK, NOINIT, READWRITE, ALIGN=3 104*10465441SEvalZero 105*10465441SEvalZeroStack_Mem SPACE USR_Stack_Size 106*10465441SEvalZero__initial_sp SPACE ISR_Stack_Size 107*10465441SEvalZero 108*10465441SEvalZeroStack_Top 109*10465441SEvalZero 110*10465441SEvalZero 111*10465441SEvalZero;// <h> Heap Configuration 112*10465441SEvalZero;// <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF> 113*10465441SEvalZero;// </h> 114*10465441SEvalZero 115*10465441SEvalZeroHeap_Size EQU 0x00000000 116*10465441SEvalZero 117*10465441SEvalZero AREA HEAP, NOINIT, READWRITE, ALIGN=3 118*10465441SEvalZero__heap_base 119*10465441SEvalZeroHeap_Mem SPACE Heap_Size 120*10465441SEvalZero__heap_limit 121*10465441SEvalZero 122*10465441SEvalZero 123*10465441SEvalZero;----------------------- Clock Definitions ------------------------------------- 124*10465441SEvalZero 125*10465441SEvalZero; System Control Block (SCB) Module Definitions 126*10465441SEvalZeroSCB_BASE EQU 0xE01FC000 ; SCB Base Address 127*10465441SEvalZeroPLLCON_OFS EQU 0x80 ; PLL Control Offset 128*10465441SEvalZeroPLLCFG_OFS EQU 0x84 ; PLL Configuration Offset 129*10465441SEvalZeroPLLSTAT_OFS EQU 0x88 ; PLL Status Offset 130*10465441SEvalZeroPLLFEED_OFS EQU 0x8C ; PLL Feed Offset 131*10465441SEvalZeroCCLKCFG_OFS EQU 0x104 ; CPU Clock Divider Reg Offset 132*10465441SEvalZeroUSBCLKCFG_OFS EQU 0x108 ; USB Clock Divider Reg Offset 133*10465441SEvalZeroCLKSRCSEL_OFS EQU 0x10C ; Clock Source Sel Reg Offset 134*10465441SEvalZeroSCS_OFS EQU 0x1A0 ; Sys Control and Status Reg Offset 135*10465441SEvalZeroPCLKSEL0_OFS EQU 0x1A8 ; Periph Clock Sel Reg 0 Offset 136*10465441SEvalZeroPCLKSEL1_OFS EQU 0x1AC ; Periph Clock Sel Reg 0 Offset 137*10465441SEvalZero 138*10465441SEvalZeroPCON_OFS EQU 0x0C0 ; Power Mode Control Reg Offset 139*10465441SEvalZeroPCONP_OFS EQU 0x0C4 ; Power Control for Periphs Reg Offset 140*10465441SEvalZero 141*10465441SEvalZero; Constants 142*10465441SEvalZeroOSCRANGE EQU (1<<4) ; Oscillator Range Select 143*10465441SEvalZeroOSCEN EQU (1<<5) ; Main oscillator Enable 144*10465441SEvalZeroOSCSTAT EQU (1<<6) ; Main Oscillator Status 145*10465441SEvalZeroPLLCON_PLLE EQU (1<<0) ; PLL Enable 146*10465441SEvalZeroPLLCON_PLLC EQU (1<<1) ; PLL Connect 147*10465441SEvalZeroPLLSTAT_M EQU (0x7FFF<<0) ; PLL M Value 148*10465441SEvalZeroPLLSTAT_N EQU (0xFF<<16) ; PLL N Value 149*10465441SEvalZeroPLLSTAT_PLOCK EQU (1<<26) ; PLL Lock Status 150*10465441SEvalZero 151*10465441SEvalZero;// <e> Clock Setup 152*10465441SEvalZero;// <h> System Controls and Status Register (SYS) 153*10465441SEvalZero;// <o1.4> OSCRANGE: Main Oscillator Range Select 154*10465441SEvalZero;// <0=> 1 MHz to 20 MHz 155*10465441SEvalZero;// <1=> 15 MHz to 24 MHz 156*10465441SEvalZero;// <e1.5> OSCEN: Main Oscillator Enable 157*10465441SEvalZero;// </e> 158*10465441SEvalZero;// </h> 159*10465441SEvalZero;// 160*10465441SEvalZero;// <h> PLL Clock Source Select Register (CLKSRCSEL) 161*10465441SEvalZero;// <o2.0..1> CLKSRC: PLL Clock Source Selection 162*10465441SEvalZero;// <0=> Internal RC oscillator 163*10465441SEvalZero;// <1=> Main oscillator 164*10465441SEvalZero;// <2=> RTC oscillator 165*10465441SEvalZero;// </h> 166*10465441SEvalZero;// 167*10465441SEvalZero;// <h> PLL Configuration Register (PLLCFG) 168*10465441SEvalZero;// <i> PLL_clk = (2* M * PLL_clk_src) / N 169*10465441SEvalZero;// <o3.0..14> MSEL: PLL Multiplier Selection 170*10465441SEvalZero;// <1-32768><#-1> 171*10465441SEvalZero;// <i> M Value 172*10465441SEvalZero;// <o3.16..23> NSEL: PLL Divider Selection 173*10465441SEvalZero;// <1-256><#-1> 174*10465441SEvalZero;// <i> N Value 175*10465441SEvalZero;// </h> 176*10465441SEvalZero;// 177*10465441SEvalZero;// <h> CPU Clock Configuration Register (CCLKCFG) 178*10465441SEvalZero;// <o4.0..7> CCLKSEL: Divide Value for CPU Clock from PLL 179*10465441SEvalZero;// <1-256><#-1> 180*10465441SEvalZero;// </h> 181*10465441SEvalZero;// 182*10465441SEvalZero;// <h> USB Clock Configuration Register (USBCLKCFG) 183*10465441SEvalZero;// <o5.0..3> USBSEL: Divide Value for USB Clock from PLL 184*10465441SEvalZero;// <1-16><#-1> 185*10465441SEvalZero;// </h> 186*10465441SEvalZero;// 187*10465441SEvalZero;// <h> Peripheral Clock Selection Register 0 (PCLKSEL0) 188*10465441SEvalZero;// <o6.0..1> PCLK_WDT: Peripheral Clock Selection for WDT 189*10465441SEvalZero;// <0=> Pclk = Cclk / 4 190*10465441SEvalZero;// <1=> Pclk = Cclk 191*10465441SEvalZero;// <2=> Pclk = Cclk / 2 192*10465441SEvalZero;// <3=> Pclk = Cclk / 8 193*10465441SEvalZero;// <o6.2..3> PCLK_TIMER0: Peripheral Clock Selection for TIMER0 194*10465441SEvalZero;// <0=> Pclk = Cclk / 4 195*10465441SEvalZero;// <1=> Pclk = Cclk 196*10465441SEvalZero;// <2=> Pclk = Cclk / 2 197*10465441SEvalZero;// <3=> Pclk = Cclk / 8 198*10465441SEvalZero;// <o6.4..5> PCLK_TIMER1: Peripheral Clock Selection for TIMER1 199*10465441SEvalZero;// <0=> Pclk = Cclk / 4 200*10465441SEvalZero;// <1=> Pclk = Cclk 201*10465441SEvalZero;// <2=> Pclk = Cclk / 2 202*10465441SEvalZero;// <3=> Pclk = Cclk / 8 203*10465441SEvalZero;// <o6.6..7> PCLK_UART0: Peripheral Clock Selection for UART0 204*10465441SEvalZero;// <0=> Pclk = Cclk / 4 205*10465441SEvalZero;// <1=> Pclk = Cclk 206*10465441SEvalZero;// <2=> Pclk = Cclk / 2 207*10465441SEvalZero;// <3=> Pclk = Cclk / 8 208*10465441SEvalZero;// <o6.8..9> PCLK_UART1: Peripheral Clock Selection for UART1 209*10465441SEvalZero;// <0=> Pclk = Cclk / 4 210*10465441SEvalZero;// <1=> Pclk = Cclk 211*10465441SEvalZero;// <2=> Pclk = Cclk / 2 212*10465441SEvalZero;// <3=> Pclk = Cclk / 8 213*10465441SEvalZero;// <o6.10..11> PCLK_PWM0: Peripheral Clock Selection for PWM0 214*10465441SEvalZero;// <0=> Pclk = Cclk / 4 215*10465441SEvalZero;// <1=> Pclk = Cclk 216*10465441SEvalZero;// <2=> Pclk = Cclk / 2 217*10465441SEvalZero;// <3=> Pclk = Cclk / 8 218*10465441SEvalZero;// <o6.12..13> PCLK_PWM1: Peripheral Clock Selection for PWM1 219*10465441SEvalZero;// <0=> Pclk = Cclk / 4 220*10465441SEvalZero;// <1=> Pclk = Cclk 221*10465441SEvalZero;// <2=> Pclk = Cclk / 2 222*10465441SEvalZero;// <3=> Pclk = Cclk / 8 223*10465441SEvalZero;// <o6.14..15> PCLK_I2C0: Peripheral Clock Selection for I2C0 224*10465441SEvalZero;// <0=> Pclk = Cclk / 4 225*10465441SEvalZero;// <1=> Pclk = Cclk 226*10465441SEvalZero;// <2=> Pclk = Cclk / 2 227*10465441SEvalZero;// <3=> Pclk = Cclk / 8 228*10465441SEvalZero;// <o6.16..17> PCLK_SPI: Peripheral Clock Selection for SPI 229*10465441SEvalZero;// <0=> Pclk = Cclk / 4 230*10465441SEvalZero;// <1=> Pclk = Cclk 231*10465441SEvalZero;// <2=> Pclk = Cclk / 2 232*10465441SEvalZero;// <3=> Pclk = Cclk / 8 233*10465441SEvalZero;// <o6.18..19> PCLK_RTC: Peripheral Clock Selection for RTC 234*10465441SEvalZero;// <0=> Pclk = Cclk / 4 235*10465441SEvalZero;// <1=> Pclk = Cclk 236*10465441SEvalZero;// <2=> Pclk = Cclk / 2 237*10465441SEvalZero;// <3=> Pclk = Cclk / 8 238*10465441SEvalZero;// <o6.20..21> PCLK_SSP1: Peripheral Clock Selection for SSP1 239*10465441SEvalZero;// <0=> Pclk = Cclk / 4 240*10465441SEvalZero;// <1=> Pclk = Cclk 241*10465441SEvalZero;// <2=> Pclk = Cclk / 2 242*10465441SEvalZero;// <3=> Pclk = Cclk / 8 243*10465441SEvalZero;// <o6.22..23> PCLK_DAC: Peripheral Clock Selection for DAC 244*10465441SEvalZero;// <0=> Pclk = Cclk / 4 245*10465441SEvalZero;// <1=> Pclk = Cclk 246*10465441SEvalZero;// <2=> Pclk = Cclk / 2 247*10465441SEvalZero;// <3=> Pclk = Cclk / 8 248*10465441SEvalZero;// <o6.24..25> PCLK_ADC: Peripheral Clock Selection for ADC 249*10465441SEvalZero;// <0=> Pclk = Cclk / 4 250*10465441SEvalZero;// <1=> Pclk = Cclk 251*10465441SEvalZero;// <2=> Pclk = Cclk / 2 252*10465441SEvalZero;// <3=> Pclk = Cclk / 8 253*10465441SEvalZero;// <o6.26..27> PCLK_CAN1: Peripheral Clock Selection for CAN1 254*10465441SEvalZero;// <0=> Pclk = Cclk / 4 255*10465441SEvalZero;// <1=> Pclk = Cclk 256*10465441SEvalZero;// <2=> Pclk = Cclk / 2 257*10465441SEvalZero;// <3=> Pclk = Cclk / 6 258*10465441SEvalZero;// <o6.28..29> PCLK_CAN2: Peripheral Clock Selection for CAN2 259*10465441SEvalZero;// <0=> Pclk = Cclk / 4 260*10465441SEvalZero;// <1=> Pclk = Cclk 261*10465441SEvalZero;// <2=> Pclk = Cclk / 2 262*10465441SEvalZero;// <3=> Pclk = Cclk / 6 263*10465441SEvalZero;// <o6.30..31> PCLK_ACF: Peripheral Clock Selection for ACF 264*10465441SEvalZero;// <0=> Pclk = Cclk / 4 265*10465441SEvalZero;// <1=> Pclk = Cclk 266*10465441SEvalZero;// <2=> Pclk = Cclk / 2 267*10465441SEvalZero;// <3=> Pclk = Cclk / 6 268*10465441SEvalZero;// </h> 269*10465441SEvalZero;// 270*10465441SEvalZero;// <h> Peripheral Clock Selection Register 1 (PCLKSEL1) 271*10465441SEvalZero;// <o7.0..1> PCLK_BAT_RAM: Peripheral Clock Selection for the Battery Supported RAM 272*10465441SEvalZero;// <0=> Pclk = Cclk / 4 273*10465441SEvalZero;// <1=> Pclk = Cclk 274*10465441SEvalZero;// <2=> Pclk = Cclk / 2 275*10465441SEvalZero;// <3=> Pclk = Cclk / 8 276*10465441SEvalZero;// <o7.2..3> PCLK_GPIO: Peripheral Clock Selection for GPIOs 277*10465441SEvalZero;// <0=> Pclk = Cclk / 4 278*10465441SEvalZero;// <1=> Pclk = Cclk 279*10465441SEvalZero;// <2=> Pclk = Cclk / 2 280*10465441SEvalZero;// <3=> Pclk = Cclk / 8 281*10465441SEvalZero;// <o7.4..5> PCLK_PCB: Peripheral Clock Selection for Pin Connect Block 282*10465441SEvalZero;// <0=> Pclk = Cclk / 4 283*10465441SEvalZero;// <1=> Pclk = Cclk 284*10465441SEvalZero;// <2=> Pclk = Cclk / 2 285*10465441SEvalZero;// <3=> Pclk = Cclk / 8 286*10465441SEvalZero;// <o7.6..7> PCLK_I2C1: Peripheral Clock Selection for I2C1 287*10465441SEvalZero;// <0=> Pclk = Cclk / 4 288*10465441SEvalZero;// <1=> Pclk = Cclk 289*10465441SEvalZero;// <2=> Pclk = Cclk / 2 290*10465441SEvalZero;// <3=> Pclk = Cclk / 8 291*10465441SEvalZero;// <o7.10..11> PCLK_SSP0: Peripheral Clock Selection for SSP0 292*10465441SEvalZero;// <0=> Pclk = Cclk / 4 293*10465441SEvalZero;// <1=> Pclk = Cclk 294*10465441SEvalZero;// <2=> Pclk = Cclk / 2 295*10465441SEvalZero;// <3=> Pclk = Cclk / 8 296*10465441SEvalZero;// <o7.12..13> PCLK_TIMER2: Peripheral Clock Selection for TIMER2 297*10465441SEvalZero;// <0=> Pclk = Cclk / 4 298*10465441SEvalZero;// <1=> Pclk = Cclk 299*10465441SEvalZero;// <2=> Pclk = Cclk / 2 300*10465441SEvalZero;// <3=> Pclk = Cclk / 8 301*10465441SEvalZero;// <o7.14..15> PCLK_TIMER3: Peripheral Clock Selection for TIMER3 302*10465441SEvalZero;// <0=> Pclk = Cclk / 4 303*10465441SEvalZero;// <1=> Pclk = Cclk 304*10465441SEvalZero;// <2=> Pclk = Cclk / 2 305*10465441SEvalZero;// <3=> Pclk = Cclk / 8 306*10465441SEvalZero;// <o7.16..17> PCLK_UART2: Peripheral Clock Selection for UART2 307*10465441SEvalZero;// <0=> Pclk = Cclk / 4 308*10465441SEvalZero;// <1=> Pclk = Cclk 309*10465441SEvalZero;// <2=> Pclk = Cclk / 2 310*10465441SEvalZero;// <3=> Pclk = Cclk / 8 311*10465441SEvalZero;// <o7.18..19> PCLK_UART3: Peripheral Clock Selection for UART3 312*10465441SEvalZero;// <0=> Pclk = Cclk / 4 313*10465441SEvalZero;// <1=> Pclk = Cclk 314*10465441SEvalZero;// <2=> Pclk = Cclk / 2 315*10465441SEvalZero;// <3=> Pclk = Cclk / 8 316*10465441SEvalZero;// <o7.20..21> PCLK_I2C2: Peripheral Clock Selection for I2C2 317*10465441SEvalZero;// <0=> Pclk = Cclk / 4 318*10465441SEvalZero;// <1=> Pclk = Cclk 319*10465441SEvalZero;// <2=> Pclk = Cclk / 2 320*10465441SEvalZero;// <3=> Pclk = Cclk / 8 321*10465441SEvalZero;// <o7.22..23> PCLK_I2S: Peripheral Clock Selection for I2S 322*10465441SEvalZero;// <0=> Pclk = Cclk / 4 323*10465441SEvalZero;// <1=> Pclk = Cclk 324*10465441SEvalZero;// <2=> Pclk = Cclk / 2 325*10465441SEvalZero;// <3=> Pclk = Cclk / 8 326*10465441SEvalZero;// <o7.24..25> PCLK_MCI: Peripheral Clock Selection for MCI 327*10465441SEvalZero;// <0=> Pclk = Cclk / 4 328*10465441SEvalZero;// <1=> Pclk = Cclk 329*10465441SEvalZero;// <2=> Pclk = Cclk / 2 330*10465441SEvalZero;// <3=> Pclk = Cclk / 8 331*10465441SEvalZero;// <o7.28..29> PCLK_SYSCON: Peripheral Clock Selection for System Control Block 332*10465441SEvalZero;// <0=> Pclk = Cclk / 4 333*10465441SEvalZero;// <1=> Pclk = Cclk 334*10465441SEvalZero;// <2=> Pclk = Cclk / 2 335*10465441SEvalZero;// <3=> Pclk = Cclk / 8 336*10465441SEvalZero;// </h> 337*10465441SEvalZero;// </e> 338*10465441SEvalZeroCLOCK_SETUP EQU 1 339*10465441SEvalZeroSCS_Val EQU 0x00000020 340*10465441SEvalZeroCLKSRCSEL_Val EQU 0x00000001 341*10465441SEvalZeroPLLCFG_Val EQU 0x0000000B 342*10465441SEvalZeroCCLKCFG_Val EQU 0x00000004 343*10465441SEvalZeroUSBCLKCFG_Val EQU 0x00000005 344*10465441SEvalZeroPCLKSEL0_Val EQU 0x00000000 345*10465441SEvalZeroPCLKSEL1_Val EQU 0x00000000 346*10465441SEvalZero 347*10465441SEvalZero 348*10465441SEvalZero;----------------------- Memory Accelerator Module (MAM) Definitions ----------- 349*10465441SEvalZero 350*10465441SEvalZeroMAM_BASE EQU 0xE01FC000 ; MAM Base Address 351*10465441SEvalZeroMAMCR_OFS EQU 0x00 ; MAM Control Offset 352*10465441SEvalZeroMAMTIM_OFS EQU 0x04 ; MAM Timing Offset 353*10465441SEvalZero 354*10465441SEvalZero;// <e> MAM Setup 355*10465441SEvalZero;// <o1.0..1> MAM Control 356*10465441SEvalZero;// <0=> Disabled 357*10465441SEvalZero;// <1=> Partially Enabled 358*10465441SEvalZero;// <2=> Fully Enabled 359*10465441SEvalZero;// <i> Mode 360*10465441SEvalZero;// <o2.0..2> MAM Timing 361*10465441SEvalZero;// <0=> Reserved <1=> 1 <2=> 2 <3=> 3 362*10465441SEvalZero;// <4=> 4 <5=> 5 <6=> 6 <7=> 7 363*10465441SEvalZero;// <i> Fetch Cycles 364*10465441SEvalZero;// </e> 365*10465441SEvalZeroMAM_SETUP EQU 1 366*10465441SEvalZeroMAMCR_Val EQU 0x00000002 367*10465441SEvalZeroMAMTIM_Val EQU 0x00000004 368*10465441SEvalZero 369*10465441SEvalZero 370*10465441SEvalZero;----------------------- Pin Connect Block Definitions ------------------------- 371*10465441SEvalZero 372*10465441SEvalZeroPCB_BASE EQU 0xE002C000 ; PCB Base Address 373*10465441SEvalZeroPINSEL0_OFS EQU 0x00 ; PINSEL0 Address Offset 374*10465441SEvalZeroPINSEL1_OFS EQU 0x04 ; PINSEL1 Address Offset 375*10465441SEvalZeroPINSEL2_OFS EQU 0x08 ; PINSEL2 Address Offset 376*10465441SEvalZeroPINSEL3_OFS EQU 0x0C ; PINSEL3 Address Offset 377*10465441SEvalZeroPINSEL4_OFS EQU 0x10 ; PINSEL4 Address Offset 378*10465441SEvalZeroPINSEL5_OFS EQU 0x14 ; PINSEL5 Address Offset 379*10465441SEvalZeroPINSEL6_OFS EQU 0x18 ; PINSEL6 Address Offset 380*10465441SEvalZeroPINSEL7_OFS EQU 0x1C ; PINSEL7 Address Offset 381*10465441SEvalZeroPINSEL8_OFS EQU 0x20 ; PINSEL8 Address Offset 382*10465441SEvalZeroPINSEL9_OFS EQU 0x24 ; PINSEL9 Address Offset 383*10465441SEvalZeroPINSEL10_OFS EQU 0x28 ; PINSEL10 Address Offset 384*10465441SEvalZero 385*10465441SEvalZero 386*10465441SEvalZero;----------------------- External Memory Controller (EMC) Definitons ----------- 387*10465441SEvalZero 388*10465441SEvalZeroEMC_BASE EQU 0xFFE08000 ; EMC Base Address 389*10465441SEvalZero 390*10465441SEvalZeroEMC_CTRL_OFS EQU 0x000 391*10465441SEvalZeroEMC_STAT_OFS EQU 0x004 392*10465441SEvalZeroEMC_CONFIG_OFS EQU 0x008 393*10465441SEvalZeroEMC_DYN_CTRL_OFS EQU 0x020 394*10465441SEvalZeroEMC_DYN_RFSH_OFS EQU 0x024 395*10465441SEvalZeroEMC_DYN_RD_CFG_OFS EQU 0x028 396*10465441SEvalZeroEMC_DYN_RP_OFS EQU 0x030 397*10465441SEvalZeroEMC_DYN_RAS_OFS EQU 0x034 398*10465441SEvalZeroEMC_DYN_SREX_OFS EQU 0x038 399*10465441SEvalZeroEMC_DYN_APR_OFS EQU 0x03C 400*10465441SEvalZeroEMC_DYN_DAL_OFS EQU 0x040 401*10465441SEvalZeroEMC_DYN_WR_OFS EQU 0x044 402*10465441SEvalZeroEMC_DYN_RC_OFS EQU 0x048 403*10465441SEvalZeroEMC_DYN_RFC_OFS EQU 0x04C 404*10465441SEvalZeroEMC_DYN_XSR_OFS EQU 0x050 405*10465441SEvalZeroEMC_DYN_RRD_OFS EQU 0x054 406*10465441SEvalZeroEMC_DYN_MRD_OFS EQU 0x058 407*10465441SEvalZeroEMC_DYN_CFG0_OFS EQU 0x100 408*10465441SEvalZeroEMC_DYN_RASCAS0_OFS EQU 0x104 409*10465441SEvalZeroEMC_DYN_CFG1_OFS EQU 0x140 410*10465441SEvalZeroEMC_DYN_RASCAS1_OFS EQU 0x144 411*10465441SEvalZeroEMC_DYN_CFG2_OFS EQU 0x160 412*10465441SEvalZeroEMC_DYN_RASCAS2_OFS EQU 0x164 413*10465441SEvalZeroEMC_DYN_CFG3_OFS EQU 0x180 414*10465441SEvalZeroEMC_DYN_RASCAS3_OFS EQU 0x184 415*10465441SEvalZeroEMC_STA_CFG0_OFS EQU 0x200 416*10465441SEvalZeroEMC_STA_WWEN0_OFS EQU 0x204 417*10465441SEvalZeroEMC_STA_WOEN0_OFS EQU 0x208 418*10465441SEvalZeroEMC_STA_WRD0_OFS EQU 0x20C 419*10465441SEvalZeroEMC_STA_WPAGE0_OFS EQU 0x210 420*10465441SEvalZeroEMC_STA_WWR0_OFS EQU 0x214 421*10465441SEvalZeroEMC_STA_WTURN0_OFS EQU 0x218 422*10465441SEvalZeroEMC_STA_CFG1_OFS EQU 0x220 423*10465441SEvalZeroEMC_STA_WWEN1_OFS EQU 0x224 424*10465441SEvalZeroEMC_STA_WOEN1_OFS EQU 0x228 425*10465441SEvalZeroEMC_STA_WRD1_OFS EQU 0x22C 426*10465441SEvalZeroEMC_STA_WPAGE1_OFS EQU 0x230 427*10465441SEvalZeroEMC_STA_WWR1_OFS EQU 0x234 428*10465441SEvalZeroEMC_STA_WTURN1_OFS EQU 0x238 429*10465441SEvalZeroEMC_STA_CFG2_OFS EQU 0x240 430*10465441SEvalZeroEMC_STA_WWEN2_OFS EQU 0x244 431*10465441SEvalZeroEMC_STA_WOEN2_OFS EQU 0x248 432*10465441SEvalZeroEMC_STA_WRD2_OFS EQU 0x24C 433*10465441SEvalZeroEMC_STA_WPAGE2_OFS EQU 0x250 434*10465441SEvalZeroEMC_STA_WWR2_OFS EQU 0x254 435*10465441SEvalZeroEMC_STA_WTURN2_OFS EQU 0x258 436*10465441SEvalZeroEMC_STA_CFG3_OFS EQU 0x260 437*10465441SEvalZeroEMC_STA_WWEN3_OFS EQU 0x264 438*10465441SEvalZeroEMC_STA_WOEN3_OFS EQU 0x268 439*10465441SEvalZeroEMC_STA_WRD3_OFS EQU 0x26C 440*10465441SEvalZeroEMC_STA_WPAGE3_OFS EQU 0x270 441*10465441SEvalZeroEMC_STA_WWR3_OFS EQU 0x274 442*10465441SEvalZeroEMC_STA_WTURN3_OFS EQU 0x278 443*10465441SEvalZeroEMC_STA_EXT_W_OFS EQU 0x880 444*10465441SEvalZero 445*10465441SEvalZero; Constants 446*10465441SEvalZeroNORMAL_CMD EQU (0x0 << 7) ; NORMAL Command 447*10465441SEvalZeroMODE_CMD EQU (0x1 << 7) ; MODE Command 448*10465441SEvalZeroPALL_CMD EQU (0x2 << 7) ; Precharge All Command 449*10465441SEvalZeroNOP_CMD EQU (0x3 << 7) ; NOP Command 450*10465441SEvalZero 451*10465441SEvalZeroBUFEN_Const EQU (1 << 19) ; Buffer enable bit 452*10465441SEvalZeroEMC_PCONP_Const EQU (1 << 11) ; PCONP val to enable power for EMC 453*10465441SEvalZero 454*10465441SEvalZero; External Memory Pins definitions 455*10465441SEvalZero; pin functions for SDRAM, NOR and NAND flash interfacing 456*10465441SEvalZeroEMC_PINSEL5_Val EQU 0x05010115 ; !CAS, !RAS, CLKOUT0, !DYCS0, DQMOUT0, DQMOUT1 457*10465441SEvalZeroEMC_PINSEL6_Val EQU 0x55555555 ; D0 .. D15 458*10465441SEvalZeroEMC_PINSEL8_Val EQU 0x55555555 ; A0 .. A15 459*10465441SEvalZeroEMC_PINSEL9_Val EQU 0x50055555; ; A16 .. A23, !OE, !WE, !CS0, !CS1 460*10465441SEvalZero 461*10465441SEvalZero;// External Memory Controller Setup (EMC) --------------------------------- 462*10465441SEvalZero;// <e> External Memory Controller Setup (EMC) 463*10465441SEvalZeroEMC_SETUP EQU 0 464*10465441SEvalZero 465*10465441SEvalZero;// <h> EMC Control Register (EMCControl) 466*10465441SEvalZero;// <i> Controls operation of the memory controller 467*10465441SEvalZero;// <o0.2> L: Low-power mode enable 468*10465441SEvalZero;// <o0.1> M: Address mirror enable 469*10465441SEvalZero;// <o0.0> E: EMC enable 470*10465441SEvalZero;// </h> 471*10465441SEvalZeroEMC_CTRL_Val EQU 0x00000001 472*10465441SEvalZero 473*10465441SEvalZero;// <h> EMC Configuration Register (EMCConfig) 474*10465441SEvalZero;// <i> Configures operation of the memory controller 475*10465441SEvalZero;// <o0.8> CCLK: CLKOUT ratio 476*10465441SEvalZero;// <0=> 1:1 477*10465441SEvalZero;// <1=> 1:2 478*10465441SEvalZero;// <o0.0> Endian mode 479*10465441SEvalZero;// <0=> Little-endian 480*10465441SEvalZero;// <1=> Big-endian 481*10465441SEvalZero;// </h> 482*10465441SEvalZeroEMC_CONFIG_Val EQU 0x00000000 483*10465441SEvalZero 484*10465441SEvalZero;// Dynamic Memory Interface Setup --------------------------------------- 485*10465441SEvalZero;// <e> Dynamic Memory Interface Setup 486*10465441SEvalZeroEMC_DYNAMIC_SETUP EQU 1 487*10465441SEvalZero 488*10465441SEvalZero;// <h> Dynamic Memory Refresh Timer Register (EMCDynamicRefresh) 489*10465441SEvalZero;// <i> Configures dynamic memory refresh operation 490*10465441SEvalZero;// <o0.0..10> REFRESH: Refresh timer <0x000-0x7FF> 491*10465441SEvalZero;// <i> 0 = refresh disabled, 0x01-0x7FF: value * 16 CCLKS 492*10465441SEvalZero;// </h> 493*10465441SEvalZeroEMC_DYN_RFSH_Val EQU 0x0000001C 494*10465441SEvalZero 495*10465441SEvalZero;// <h> Dynamic Memory Read Configuration Register (EMCDynamicReadConfig) 496*10465441SEvalZero;// <i> Configures the dynamic memory read strategy 497*10465441SEvalZero;// <o0.0..1> RD: Read data strategy 498*10465441SEvalZero;// <0=> Clock out delayed strategy 499*10465441SEvalZero;// <1=> Command delayed strategy 500*10465441SEvalZero;// <2=> Command delayed strategy plus one clock cycle 501*10465441SEvalZero;// <3=> Command delayed strategy plus two clock cycles 502*10465441SEvalZero;// </h> 503*10465441SEvalZeroEMC_DYN_RD_CFG_Val EQU 0x00000001 504*10465441SEvalZero 505*10465441SEvalZero;// <h> Dynamic Memory Timings 506*10465441SEvalZero;// <h> Dynamic Memory Percentage Command Period Register (EMCDynamictRP) 507*10465441SEvalZero;// <o0.0..3> tRP: Precharge command period <1-16> <#-1> 508*10465441SEvalZero;// <i> The delay is in EMCCLK cycles 509*10465441SEvalZero;// <i> This value is normally found in SDRAM data sheets as tRP 510*10465441SEvalZero;// </h> 511*10465441SEvalZero;// <h> Dynamic Memory Active to Precharge Command Period Register (EMCDynamictRAS) 512*10465441SEvalZero;// <o1.0..3> tRAS: Active to precharge command period <1-16> <#-1> 513*10465441SEvalZero;// <i> The delay is in EMCCLK cycles 514*10465441SEvalZero;// <i> This value is normally found in SDRAM data sheets as tRAS 515*10465441SEvalZero;// </h> 516*10465441SEvalZero;// <h> Dynamic Memory Self-refresh Exit Time Register (EMCDynamictSREX) 517*10465441SEvalZero;// <o2.0..3> tSREX: Self-refresh exit time <1-16> <#-1> 518*10465441SEvalZero;// <i> The delay is in CCLK cycles 519*10465441SEvalZero;// <i> This value is normally found in SDRAM data sheets as tSREX, 520*10465441SEvalZero;// <i> for devices without this parameter you use the same value as tXSR 521*10465441SEvalZero;// </h> 522*10465441SEvalZero;// <h> Dynamic Memory Last Data Out to Active Time Register (EMCDynamictAPR) 523*10465441SEvalZero;// <o3.0..3> tAPR: Last-data-out to active command time <1-16> <#-1> 524*10465441SEvalZero;// <i> The delay is in CCLK cycles 525*10465441SEvalZero;// <i> This value is normally found in SDRAM data sheets as tAPR 526*10465441SEvalZero;// </h> 527*10465441SEvalZero;// <h> Dynamic Memory Data-in to Active Command Time Register (EMCDynamictDAL) 528*10465441SEvalZero;// <o4.0..3> tDAL: Data-in to active command time <1-16> <#-1> 529*10465441SEvalZero;// <i> The delay is in CCLK cycles 530*10465441SEvalZero;// <i> This value is normally found in SDRAM data sheets as tDAL or tAPW 531*10465441SEvalZero;// </h> 532*10465441SEvalZero;// <h> Dynamic Memory Write Recovery Time Register (EMCDynamictWR) 533*10465441SEvalZero;// <o5.0..3> tWR: Write recovery time <1-16> <#-1> 534*10465441SEvalZero;// <i> The delay is in CCLK cycles 535*10465441SEvalZero;// <i> This value is normally found in SDRAM data sheets as tWR, tDPL, tRWL, or tRDL 536*10465441SEvalZero;// </h> 537*10465441SEvalZero;// <h> Dynamic Memory Active to Active Command Period Register (EMCDynamictRC) 538*10465441SEvalZero;// <o6.0..4> tRC: Active to active command period <1-32> <#-1> 539*10465441SEvalZero;// <i> The delay is in CCLK cycles 540*10465441SEvalZero;// <i> This value is normally found in SDRAM data sheets as tRC 541*10465441SEvalZero;// </h> 542*10465441SEvalZero;// <h> Dynamic Memory Auto-refresh Period Register (EMCDynamictRFC) 543*10465441SEvalZero;// <o7.0..4> tRFC: Auto-refresh period and auto-refresh to active command period <1-32> <#-1> 544*10465441SEvalZero;// <i> The delay is in CCLK cycles 545*10465441SEvalZero;// <i> This value is normally found in SDRAM data sheets as tRFC or tRC 546*10465441SEvalZero;// </h> 547*10465441SEvalZero;// <h> Dynamic Memory Exit Self-refresh Register (EMCDynamictXSR) 548*10465441SEvalZero;// <o8.0..4> tXSR: Exit self-refresh to active command time <1-32> <#-1> 549*10465441SEvalZero;// <i> The delay is in CCLK cycles 550*10465441SEvalZero;// <i> This value is normally found in SDRAM data sheets as tXSR 551*10465441SEvalZero;// </h> 552*10465441SEvalZero;// <h> Dynamic Memory Active Bank A to Active Bank B Time Register (EMCDynamicRRD) 553*10465441SEvalZero;// <o9.0..3> tRRD: Active bank A to active bank B latency <1-16> <#-1> 554*10465441SEvalZero;// <i> The delay is in CCLK cycles 555*10465441SEvalZero;// <i> This value is normally found in SDRAM data sheets as tRRD 556*10465441SEvalZero;// </h> 557*10465441SEvalZero;// <h> Dynamic Memory Load Mode Register to Active Command Time (EMCDynamictMRD) 558*10465441SEvalZero;// <o10.0..3> tMRD: Load mode register to active command time <1-16> <#-1> 559*10465441SEvalZero;// <i> The delay is in CCLK cycles 560*10465441SEvalZero;// <i> This value is normally found in SDRAM data sheets as tMRD or tRSA 561*10465441SEvalZero;// </h> 562*10465441SEvalZero;// </h> 563*10465441SEvalZeroEMC_DYN_RP_Val EQU 0x00000002 564*10465441SEvalZeroEMC_DYN_RAS_Val EQU 0x00000003 565*10465441SEvalZeroEMC_DYN_SREX_Val EQU 0x00000007 566*10465441SEvalZeroEMC_DYN_APR_Val EQU 0x00000002 567*10465441SEvalZeroEMC_DYN_DAL_Val EQU 0x00000005 568*10465441SEvalZeroEMC_DYN_WR_Val EQU 0x00000001 569*10465441SEvalZeroEMC_DYN_RC_Val EQU 0x00000005 570*10465441SEvalZeroEMC_DYN_RFC_Val EQU 0x00000005 571*10465441SEvalZeroEMC_DYN_XSR_Val EQU 0x00000007 572*10465441SEvalZeroEMC_DYN_RRD_Val EQU 0x00000001 573*10465441SEvalZeroEMC_DYN_MRD_Val EQU 0x00000002 574*10465441SEvalZero 575*10465441SEvalZero;// <e> Configure External Bus Behaviour for Dynamic CS0 Area 576*10465441SEvalZeroEMC_DYNCS0_SETUP EQU 1 577*10465441SEvalZero 578*10465441SEvalZero;// <h> Dynamic Memory Configuration Register (EMCDynamicConfig0) 579*10465441SEvalZero;// <i> Defines the configuration information for the dynamic memory CS0 580*10465441SEvalZero;// <o0.20> P: Write protect 581*10465441SEvalZero;// <o0.19> B: Buffer enable 582*10465441SEvalZero;// <o0.14> AM 14: External bus data width 583*10465441SEvalZero;// <0=> 16 bit 584*10465441SEvalZero;// <1=> 32 bit 585*10465441SEvalZero;// <o0.12> AM 12: External bus memory type 586*10465441SEvalZero;// <0=> High-performance 587*10465441SEvalZero;// <1=> Low-power SDRAM 588*10465441SEvalZero;// <o0.7..11> AM 11..7: External bus address mapping (Row, Bank, Column) 589*10465441SEvalZero;// <0x00=> 16 Mb = 2MB (2Mx8), 2 banks, row length = 11, column length = 9 590*10465441SEvalZero;// <0x01=> 16 Mb = 2MB (1Mx16), 2 banks, row length = 11, column length = 8 591*10465441SEvalZero;// <0x04=> 64 Mb = 8MB (8Mx8), 4 banks, row length = 12, column length = 9 592*10465441SEvalZero;// <0x05=> 64 Mb = 8MB (4Mx16), 4 banks, row length = 12, column length = 8 593*10465441SEvalZero;// <0x08=> 128 Mb = 16MB (16Mx8), 4 banks, row length = 12, column length = 10 594*10465441SEvalZero;// <0x09=> 128 Mb = 16MB (8Mx16), 4 banks, row length = 12, column length = 9 595*10465441SEvalZero;// <0x0C=> 256 Mb = 32MB (32Mx8), 4 banks, row length = 13, column length = 10 596*10465441SEvalZero;// <0x0D=> 256 Mb = 32MB (16Mx16), 4 banks, row length = 13, column length = 9 597*10465441SEvalZero;// <0x10=> 512 Mb = 64MB (64Mx8), 4 banks, row length = 13, column length = 11 598*10465441SEvalZero;// <0x11=> 512 Mb = 64MB (32Mx16), 4 banks, row length = 13, column length = 10 599*10465441SEvalZero;// <o0.3..4> MD: Memory device 600*10465441SEvalZero;// <0=> SDRAM 601*10465441SEvalZero;// <1=> Low-power SDRAM 602*10465441SEvalZero;// <2=> Micron SyncFlash 603*10465441SEvalZero;// </h> 604*10465441SEvalZeroEMC_DYN_CFG0_Val EQU 0x00080680 605*10465441SEvalZero 606*10465441SEvalZero;// <h> Dynamic Memory RAS & CAS Delay register (EMCDynamicRASCAS0) 607*10465441SEvalZero;// <i> Controls the RAS and CAS latencies for the dynamic memory CS0 608*10465441SEvalZero;// <o0.8..9> CAS: CAS latency 609*10465441SEvalZero;// <1=> One CCLK cycle 610*10465441SEvalZero;// <2=> Two CCLK cycles 611*10465441SEvalZero;// <3=> Three CCLK cycles 612*10465441SEvalZero;// <o0.0..1> RAS: RAS latency (active to read/write delay) 613*10465441SEvalZero;// <1=> One CCLK cycle 614*10465441SEvalZero;// <2=> Two CCLK cycles 615*10465441SEvalZero;// <3=> Three CCLK cycles 616*10465441SEvalZero;// </h> 617*10465441SEvalZeroEMC_DYN_RASCAS0_Val EQU 0x00000303 618*10465441SEvalZero 619*10465441SEvalZero;// </e> End of Dynamic Setup for CS0 Area 620*10465441SEvalZero 621*10465441SEvalZero 622*10465441SEvalZero;// <e> Configure External Bus Behaviour for Dynamic CS1 Area 623*10465441SEvalZeroEMC_DYNCS1_SETUP EQU 0 624*10465441SEvalZero 625*10465441SEvalZero;// <h> Dynamic Memory Configuration Register (EMCDynamicConfig1) 626*10465441SEvalZero;// <i> Defines the configuration information for the dynamic memory CS1 627*10465441SEvalZero;// <o0.20> P: Write protect 628*10465441SEvalZero;// <o0.19> B: Buffer enable 629*10465441SEvalZero;// <o0.14> AM 14: External bus data width 630*10465441SEvalZero;// <0=> 16 bit 631*10465441SEvalZero;// <1=> 32 bit 632*10465441SEvalZero;// <o0.12> AM 12: External bus memory type 633*10465441SEvalZero;// <0=> High-performance 634*10465441SEvalZero;// <1=> Low-power SDRAM 635*10465441SEvalZero;// <o0.7..11> AM 11..7: External bus address mapping (Row, Bank, Column) 636*10465441SEvalZero;// <0x00=> 16 Mb = 2MB (2Mx8), 2 banks, row length = 11, column length = 9 637*10465441SEvalZero;// <0x01=> 16 Mb = 2MB (1Mx16), 2 banks, row length = 11, column length = 8 638*10465441SEvalZero;// <0x04=> 64 Mb = 8MB (8Mx8), 4 banks, row length = 12, column length = 9 639*10465441SEvalZero;// <0x05=> 64 Mb = 8MB (4Mx16), 4 banks, row length = 12, column length = 8 640*10465441SEvalZero;// <0x08=> 128 Mb = 16MB (16Mx8), 4 banks, row length = 12, column length = 10 641*10465441SEvalZero;// <0x09=> 128 Mb = 16MB (8Mx16), 4 banks, row length = 12, column length = 9 642*10465441SEvalZero;// <0x0C=> 256 Mb = 32MB (32Mx8), 4 banks, row length = 13, column length = 10 643*10465441SEvalZero;// <0x0D=> 256 Mb = 32MB (16Mx16), 4 banks, row length = 13, column length = 9 644*10465441SEvalZero;// <0x10=> 512 Mb = 64MB (64Mx8), 4 banks, row length = 13, column length = 11 645*10465441SEvalZero;// <0x11=> 512 Mb = 64MB (32Mx16), 4 banks, row length = 13, column length = 10 646*10465441SEvalZero;// <o0.3..4> MD: Memory device 647*10465441SEvalZero;// <0=> SDRAM 648*10465441SEvalZero;// <1=> Low-power SDRAM 649*10465441SEvalZero;// <2=> Micron SyncFlash 650*10465441SEvalZero;// </h> 651*10465441SEvalZeroEMC_DYN_CFG1_Val EQU 0x00000000 652*10465441SEvalZero 653*10465441SEvalZero;// <h> Dynamic Memory RAS & CAS Delay register (EMCDynamicRASCAS1) 654*10465441SEvalZero;// <i> Controls the RAS and CAS latencies for the dynamic memory CS1 655*10465441SEvalZero;// <o0.8..9> CAS: CAS latency 656*10465441SEvalZero;// <1=> One CCLK cycle 657*10465441SEvalZero;// <2=> Two CCLK cycles 658*10465441SEvalZero;// <3=> Three CCLK cycles 659*10465441SEvalZero;// <o0.0..1> RAS: RAS latency (active to read/write delay) 660*10465441SEvalZero;// <1=> One CCLK cycle 661*10465441SEvalZero;// <2=> Two CCLK cycles 662*10465441SEvalZero;// <3=> Three CCLK cycles 663*10465441SEvalZero;// </h> 664*10465441SEvalZeroEMC_DYN_RASCAS1_Val EQU 0x00000303 665*10465441SEvalZero 666*10465441SEvalZero;// </e> End of Dynamic Setup for CS1 Area 667*10465441SEvalZero 668*10465441SEvalZero;// <e> Configure External Bus Behaviour for Dynamic CS2 Area 669*10465441SEvalZeroEMC_DYNCS2_SETUP EQU 0 670*10465441SEvalZero 671*10465441SEvalZero;// <h> Dynamic Memory Configuration Register (EMCDynamicConfig2) 672*10465441SEvalZero;// <i> Defines the configuration information for the dynamic memory CS2 673*10465441SEvalZero;// <o0.20> P: Write protect 674*10465441SEvalZero;// <o0.19> B: Buffer enable 675*10465441SEvalZero;// <o0.14> AM 14: External bus data width 676*10465441SEvalZero;// <0=> 16 bit 677*10465441SEvalZero;// <1=> 32 bit 678*10465441SEvalZero;// <o0.12> AM 12: External bus memory type 679*10465441SEvalZero;// <0=> High-performance 680*10465441SEvalZero;// <1=> Low-power SDRAM 681*10465441SEvalZero;// <o0.7..11> AM 11..7: External bus address mapping (Row, Bank, Column) 682*10465441SEvalZero;// <0x00=> 16 Mb = 2MB (2Mx8), 2 banks, row length = 11, column length = 9 683*10465441SEvalZero;// <0x01=> 16 Mb = 2MB (1Mx16), 2 banks, row length = 11, column length = 8 684*10465441SEvalZero;// <0x04=> 64 Mb = 8MB (8Mx8), 4 banks, row length = 12, column length = 9 685*10465441SEvalZero;// <0x05=> 64 Mb = 8MB (4Mx16), 4 banks, row length = 12, column length = 8 686*10465441SEvalZero;// <0x08=> 128 Mb = 16MB (16Mx8), 4 banks, row length = 12, column length = 10 687*10465441SEvalZero;// <0x09=> 128 Mb = 16MB (8Mx16), 4 banks, row length = 12, column length = 9 688*10465441SEvalZero;// <0x0C=> 256 Mb = 32MB (32Mx8), 4 banks, row length = 13, column length = 10 689*10465441SEvalZero;// <0x0D=> 256 Mb = 32MB (16Mx16), 4 banks, row length = 13, column length = 9 690*10465441SEvalZero;// <0x10=> 512 Mb = 64MB (64Mx8), 4 banks, row length = 13, column length = 11 691*10465441SEvalZero;// <0x11=> 512 Mb = 64MB (32Mx16), 4 banks, row length = 13, column length = 10 692*10465441SEvalZero;// <o0.3..4> MD: Memory device 693*10465441SEvalZero;// <0=> SDRAM 694*10465441SEvalZero;// <1=> Low-power SDRAM 695*10465441SEvalZero;// <2=> Micron SyncFlash 696*10465441SEvalZero;// </h> 697*10465441SEvalZeroEMC_DYN_CFG2_Val EQU 0x00000000 698*10465441SEvalZero 699*10465441SEvalZero;// <h> Dynamic Memory RAS & CAS Delay register (EMCDynamicRASCAS2) 700*10465441SEvalZero;// <i> Controls the RAS and CAS latencies for the dynamic memory CS2 701*10465441SEvalZero;// <o0.8..9> CAS: CAS latency 702*10465441SEvalZero;// <1=> One CCLK cycle 703*10465441SEvalZero;// <2=> Two CCLK cycles 704*10465441SEvalZero;// <3=> Three CCLK cycles 705*10465441SEvalZero;// <o0.0..1> RAS: RAS latency (active to read/write delay) 706*10465441SEvalZero;// <1=> One CCLK cycle 707*10465441SEvalZero;// <2=> Two CCLK cycles 708*10465441SEvalZero;// <3=> Three CCLK cycles 709*10465441SEvalZero;// </h> 710*10465441SEvalZeroEMC_DYN_RASCAS2_Val EQU 0x00000303 711*10465441SEvalZero 712*10465441SEvalZero;// </e> End of Dynamic Setup for CS2 Area 713*10465441SEvalZero 714*10465441SEvalZero;// <e> Configure External Bus Behaviour for Dynamic CS3 Area 715*10465441SEvalZeroEMC_DYNCS3_SETUP EQU 0 716*10465441SEvalZero 717*10465441SEvalZero;// <h> Dynamic Memory Configuration Register (EMCDynamicConfig3) 718*10465441SEvalZero;// <i> Defines the configuration information for the dynamic memory CS3 719*10465441SEvalZero;// <o0.20> P: Write protect 720*10465441SEvalZero;// <o0.19> B: Buffer enable 721*10465441SEvalZero;// <o0.14> AM 14: External bus data width 722*10465441SEvalZero;// <0=> 16 bit 723*10465441SEvalZero;// <1=> 32 bit 724*10465441SEvalZero;// <o0.12> AM 12: External bus memory type 725*10465441SEvalZero;// <0=> High-performance 726*10465441SEvalZero;// <1=> Low-power SDRAM 727*10465441SEvalZero;// <o0.7..11> AM 11..7: External bus address mapping (Row, Bank, Column) 728*10465441SEvalZero;// <0x00=> 16 Mb = 2MB (2Mx8), 2 banks, row length = 11, column length = 9 729*10465441SEvalZero;// <0x01=> 16 Mb = 2MB (1Mx16), 2 banks, row length = 11, column length = 8 730*10465441SEvalZero;// <0x04=> 64 Mb = 8MB (8Mx8), 4 banks, row length = 12, column length = 9 731*10465441SEvalZero;// <0x05=> 64 Mb = 8MB (4Mx16), 4 banks, row length = 12, column length = 8 732*10465441SEvalZero;// <0x08=> 128 Mb = 16MB (16Mx8), 4 banks, row length = 12, column length = 10 733*10465441SEvalZero;// <0x09=> 128 Mb = 16MB (8Mx16), 4 banks, row length = 12, column length = 9 734*10465441SEvalZero;// <0x0C=> 256 Mb = 32MB (32Mx8), 4 banks, row length = 13, column length = 10 735*10465441SEvalZero;// <0x0D=> 256 Mb = 32MB (16Mx16), 4 banks, row length = 13, column length = 9 736*10465441SEvalZero;// <0x10=> 512 Mb = 64MB (64Mx8), 4 banks, row length = 13, column length = 11 737*10465441SEvalZero;// <0x11=> 512 Mb = 64MB (32Mx16), 4 banks, row length = 13, column length = 10 738*10465441SEvalZero;// <o0.3..4> MD: Memory device 739*10465441SEvalZero;// <0=> SDRAM 740*10465441SEvalZero;// <1=> Low-power SDRAM 741*10465441SEvalZero;// <2=> Micron SyncFlash 742*10465441SEvalZero;// </h> 743*10465441SEvalZeroEMC_DYN_CFG3_Val EQU 0x00000000 744*10465441SEvalZero 745*10465441SEvalZero;// <h> Dynamic Memory RAS & CAS Delay register (EMCDynamicRASCAS3) 746*10465441SEvalZero;// <i> Controls the RAS and CAS latencies for the dynamic memory CS3 747*10465441SEvalZero;// <o0.8..9> CAS: CAS latency 748*10465441SEvalZero;// <1=> One CCLK cycle 749*10465441SEvalZero;// <2=> Two CCLK cycles 750*10465441SEvalZero;// <3=> Three CCLK cycles 751*10465441SEvalZero;// <o0.0..1> RAS: RAS latency (active to read/write delay) 752*10465441SEvalZero;// <1=> One CCLK cycle 753*10465441SEvalZero;// <2=> Two CCLK cycles 754*10465441SEvalZero;// <3=> Three CCLK cycles 755*10465441SEvalZero;// </h> 756*10465441SEvalZeroEMC_DYN_RASCAS3_Val EQU 0x00000303 757*10465441SEvalZero 758*10465441SEvalZero;// </e> End of Dynamic Setup for CS3 Area 759*10465441SEvalZero 760*10465441SEvalZero;// </e> End of Dynamic Setup 761*10465441SEvalZero 762*10465441SEvalZero;// Static Memory Interface Setup ---------------------------------------- 763*10465441SEvalZero;// <e> Static Memory Interface Setup 764*10465441SEvalZeroEMC_STATIC_SETUP EQU 1 765*10465441SEvalZero 766*10465441SEvalZero;// Configure External Bus Behaviour for Static CS0 Area --------------- 767*10465441SEvalZero;// <e> Configure External Bus Behaviour for Static CS0 Area 768*10465441SEvalZeroEMC_STACS0_SETUP EQU 1 769*10465441SEvalZero 770*10465441SEvalZero;// <h> Static Memory Configuration Register (EMCStaticConfig0) 771*10465441SEvalZero;// <i> Defines the configuration information for the static memory CS0 772*10465441SEvalZero;// <o0.20> WP: Write protect 773*10465441SEvalZero;// <o0.19> B: Buffer enable 774*10465441SEvalZero;// <o0.8> EW: Extended wait enable 775*10465441SEvalZero;// <o0.7> PB: Byte lane state 776*10465441SEvalZero;// <0=> For reads BLSn are HIGH, for writes BLSn are LOW 777*10465441SEvalZero;// <1=> For reads BLSn are LOW, for writes BLSn are LOW 778*10465441SEvalZero;// <o0.6> PC: Chip select polarity 779*10465441SEvalZero;// <0=> Active LOW chip select 780*10465441SEvalZero;// <1=> Active HIGH chip select 781*10465441SEvalZero;// <o0.3> PM: Page mode enable 782*10465441SEvalZero;// <o0.0..1> MW: Memory width 783*10465441SEvalZero;// <0=> 8 bit 784*10465441SEvalZero;// <1=> 16 bit 785*10465441SEvalZero;// <2=> 32 bit 786*10465441SEvalZero;// </h> 787*10465441SEvalZeroEMC_STA_CFG0_Val EQU 0x00000081 788*10465441SEvalZero 789*10465441SEvalZero;// <h> Static Memory Write Enable Delay Register (EMCStaticWaitWen0) 790*10465441SEvalZero;// <i> Selects the delay from CS0 to write enable 791*10465441SEvalZero;// <o.0..3> WAITWEN: Wait write enable <1-16> <#-1> 792*10465441SEvalZero;// <i> The delay is in CCLK cycles 793*10465441SEvalZero;// </h> 794*10465441SEvalZeroEMC_STA_WWEN0_Val EQU 0x00000002 795*10465441SEvalZero 796*10465441SEvalZero;// <h> Static Memory Output Enable Delay register (EMCStaticWaitOen0) 797*10465441SEvalZero;// <i> Selects the delay from CS0 or address change, whichever is later, to output enable 798*10465441SEvalZero;// <o.0..3> WAITOEN: Wait output enable <0-15> 799*10465441SEvalZero;// <i> The delay is in CCLK cycles 800*10465441SEvalZero;// </h> 801*10465441SEvalZeroEMC_STA_WOEN0_Val EQU 0x00000002 802*10465441SEvalZero 803*10465441SEvalZero;// <h> Static Memory Read Delay Register (EMCStaticWaitRd0) 804*10465441SEvalZero;// <i> Selects the delay from CS0 to a read access 805*10465441SEvalZero;// <o.0..4> WAITRD: Non-page mode read wait states or asynchronous page mode read first access wait states <1-32> <#-1> 806*10465441SEvalZero;// <i> The delay is in CCLK cycles 807*10465441SEvalZero;// </h> 808*10465441SEvalZeroEMC_STA_WRD0_Val EQU 0x0000001F 809*10465441SEvalZero 810*10465441SEvalZero;// <h> Static Memory Page Mode Read Delay Register (EMCStaticWaitPage0) 811*10465441SEvalZero;// <i> Selects the delay for asynchronous page mode sequential accesses for CS0 812*10465441SEvalZero;// <o.0..4> WAITPAGE: Asynchronous page mode read after the first read wait states <1-32> <#-1> 813*10465441SEvalZero;// <i> The delay is in CCLK cycles 814*10465441SEvalZero;// </h> 815*10465441SEvalZeroEMC_STA_WPAGE0_Val EQU 0x0000001F 816*10465441SEvalZero 817*10465441SEvalZero;// <h> Static Memory Write Delay Register (EMCStaticWaitWr0) 818*10465441SEvalZero;// <i> Selects the delay from CS0 to a write access 819*10465441SEvalZero;// <o.0..4> WAITWR: Write wait states <2-33> <#-2> 820*10465441SEvalZero;// <i> The delay is in CCLK cycles 821*10465441SEvalZero;// </h> 822*10465441SEvalZeroEMC_STA_WWR0_Val EQU 0x0000001F 823*10465441SEvalZero 824*10465441SEvalZero;// <h> Static Memory Turn Round Delay Register (EMCStaticWaitTurn0) 825*10465441SEvalZero;// <i> Selects the number of bus turnaround cycles for CS0 826*10465441SEvalZero;// <o.0..4> WAITTURN: Bus turnaround cycles <1-16> <#-1> 827*10465441SEvalZero;// <i> The delay is in CCLK cycles 828*10465441SEvalZero;// </h> 829*10465441SEvalZeroEMC_STA_WTURN0_Val EQU 0x0000000F 830*10465441SEvalZero 831*10465441SEvalZero;// </e> End of Static Setup for Static CS0 Area 832*10465441SEvalZero 833*10465441SEvalZero;// Configure External Bus Behaviour for Static CS1 Area --------------- 834*10465441SEvalZero;// <e> Configure External Bus Behaviour for Static CS1 Area 835*10465441SEvalZeroEMC_STACS1_SETUP EQU 0 836*10465441SEvalZero 837*10465441SEvalZero;// <h> Static Memory Configuration Register (EMCStaticConfig1) 838*10465441SEvalZero;// <i> Defines the configuration information for the static memory CS1 839*10465441SEvalZero;// <o0.20> WP: Write protect 840*10465441SEvalZero;// <o0.19> B: Buffer enable 841*10465441SEvalZero;// <o0.8> EW: Extended wait enable 842*10465441SEvalZero;// <o0.7> PB: Byte lane state 843*10465441SEvalZero;// <0=> For reads BLSn are HIGH, for writes BLSn are LOW 844*10465441SEvalZero;// <1=> For reads BLSn are LOW, for writes BLSn are LOW 845*10465441SEvalZero;// <o0.6> PC: Chip select polarity 846*10465441SEvalZero;// <0=> Active LOW chip select 847*10465441SEvalZero;// <1=> Active HIGH chip select 848*10465441SEvalZero;// <o0.3> PM: Page mode enable 849*10465441SEvalZero;// <o0.0..1> MW: Memory width 850*10465441SEvalZero;// <0=> 8 bit 851*10465441SEvalZero;// <1=> 16 bit 852*10465441SEvalZero;// <2=> 32 bit 853*10465441SEvalZero;// </h> 854*10465441SEvalZeroEMC_STA_CFG1_Val EQU 0x00000000 855*10465441SEvalZero 856*10465441SEvalZero;// <h> Static Memory Write Enable Delay Register (EMCStaticWaitWen1) 857*10465441SEvalZero;// <i> Selects the delay from CS1 to write enable 858*10465441SEvalZero;// <o.0..3> WAITWEN: Wait write enable <1-16> <#-1> 859*10465441SEvalZero;// <i> The delay is in CCLK cycles 860*10465441SEvalZero;// </h> 861*10465441SEvalZeroEMC_STA_WWEN1_Val EQU 0x00000000 862*10465441SEvalZero 863*10465441SEvalZero;// <h> Static Memory Output Enable Delay register (EMCStaticWaitOen1) 864*10465441SEvalZero;// <i> Selects the delay from CS1 or address change, whichever is later, to output enable 865*10465441SEvalZero;// <o.0..3> WAITOEN: Wait output enable <0-15> 866*10465441SEvalZero;// <i> The delay is in CCLK cycles 867*10465441SEvalZero;// </h> 868*10465441SEvalZeroEMC_STA_WOEN1_Val EQU 0x00000000 869*10465441SEvalZero 870*10465441SEvalZero;// <h> Static Memory Read Delay Register (EMCStaticWaitRd1) 871*10465441SEvalZero;// <i> Selects the delay from CS1 to a read access 872*10465441SEvalZero;// <o.0..4> WAITRD: Non-page mode read wait states or asynchronous page mode read first access wait states <1-32> <#-1> 873*10465441SEvalZero;// <i> The delay is in CCLK cycles 874*10465441SEvalZero;// </h> 875*10465441SEvalZeroEMC_STA_WRD1_Val EQU 0x0000001F 876*10465441SEvalZero 877*10465441SEvalZero;// <h> Static Memory Page Mode Read Delay Register (EMCStaticWaitPage0) 878*10465441SEvalZero;// <i> Selects the delay for asynchronous page mode sequential accesses for CS1 879*10465441SEvalZero;// <o.0..4> WAITPAGE: Asynchronous page mode read after the first read wait states <1-32> <#-1> 880*10465441SEvalZero;// <i> The delay is in CCLK cycles 881*10465441SEvalZero;// </h> 882*10465441SEvalZeroEMC_STA_WPAGE1_Val EQU 0x0000001F 883*10465441SEvalZero 884*10465441SEvalZero;// <h> Static Memory Write Delay Register (EMCStaticWaitWr1) 885*10465441SEvalZero;// <i> Selects the delay from CS1 to a write access 886*10465441SEvalZero;// <o.0..4> WAITWR: Write wait states <2-33> <#-2> 887*10465441SEvalZero;// <i> The delay is in CCLK cycles 888*10465441SEvalZero;// </h> 889*10465441SEvalZeroEMC_STA_WWR1_Val EQU 0x0000001F 890*10465441SEvalZero 891*10465441SEvalZero;// <h> Static Memory Turn Round Delay Register (EMCStaticWaitTurn1) 892*10465441SEvalZero;// <i> Selects the number of bus turnaround cycles for CS1 893*10465441SEvalZero;// <o.0..4> WAITTURN: Bus turnaround cycles <1-16> <#-1> 894*10465441SEvalZero;// <i> The delay is in CCLK cycles 895*10465441SEvalZero;// </h> 896*10465441SEvalZeroEMC_STA_WTURN1_Val EQU 0x0000000F 897*10465441SEvalZero 898*10465441SEvalZero;// </e> End of Static Setup for Static CS1 Area 899*10465441SEvalZero 900*10465441SEvalZero;// Configure External Bus Behaviour for Static CS2 Area --------------- 901*10465441SEvalZero;// <e> Configure External Bus Behaviour for Static CS2 Area 902*10465441SEvalZeroEMC_STACS2_SETUP EQU 0 903*10465441SEvalZero 904*10465441SEvalZero;// <h> Static Memory Configuration Register (EMCStaticConfig2) 905*10465441SEvalZero;// <i> Defines the configuration information for the static memory CS2 906*10465441SEvalZero;// <o0.20> WP: Write protect 907*10465441SEvalZero;// <o0.19> B: Buffer enable 908*10465441SEvalZero;// <o0.8> EW: Extended wait enable 909*10465441SEvalZero;// <o0.7> PB: Byte lane state 910*10465441SEvalZero;// <0=> For reads BLSn are HIGH, for writes BLSn are LOW 911*10465441SEvalZero;// <1=> For reads BLSn are LOW, for writes BLSn are LOW 912*10465441SEvalZero;// <o0.6> PC: Chip select polarity 913*10465441SEvalZero;// <0=> Active LOW chip select 914*10465441SEvalZero;// <1=> Active HIGH chip select 915*10465441SEvalZero;// <o0.3> PM: Page mode enable 916*10465441SEvalZero;// <o0.0..1> MW: Memory width 917*10465441SEvalZero;// <0=> 8 bit 918*10465441SEvalZero;// <1=> 16 bit 919*10465441SEvalZero;// <2=> 32 bit 920*10465441SEvalZero;// </h> 921*10465441SEvalZeroEMC_STA_CFG2_Val EQU 0x00000000 922*10465441SEvalZero 923*10465441SEvalZero;// <h> Static Memory Write Enable Delay Register (EMCStaticWaitWen2) 924*10465441SEvalZero;// <i> Selects the delay from CS2 to write enable 925*10465441SEvalZero;// <o.0..3> WAITWEN: Wait write enable <1-16> <#-1> 926*10465441SEvalZero;// <i> The delay is in CCLK cycles 927*10465441SEvalZero;// </h> 928*10465441SEvalZeroEMC_STA_WWEN2_Val EQU 0x00000000 929*10465441SEvalZero 930*10465441SEvalZero;// <h> Static Memory Output Enable Delay register (EMCStaticWaitOen2) 931*10465441SEvalZero;// <i> Selects the delay from CS2 or address change, whichever is later, to output enable 932*10465441SEvalZero;// <o.0..3> WAITOEN: Wait output enable <0-15> 933*10465441SEvalZero;// <i> The delay is in CCLK cycles 934*10465441SEvalZero;// </h> 935*10465441SEvalZeroEMC_STA_WOEN2_Val EQU 0x00000000 936*10465441SEvalZero 937*10465441SEvalZero;// <h> Static Memory Read Delay Register (EMCStaticWaitRd2) 938*10465441SEvalZero;// <i> Selects the delay from CS2 to a read access 939*10465441SEvalZero;// <o.0..4> WAITRD: Non-page mode read wait states or asynchronous page mode read first access wait states <1-32> <#-1> 940*10465441SEvalZero;// <i> The delay is in CCLK cycles 941*10465441SEvalZero;// </h> 942*10465441SEvalZeroEMC_STA_WRD2_Val EQU 0x0000001F 943*10465441SEvalZero 944*10465441SEvalZero;// <h> Static Memory Page Mode Read Delay Register (EMCStaticWaitPage2) 945*10465441SEvalZero;// <i> Selects the delay for asynchronous page mode sequential accesses for CS2 946*10465441SEvalZero;// <o.0..4> WAITPAGE: Asynchronous page mode read after the first read wait states <1-32> <#-1> 947*10465441SEvalZero;// <i> The delay is in CCLK cycles 948*10465441SEvalZero;// </h> 949*10465441SEvalZeroEMC_STA_WPAGE2_Val EQU 0x0000001F 950*10465441SEvalZero 951*10465441SEvalZero;// <h> Static Memory Write Delay Register (EMCStaticWaitWr2) 952*10465441SEvalZero;// <i> Selects the delay from CS2 to a write access 953*10465441SEvalZero;// <o.0..4> WAITWR: Write wait states <2-33> <#-2> 954*10465441SEvalZero;// <i> The delay is in CCLK cycles 955*10465441SEvalZero;// </h> 956*10465441SEvalZeroEMC_STA_WWR2_Val EQU 0x0000001F 957*10465441SEvalZero 958*10465441SEvalZero;// <h> Static Memory Turn Round Delay Register (EMCStaticWaitTurn2) 959*10465441SEvalZero;// <i> Selects the number of bus turnaround cycles for CS2 960*10465441SEvalZero;// <o.0..4> WAITTURN: Bus turnaround cycles <1-16> <#-1> 961*10465441SEvalZero;// <i> The delay is in CCLK cycles 962*10465441SEvalZero;// </h> 963*10465441SEvalZeroEMC_STA_WTURN2_Val EQU 0x0000000F 964*10465441SEvalZero 965*10465441SEvalZero;// </e> End of Static Setup for Static CS2 Area 966*10465441SEvalZero 967*10465441SEvalZero;// Configure External Bus Behaviour for Static CS3 Area --------------- 968*10465441SEvalZero;// <e> Configure External Bus Behaviour for Static CS3 Area 969*10465441SEvalZeroEMC_STACS3_SETUP EQU 0 970*10465441SEvalZero 971*10465441SEvalZero;// <h> Static Memory Configuration Register (EMCStaticConfig3) 972*10465441SEvalZero;// <i> Defines the configuration information for the static memory CS3 973*10465441SEvalZero;// <o0.20> WP: Write protect 974*10465441SEvalZero;// <o0.19> B: Buffer enable 975*10465441SEvalZero;// <o0.8> EW: Extended wait enable 976*10465441SEvalZero;// <o0.7> PB: Byte lane state 977*10465441SEvalZero;// <0=> For reads BLSn are HIGH, for writes BLSn are LOW 978*10465441SEvalZero;// <1=> For reads BLSn are LOW, for writes BLSn are LOW 979*10465441SEvalZero;// <o0.6> PC: Chip select polarity 980*10465441SEvalZero;// <0=> Active LOW chip select 981*10465441SEvalZero;// <1=> Active HIGH chip select 982*10465441SEvalZero;// <o0.3> PM: Page mode enable 983*10465441SEvalZero;// <o0.0..1> MW: Memory width 984*10465441SEvalZero;// <0=> 8 bit 985*10465441SEvalZero;// <1=> 16 bit 986*10465441SEvalZero;// <2=> 32 bit 987*10465441SEvalZero;// </h> 988*10465441SEvalZeroEMC_STA_CFG3_Val EQU 0x00000000 989*10465441SEvalZero 990*10465441SEvalZero;// <h> Static Memory Write Enable Delay Register (EMCStaticWaitWen3) 991*10465441SEvalZero;// <i> Selects the delay from CS3 to write enable 992*10465441SEvalZero;// <o.0..3> WAITWEN: Wait write enable <1-16> <#-1> 993*10465441SEvalZero;// <i> The delay is in CCLK cycles 994*10465441SEvalZero;// </h> 995*10465441SEvalZeroEMC_STA_WWEN3_Val EQU 0x00000000 996*10465441SEvalZero 997*10465441SEvalZero;// <h> Static Memory Output Enable Delay register (EMCStaticWaitOen3) 998*10465441SEvalZero;// <i> Selects the delay from CS3 or address change, whichever is later, to output enable 999*10465441SEvalZero;// <o.0..3> WAITOEN: Wait output enable <0-15> 1000*10465441SEvalZero;// <i> The delay is in CCLK cycles 1001*10465441SEvalZero;// </h> 1002*10465441SEvalZeroEMC_STA_WOEN3_Val EQU 0x00000000 1003*10465441SEvalZero 1004*10465441SEvalZero;// <h> Static Memory Read Delay Register (EMCStaticWaitRd3) 1005*10465441SEvalZero;// <i> Selects the delay from CS3 to a read access 1006*10465441SEvalZero;// <o.0..4> WAITRD: Non-page mode read wait states or asynchronous page mode read first access wait states <1-32> <#-1> 1007*10465441SEvalZero;// <i> The delay is in CCLK cycles 1008*10465441SEvalZero;// </h> 1009*10465441SEvalZeroEMC_STA_WRD3_Val EQU 0x0000001F 1010*10465441SEvalZero 1011*10465441SEvalZero;// <h> Static Memory Page Mode Read Delay Register (EMCStaticWaitPage3) 1012*10465441SEvalZero;// <i> Selects the delay for asynchronous page mode sequential accesses for CS3 1013*10465441SEvalZero;// <o.0..4> WAITPAGE: Asynchronous page mode read after the first read wait states <1-32> <#-1> 1014*10465441SEvalZero;// <i> The delay is in CCLK cycles 1015*10465441SEvalZero;// </h> 1016*10465441SEvalZeroEMC_STA_WPAGE3_Val EQU 0x0000001F 1017*10465441SEvalZero 1018*10465441SEvalZero;// <h> Static Memory Write Delay Register (EMCStaticWaitWr3) 1019*10465441SEvalZero;// <i> Selects the delay from CS3 to a write access 1020*10465441SEvalZero;// <o.0..4> WAITWR: Write wait states <2-33> <#-2> 1021*10465441SEvalZero;// <i> The delay is in CCLK cycles 1022*10465441SEvalZero;// </h> 1023*10465441SEvalZeroEMC_STA_WWR3_Val EQU 0x0000001F 1024*10465441SEvalZero 1025*10465441SEvalZero;// <h> Static Memory Turn Round Delay Register (EMCStaticWaitTurn3) 1026*10465441SEvalZero;// <i> Selects the number of bus turnaround cycles for CS3 1027*10465441SEvalZero;// <o.0..4> WAITTURN: Bus turnaround cycles <1-16> <#-1> 1028*10465441SEvalZero;// <i> The delay is in CCLK cycles 1029*10465441SEvalZero;// </h> 1030*10465441SEvalZeroEMC_STA_WTURN3_Val EQU 0x0000000F 1031*10465441SEvalZero 1032*10465441SEvalZero;// </e> End of Static Setup for Static CS3 Area 1033*10465441SEvalZero 1034*10465441SEvalZero;// <h> Static Memory Extended Wait Register (EMCStaticExtendedWait) 1035*10465441SEvalZero;// <i> Time long static memory read and write transfers 1036*10465441SEvalZero;// <o.0..9> EXTENDEDWAIT: Extended wait time out <0-1023> 1037*10465441SEvalZero;// <i> The delay is in (16 * CCLK) cycles 1038*10465441SEvalZero;// </h> 1039*10465441SEvalZeroEMC_STA_EXT_W_Val EQU 0x00000000 1040*10465441SEvalZero 1041*10465441SEvalZero;// </e> End of Static Setup 1042*10465441SEvalZero 1043*10465441SEvalZero;// </e> End of EMC Setup 1044*10465441SEvalZero 1045*10465441SEvalZero 1046*10465441SEvalZero PRESERVE8 1047*10465441SEvalZero 1048*10465441SEvalZero; Area Definition and Entry Point 1049*10465441SEvalZero; Startup Code must be linked first at Address at which it expects to run. 1050*10465441SEvalZero 1051*10465441SEvalZero AREA RESET, CODE, READONLY 1052*10465441SEvalZero ARM 1053*10465441SEvalZero 1054*10465441SEvalZero 1055*10465441SEvalZero; Exception Vectors 1056*10465441SEvalZero; Mapped to Address 0. 1057*10465441SEvalZero; Absolute addressing mode must be used. 1058*10465441SEvalZero; Dummy Handlers are implemented as infinite loops which can be modified. 1059*10465441SEvalZero 1060*10465441SEvalZeroVectors LDR PC, Reset_Addr 1061*10465441SEvalZero LDR PC, Undef_Addr 1062*10465441SEvalZero LDR PC, SWI_Addr 1063*10465441SEvalZero LDR PC, PAbt_Addr 1064*10465441SEvalZero LDR PC, DAbt_Addr 1065*10465441SEvalZero NOP ; Reserved Vector 1066*10465441SEvalZero LDR PC, IRQ_Addr 1067*10465441SEvalZero LDR PC, FIQ_Addr 1068*10465441SEvalZero 1069*10465441SEvalZeroReset_Addr DCD Reset_Handler 1070*10465441SEvalZeroUndef_Addr DCD Undef_Handler 1071*10465441SEvalZeroSWI_Addr DCD SWI_Handler 1072*10465441SEvalZeroPAbt_Addr DCD PAbt_Handler 1073*10465441SEvalZeroDAbt_Addr DCD DAbt_Handler 1074*10465441SEvalZero DCD 0 ; Reserved Address 1075*10465441SEvalZeroIRQ_Addr DCD IRQ_Handler 1076*10465441SEvalZeroFIQ_Addr DCD FIQ_Handler 1077*10465441SEvalZero 1078*10465441SEvalZero 1079*10465441SEvalZero; Exception Handler 1080*10465441SEvalZero IMPORT rt_hw_trap_udef 1081*10465441SEvalZero IMPORT rt_hw_trap_swi 1082*10465441SEvalZero IMPORT rt_hw_trap_pabt 1083*10465441SEvalZero IMPORT rt_hw_trap_dabt 1084*10465441SEvalZero IMPORT rt_hw_trap_fiq 1085*10465441SEvalZero 1086*10465441SEvalZero; Prepare Fatal Context 1087*10465441SEvalZero MACRO 1088*10465441SEvalZero prepare_fatal 1089*10465441SEvalZero STMFD sp!, {r0-r3} 1090*10465441SEvalZero MOV r1, sp 1091*10465441SEvalZero ADD sp, sp, #16 1092*10465441SEvalZero SUB r2, lr, #4 1093*10465441SEvalZero MRS r3, spsr 1094*10465441SEvalZero 1095*10465441SEvalZero ; switch to SVC mode and no interrupt 1096*10465441SEvalZero MSR cpsr_c, #I_Bit :OR: F_Bit :OR: Mode_SVC 1097*10465441SEvalZero 1098*10465441SEvalZero STMFD sp!, {r0} ; old r0 1099*10465441SEvalZero ; get sp 1100*10465441SEvalZero ADD r0, sp, #4 1101*10465441SEvalZero STMFD sp!, {r3} ; cpsr 1102*10465441SEvalZero STMFD sp!, {r2} ; pc 1103*10465441SEvalZero STMFD sp!, {lr} ; lr 1104*10465441SEvalZero STMFD sp!, {r0} ; sp 1105*10465441SEvalZero STMFD sp!, {r4-r12} 1106*10465441SEvalZero 1107*10465441SEvalZero MOV r4, r1 1108*10465441SEvalZero 1109*10465441SEvalZero LDMFD r4!, {r0-r3} 1110*10465441SEvalZero STMFD sp!, {r0-r3} 1111*10465441SEvalZero 1112*10465441SEvalZero MOV r0, sp 1113*10465441SEvalZero MEND 1114*10465441SEvalZero 1115*10465441SEvalZeroUndef_Handler 1116*10465441SEvalZero prepare_fatal 1117*10465441SEvalZero BL rt_hw_trap_irq 1118*10465441SEvalZero B . 1119*10465441SEvalZero 1120*10465441SEvalZeroSWI_Handler 1121*10465441SEvalZero prepare_fatal 1122*10465441SEvalZero BL rt_hw_trap_swi 1123*10465441SEvalZero B . 1124*10465441SEvalZero 1125*10465441SEvalZeroPAbt_Handler 1126*10465441SEvalZero prepare_fatal 1127*10465441SEvalZero BL rt_hw_trap_pabt 1128*10465441SEvalZero B . 1129*10465441SEvalZero 1130*10465441SEvalZeroDAbt_Handler 1131*10465441SEvalZero prepare_fatal 1132*10465441SEvalZero BL rt_hw_trap_dabt 1133*10465441SEvalZero B . 1134*10465441SEvalZero 1135*10465441SEvalZeroFIQ_Handler 1136*10465441SEvalZero prepare_fatal 1137*10465441SEvalZero BL rt_hw_trap_fiq 1138*10465441SEvalZero B . 1139*10465441SEvalZero 1140*10465441SEvalZero; Reset Handler 1141*10465441SEvalZero 1142*10465441SEvalZero EXPORT Reset_Handler 1143*10465441SEvalZeroReset_Handler 1144*10465441SEvalZero 1145*10465441SEvalZero 1146*10465441SEvalZero; Clock Setup ------------------------------------------------------------------ 1147*10465441SEvalZero 1148*10465441SEvalZero IF (:LNOT:(:DEF:NO_CLOCK_SETUP)):LAND:(CLOCK_SETUP != 0) 1149*10465441SEvalZero LDR R0, =SCB_BASE 1150*10465441SEvalZero MOV R1, #0xAA 1151*10465441SEvalZero MOV R2, #0x55 1152*10465441SEvalZero 1153*10465441SEvalZero; Configure and Enable PLL 1154*10465441SEvalZero LDR R3, =SCS_Val ; Enable main oscillator 1155*10465441SEvalZero STR R3, [R0, #SCS_OFS] 1156*10465441SEvalZero 1157*10465441SEvalZero IF (SCS_Val:AND:OSCEN) != 0 1158*10465441SEvalZeroOSC_Loop LDR R3, [R0, #SCS_OFS] ; Wait for main osc stabilize 1159*10465441SEvalZero ANDS R3, R3, #OSCSTAT 1160*10465441SEvalZero BEQ OSC_Loop 1161*10465441SEvalZero ENDIF 1162*10465441SEvalZero 1163*10465441SEvalZero LDR R3, =CLKSRCSEL_Val ; Select PLL source clock 1164*10465441SEvalZero STR R3, [R0, #CLKSRCSEL_OFS] 1165*10465441SEvalZero LDR R3, =PLLCFG_Val 1166*10465441SEvalZero STR R3, [R0, #PLLCFG_OFS] 1167*10465441SEvalZero STR R1, [R0, #PLLFEED_OFS] 1168*10465441SEvalZero STR R2, [R0, #PLLFEED_OFS] 1169*10465441SEvalZero MOV R3, #PLLCON_PLLE 1170*10465441SEvalZero STR R3, [R0, #PLLCON_OFS] 1171*10465441SEvalZero STR R1, [R0, #PLLFEED_OFS] 1172*10465441SEvalZero STR R2, [R0, #PLLFEED_OFS] 1173*10465441SEvalZero 1174*10465441SEvalZero IF (CLKSRCSEL_Val:AND:3) != 2 1175*10465441SEvalZero; Wait until PLL Locked (if source is not RTC oscillator) 1176*10465441SEvalZeroPLL_Loop LDR R3, [R0, #PLLSTAT_OFS] 1177*10465441SEvalZero ANDS R3, R3, #PLLSTAT_PLOCK 1178*10465441SEvalZero BEQ PLL_Loop 1179*10465441SEvalZero ELSE 1180*10465441SEvalZero; Wait at least 200 cycles (if source is RTC oscillator) 1181*10465441SEvalZero MOV R3, #(200/4) 1182*10465441SEvalZeroPLL_Loop SUBS R3, R3, #1 1183*10465441SEvalZero BNE PLL_Loop 1184*10465441SEvalZero ENDIF 1185*10465441SEvalZero 1186*10465441SEvalZeroM_N_Lock LDR R3, [R0, #PLLSTAT_OFS] 1187*10465441SEvalZero LDR R4, =(PLLSTAT_M:OR:PLLSTAT_N) 1188*10465441SEvalZero AND R3, R3, R4 1189*10465441SEvalZero LDR R4, =PLLCFG_Val 1190*10465441SEvalZero EORS R3, R3, R4 1191*10465441SEvalZero BNE M_N_Lock 1192*10465441SEvalZero 1193*10465441SEvalZero; Setup CPU clock divider 1194*10465441SEvalZero MOV R3, #CCLKCFG_Val 1195*10465441SEvalZero STR R3, [R0, #CCLKCFG_OFS] 1196*10465441SEvalZero 1197*10465441SEvalZero; Setup USB clock divider 1198*10465441SEvalZero LDR R3, =USBCLKCFG_Val 1199*10465441SEvalZero STR R3, [R0, #USBCLKCFG_OFS] 1200*10465441SEvalZero 1201*10465441SEvalZero; Setup Peripheral Clock 1202*10465441SEvalZero LDR R3, =PCLKSEL0_Val 1203*10465441SEvalZero STR R3, [R0, #PCLKSEL0_OFS] 1204*10465441SEvalZero LDR R3, =PCLKSEL1_Val 1205*10465441SEvalZero STR R3, [R0, #PCLKSEL1_OFS] 1206*10465441SEvalZero 1207*10465441SEvalZero; Switch to PLL Clock 1208*10465441SEvalZero MOV R3, #(PLLCON_PLLE:OR:PLLCON_PLLC) 1209*10465441SEvalZero STR R3, [R0, #PLLCON_OFS] 1210*10465441SEvalZero STR R1, [R0, #PLLFEED_OFS] 1211*10465441SEvalZero STR R2, [R0, #PLLFEED_OFS] 1212*10465441SEvalZero ENDIF ; CLOCK_SETUP 1213*10465441SEvalZero 1214*10465441SEvalZero 1215*10465441SEvalZero; Setup Memory Accelerator Module ---------------------------------------------- 1216*10465441SEvalZero 1217*10465441SEvalZero IF MAM_SETUP != 0 1218*10465441SEvalZero LDR R0, =MAM_BASE 1219*10465441SEvalZero MOV R1, #MAMTIM_Val 1220*10465441SEvalZero STR R1, [R0, #MAMTIM_OFS] 1221*10465441SEvalZero MOV R1, #MAMCR_Val 1222*10465441SEvalZero STR R1, [R0, #MAMCR_OFS] 1223*10465441SEvalZero ENDIF ; MAM_SETUP 1224*10465441SEvalZero 1225*10465441SEvalZero 1226*10465441SEvalZero; Setup External Memory Controller --------------------------------------------- 1227*10465441SEvalZero 1228*10465441SEvalZero IF (:LNOT:(:DEF:NO_EMC_SETUP)):LAND:(EMC_SETUP != 0) 1229*10465441SEvalZero LDR R0, =EMC_BASE 1230*10465441SEvalZero LDR R1, =SCB_BASE 1231*10465441SEvalZero LDR R2, =PCB_BASE 1232*10465441SEvalZero 1233*10465441SEvalZero LDR R4, =EMC_PCONP_Const ; Enable EMC 1234*10465441SEvalZero LDR R3, [R1, #PCONP_OFS] 1235*10465441SEvalZero ORR R4, R4, R3 1236*10465441SEvalZero STR R4, [R1, #PCONP_OFS] 1237*10465441SEvalZero 1238*10465441SEvalZero LDR R4, =EMC_CTRL_Val 1239*10465441SEvalZero STR R4, [R0, #EMC_CTRL_OFS] 1240*10465441SEvalZero LDR R4, =EMC_CONFIG_Val 1241*10465441SEvalZero STR R4, [R0, #EMC_CONFIG_OFS] 1242*10465441SEvalZero 1243*10465441SEvalZero; Setup pin functions for External Bus functionality 1244*10465441SEvalZero LDR R4, =EMC_PINSEL5_Val 1245*10465441SEvalZero STR R4, [R2, #PINSEL5_OFS] 1246*10465441SEvalZero LDR R4, =EMC_PINSEL6_Val 1247*10465441SEvalZero STR R4, [R2, #PINSEL6_OFS] 1248*10465441SEvalZero LDR R4, =EMC_PINSEL8_Val 1249*10465441SEvalZero STR R4, [R2, #PINSEL8_OFS] 1250*10465441SEvalZero LDR R4, =EMC_PINSEL9_Val 1251*10465441SEvalZero STR R4, [R2, #PINSEL9_OFS] 1252*10465441SEvalZero 1253*10465441SEvalZero; Setup Dynamic Memory Interface 1254*10465441SEvalZero IF (EMC_DYNAMIC_SETUP != 0) 1255*10465441SEvalZero 1256*10465441SEvalZero LDR R4, =EMC_DYN_RP_Val 1257*10465441SEvalZero STR R4, [R0, #EMC_DYN_RP_OFS] 1258*10465441SEvalZero LDR R4, =EMC_DYN_RAS_Val 1259*10465441SEvalZero STR R4, [R0, #EMC_DYN_RAS_OFS] 1260*10465441SEvalZero LDR R4, =EMC_DYN_SREX_Val 1261*10465441SEvalZero STR R4, [R0, #EMC_DYN_SREX_OFS] 1262*10465441SEvalZero LDR R4, =EMC_DYN_APR_Val 1263*10465441SEvalZero STR R4, [R0, #EMC_DYN_APR_OFS] 1264*10465441SEvalZero LDR R4, =EMC_DYN_DAL_Val 1265*10465441SEvalZero STR R4, [R0, #EMC_DYN_DAL_OFS] 1266*10465441SEvalZero LDR R4, =EMC_DYN_WR_Val 1267*10465441SEvalZero STR R4, [R0, #EMC_DYN_WR_OFS] 1268*10465441SEvalZero LDR R4, =EMC_DYN_RC_Val 1269*10465441SEvalZero STR R4, [R0, #EMC_DYN_RC_OFS] 1270*10465441SEvalZero LDR R4, =EMC_DYN_RFC_Val 1271*10465441SEvalZero STR R4, [R0, #EMC_DYN_RFC_OFS] 1272*10465441SEvalZero LDR R4, =EMC_DYN_XSR_Val 1273*10465441SEvalZero STR R4, [R0, #EMC_DYN_XSR_OFS] 1274*10465441SEvalZero LDR R4, =EMC_DYN_RRD_Val 1275*10465441SEvalZero STR R4, [R0, #EMC_DYN_RRD_OFS] 1276*10465441SEvalZero LDR R4, =EMC_DYN_MRD_Val 1277*10465441SEvalZero STR R4, [R0, #EMC_DYN_MRD_OFS] 1278*10465441SEvalZero 1279*10465441SEvalZero LDR R4, =EMC_DYN_RD_CFG_Val 1280*10465441SEvalZero STR R4, [R0, #EMC_DYN_RD_CFG_OFS] 1281*10465441SEvalZero 1282*10465441SEvalZero IF (EMC_DYNCS0_SETUP != 0) 1283*10465441SEvalZero LDR R4, =EMC_DYN_RASCAS0_Val 1284*10465441SEvalZero STR R4, [R0, #EMC_DYN_RASCAS0_OFS] 1285*10465441SEvalZero LDR R4, =EMC_DYN_CFG0_Val 1286*10465441SEvalZero MVN R5, #BUFEN_Const 1287*10465441SEvalZero AND R4, R4, R5 1288*10465441SEvalZero STR R4, [R0, #EMC_DYN_CFG0_OFS] 1289*10465441SEvalZero ENDIF 1290*10465441SEvalZero IF (EMC_DYNCS1_SETUP != 0) 1291*10465441SEvalZero LDR R4, =EMC_DYN_RASCAS1_Val 1292*10465441SEvalZero STR R4, [R0, #EMC_DYN_RASCAS1_OFS] 1293*10465441SEvalZero LDR R4, =EMC_DYN_CFG1_Val 1294*10465441SEvalZero MVN R5, =BUFEN_Const 1295*10465441SEvalZero AND R4, R4, R5 1296*10465441SEvalZero STR R4, [R0, #EMC_DYN_CFG1_OFS] 1297*10465441SEvalZero ENDIF 1298*10465441SEvalZero IF (EMC_DYNCS2_SETUP != 0) 1299*10465441SEvalZero LDR R4, =EMC_DYN_RASCAS2_Val 1300*10465441SEvalZero STR R4, [R0, #EMC_DYN_RASCAS2_OFS] 1301*10465441SEvalZero LDR R4, =EMC_DYN_CFG2_Val 1302*10465441SEvalZero MVN R5, =BUFEN_Const 1303*10465441SEvalZero AND R4, R4, R5 1304*10465441SEvalZero STR R4, [R0, #EMC_DYN_CFG2_OFS] 1305*10465441SEvalZero ENDIF 1306*10465441SEvalZero IF (EMC_DYNCS3_SETUP != 0) 1307*10465441SEvalZero LDR R4, =EMC_DYN_RASCAS3_Val 1308*10465441SEvalZero STR R4, [R0, #EMC_DYN_RASCAS3_OFS] 1309*10465441SEvalZero LDR R4, =EMC_DYN_CFG3_Val 1310*10465441SEvalZero MVN R5, =BUFEN_Const 1311*10465441SEvalZero AND R4, R4, R5 1312*10465441SEvalZero STR R4, [R0, #EMC_DYN_CFG3_OFS] 1313*10465441SEvalZero ENDIF 1314*10465441SEvalZero 1315*10465441SEvalZero LDR R6, =1440000 ; Number of cycles to delay 1316*10465441SEvalZeroWait_0 SUBS R6, R6, #1 ; Delay ~100 ms proc clk 57.6 MHz 1317*10465441SEvalZero BNE Wait_0 ; BNE (3 cyc) + SUBS (1 cyc) = 4 cyc 1318*10465441SEvalZero 1319*10465441SEvalZero LDR R4, =(NOP_CMD:OR:0x03) ; Write NOP Command 1320*10465441SEvalZero STR R4, [R0, #EMC_DYN_CTRL_OFS] 1321*10465441SEvalZero 1322*10465441SEvalZero LDR R6, =2880000 ; Number of cycles to delay 1323*10465441SEvalZeroWait_1 SUBS R6, R6, #1 ; Delay ~200 ms proc clk 57.6 MHz 1324*10465441SEvalZero BNE Wait_1 1325*10465441SEvalZero 1326*10465441SEvalZero LDR R4, =(PALL_CMD:OR:0x03) ; Write Precharge All Command 1327*10465441SEvalZero STR R4, [R0, #EMC_DYN_CTRL_OFS] 1328*10465441SEvalZero 1329*10465441SEvalZero MOV R4, #2 1330*10465441SEvalZero STR R4, [R0, #EMC_DYN_RFSH_OFS] 1331*10465441SEvalZero 1332*10465441SEvalZero MOV R6, #64 ; Number of cycles to delay 1333*10465441SEvalZeroWait_2 SUBS R6, R6, #1 ; Delay 1334*10465441SEvalZero BNE Wait_2 1335*10465441SEvalZero 1336*10465441SEvalZero LDR R4, =EMC_DYN_RFSH_Val 1337*10465441SEvalZero STR R4, [R0, #EMC_DYN_RFSH_OFS] 1338*10465441SEvalZero 1339*10465441SEvalZero LDR R4, =(MODE_CMD:OR:0x03) ; Write MODE Command 1340*10465441SEvalZero STR R4, [R0, #EMC_DYN_CTRL_OFS] 1341*10465441SEvalZero 1342*10465441SEvalZero ; Dummy read 1343*10465441SEvalZero IF (EMC_DYNCS0_SETUP != 0) 1344*10465441SEvalZero LDR R4, =DYN_MEM0_BASE 1345*10465441SEvalZero MOV R5, #(0x33 << 12) 1346*10465441SEvalZero ADD R4, R4, R5 1347*10465441SEvalZero LDR R4, [R4, #0] 1348*10465441SEvalZero ENDIF 1349*10465441SEvalZero IF (EMC_DYNCS1_SETUP != 0) 1350*10465441SEvalZero LDR R4, =DYN_MEM1_BASE 1351*10465441SEvalZero MOV R5, #(0x33 << 12) 1352*10465441SEvalZero ADD R4, R4, R5 1353*10465441SEvalZero LDR R4, [R4, #0] 1354*10465441SEvalZero ENDIF 1355*10465441SEvalZero IF (EMC_DYNCS2_SETUP != 0) 1356*10465441SEvalZero LDR R4, =DYN_MEM2_BASE 1357*10465441SEvalZero MOV R5, #(0x33 << 12) 1358*10465441SEvalZero ADD R4, R4, R5 1359*10465441SEvalZero LDR R4, [R4, #0] 1360*10465441SEvalZero ENDIF 1361*10465441SEvalZero IF (EMC_DYNCS3_SETUP != 0) 1362*10465441SEvalZero LDR R4, =DYN_MEM3_BASE 1363*10465441SEvalZero MOV R5, #(0x33 << 12) 1364*10465441SEvalZero ADD R4, R4, R5 1365*10465441SEvalZero LDR R4, [R4, #0] 1366*10465441SEvalZero ENDIF 1367*10465441SEvalZero 1368*10465441SEvalZero LDR R4, =NORMAL_CMD ; Write NORMAL Command 1369*10465441SEvalZero STR R4, [R0, #EMC_DYN_CTRL_OFS] 1370*10465441SEvalZero 1371*10465441SEvalZero ; Enable buffer if requested by settings 1372*10465441SEvalZero IF (EMC_DYNCS0_SETUP != 0):LAND:((EMC_DYN_CFG0_Val:AND:BUFEN_Const) != 0) 1373*10465441SEvalZero LDR R4, =EMC_DYN_CFG0_Val 1374*10465441SEvalZero STR R4, [R0, #EMC_DYN_CFG0_OFS] 1375*10465441SEvalZero ENDIF 1376*10465441SEvalZero IF (EMC_DYNCS1_SETUP != 0):LAND:((EMC_DYN_CFG1_Val:AND:BUFEN_Const) != 0) 1377*10465441SEvalZero LDR R4, =EMC_DYN_CFG1_Val 1378*10465441SEvalZero STR R4, [R0, #EMC_DYN_CFG1_OFS] 1379*10465441SEvalZero ENDIF 1380*10465441SEvalZero IF (EMC_DYNCS2_SETUP != 0):LAND:((EMC_DYN_CFG2_Val:AND:BUFEN_Const) != 0) 1381*10465441SEvalZero LDR R4, =EMC_DYN_CFG2_Val 1382*10465441SEvalZero STR R4, [R0, #EMC_DYN_CFG2_OFS] 1383*10465441SEvalZero ENDIF 1384*10465441SEvalZero IF (EMC_DYNCS3_SETUP != 0):LAND:((EMC_DYN_CFG3_Val:AND:BUFEN_Const) != 0) 1385*10465441SEvalZero LDR R4, =EMC_DYN_CFG3_Val 1386*10465441SEvalZero STR R4, [R0, #EMC_DYN_CFG3_OFS] 1387*10465441SEvalZero ENDIF 1388*10465441SEvalZero 1389*10465441SEvalZero LDR R6, =14400 ; Number of cycles to delay 1390*10465441SEvalZeroWait_3 SUBS R6, R6, #1 ; Delay ~1 ms @ proc clk 57.6 MHz 1391*10465441SEvalZero BNE Wait_3 1392*10465441SEvalZero 1393*10465441SEvalZero ENDIF ; EMC_DYNAMIC_SETUP 1394*10465441SEvalZero 1395*10465441SEvalZero; Setup Static Memory Interface 1396*10465441SEvalZero IF (EMC_STATIC_SETUP != 0) 1397*10465441SEvalZero 1398*10465441SEvalZero LDR R6, =1440000 ; Number of cycles to delay 1399*10465441SEvalZeroWait_4 SUBS R6, R6, #1 ; Delay ~100 ms @ proc clk 57.6 MHz 1400*10465441SEvalZero BNE Wait_4 1401*10465441SEvalZero 1402*10465441SEvalZero IF (EMC_STACS0_SETUP != 0) 1403*10465441SEvalZero LDR R4, =EMC_STA_CFG0_Val 1404*10465441SEvalZero STR R4, [R0, #EMC_STA_CFG0_OFS] 1405*10465441SEvalZero LDR R4, =EMC_STA_WWEN0_Val 1406*10465441SEvalZero STR R4, [R0, #EMC_STA_WWEN0_OFS] 1407*10465441SEvalZero LDR R4, =EMC_STA_WOEN0_Val 1408*10465441SEvalZero STR R4, [R0, #EMC_STA_WOEN0_OFS] 1409*10465441SEvalZero LDR R4, =EMC_STA_WRD0_Val 1410*10465441SEvalZero STR R4, [R0, #EMC_STA_WRD0_OFS] 1411*10465441SEvalZero LDR R4, =EMC_STA_WPAGE0_Val 1412*10465441SEvalZero STR R4, [R0, #EMC_STA_WPAGE0_OFS] 1413*10465441SEvalZero LDR R4, =EMC_STA_WWR0_Val 1414*10465441SEvalZero STR R4, [R0, #EMC_STA_WWR0_OFS] 1415*10465441SEvalZero LDR R4, =EMC_STA_WTURN0_Val 1416*10465441SEvalZero STR R4, [R0, #EMC_STA_WTURN0_OFS] 1417*10465441SEvalZero ENDIF 1418*10465441SEvalZero 1419*10465441SEvalZero IF (EMC_STACS1_SETUP != 0) 1420*10465441SEvalZero LDR R4, =EMC_STA_CFG1_Val 1421*10465441SEvalZero STR R4, [R0, #EMC_STA_CFG1_OFS] 1422*10465441SEvalZero LDR R4, =EMC_STA_WWEN1_Val 1423*10465441SEvalZero STR R4, [R0, #EMC_STA_WWEN1_OFS] 1424*10465441SEvalZero LDR R4, =EMC_STA_WOEN1_Val 1425*10465441SEvalZero STR R4, [R0, #EMC_STA_WOEN1_OFS] 1426*10465441SEvalZero LDR R4, =EMC_STA_WRD1_Val 1427*10465441SEvalZero STR R4, [R0, #EMC_STA_WRD1_OFS] 1428*10465441SEvalZero LDR R4, =EMC_STA_WPAGE1_Val 1429*10465441SEvalZero STR R4, [R0, #EMC_STA_WPAGE1_OFS] 1430*10465441SEvalZero LDR R4, =EMC_STA_WWR1_Val 1431*10465441SEvalZero STR R4, [R0, #EMC_STA_WWR1_OFS] 1432*10465441SEvalZero LDR R4, =EMC_STA_WTURN1_Val 1433*10465441SEvalZero STR R4, [R0, #EMC_STA_WTURN1_OFS] 1434*10465441SEvalZero ENDIF 1435*10465441SEvalZero 1436*10465441SEvalZero IF (EMC_STACS2_SETUP != 0) 1437*10465441SEvalZero LDR R4, =EMC_STA_CFG2_Val 1438*10465441SEvalZero STR R4, [R0, #EMC_STA_CFG2_OFS] 1439*10465441SEvalZero LDR R4, =EMC_STA_WWEN2_Val 1440*10465441SEvalZero STR R4, [R0, #EMC_STA_WWEN2_OFS] 1441*10465441SEvalZero LDR R4, =EMC_STA_WOEN2_Val 1442*10465441SEvalZero STR R4, [R0, #EMC_STA_WOEN2_OFS] 1443*10465441SEvalZero LDR R4, =EMC_STA_WRD2_Val 1444*10465441SEvalZero STR R4, [R0, #EMC_STA_WRD2_OFS] 1445*10465441SEvalZero LDR R4, =EMC_STA_WPAGE2_Val 1446*10465441SEvalZero STR R4, [R0, #EMC_STA_WPAGE2_OFS] 1447*10465441SEvalZero LDR R4, =EMC_STA_WWR2_Val 1448*10465441SEvalZero STR R4, [R0, #EMC_STA_WWR2_OFS] 1449*10465441SEvalZero LDR R4, =EMC_STA_WTURN2_Val 1450*10465441SEvalZero STR R4, [R0, #EMC_STA_WTURN2_OFS] 1451*10465441SEvalZero ENDIF 1452*10465441SEvalZero 1453*10465441SEvalZero IF (EMC_STACS3_SETUP != 0) 1454*10465441SEvalZero LDR R4, =EMC_STA_CFG3_Val 1455*10465441SEvalZero STR R4, [R0, #EMC_STA_CFG3_OFS] 1456*10465441SEvalZero LDR R4, =EMC_STA_WWEN3_Val 1457*10465441SEvalZero STR R4, [R0, #EMC_STA_WWEN3_OFS] 1458*10465441SEvalZero LDR R4, =EMC_STA_WOEN3_Val 1459*10465441SEvalZero STR R4, [R0, #EMC_STA_WOEN3_OFS] 1460*10465441SEvalZero LDR R4, =EMC_STA_WRD3_Val 1461*10465441SEvalZero STR R4, [R0, #EMC_STA_WRD3_OFS] 1462*10465441SEvalZero LDR R4, =EMC_STA_WPAGE3_Val 1463*10465441SEvalZero STR R4, [R0, #EMC_STA_WPAGE3_OFS] 1464*10465441SEvalZero LDR R4, =EMC_STA_WWR3_Val 1465*10465441SEvalZero STR R4, [R0, #EMC_STA_WWR3_OFS] 1466*10465441SEvalZero LDR R4, =EMC_STA_WTURN3_Val 1467*10465441SEvalZero STR R4, [R0, #EMC_STA_WTURN3_OFS] 1468*10465441SEvalZero ENDIF 1469*10465441SEvalZero 1470*10465441SEvalZero LDR R6, =144000 ; Number of cycles to delay 1471*10465441SEvalZeroWait_5 SUBS R6, R6, #1 ; Delay ~10 ms @ proc clk 57.6 MHz 1472*10465441SEvalZero BNE Wait_5 1473*10465441SEvalZero 1474*10465441SEvalZero LDR R4, =EMC_STA_EXT_W_Val 1475*10465441SEvalZero LDR R5, =EMC_STA_EXT_W_OFS 1476*10465441SEvalZero ADD R5, R5, R0 1477*10465441SEvalZero STR R4, [R5, #0] 1478*10465441SEvalZero 1479*10465441SEvalZero ENDIF ; EMC_STATIC_SETUP 1480*10465441SEvalZero 1481*10465441SEvalZero ENDIF ; EMC_SETUP 1482*10465441SEvalZero 1483*10465441SEvalZero 1484*10465441SEvalZero; Copy Exception Vectors to Internal RAM --------------------------------------- 1485*10465441SEvalZero 1486*10465441SEvalZero IF :DEF:RAM_INTVEC 1487*10465441SEvalZero ADR R8, Vectors ; Source 1488*10465441SEvalZero LDR R9, =RAM_BASE ; Destination 1489*10465441SEvalZero LDMIA R8!, {R0-R7} ; Load Vectors 1490*10465441SEvalZero STMIA R9!, {R0-R7} ; Store Vectors 1491*10465441SEvalZero LDMIA R8!, {R0-R7} ; Load Handler Addresses 1492*10465441SEvalZero STMIA R9!, {R0-R7} ; Store Handler Addresses 1493*10465441SEvalZero ENDIF 1494*10465441SEvalZero 1495*10465441SEvalZero 1496*10465441SEvalZero; Memory Mapping (when Interrupt Vectors are in RAM) --------------------------- 1497*10465441SEvalZero 1498*10465441SEvalZeroMEMMAP EQU 0xE01FC040 ; Memory Mapping Control 1499*10465441SEvalZero IF :DEF:REMAP 1500*10465441SEvalZero LDR R0, =MEMMAP 1501*10465441SEvalZero IF :DEF:EXTMEM_MODE 1502*10465441SEvalZero MOV R1, #3 1503*10465441SEvalZero ELIF :DEF:RAM_MODE 1504*10465441SEvalZero MOV R1, #2 1505*10465441SEvalZero ELSE 1506*10465441SEvalZero MOV R1, #1 1507*10465441SEvalZero ENDIF 1508*10465441SEvalZero STR R1, [R0] 1509*10465441SEvalZero ENDIF 1510*10465441SEvalZero 1511*10465441SEvalZero 1512*10465441SEvalZero; Setup Stack for each mode ---------------------------------------------------- 1513*10465441SEvalZero 1514*10465441SEvalZero LDR R0, =Stack_Top 1515*10465441SEvalZero 1516*10465441SEvalZero; Enter Undefined Instruction Mode and set its Stack Pointer 1517*10465441SEvalZero MSR CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit 1518*10465441SEvalZero MOV SP, R0 1519*10465441SEvalZero SUB R0, R0, #UND_Stack_Size 1520*10465441SEvalZero 1521*10465441SEvalZero; Enter Abort Mode and set its Stack Pointer 1522*10465441SEvalZero MSR CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit 1523*10465441SEvalZero MOV SP, R0 1524*10465441SEvalZero SUB R0, R0, #ABT_Stack_Size 1525*10465441SEvalZero 1526*10465441SEvalZero; Enter FIQ Mode and set its Stack Pointer 1527*10465441SEvalZero MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit 1528*10465441SEvalZero MOV SP, R0 1529*10465441SEvalZero SUB R0, R0, #FIQ_Stack_Size 1530*10465441SEvalZero 1531*10465441SEvalZero; Enter IRQ Mode and set its Stack Pointer 1532*10465441SEvalZero MSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit 1533*10465441SEvalZero MOV SP, R0 1534*10465441SEvalZero SUB R0, R0, #IRQ_Stack_Size 1535*10465441SEvalZero 1536*10465441SEvalZero; Enter Supervisor Mode and set its Stack Pointer 1537*10465441SEvalZero MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit 1538*10465441SEvalZero MOV SP, R0 1539*10465441SEvalZero SUB R0, R0, #SVC_Stack_Size 1540*10465441SEvalZero 1541*10465441SEvalZero IF :DEF:__MICROLIB 1542*10465441SEvalZero EXPORT __initial_sp 1543*10465441SEvalZero ELSE 1544*10465441SEvalZero ENDIF 1545*10465441SEvalZero 1546*10465441SEvalZero; Enter the C code ------------------------------------------------------------- 1547*10465441SEvalZero 1548*10465441SEvalZero IMPORT __main 1549*10465441SEvalZero LDR R0, =__main 1550*10465441SEvalZero BX R0 1551*10465441SEvalZero 1552*10465441SEvalZero IMPORT rt_interrupt_enter 1553*10465441SEvalZero IMPORT rt_interrupt_leave 1554*10465441SEvalZero IMPORT rt_thread_switch_interrupt_flag 1555*10465441SEvalZero IMPORT rt_interrupt_from_thread 1556*10465441SEvalZero IMPORT rt_interrupt_to_thread 1557*10465441SEvalZero IMPORT rt_hw_trap_irq 1558*10465441SEvalZero 1559*10465441SEvalZeroIRQ_Handler PROC 1560*10465441SEvalZero EXPORT IRQ_Handler 1561*10465441SEvalZero STMFD sp!, {r0-r12,lr} 1562*10465441SEvalZero BL rt_interrupt_enter 1563*10465441SEvalZero BL rt_hw_trap_irq 1564*10465441SEvalZero BL rt_interrupt_leave 1565*10465441SEvalZero 1566*10465441SEvalZero ; if rt_thread_switch_interrupt_flag set, jump to 1567*10465441SEvalZero ; rt_hw_context_switch_interrupt_do and don't return 1568*10465441SEvalZero LDR r0, =rt_thread_switch_interrupt_flag 1569*10465441SEvalZero LDR r1, [r0] 1570*10465441SEvalZero CMP r1, #1 1571*10465441SEvalZero BEQ rt_hw_context_switch_interrupt_do 1572*10465441SEvalZero 1573*10465441SEvalZero LDMFD sp!, {r0-r12,lr} 1574*10465441SEvalZero SUBS pc, lr, #4 1575*10465441SEvalZero ENDP 1576*10465441SEvalZero 1577*10465441SEvalZero; /* 1578*10465441SEvalZero; * void rt_hw_context_switch_interrupt_do(rt_base_t flag) 1579*10465441SEvalZero; */ 1580*10465441SEvalZerort_hw_context_switch_interrupt_do PROC 1581*10465441SEvalZero EXPORT rt_hw_context_switch_interrupt_do 1582*10465441SEvalZero MOV r1, #0 ; clear flag 1583*10465441SEvalZero STR r1, [r0] 1584*10465441SEvalZero 1585*10465441SEvalZero LDMFD sp!, {r0-r12,lr}; reload saved registers 1586*10465441SEvalZero STMFD sp!, {r0-r3} ; save r0-r3 1587*10465441SEvalZero MOV r1, sp 1588*10465441SEvalZero ADD sp, sp, #16 ; restore sp 1589*10465441SEvalZero SUB r2, lr, #4 ; save old task's pc to r2 1590*10465441SEvalZero 1591*10465441SEvalZero MRS r3, spsr ; get cpsr of interrupt thread 1592*10465441SEvalZero 1593*10465441SEvalZero ; switch to SVC mode and no interrupt 1594*10465441SEvalZero MSR cpsr_c, #I_Bit :OR: F_Bit :OR: Mode_SVC 1595*10465441SEvalZero 1596*10465441SEvalZero STMFD sp!, {r2} ; push old task's pc 1597*10465441SEvalZero STMFD sp!, {r4-r12,lr}; push old task's lr,r12-r4 1598*10465441SEvalZero MOV r4, r1 ; Special optimised code below 1599*10465441SEvalZero MOV r5, r3 1600*10465441SEvalZero LDMFD r4!, {r0-r3} 1601*10465441SEvalZero STMFD sp!, {r0-r3} ; push old task's r3-r0 1602*10465441SEvalZero STMFD sp!, {r5} ; push old task's cpsr 1603*10465441SEvalZero 1604*10465441SEvalZero LDR r4, =rt_interrupt_from_thread 1605*10465441SEvalZero LDR r5, [r4] 1606*10465441SEvalZero STR sp, [r5] ; store sp in preempted tasks's TCB 1607*10465441SEvalZero 1608*10465441SEvalZero LDR r6, =rt_interrupt_to_thread 1609*10465441SEvalZero LDR r6, [r6] 1610*10465441SEvalZero LDR sp, [r6] ; get new task's stack pointer 1611*10465441SEvalZero 1612*10465441SEvalZero LDMFD sp!, {r4} ; pop new task's cpsr to spsr 1613*10465441SEvalZero MSR spsr_cxsf, r4 1614*10465441SEvalZero BIC r4, r4, #0x20 ; must be ARM mode 1615*10465441SEvalZero MSR cpsr_cxsf, r4 1616*10465441SEvalZero 1617*10465441SEvalZero LDMFD sp!, {r0-r12,lr,pc}^ ; pop new task's r0-r12,lr & pc, copy spsr to cpsr 1618*10465441SEvalZero ENDP 1619*10465441SEvalZero 1620*10465441SEvalZero IF :DEF:__MICROLIB 1621*10465441SEvalZero 1622*10465441SEvalZero EXPORT __heap_base 1623*10465441SEvalZero EXPORT __heap_limit 1624*10465441SEvalZero 1625*10465441SEvalZero ELSE 1626*10465441SEvalZero; User Initial Stack & Heap 1627*10465441SEvalZero AREA |.text|, CODE, READONLY 1628*10465441SEvalZero 1629*10465441SEvalZero IMPORT __use_two_region_memory 1630*10465441SEvalZero EXPORT __user_initial_stackheap 1631*10465441SEvalZero__user_initial_stackheap 1632*10465441SEvalZero 1633*10465441SEvalZero LDR R0, = Heap_Mem 1634*10465441SEvalZero LDR R1, =(Stack_Mem + USR_Stack_Size) 1635*10465441SEvalZero LDR R2, = (Heap_Mem + Heap_Size) 1636*10465441SEvalZero LDR R3, = Stack_Mem 1637*10465441SEvalZero BX LR 1638*10465441SEvalZero ENDIF 1639*10465441SEvalZero 1640*10465441SEvalZero 1641*10465441SEvalZero END 1642