@@ -1,503 +0,0 @@
/ *
* This w a s o r i g i n a l l y f r o m t h e L u b b o c k u - b o o t p o r t .
*
* Most o f t h i s t a k e n f r o m R e d b o o t h a l _ p l a t f o r m _ s e t u p . h w i t h c l e a n u p
*
* NOTE : I h a v e n ' t c l e a n t h i s u p c o n s i d e r a b l y , j u s t e n o u g h t o g e t i t
* running. S e e h a l _ p l a t f o r m _ s e t u p . h f o r t h e s o u r c e . S e e
* board/ c r a d l e / l o w l e v e l _ i n i t . S f o r a n o t h e r P X A 2 5 0 s e t u p t h a t i s
* much c l e a n e r .
*
* See f i l e C R E D I T S f o r l i s t o f p e o p l e w h o c o n t r i b u t e d t o t h i s
* project.
*
* This p r o g r a m i s f r e e s o f t w a r e ; you can redistribute it and/or
* modify i t u n d e r t h e t e r m s o f t h e G N U G e n e r a l P u b l i c L i c e n s e a s
* published b y t h e F r e e S o f t w a r e F o u n d a t i o n ; either version 2 of
* the L i c e n s e , o r ( a t y o u r o p t i o n ) a n y l a t e r v e r s i o n .
*
* This p r o g r a m i s d i s t r i b u t e d i n t h e h o p e t h a t i t w i l l b e u s e f u l ,
* but W I T H O U T A N Y W A R R A N T Y ; without even the implied warranty of
* MERCHANTABILITY o r F I T N E S S F O R A P A R T I C U L A R P U R P O S E . S e e t h e
* GNU G e n e r a l P u b l i c L i c e n s e f o r m o r e d e t a i l s .
*
* You s h o u l d h a v e r e c e i v e d a c o p y o f t h e G N U G e n e r a l P u b l i c L i c e n s e
* along w i t h t h i s p r o g r a m ; if not, write to the Free Software
* Foundation, I n c . , 5 9 T e m p l e P l a c e , S u i t e 3 3 0 , B o s t o n ,
* MA 0 2 1 1 1 - 1 3 0 7 U S A
* /
# include < c o n f i g . h >
# include < v e r s i o n . h >
# include < a s m / a r c h / p x a - r e g s . h >
/* wait for coprocessor write complete */
.macro CPWAIT reg
mrc p15 ,0 ,\ r e g ,c2 ,c0 ,0
mov \ r e g ,\ r e g
sub p c ,p c ,#4
.endm
/ *
* Memory s e t u p
* /
.globl lowlevel_init
lowlevel_init :
/* Set up GPIO pins first ----------------------------------------- */
ldr r0 , =GPSR0
ldr r1 , =CONFIG_SYS_GPSR0_VAL
str r1 , [ r0 ]
ldr r0 , =GPSR1
ldr r1 , =CONFIG_SYS_GPSR1_VAL
str r1 , [ r0 ]
ldr r0 , =GPSR2
ldr r1 , =CONFIG_SYS_GPSR2_VAL
str r1 , [ r0 ]
ldr r0 , =GPSR3
ldr r1 , =CONFIG_SYS_GPSR3_VAL
str r1 , [ r0 ]
ldr r0 , =GPCR0
ldr r1 , =CONFIG_SYS_GPCR0_VAL
str r1 , [ r0 ]
ldr r0 , =GPCR1
ldr r1 , =CONFIG_SYS_GPCR1_VAL
str r1 , [ r0 ]
ldr r0 , =GPCR2
ldr r1 , =CONFIG_SYS_GPCR2_VAL
str r1 , [ r0 ]
ldr r0 , =GPCR3
ldr r1 , =CONFIG_SYS_GPCR3_VAL
str r1 , [ r0 ]
ldr r0 , =GRER0
ldr r1 , =CONFIG_SYS_GRER0_VAL
str r1 , [ r0 ]
ldr r0 , =GRER1
ldr r1 , =CONFIG_SYS_GRER1_VAL
str r1 , [ r0 ]
ldr r0 , =GRER2
ldr r1 , =CONFIG_SYS_GRER2_VAL
str r1 , [ r0 ]
ldr r0 , =GRER3
ldr r1 , =CONFIG_SYS_GRER3_VAL
str r1 , [ r0 ]
ldr r0 , =GFER0
ldr r1 , =CONFIG_SYS_GFER0_VAL
str r1 , [ r0 ]
ldr r0 , =GFER1
ldr r1 , =CONFIG_SYS_GFER1_VAL
str r1 , [ r0 ]
ldr r0 , =GFER2
ldr r1 , =CONFIG_SYS_GFER2_VAL
str r1 , [ r0 ]
ldr r0 , =GFER3
ldr r1 , =CONFIG_SYS_GFER3_VAL
str r1 , [ r0 ]
ldr r0 , =GPDR0
ldr r1 , =CONFIG_SYS_GPDR0_VAL
str r1 , [ r0 ]
ldr r0 , =GPDR1
ldr r1 , =CONFIG_SYS_GPDR1_VAL
str r1 , [ r0 ]
ldr r0 , =GPDR2
ldr r1 , =CONFIG_SYS_GPDR2_VAL
str r1 , [ r0 ]
ldr r0 , =GPDR3
ldr r1 , =CONFIG_SYS_GPDR3_VAL
str r1 , [ r0 ]
ldr r0 , =GAFR0_L
ldr r1 , =CONFIG_SYS_GAFR0_L_VAL
str r1 , [ r0 ]
ldr r0 , =GAFR0_U
ldr r1 , =CONFIG_SYS_GAFR0_U_VAL
str r1 , [ r0 ]
ldr r0 , =GAFR1_L
ldr r1 , =CONFIG_SYS_GAFR1_L_VAL
str r1 , [ r0 ]
ldr r0 , =GAFR1_U
ldr r1 , =CONFIG_SYS_GAFR1_U_VAL
str r1 , [ r0 ]
ldr r0 , =GAFR2_L
ldr r1 , =CONFIG_SYS_GAFR2_L_VAL
str r1 , [ r0 ]
ldr r0 , =GAFR2_U
ldr r1 , =CONFIG_SYS_GAFR2_U_VAL
str r1 , [ r0 ]
ldr r0 , =GAFR3_L
ldr r1 , =CONFIG_SYS_GAFR3_L_VAL
str r1 , [ r0 ]
ldr r0 , =GAFR3_U
ldr r1 , =CONFIG_SYS_GAFR3_U_VAL
str r1 , [ r0 ]
ldr r0 , =PSSR / * e n a b l e G P I O p i n s * /
ldr r1 , =CONFIG_SYS_PSSR_VAL
str r1 , [ r0 ]
/* ---------------------------------------------------------------- */
/* Enable memory interface */
/* */
/* The sequence below is based on the recommended init steps */
/* detailed in the Intel PXA250 Operating Systems Developers Guide, */
/* Chapter 10. */
/* ---------------------------------------------------------------- */
/* ---------------------------------------------------------------- */
/* Step 1: Wait for at least 200 microsedonds to allow internal */
/* clocks to settle. Only necessary after hard reset... */
/* FIXME: can be optimized later */
/* ---------------------------------------------------------------- */
ldr r3 , =OSCR / * r e s e t t h e O S T i m e r C o u n t t o z e r o * /
mov r2 , #0
str r2 , [ r3 ]
ldr r4 , =0x300 / * r e a l l y 0 x2 E 1 i s a b o u t 2 0 0 u s e c , * /
/* so 0x300 should be plenty */
1 :
ldr r2 , [ r3 ]
cmp r4 , r2
bgt 1 b
mem_init :
ldr r1 , =MEMC_BASE / * g e t m e m o r y c o n t r o l l e r b a s e a d d r . * /
/* ---------------------------------------------------------------- */
/* Step 2a: Initialize Asynchronous static memory controller */
/* ---------------------------------------------------------------- */
/* MSC registers: timing, bus width, mem type */
/* MSC0: nCS(0,1) */
ldr r2 , =CONFIG_SYS_MSC0_VAL
str r2 , [ r1 , #M S C 0 _ O F F S E T ]
ldr r2 , [ r1 , #M S C 0 _ O F F S E T ] / * r e a d b a c k t o e n s u r e * /
/* that data latches */
/* MSC1: nCS(2,3) */
ldr r2 , =CONFIG_SYS_MSC1_VAL
str r2 , [ r1 , #M S C 1 _ O F F S E T ]
ldr r2 , [ r1 , #M S C 1 _ O F F S E T ]
/* MSC2: nCS(4,5) */
ldr r2 , =CONFIG_SYS_MSC2_VAL
str r2 , [ r1 , #M S C 2 _ O F F S E T ]
ldr r2 , [ r1 , #M S C 2 _ O F F S E T ]
/* ---------------------------------------------------------------- */
/* Step 2b: Initialize Card Interface */
/* ---------------------------------------------------------------- */
/* MECR: Memory Expansion Card Register */
ldr r2 , =CONFIG_SYS_MECR_VAL
str r2 , [ r1 , #M E C R _ O F F S E T ]
ldr r2 , [ r1 , #M E C R _ O F F S E T ]
/* MCMEM0: Card Interface slot 0 timing */
ldr r2 , =CONFIG_SYS_MCMEM0_VAL
str r2 , [ r1 , #M C M E M 0 _ O F F S E T ]
ldr r2 , [ r1 , #M C M E M 0 _ O F F S E T ]
/* MCMEM1: Card Interface slot 1 timing */
ldr r2 , =CONFIG_SYS_MCMEM1_VAL
str r2 , [ r1 , #M C M E M 1 _ O F F S E T ]
ldr r2 , [ r1 , #M C M E M 1 _ O F F S E T ]
/* MCATT0: Card Interface Attribute Space Timing, slot 0 */
ldr r2 , =CONFIG_SYS_MCATT0_VAL
str r2 , [ r1 , #M C A T T 0 _ O F F S E T ]
ldr r2 , [ r1 , #M C A T T 0 _ O F F S E T ]
/* MCATT1: Card Interface Attribute Space Timing, slot 1 */
ldr r2 , =CONFIG_SYS_MCATT1_VAL
str r2 , [ r1 , #M C A T T 1 _ O F F S E T ]
ldr r2 , [ r1 , #M C A T T 1 _ O F F S E T ]
/* MCIO0: Card Interface I/O Space Timing, slot 0 */
ldr r2 , =CONFIG_SYS_MCIO0_VAL
str r2 , [ r1 , #M C I O 0 _ O F F S E T ]
ldr r2 , [ r1 , #M C I O 0 _ O F F S E T ]
/* MCIO1: Card Interface I/O Space Timing, slot 1 */
ldr r2 , =CONFIG_SYS_MCIO1_VAL
str r2 , [ r1 , #M C I O 1 _ O F F S E T ]
ldr r2 , [ r1 , #M C I O 1 _ O F F S E T ]
/* ---------------------------------------------------------------- */
/* Step 2c: Write FLYCNFG FIXME: what's that??? */
/* ---------------------------------------------------------------- */
ldr r2 , =CONFIG_SYS_FLYCNFG_VAL
str r2 , [ r1 , #F L Y C N F G _ O F F S E T ]
str r2 , [ r1 , #F L Y C N F G _ O F F S E T ]
/* ---------------------------------------------------------------- */
/* Step 2d: Initialize Timing for Sync Memory (SDCLK0) */
/* ---------------------------------------------------------------- */
/* Before accessing MDREFR we need a valid DRI field, so we set */
/* this to power on defaults + DRI field. */
ldr r4 , [ r1 , #M D R E F R _ O F F S E T ]
ldr r2 , =0xFFF
bic r4 , r4 , r2
ldr r3 , =CONFIG_SYS_MDREFR_VAL
and r3 , r3 , r2
orr r4 , r4 , r3
str r4 , [ r1 , #M D R E F R _ O F F S E T ] / * w r i t e b a c k M D R E F R * /
orr r4 , r4 , #M D R E F R _ K 0 R U N
orr r4 , r4 , #M D R E F R _ K 0 D B 4
orr r4 , r4 , #M D R E F R _ K 0 F R E E
orr r4 , r4 , #M D R E F R _ K 0 D B 2
orr r4 , r4 , #M D R E F R _ K 1 D B 2
bic r4 , r4 , #M D R E F R _ K 1 F R E E
bic r4 , r4 , #M D R E F R _ K 2 F R E E
str r4 , [ r1 , #M D R E F R _ O F F S E T ] / * w r i t e b a c k M D R E F R * /
ldr r4 , [ r1 , #M D R E F R _ O F F S E T ]
/* Note: preserve the mdrefr value in r4 */
/* ---------------------------------------------------------------- */
/* Step 3: Initialize Synchronous Static Memory (Flash/Peripherals) */
/* ---------------------------------------------------------------- */
/* Initialize SXCNFG register. Assert the enable bits */
/* Write SXMRS to cause an MRS command to all enabled banks of */
/* synchronous static memory. Note that SXLCR need not be written */
/* at this time. */
ldr r2 , =CONFIG_SYS_SXCNFG_VAL
str r2 , [ r1 , #S X C N F G _ O F F S E T ]
/* ---------------------------------------------------------------- */
/* Step 4: Initialize SDRAM */
/* ---------------------------------------------------------------- */
bic r4 , r4 , #( M D R E F R _ K 2 F R E E | M D R E F R _ K 1 F R E E | M D R E F R _ K 0 F R E E )
orr r4 , r4 , #M D R E F R _ K 1 R U N
bic r4 , r4 , #M D R E F R _ K 2 D B 2
str r4 , [ r1 , #M D R E F R _ O F F S E T ]
ldr r4 , [ r1 , #M D R E F R _ O F F S E T ]
bic r4 , r4 , #M D R E F R _ S L F R S H
str r4 , [ r1 , #M D R E F R _ O F F S E T ]
ldr r4 , [ r1 , #M D R E F R _ O F F S E T ]
orr r4 , r4 , #M D R E F R _ E 1 P I N
str r4 , [ r1 , #M D R E F R _ O F F S E T ]
ldr r4 , [ r1 , #M D R E F R _ O F F S E T ]
nop
nop
/* Step 4d: write MDCNFG with MDCNFG:DEx deasserted (set to 0), to */
/* configure but not enable each SDRAM partition pair. */
ldr r4 , =CONFIG_SYS_MDCNFG_VAL
bic r4 , r4 , #( M D C N F G _ D E 0 | M D C N F G _ D E 1 )
bic r4 , r4 , #( M D C N F G _ D E 2 | M D C N F G _ D E 3 )
str r4 , [ r1 , #M D C N F G _ O F F S E T ] / * w r i t e b a c k M D C N F G * /
ldr r4 , [ r1 , #M D C N F G _ O F F S E T ]
/* Step 4e: Wait for the clock to the SDRAMs to stabilize, */
/* 100..200 <20> sec. */
ldr r3 , =OSCR / * r e s e t t h e O S T i m e r C o u n t t o z e r o * /
mov r2 , #0
str r2 , [ r3 ]
ldr r4 , =0x300 / * r e a l l y 0 x2 E 1 i s a b o u t 2 0 0 u s e c , * /
/* so 0x300 should be plenty */
1 :
ldr r2 , [ r3 ]
cmp r4 , r2
bgt 1 b
/* Step 4f: Trigger a number (usually 8) refresh cycles by */
/* attempting non-burst read or write accesses to disabled */
/* SDRAM, as commonly specified in the power up sequence */
/* documented in SDRAM data sheets. The address(es) used */
/* for this purpose must not be cacheable. */
ldr r3 , =CONFIG_SYS_DRAM_BASE
str r2 , [ r3 ]
str r2 , [ r3 ]
str r2 , [ r3 ]
str r2 , [ r3 ]
str r2 , [ r3 ]
str r2 , [ r3 ]
str r2 , [ r3 ]
str r2 , [ r3 ]
/* Step 4g: Write MDCNFG with enable bits asserted */
/* (MDCNFG:DEx set to 1). */
ldr r3 , [ r1 , #M D C N F G _ O F F S E T ]
mov r4 , r3
orr r3 , r3 , #M D C N F G _ D E 0
str r3 , [ r1 , #M D C N F G _ O F F S E T ]
mov r0 , r3
/* Step 4h: Write MDMRS. */
ldr r2 , =CONFIG_SYS_MDMRS_VAL
str r2 , [ r1 , #M D M R S _ O F F S E T ]
/* enable APD */
ldr r3 , [ r1 , #M D R E F R _ O F F S E T ]
orr r3 , r3 , #M D R E F R _ A P D
str r3 , [ r1 , #M D R E F R _ O F F S E T ]
/* We are finished with Intel's memory controller initialisation */
setvoltage :
mov r10 , l r
bl i n i t P X A v o l t a g e / * I n c a s e t h e b o a r d i s r e b o o t i n g w i t h a * /
mov l r , r10 / * l o w v o l t a g e r a i s e i t u p t o a g o o d o n e . * /
# if 1
b i n i t i r q s
# endif
wakeup :
/* Are we waking from sleep? */
ldr r0 , =RCSR
ldr r1 , [ r0 ]
and r1 , r1 , #( R C S R _ G P R | R C S R _ S M R | R C S R _ W D R | R C S R _ H W R )
str r1 , [ r0 ]
teq r1 , #R C S R _ S M R
bne i n i t i r q s
ldr r0 , =PSSR
mov r1 , #P S S R _ P H
str r1 , [ r0 ]
/* if so, resume at PSPR */
ldr r0 , =PSPR
ldr r1 , [ r0 ]
mov p c , r1
/* ---------------------------------------------------------------- */
/* Disable (mask) all interrupts at interrupt controller */
/* ---------------------------------------------------------------- */
initirqs :
mov r1 , #0 / * c l e a r i n t . l e v e l r e g i s t e r ( I R Q , n o t F I Q ) * /
ldr r2 , =ICLR
str r1 , [ r2 ]
ldr r2 , =ICMR / * m a s k a l l i n t e r r u p t s a t t h e c o n t r o l l e r * /
str r1 , [ r2 ]
/* ---------------------------------------------------------------- */
/* Clock initialisation */
/* ---------------------------------------------------------------- */
initclks :
/* Disable the peripheral clocks, and set the core clock frequency */
/* Turn Off on-chip peripheral clocks (except for memory) */
/* for re-configuration. */
ldr r1 , =CKEN
ldr r2 , =CONFIG_SYS_CKEN
str r2 , [ r1 ]
/* ... and write the core clock config register */
ldr r2 , =CONFIG_SYS_CCCR
ldr r1 , =CCCR
str r2 , [ r1 ]
/* Turn on turbo mode */
mrc p14 , 0 , r2 , c6 , c0 , 0
orr r2 , r2 , #0xB / * T u r b o , F a s t - B u s , F r e q c h a n g e * * /
mcr p14 , 0 , r2 , c6 , c0 , 0
/* Re-write MDREFR */
ldr r1 , =MEMC_BASE
ldr r2 , [ r1 , #M D R E F R _ O F F S E T ]
str r2 , [ r1 , #M D R E F R _ O F F S E T ]
# ifdef R T C
/* enable the 32Khz oscillator for RTC and PowerManager */
ldr r1 , =OSCC
mov r2 , #O S C C _ O O N
str r2 , [ r1 ]
/* NOTE: spin here until OSCC.OOK get set, meaning the PLL */
/* has settled. */
60 :
ldr r2 , [ r1 ]
ands r2 , r2 , #1
beq 6 0 b
# else
# error " R T C n o t d e f i n e d "
# endif
/* Interrupt init: Mask all interrupts */
ldr r0 , =ICMR / * e n a b l e n o s o u r c e s * /
mov r1 , #0
str r1 , [ r0 ]
/* FIXME */
# ifdef N O D E B U G
/*Disable software and data breakpoints */
mov r0 ,#0
mcr p15 ,0 ,r0 ,c14 ,c8 ,0 / * i b c r0 * /
mcr p15 ,0 ,r0 ,c14 ,c9 ,0 / * i b c r1 * /
mcr p15 ,0 ,r0 ,c14 ,c4 ,0 / * d b c o n * /
/*Enable all debug functionality */
mov r0 ,#0x80000000
mcr p14 ,0 ,r0 ,c10 ,c0 ,0 / * d c s r * /
# endif
/* ---------------------------------------------------------------- */
/* End lowlevel_init */
/* ---------------------------------------------------------------- */
endlowlevel_init :
mov p c , l r