lowlevel_init.S 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. #include <config.h>
  2. #include <version.h>
  3. #include <asm/arch/pxa-regs.h>
  4. DRAM_SIZE: .long CONFIG_SYS_DRAM_SIZE
  5. .globl lowlevel_init
  6. lowlevel_init:
  7. mov r10, lr
  8. /* ---- GPIO INITIALISATION ---- */
  9. /* Set up GPIO pins first (3 groups [31:0] [63:32] [80:64]) */
  10. /* General purpose set registers */
  11. ldr r0, =GPSR0
  12. ldr r1, =CONFIG_SYS_GPSR0_VAL
  13. str r1, [r0]
  14. ldr r0, =GPSR1
  15. ldr r1, =CONFIG_SYS_GPSR1_VAL
  16. str r1, [r0]
  17. ldr r0, =GPSR2
  18. ldr r1, =CONFIG_SYS_GPSR2_VAL
  19. str r1, [r0]
  20. /* General purpose clear registers */
  21. ldr r0, =GPCR0
  22. ldr r1, =CONFIG_SYS_GPCR0_VAL
  23. str r1, [r0]
  24. ldr r0, =GPCR1
  25. ldr r1, =CONFIG_SYS_GPCR1_VAL
  26. str r1, [r0]
  27. ldr r0, =GPCR2
  28. ldr r1, =CONFIG_SYS_GPCR2_VAL
  29. str r1, [r0]
  30. /* General rising edge registers */
  31. ldr r0, =GRER0
  32. ldr r1, =CONFIG_SYS_GRER0_VAL
  33. str r1, [r0]
  34. ldr r0, =GRER1
  35. ldr r1, =CONFIG_SYS_GRER1_VAL
  36. str r1, [r0]
  37. ldr r0, =GRER2
  38. ldr r1, =CONFIG_SYS_GRER2_VAL
  39. str r1, [r0]
  40. /* General falling edge registers */
  41. ldr r0, =GFER0
  42. ldr r1, =CONFIG_SYS_GFER0_VAL
  43. str r1, [r0]
  44. ldr r0, =GFER1
  45. ldr r1, =CONFIG_SYS_GFER1_VAL
  46. str r1, [r0]
  47. ldr r0, =GFER2
  48. ldr r1, =CONFIG_SYS_GFER2_VAL
  49. str r1, [r0]
  50. /* General edge detect registers */
  51. ldr r0, =GPDR0
  52. ldr r1, =CONFIG_SYS_GPDR0_VAL
  53. str r1, [r0]
  54. ldr r0, =GPDR1
  55. ldr r1, =CONFIG_SYS_GPDR1_VAL
  56. str r1, [r0]
  57. ldr r0, =GPDR2
  58. ldr r1, =CONFIG_SYS_GPDR2_VAL
  59. str r1, [r0]
  60. /* General alternate function registers */
  61. ldr r0, =GAFR0_L /* [0:15] */
  62. ldr r1, =CONFIG_SYS_GAFR0_L_VAL
  63. str r1, [r0]
  64. ldr r0, =GAFR0_U /* [31:16] */
  65. ldr r1, =CONFIG_SYS_GAFR0_U_VAL
  66. str r1, [r0]
  67. ldr r0, =GAFR1_L /* [47:32] */
  68. ldr r1, =CONFIG_SYS_GAFR1_L_VAL
  69. str r1, [r0]
  70. ldr r0, =GAFR1_U /* [63:48] */
  71. ldr r1, =CONFIG_SYS_GAFR1_U_VAL
  72. str r1, [r0]
  73. ldr r0, =GAFR2_L /* [79:64] */
  74. ldr r1, =CONFIG_SYS_GAFR2_L_VAL
  75. str r1, [r0]
  76. ldr r0, =GAFR2_U /* [80] */
  77. ldr r1, =CONFIG_SYS_GAFR2_U_VAL
  78. str r1, [r0]
  79. /* General purpose direction registers */
  80. ldr r0, =GPDR0
  81. ldr r1, =CONFIG_SYS_GPDR0_VAL
  82. str r1, [r0]
  83. ldr r0, =GPDR1
  84. ldr r1, =CONFIG_SYS_GPDR1_VAL
  85. str r1, [r0]
  86. ldr r0, =GPDR2
  87. ldr r1, =CONFIG_SYS_GPDR2_VAL
  88. str r1, [r0]
  89. /* Power manager sleep status */
  90. ldr r0, =PSSR
  91. ldr r1, =CONFIG_SYS_PSSR_VAL
  92. str r1, [r0]
  93. /* ---- MEMORY INITIALISATION ---- */
  94. /* Initialize Memory Controller, see PXA250 Operating System Developer's Guide */
  95. /* pause for 200 uSecs- allow internal clocks to settle */
  96. ldr r3, =OSCR /* reset the OS Timer Count to zero */
  97. mov r2, #0
  98. str r2, [r3]
  99. ldr r4, =0x300 /* really 0x2E1 is about 200usec, so 0x300 should be plenty */
  100. 1:
  101. ldr r2, [r3]
  102. cmp r4, r2
  103. bgt 1b
  104. mem_init:
  105. /* get memory controller base address */
  106. ldr r1, =MEMC_BASE
  107. /* ---- FLASH INITIALISATION ---- */
  108. /* Write MSC0 and read back to ensure data change is accepted by cpu */
  109. ldr r2, =CONFIG_SYS_MSC0_VAL
  110. str r2, [r1, #MSC0_OFFSET]
  111. ldr r2, [r1, #MSC0_OFFSET]
  112. /* ---- SDRAM INITIALISATION ---- */
  113. /* get the MDREFR settings */
  114. ldr r2, =CONFIG_SYS_MDREFR_VAL
  115. str r2, [r1, #MDREFR_OFFSET]
  116. /* fetch platform value of MDCNFG */
  117. ldr r2, =CONFIG_SYS_MDCNFG_VAL
  118. /* disable all sdram banks */
  119. bic r2, r2, #(MDCNFG_DE0 | MDCNFG_DE1)
  120. bic r2, r2, #(MDCNFG_DE2 | MDCNFG_DE3)
  121. /* write initial value of MDCNFG, w/o enabling sdram banks */
  122. str r2, [r1, #MDCNFG_OFFSET]
  123. /* pause for 200 uSecs */
  124. ldr r3, =OSCR /* reset the OS Timer Count to zero */
  125. mov r2, #0
  126. str r2, [r3]
  127. ldr r4, =0x300 /* about 200 usec */
  128. 1:
  129. ldr r2, [r3]
  130. cmp r4, r2
  131. bgt 1b
  132. /* Access memory *not yet enabled* for CBR refresh cycles (8) */
  133. /* CBR is generated for all banks */
  134. ldr r2, =CONFIG_SYS_DRAM_BASE
  135. str r2, [r2]
  136. str r2, [r2]
  137. str r2, [r2]
  138. str r2, [r2]
  139. str r2, [r2]
  140. str r2, [r2]
  141. str r2, [r2]
  142. str r2, [r2]
  143. /* get memory controller base address */
  144. ldr r2, =MEMC_BASE
  145. /* Enable SDRAM bank 0 in MDCNFG register */
  146. ldr r2, [r1, #MDCNFG_OFFSET]
  147. orr r2, r2, #MDCNFG_DE0
  148. str r2, [r1, #MDCNFG_OFFSET]
  149. /* write MDMRS to trigger an MSR command to all enabled SDRAM banks */
  150. ldr r2, =CONFIG_SYS_MDMRS_VAL
  151. str r2, [r1, #MDMRS_OFFSET]
  152. /* ---- INTERRUPT INITIALISATION ---- */
  153. /* Disable (mask) all interrupts at the interrupt controller */
  154. /* clear the interrupt level register (use IRQ, not FIQ) */
  155. mov r1, #0
  156. ldr r2, =ICLR
  157. str r1, [r2]
  158. /* Set interrupt mask register */
  159. ldr r1, =CONFIG_SYS_ICMR_VAL
  160. ldr r2, =ICMR
  161. str r1, [r2]
  162. /* ---- CLOCK INITIALISATION ---- */
  163. /* Disable the peripheral clocks, and set the core clock */
  164. /* Turn Off ALL on-chip peripheral clocks for re-configuration */
  165. ldr r1, =CKEN
  166. mov r2, #0
  167. str r2, [r1]
  168. /* set core clocks */
  169. ldr r2, =CONFIG_SYS_CCCR_VAL
  170. ldr r1, =CCCR
  171. str r2, [r1]
  172. #ifdef ENABLE32KHZ
  173. /* enable the 32Khz oscillator for RTC and PowerManager */
  174. ldr r1, =OSCC
  175. mov r2, #OSCC_OON
  176. str r2, [r1]
  177. /* NOTE: spin here until OSCC.OOK get set, meaning the PLL has settled. */
  178. 60:
  179. ldr r2, [r1]
  180. ands r2, r2, #1
  181. beq 60b
  182. #endif
  183. /* Turn on needed clocks */
  184. ldr r1, =CKEN
  185. ldr r2, =CONFIG_SYS_CKEN_VAL
  186. str r2, [r1]
  187. mov pc, r10