2014-08-21 22:10:31 +10:00
/ *
* head- r a m . S - s t a r t u p c o d e f o r M o t o r o l a 6 8 3 6 0
2005-09-12 11:18:10 +10:00
*
* Copyright 2 0 0 1 ( C ) S E D S y s t e m s , a D i v i s i o n o f C a l i a n L t d .
* Based o n : a r c h / m 6 8 k n o m m u / p l a t f o r m / 6 8 3 2 8 / p i l o t / c r t 0 _ r o m . S
* Based o n : a r c h / m 6 8 k n o m m u / p l a t f o r m / 6 8 3 6 0 / u C q u i c c / c r t 0 _ r o m . S , 2 . 0 . 3 8 . 1 . p r e 7
* uClinux K e r n e l
* Copyright ( C ) M i c h a e l L e s l i e < m l e s l i e @lineo.com>
* Based o n : a r c h / m 6 8 k n o m m u / p l a t f o r m / 6 8 E Z 3 2 8 / u c s i m m / c r t 0 _ r o m . S
* Copyright ( C ) 1 9 9 8 D . J e f f D i o n n e < j e f f @uclinux.org>,
*
* /
# define A S S E M B L Y
.global _stext
.global _start
.global _rambase
.global _ramvec
.global _ramstart
.global _ramend
.global _quicc_base
.global _periph_base
2006-06-27 13:27:08 +10:00
# define R A M E N D ( C O N F I G _ R A M B A S E + C O N F I G _ R A M S I Z E )
2006-12-04 17:27:42 +10:00
# define R O M E N D ( C O N F I G _ R O M B A S E + C O N F I G _ R O M S I Z E )
2006-06-27 13:27:08 +10:00
2005-09-12 11:18:10 +10:00
# define R E G B 0 x10 0 0
# define P E P A R ( _ d p r b a s e + R E G B + 0 x00 1 6 )
# define G M R ( _ d p r b a s e + R E G B + 0 x00 4 0 )
# define O R 0 ( _ d p r b a s e + R E G B + 0 x00 5 4 )
# define B R 0 ( _ d p r b a s e + R E G B + 0 x00 5 0 )
# define O R 1 ( _ d p r b a s e + R E G B + 0 x00 6 4 )
# define B R 1 ( _ d p r b a s e + R E G B + 0 x00 6 0 )
# define O R 4 ( _ d p r b a s e + R E G B + 0 x00 9 4 )
# define B R 4 ( _ d p r b a s e + R E G B + 0 x00 9 0 )
# define O R 6 ( _ d p r b a s e + R E G B + 0 x00 b4 )
# define B R 6 ( _ d p r b a s e + R E G B + 0 x00 b0 )
# define O R 7 ( _ d p r b a s e + R E G B + 0 x00 c4 )
# define B R 7 ( _ d p r b a s e + R E G B + 0 x00 c0 )
# define M C R ( _ d p r b a s e + R E G B + 0 x00 0 0 )
# define A V R ( _ d p r b a s e + R E G B + 0 x00 0 8 )
# define S Y P C R ( _ d p r b a s e + R E G B + 0 x00 2 2 )
# define P L L C R ( _ d p r b a s e + R E G B + 0 x00 1 0 )
# define C L K O C R ( _ d p r b a s e + R E G B + 0 x00 0 C )
# define C D V C R ( _ d p r b a s e + R E G B + 0 x00 1 4 )
# define B K A R ( _ d p r b a s e + R E G B + 0 x00 3 0 )
# define B K C R ( _ d p r b a s e + R E G B + 0 x00 3 4 )
# define S W I V ( _ d p r b a s e + R E G B + 0 x00 2 3 )
# define P I C R ( _ d p r b a s e + R E G B + 0 x00 2 6 )
# define P I T R ( _ d p r b a s e + R E G B + 0 x00 2 A )
/* Define for all memory configuration */
# define M C U _ S I M _ G M R 0 x00 0 0 0 0 0 0
# define S I M _ O R _ M A S K 0 x0 f f f f f f f
/* Defines for chip select zero - the flash */
# define S I M _ O R 0 _ M A S K 0 x20 0 0 0 0 0 2
# define S I M _ B R 0 _ M A S K 0 x00 0 0 0 0 0 1
/* Defines for chip select one - the RAM */
# define S I M _ O R 1 _ M A S K 0 x10 0 0 0 0 0 0
# define S I M _ B R 1 _ M A S K 0 x00 0 0 0 0 0 1
# define M C U _ S I M _ M B A R _ A D R S 0 x00 0 3 f f00
# define M C U _ S I M _ M B A R _ B A _ M A S K 0 x f f f f f00 0
# define M C U _ S I M _ M B A R _ A S _ M A S K 0 x00 0 0 0 0 0 1
# define M C U _ S I M _ P E P A R 0 x00 B 4
# define M C U _ D I S A B L E _ I N T R P T S 0 x27 0 0
# define M C U _ S I M _ A V R 0 x00
# define M C U _ S I M _ M C R 0 x00 0 0 5 c f f
# define M C U _ S I M _ C L K O C R 0 x00
# define M C U _ S I M _ P L L C R 0 x80 0 0
# define M C U _ S I M _ C D V C R 0 x00 0 0
# define M C U _ S I M _ S Y P C R 0 x00 0 0
# define M C U _ S I M _ S W I V 0 x00
# define M C U _ S I M _ P I C R 0 x00 0 0
# define M C U _ S I M _ P I T R 0 x00 0 0
# include < a s m / m 6 8 3 6 0 _ r e g s . h >
/ *
* By t h e t i m e t h i s R A M s p e c i f i c c o d e b e g i n s t o e x e c u t e , D P R A M
* and D R A M s h o u l d a l r e a d y b e m a p p e d a n d a c c e s s i b l e .
* /
.text
_start :
_stext :
nop
ori. w #M C U _ D I S A B L E _ I N T R P T S , % s r / * d i s a b l e i n t e r r u p t s : * /
/* We should not need to setup the boot stack the reset should do it. */
2006-06-27 13:27:08 +10:00
movea. l #R A M E N D , % s p / * s e t u p s t a c k a t t h e e n d o f D R A M : * /
2005-09-12 11:18:10 +10:00
set_mbar_register :
moveq. l #0x07 , % d1 / * S e t u p M B A R * /
movec % d1 , % d f c
lea. l M C U _ S I M _ M B A R _ A D R S , % a0
move. l #_ d p r b a s e , % d 0
andi. l #M C U _ S I M _ M B A R _ B A _ M A S K , % d 0
ori. l #M C U _ S I M _ M B A R _ A S _ M A S K , % d 0
moves. l % d0 , % a0 @
moveq. l #0x05 , % d1
movec. l % d1 , % d f c
/* Now we can begin to access registers in DPRAM */
set_sim_mcr :
/* Set Module Configuration Register */
move. l #M C U _ S I M _ M C R , M C R
/* to do: Determine cause of reset */
/ *
* configure s y s t e m c l o c k M C 6 8 3 6 0 p . 6 - 4 0
* ( value + 1 ) * o s c / 1 2 8 = s y s t e m c l o c k
* /
set_sim_clock :
move. w #M C U _ S I M _ P L L C R , P L L C R
move. b #M C U _ S I M _ C L K O C R , C L K O C R
move. w #M C U _ S I M _ C D V C R , C D V C R
/* Wait for the PLL to settle */
move. w #16384 , % d0
pll_settle_wait :
subi. w #1 , % d0
bne p l l _ s e t t l e _ w a i t
/* Setup the system protection register, and watchdog timer register */
move. b #M C U _ S I M _ S W I V , S W I V
move. w #M C U _ S I M _ P I C R , P I C R
move. w #M C U _ S I M _ P I T R , P I T R
move. w #M C U _ S I M _ S Y P C R , S Y P C R
/* Clear DPRAM - system + parameter */
movea. l #_ d p r b a s e , % a 0
movea. l #_ d p r b a s e + 0x2000 , % a1
/* Copy 0 to %a0 until %a0 == %a1 */
clear_dpram :
movel #0 , % a0 @+
cmpal % a0 , % a1
bhi c l e a r _ d p r a m
configure_memory_controller :
/* Set up Global Memory Register (GMR) */
move. l #M C U _ S I M _ G M R , % d 0
move. l % d0 , G M R
configure_chip_select_0 :
2006-06-27 13:27:08 +10:00
move. l #R A M E N D , % d 0
2005-09-12 11:18:10 +10:00
subi. l #_ _ r a m s t a r t , % d 0
subq. l #0x01 , % d0
eori. l #S I M _ O R _ M A S K , % d 0
ori. l #S I M _ O R 0 _ M A S K , % d0
move. l % d0 , O R 0
move. l #_ _ r a m s t a r t , % d 0
ori. l #S I M _ B R 0 _ M A S K , % d0
move. l % d0 , B R 0
configure_chip_select_1 :
2006-12-04 17:27:42 +10:00
move. l #R O M E N D , % d 0
2005-09-12 11:18:10 +10:00
subi. l #_ _ r o m _ s t a r t , % d 0
subq. l #0x01 , % d0
eori. l #S I M _ O R _ M A S K , % d 0
ori. l #S I M _ O R 1 _ M A S K , % d0
move. l % d0 , O R 1
move. l #_ _ r o m _ s t a r t , % d 0
ori. l #S I M _ B R 1 _ M A S K , % d0
move. l % d0 , B R 1
move. w #M C U _ S I M _ P E P A R , P E P A R
/* point to vector table: */
move. l #_ r o m v e c , % a 0
move. l #_ r a m v e c , % a 1
copy_vectors :
move. l % a0 @, %d0
move. l % d0 , % a1 @
move. l % a0 @, %a1@
addq. l #0x04 , % a0
addq. l #0x04 , % a1
cmp. l #_ s t a r t , % a 0
blt c o p y _ v e c t o r s
move. l #_ r a m v e c , % a 1
movec % a1 , % v b r
/* Copy data segment from ROM to RAM */
moveal #_ s t e x t , % a 0
moveal #_ s d a t a , % a 1
moveal #_ e d a t a , % a 2
/* Copy %a0 to %a1 until %a1 == %a2 */
LD1 :
move. l % a0 @, %d0
addq. l #0x04 , % a0
move. l % d0 , % a1 @
addq. l #0x04 , % a1
cmp. l #_ e d a t a , % a 1
blt L D 1
2012-05-31 21:46:03 +02:00
moveal #_ _ b s s _ s t a r t , % a 0
moveal #_ _ b s s _ s t o p , % a 1
2005-09-12 11:18:10 +10:00
/* Copy 0 to %a0 until %a0 == %a1 */
L1 :
movel #0 , % a0 @+
cmpal % a0 , % a1
bhi L 1
load_quicc :
move. l #_ d p r b a s e , _ q u i c c _ b a s e
store_ram_size :
/* Set ram size information */
move. l #_ s d a t a , _ r a m b a s e
2012-05-31 21:46:03 +02:00
move. l #_ _ b s s _ s t o p , _ r a m s t a r t
2006-06-27 13:27:08 +10:00
move. l #R A M E N D , % d 0
2005-09-12 11:18:10 +10:00
sub. l #0x1000 , % d0 / * R e s e r v e 4 K f o r s t a c k s p a c e . * /
2006-06-27 13:27:08 +10:00
move. l % d0 , _ r a m e n d / * D i f f e r e n t f r o m R A M E N D . * /
2005-09-12 11:18:10 +10:00
pea 0
pea e n v
pea % s p @(4)
pea 0
lea i n i t _ t h r e a d _ u n i o n , % a2
lea 0 x20 0 0 ( % a2 ) , % s p
lp :
jsr s t a r t _ k e r n e l
_exit :
jmp _ e x i t
.data
.align 4
env :
.long 0
_quicc_base :
.long 0
_periph_base :
.long 0
_ramvec :
.long 0
_rambase :
.long 0
_ramstart :
.long 0
_ramend :
.long 0
_dprbase :
.long 0xffffe000
.text
/ *
* These a r e t h e e x c e p t i o n v e c t o r s a t b o o t u p , t h e y a r e c o p i e d i n t o R A M
* and t h e n o v e r w r i t t e n a s n e e d e d .
* /
2010-02-20 01:03:54 +01:00
.section " .data . .initvect " , " awx"
2006-06-27 13:27:08 +10:00
.long RAMEND /* Reset: Initial Stack Pointer - 0. */
2005-09-12 11:18:10 +10:00
.long _start /* Reset: Initial Program Counter - 1. */
.long buserr /* Bus Error - 2. */
.long trap /* Address Error - 3. */
.long trap /* Illegal Instruction - 4. */
.long trap /* Divide by zero - 5. */
.long trap /* CHK, CHK2 Instructions - 6. */
.long trap /* TRAPcc, TRAPV Instructions - 7. */
.long trap /* Privilege Violation - 8. */
.long trap /* Trace - 9. */
.long trap /* Line 1010 Emulator - 10. */
.long trap /* Line 1111 Emualtor - 11. */
.long trap /* Harware Breakpoint - 12. */
.long trap /* (Reserved for Coprocessor Protocol Violation)- 13. */
.long trap /* Format Error - 14. */
.long trap /* Uninitialized Interrupt - 15. */
.long trap /* (Unassigned, Reserver) - 16. */
.long trap /* (Unassigned, Reserver) - 17. */
.long trap /* (Unassigned, Reserver) - 18. */
.long trap /* (Unassigned, Reserver) - 19. */
.long trap /* (Unassigned, Reserver) - 20. */
.long trap /* (Unassigned, Reserver) - 21. */
.long trap /* (Unassigned, Reserver) - 22. */
.long trap /* (Unassigned, Reserver) - 23. */
.long trap /* Spurious Interrupt - 24. */
.long trap /* Level 1 Interrupt Autovector - 25. */
.long trap /* Level 2 Interrupt Autovector - 26. */
.long trap /* Level 3 Interrupt Autovector - 27. */
.long trap /* Level 4 Interrupt Autovector - 28. */
.long trap /* Level 5 Interrupt Autovector - 29. */
.long trap /* Level 6 Interrupt Autovector - 30. */
.long trap /* Level 7 Interrupt Autovector - 31. */
.long system_call /* Trap Instruction Vectors 0 - 32. */
.long trap /* Trap Instruction Vectors 1 - 33. */
.long trap /* Trap Instruction Vectors 2 - 34. */
.long trap /* Trap Instruction Vectors 3 - 35. */
.long trap /* Trap Instruction Vectors 4 - 36. */
.long trap /* Trap Instruction Vectors 5 - 37. */
.long trap /* Trap Instruction Vectors 6 - 38. */
.long trap /* Trap Instruction Vectors 7 - 39. */
.long trap /* Trap Instruction Vectors 8 - 40. */
.long trap /* Trap Instruction Vectors 9 - 41. */
.long trap /* Trap Instruction Vectors 10 - 42. */
.long trap /* Trap Instruction Vectors 11 - 43. */
.long trap /* Trap Instruction Vectors 12 - 44. */
.long trap /* Trap Instruction Vectors 13 - 45. */
.long trap /* Trap Instruction Vectors 14 - 46. */
.long trap /* Trap Instruction Vectors 15 - 47. */
.long 0 /* (Reserved for Coprocessor) - 48. */
.long 0 /* (Reserved for Coprocessor) - 49. */
.long 0 /* (Reserved for Coprocessor) - 50. */
.long 0 /* (Reserved for Coprocessor) - 51. */
.long 0 /* (Reserved for Coprocessor) - 52. */
.long 0 /* (Reserved for Coprocessor) - 53. */
.long 0 /* (Reserved for Coprocessor) - 54. */
.long 0 /* (Reserved for Coprocessor) - 55. */
.long 0 /* (Reserved for Coprocessor) - 56. */
.long 0 /* (Reserved for Coprocessor) - 57. */
.long 0 /* (Reserved for Coprocessor) - 58. */
.long 0 /* (Unassigned, Reserved) - 59. */
.long 0 /* (Unassigned, Reserved) - 60. */
.long 0 /* (Unassigned, Reserved) - 61. */
.long 0 /* (Unassigned, Reserved) - 62. */
.long 0 /* (Unassigned, Reserved) - 63. */
/* The assignment of these vectors to the CPM is */
/* dependent on the configuration of the CPM vba */
/* fields. */
.long 0 /* (User-Defined Vectors 1) CPM Error - 64. */
.long 0 /* (User-Defined Vectors 2) CPM Parallel IO PC11- 65. */
.long 0 /* (User-Defined Vectors 3) CPM Parallel IO PC10- 66. */
.long 0 /* (User-Defined Vectors 4) CPM SMC2 / PIP - 67. */
.long 0 /* (User-Defined Vectors 5) CPM SMC1 - 68. */
.long 0 /* (User-Defined Vectors 6) CPM SPI - 69. */
.long 0 /* (User-Defined Vectors 7) CPM Parallel IO PC9 - 70. */
.long 0 /* (User-Defined Vectors 8) CPM Timer 4 - 71. */
.long 0 /* (User-Defined Vectors 9) CPM Reserved - 72. */
.long 0 /* (User-Defined Vectors 10) CPM Parallel IO PC8- 73. */
.long 0 /* (User-Defined Vectors 11) CPM Parallel IO PC7- 74. */
.long 0 /* (User-Defined Vectors 12) CPM Parallel IO PC6- 75. */
.long 0 /* (User-Defined Vectors 13) CPM Timer 3 - 76. */
.long 0 /* (User-Defined Vectors 14) CPM Reserved - 77. */
.long 0 /* (User-Defined Vectors 15) CPM Parallel IO PC5- 78. */
.long 0 /* (User-Defined Vectors 16) CPM Parallel IO PC4- 79. */
.long 0 /* (User-Defined Vectors 17) CPM Reserved - 80. */
.long 0 /* (User-Defined Vectors 18) CPM RISC Timer Tbl - 81. */
.long 0 /* (User-Defined Vectors 19) CPM Timer 2 - 82. */
.long 0 /* (User-Defined Vectors 21) CPM Reserved - 83. */
.long 0 /* (User-Defined Vectors 22) CPM IDMA2 - 84. */
.long 0 /* (User-Defined Vectors 23) CPM IDMA1 - 85. */
.long 0 /* (User-Defined Vectors 24) CPM SDMA Bus Err - 86. */
.long 0 /* (User-Defined Vectors 25) CPM Parallel IO PC3- 87. */
.long 0 /* (User-Defined Vectors 26) CPM Parallel IO PC2- 88. */
.long 0 /* (User-Defined Vectors 27) CPM Timer 1 - 89. */
.long 0 /* (User-Defined Vectors 28) CPM Parallel IO PC1- 90. */
.long 0 /* (User-Defined Vectors 29) CPM SCC 4 - 91. */
.long 0 /* (User-Defined Vectors 30) CPM SCC 3 - 92. */
.long 0 /* (User-Defined Vectors 31) CPM SCC 2 - 93. */
.long 0 /* (User-Defined Vectors 32) CPM SCC 1 - 94. */
.long 0 /* (User-Defined Vectors 33) CPM Parallel IO PC0- 95. */
/* I don't think anything uses the vectors after here. */
.long 0 /* (User-Defined Vectors 34) - 96. */
.long 0 , 0 , 0 , 0 , 0 /* (User-Defined Vectors 35 - 39). */
.long 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 /* (User-Defined Vectors 40 - 49). */
.long 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 /* (User-Defined Vectors 50 - 59). */
.long 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 /* (User-Defined Vectors 60 - 69). */
.long 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 /* (User-Defined Vectors 70 - 79). */
.long 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 /* (User-Defined Vectors 80 - 89). */
.long 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 /* (User-Defined Vectors 90 - 99). */
.long 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 /* (User-Defined Vectors 100 - 109). */
.long 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 /* (User-Defined Vectors 110 - 119). */
.long 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 /* (User-Defined Vectors 120 - 129). */
.long 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 /* (User-Defined Vectors 130 - 139). */
.long 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 /* (User-Defined Vectors 140 - 149). */
.long 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 /* (User-Defined Vectors 150 - 159). */
.long 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 /* (User-Defined Vectors 160 - 169). */
.long 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 /* (User-Defined Vectors 170 - 179). */
.long 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 /* (User-Defined Vectors 180 - 189). */
.long 0 , 0 , 0 /* (User-Defined Vectors 190 - 192). */
.text
ignore : rte