You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

319 lines
8.7 KiB

  1. #######################################
  2. # DENX M53EVK #
  3. # http://www.denx-cs.de/?q=M53EVK #
  4. # Author: Marek Vasut <marex@denx.de> #
  5. # Based on imx53loco.cfg #
  6. #######################################
  7. # The DENX M53EVK has on-board JTAG adapter
  8. source [find interface/ftdi/m53evk.cfg]
  9. # The DENX M53EVK board has a single i.MX53 chip
  10. source [find target/imx53.cfg]
  11. # Helper for common memory read/modify/write procedures
  12. source [find mem_helper.tcl]
  13. echo "iMX53 M53EVK board lodaded."
  14. # Set reset type
  15. reset_config trst_and_srst separate trst_open_drain srst_open_drain
  16. # Run at 6 MHz
  17. adapter speed 6000
  18. $_TARGETNAME configure -event "reset-assert" {
  19. echo "Resetting ...."
  20. #cortex_a dbginit
  21. }
  22. $_TARGETNAME configure -event reset-init { m53evk_init }
  23. global AIPS1_BASE_ADDR
  24. set AIPS1_BASE_ADDR 0x53F00000
  25. global AIPS2_BASE_ADDR
  26. set AIPS2_BASE_ADDR 0x63F00000
  27. proc m53evk_init { } {
  28. echo "Reset-init..."
  29. ; # halt the CPU
  30. halt
  31. echo "HW version [format %x [mrw 0x48]]"
  32. dap apsel 1
  33. DCD
  34. ; # ARM errata ID #468414
  35. set tR [arm mrc 15 0 1 0 1]
  36. arm mcr 15 0 1 0 1 [expr {$tR | (1<<5)}] ; # enable L1NEON bit
  37. init_l2cc
  38. init_aips
  39. init_clock
  40. dap apsel 0
  41. ; # Force ARM state
  42. ; #reg cpsr 0x000001D3
  43. arm core_state arm
  44. }
  45. # L2CC Cache setup/invalidation/disable
  46. proc init_l2cc { } {
  47. ; #/* explicitly disable L2 cache */
  48. ; #mrc 15, 0, r0, c1, c0, 1
  49. set tR [arm mrc 15 0 1 0 1]
  50. ; #bic r0, r0, #0x2
  51. ; #mcr 15, 0, r0, c1, c0, 1
  52. arm mcr 15 0 1 0 1 [expr {$tR & ~(1 << 2)}]
  53. ; #/* reconfigure L2 cache aux control reg */
  54. ; #mov r0, #0xC0 /* tag RAM */
  55. ; #add r0, r0, #0x4 /* data RAM */
  56. ; #orr r0, r0, #(1 << 24) /* disable write allocate delay */
  57. ; #orr r0, r0, #(1 << 23) /* disable write allocate combine */
  58. ; #orr r0, r0, #(1 << 22) /* disable write allocate */
  59. ; #mcr 15, 1, r0, c9, c0, 2
  60. arm mcr 15 1 9 0 2 [expr {0xC4 | (1<<24) | (1<<23) | (1<<22)}]
  61. }
  62. # AIPS setup - Only setup MPROTx registers.
  63. # The PACR default values are good.
  64. proc init_aips { } {
  65. ; # Set all MPROTx to be non-bufferable, trusted for R/W,
  66. ; # not forced to user-mode.
  67. global AIPS1_BASE_ADDR
  68. global AIPS2_BASE_ADDR
  69. set VAL 0x77777777
  70. # dap apsel 1
  71. mww [expr {$AIPS1_BASE_ADDR + 0x0}] $VAL
  72. mww [expr {$AIPS1_BASE_ADDR + 0x4}] $VAL
  73. mww [expr {$AIPS2_BASE_ADDR + 0x0}] $VAL
  74. mww [expr {$AIPS2_BASE_ADDR + 0x4}] $VAL
  75. # dap apsel 0
  76. }
  77. proc init_clock { } {
  78. global AIPS1_BASE_ADDR
  79. global AIPS2_BASE_ADDR
  80. set CCM_BASE_ADDR [expr {$AIPS1_BASE_ADDR + 0x000D4000}]
  81. set CLKCTL_CCSR 0x0C
  82. set CLKCTL_CBCDR 0x14
  83. set CLKCTL_CBCMR 0x18
  84. set PLL1_BASE_ADDR [expr {$AIPS2_BASE_ADDR + 0x00080000}]
  85. set PLL2_BASE_ADDR [expr {$AIPS2_BASE_ADDR + 0x00084000}]
  86. set PLL3_BASE_ADDR [expr {$AIPS2_BASE_ADDR + 0x00088000}]
  87. set PLL4_BASE_ADDR [expr {$AIPS2_BASE_ADDR + 0x0008C000}]
  88. set CLKCTL_CSCMR1 0x1C
  89. set CLKCTL_CDHIPR 0x48
  90. set PLATFORM_BASE_ADDR [expr {$AIPS2_BASE_ADDR + 0x000A0000}]
  91. set CLKCTL_CSCDR1 0x24
  92. set CLKCTL_CCDR 0x04
  93. ; # Switch ARM to step clock
  94. mww [expr {$CCM_BASE_ADDR + $CLKCTL_CCSR}] 0x4
  95. return
  96. echo "not returned"
  97. setup_pll $PLL1_BASE_ADDR 800
  98. setup_pll $PLL3_BASE_ADDR 400
  99. ; # Switch peripheral to PLL3
  100. mww [expr {$CCM_BASE_ADDR + $CLKCTL_CBCMR}] 0x00015154
  101. mww [expr {$CCM_BASE_ADDR + $CLKCTL_CBCDR}] [expr {0x02888945 | (1<<16)}]
  102. while {[mrw [expr {$CCM_BASE_ADDR + $CLKCTL_CDHIPR}]] != 0} { sleep 1 }
  103. setup_pll $PLL2_BASE_ADDR 400
  104. ; # Switch peripheral to PLL2
  105. mww [expr {$CCM_BASE_ADDR + $CLKCTL_CBCDR}] [expr {0x00808145 | (2<<10) | (9<<16) | (1<<19)}]
  106. mww [expr {$CCM_BASE_ADDR + $CLKCTL_CBCMR}] 0x00016154
  107. ; # change uart clk parent to pll2
  108. mww [expr {$CCM_BASE_ADDR + $CLKCTL_CSCMR1}] [expr {[mrw [expr {$CCM_BASE_ADDR + $CLKCTL_CSCMR1}]] & 0xfcffffff | 0x01000000}]
  109. ; # make sure change is effective
  110. while {[mrw [expr {$CCM_BASE_ADDR + $CLKCTL_CDHIPR}]] != 0} { sleep 1 }
  111. setup_pll $PLL3_BASE_ADDR 216
  112. setup_pll $PLL4_BASE_ADDR 455
  113. ; # Set the platform clock dividers
  114. mww [expr {$PLATFORM_BASE_ADDR + 0x14}] 0x00000124
  115. mww [expr {$CCM_BASE_ADDR + 0x10}] 0
  116. ; # Switch ARM back to PLL 1.
  117. mww [expr {$CCM_BASE_ADDR + $CLKCTL_CCSR}] 0x0
  118. ; # make uart div=6
  119. mww [expr {$CCM_BASE_ADDR + $CLKCTL_CSCDR1}] [expr {[mrw [expr {$CCM_BASE_ADDR + $CLKCTL_CSCDR1}]] & 0xffffffc0 | 0x0a}]
  120. ; # Restore the default values in the Gate registers
  121. mww [expr {$CCM_BASE_ADDR + 0x68}] 0xFFFFFFFF
  122. mww [expr {$CCM_BASE_ADDR + 0x6C}] 0xFFFFFFFF
  123. mww [expr {$CCM_BASE_ADDR + 0x70}] 0xFFFFFFFF
  124. mww [expr {$CCM_BASE_ADDR + 0x74}] 0xFFFFFFFF
  125. mww [expr {$CCM_BASE_ADDR + 0x78}] 0xFFFFFFFF
  126. mww [expr {$CCM_BASE_ADDR + 0x7C}] 0xFFFFFFFF
  127. mww [expr {$CCM_BASE_ADDR + 0x80}] 0xFFFFFFFF
  128. mww [expr {$CCM_BASE_ADDR + 0x84}] 0xFFFFFFFF
  129. mww [expr {$CCM_BASE_ADDR + $CLKCTL_CCDR}] 0x00000
  130. ; # for cko - for ARM div by 8
  131. mww [expr {$CCM_BASE_ADDR + 0x60}] [expr {0x000A0000 & 0x00000F0}]
  132. }
  133. proc setup_pll { PLL_ADDR CLK } {
  134. set PLL_DP_CTL 0x00
  135. set PLL_DP_CONFIG 0x04
  136. set PLL_DP_OP 0x08
  137. set PLL_DP_HFS_OP 0x1C
  138. set PLL_DP_MFD 0x0C
  139. set PLL_DP_HFS_MFD 0x20
  140. set PLL_DP_MFN 0x10
  141. set PLL_DP_HFS_MFN 0x24
  142. if {$CLK == 1000} {
  143. set DP_OP [expr {(10 << 4) + ((1 - 1) << 0)}]
  144. set DP_MFD [expr {12 - 1}]
  145. set DP_MFN 5
  146. } elseif {$CLK == 850} {
  147. set DP_OP [expr {(8 << 4) + ((1 - 1) << 0)}]
  148. set DP_MFD [expr {48 - 1}]
  149. set DP_MFN 41
  150. } elseif {$CLK == 800} {
  151. set DP_OP [expr {(8 << 4) + ((1 - 1) << 0)}]
  152. set DP_MFD [expr {3 - 1}]
  153. set DP_MFN 1
  154. } elseif {$CLK == 700} {
  155. set DP_OP [expr {(7 << 4) + ((1 - 1) << 0)}]
  156. set DP_MFD [expr {24 - 1}]
  157. set DP_MFN 7
  158. } elseif {$CLK == 600} {
  159. set DP_OP [expr {(6 << 4) + ((1 - 1) << 0)}]
  160. set DP_MFD [expr {4 - 1}]
  161. set DP_MFN 1
  162. } elseif {$CLK == 665} {
  163. set DP_OP [expr {(6 << 4) + ((1 - 1) << 0)}]
  164. set DP_MFD [expr {96 - 1}]
  165. set DP_MFN 89
  166. } elseif {$CLK == 532} {
  167. set DP_OP [expr {(5 << 4) + ((1 - 1) << 0)}]
  168. set DP_MFD [expr {24 - 1}]
  169. set DP_MFN 13
  170. } elseif {$CLK == 455} {
  171. set DP_OP [expr {(8 << 4) + ((2 - 1) << 0)}]
  172. set DP_MFD [expr {48 - 1}]
  173. set DP_MFN 71
  174. } elseif {$CLK == 400} {
  175. set DP_OP [expr {(8 << 4) + ((2 - 1) << 0)}]
  176. set DP_MFD [expr {3 - 1}]
  177. set DP_MFN 1
  178. } elseif {$CLK == 216} {
  179. set DP_OP [expr {(6 << 4) + ((3 - 1) << 0)}]
  180. set DP_MFD [expr {4 - 1}]
  181. set DP_MFN 3
  182. } else {
  183. error "Error (setup_dll): clock not found!"
  184. }
  185. mww [expr {$PLL_ADDR + $PLL_DP_CTL}] 0x00001232
  186. mww [expr {$PLL_ADDR + $PLL_DP_CONFIG}] 0x2
  187. mww [expr {$PLL_ADDR + $PLL_DP_OP}] $DP_OP
  188. mww [expr {$PLL_ADDR + $PLL_DP_HFS_MFD}] $DP_OP
  189. mww [expr {$PLL_ADDR + $PLL_DP_MFD}] $DP_MFD
  190. mww [expr {$PLL_ADDR + $PLL_DP_HFS_MFD}] $DP_MFD
  191. mww [expr {$PLL_ADDR + $PLL_DP_MFN}] $DP_MFN
  192. mww [expr {$PLL_ADDR + $PLL_DP_HFS_MFN}] $DP_MFN
  193. mww [expr {$PLL_ADDR + $PLL_DP_CTL}] 0x00001232
  194. while {[expr {[mrw [expr {$PLL_ADDR + $PLL_DP_CTL}]] & 0x1}] == 0} { sleep 1 }
  195. }
  196. proc CPU_2_BE_32 { L } {
  197. return [expr {(($L & 0x000000FF) << 24) | (($L & 0x0000FF00) << 8) | (($L & 0x00FF0000) >> 8) | (($L & 0xFF000000) >> 24)}]
  198. }
  199. # Device Configuration Data
  200. proc DCD { } {
  201. # dap apsel 1
  202. mww 0x53fa86f4 0x00000000 ;# GRP_DDRMODE_CTL
  203. mww 0x53fa8714 0x00000000 ;# GRP_DDRMODE
  204. mww 0x53fa86fc 0x00000000 ;# GRP_DDRPKE
  205. mww 0x53fa8724 0x04000000 ;# GRP_DDR_TYPE
  206. mww 0x53fa872c 0x00300000 ;# GRP_B3DS
  207. mww 0x53fa8554 0x00300000 ;# DRAM_DQM3
  208. mww 0x53fa8558 0x00300040 ;# DRAM_SDQS3
  209. mww 0x53fa8728 0x00300000 ;# GRP_B2DS
  210. mww 0x53fa8560 0x00300000 ;# DRAM_DQM2
  211. mww 0x53fa8568 0x00300040 ;# DRAM_SDQS2
  212. mww 0x53fa871c 0x00300000 ;# GRP_B1DS
  213. mww 0x53fa8594 0x00300000 ;# DRAM_DQM1
  214. mww 0x53fa8590 0x00300040 ;# DRAM_SDQS1
  215. mww 0x53fa8718 0x00300000 ;# GRP_B0DS
  216. mww 0x53fa8584 0x00300000 ;# DRAM_DQM0
  217. mww 0x53fa857c 0x00300040 ;# DRAM_SDQS0
  218. mww 0x53fa8578 0x00300000 ;# DRAM_SDCLK_0
  219. mww 0x53fa8570 0x00300000 ;# DRAM_SDCLK_1
  220. mww 0x53fa8574 0x00300000 ;# DRAM_CAS
  221. mww 0x53fa8588 0x00300000 ;# DRAM_RAS
  222. mww 0x53fa86f0 0x00300000 ;# GRP_ADDDS
  223. mww 0x53fa8720 0x00300000 ;# GRP_CTLDS
  224. mww 0x53fa8564 0x00300040 ;# DRAM_SDODT1
  225. mww 0x53fa8580 0x00300040 ;# DRAM_SDODT0
  226. # Initialize DDR2 memory
  227. mww 0x63fd9088 0x32383535
  228. mww 0x63fd9090 0x40383538
  229. mww 0x63fd907c 0x0136014d
  230. mww 0x63fd9080 0x01510141
  231. mww 0x63fd9018 0x00011740
  232. mww 0x63fd9000 0xc3190000
  233. mww 0x63fd900c 0x555952e3
  234. mww 0x63fd9010 0xb68e8b63
  235. mww 0x63fd9014 0x01ff00db
  236. mww 0x63fd902c 0x000026d2
  237. mww 0x63fd9030 0x009f0e21
  238. mww 0x63fd9008 0x12273030
  239. mww 0x63fd9004 0x0002002d
  240. mww 0x63fd901c 0x00008032
  241. mww 0x63fd901c 0x00008033
  242. mww 0x63fd901c 0x00028031
  243. mww 0x63fd901c 0x092080b0
  244. mww 0x63fd901c 0x04008040
  245. mww 0x63fd901c 0x0000803a
  246. mww 0x63fd901c 0x0000803b
  247. mww 0x63fd901c 0x00028039
  248. mww 0x63fd901c 0x09208138
  249. mww 0x63fd901c 0x04008048
  250. mww 0x63fd9020 0x00001800
  251. mww 0x63fd9040 0x04b80003
  252. mww 0x63fd9058 0x00022227
  253. mww 0x63fd901c 0x00000000
  254. # dap apsel 0
  255. }
  256. # vim:filetype=tcl