1 ##################################################################################
2 # Author: Wjatscheslaw Stoljarski (Slawa) <wjatscheslaw.stoljarski@kiwigrid.com> #
4 ##################################################################################
6 # The IMX53LOCO (QSB) board has a single IMX53 chip
7 source [find target/imx53.cfg]
8 # Helper for common memory read/modify/write procedures
9 source [find mem_helper.tcl]
11 echo "iMX53 Loco board lodaded."
14 #reset_config srst_only
21 $_TARGETNAME configure -event "reset-assert" {
26 $_TARGETNAME configure -event reset-init { loco_init }
28 global AIPS1_BASE_ADDR
29 set AIPS1_BASE_ADDR 0x53F00000
30 global AIPS2_BASE_ADDR
31 set AIPS2_BASE_ADDR 0x63F00000
38 echo "HW version [format %x [mrw 0x48]]"
43 ; # ARM errata ID #468414
44 set tR [arm mrc 15 0 1 0 1]
45 arm mcr 15 0 1 0 1 [expr $tR | (1<<5)] ; # enable L1NEON bit
54 ; #reg cpsr 0x000001D3
62 # L2CC Cache setup/invalidation/disable
64 ; #/* explicitly disable L2 cache */
65 ; #mrc 15, 0, r0, c1, c0, 1
66 set tR [arm mrc 15 0 1 0 1]
68 ; #mcr 15, 0, r0, c1, c0, 1
69 arm mcr 15 0 1 0 1 [expr $tR & ~(1<<2)]
71 ; #/* reconfigure L2 cache aux control reg */
72 ; #mov r0, #0xC0 /* tag RAM */
73 ; #add r0, r0, #0x4 /* data RAM */
74 ; #orr r0, r0, #(1 << 24) /* disable write allocate delay */
75 ; #orr r0, r0, #(1 << 23) /* disable write allocate combine */
76 ; #orr r0, r0, #(1 << 22) /* disable write allocate */
78 ; #mcr 15, 1, r0, c9, c0, 2
79 arm mcr 15 1 9 0 2 [expr 0xC4 | (1<<24) | (1<<23) | (1<22)]
83 # AIPS setup - Only setup MPROTx registers.
84 # The PACR default values are good.
86 ; # Set all MPROTx to be non-bufferable, trusted for R/W,
87 ; # not forced to user-mode.
88 global AIPS1_BASE_ADDR
89 global AIPS2_BASE_ADDR
93 mww [expr $AIPS1_BASE_ADDR + 0x0] $VAL
94 mww [expr $AIPS1_BASE_ADDR + 0x4] $VAL
95 mww [expr $AIPS2_BASE_ADDR + 0x0] $VAL
96 mww [expr $AIPS2_BASE_ADDR + 0x4] $VAL
101 proc init_clock { } {
102 global AIPS1_BASE_ADDR
103 global AIPS2_BASE_ADDR
104 set CCM_BASE_ADDR [expr $AIPS1_BASE_ADDR + 0x000D4000]
106 set CLKCTL_CBCDR 0x14
107 set CLKCTL_CBCMR 0x18
108 set PLL1_BASE_ADDR [expr $AIPS2_BASE_ADDR + 0x00080000]
109 set PLL2_BASE_ADDR [expr $AIPS2_BASE_ADDR + 0x00084000]
110 set PLL3_BASE_ADDR [expr $AIPS2_BASE_ADDR + 0x00088000]
111 set PLL4_BASE_ADDR [expr $AIPS2_BASE_ADDR + 0x0008C000]
112 set CLKCTL_CSCMR1 0x1C
113 set CLKCTL_CDHIPR 0x48
114 set PLATFORM_BASE_ADDR [expr $AIPS2_BASE_ADDR + 0x000A0000]
115 set CLKCTL_CSCDR1 0x24
118 ; # Switch ARM to step clock
119 mww [expr $CCM_BASE_ADDR + $CLKCTL_CCSR] 0x4
123 setup_pll $PLL1_BASE_ADDR 800
124 setup_pll $PLL3_BASE_ADDR 400
126 ; # Switch peripheral to PLL3
127 mww [expr $CCM_BASE_ADDR + $CLKCTL_CBCMR] 0x00015154
128 mww [expr $CCM_BASE_ADDR + $CLKCTL_CBCDR] [expr 0x02888945 | (1<<16)]
129 while {[mrw [expr $CCM_BASE_ADDR + $CLKCTL_CDHIPR]] != 0} { sleep 1 }
131 setup_pll $PLL2_BASE_ADDR 400
133 ; # Switch peripheral to PLL2
134 mww [expr $CCM_BASE_ADDR + $CLKCTL_CBCDR] [expr 0x00808145 | (2<<10) | (9<<16) | (1<<19)]
136 mww [expr $CCM_BASE_ADDR + $CLKCTL_CBCMR] 0x00016154
138 ; # change uart clk parent to pll2
139 mww [expr $CCM_BASE_ADDR + $CLKCTL_CSCMR1] [expr [mrw [expr $CCM_BASE_ADDR + $CLKCTL_CSCMR1]] & 0xfcffffff | 0x01000000]
141 ; # make sure change is effective
142 while {[mrw [expr $CCM_BASE_ADDR + $CLKCTL_CDHIPR]] != 0} { sleep 1 }
144 setup_pll $PLL3_BASE_ADDR 216
146 setup_pll $PLL4_BASE_ADDR 455
148 ; # Set the platform clock dividers
149 mww [expr $PLATFORM_BASE_ADDR + 0x14] 0x00000124
151 mww [expr $CCM_BASE_ADDR + 0x10] 0
153 ; # Switch ARM back to PLL 1.
154 mww [expr $CCM_BASE_ADDR + $CLKCTL_CCSR] 0x0
157 mww [expr $CCM_BASE_ADDR + $CLKCTL_CSCDR1] [expr [mrw [expr $CCM_BASE_ADDR + $CLKCTL_CSCDR1]] & 0xffffffc0 | 0x0a]
159 ; # Restore the default values in the Gate registers
160 mww [expr $CCM_BASE_ADDR + 0x68] 0xFFFFFFFF
161 mww [expr $CCM_BASE_ADDR + 0x6C] 0xFFFFFFFF
162 mww [expr $CCM_BASE_ADDR + 0x70] 0xFFFFFFFF
163 mww [expr $CCM_BASE_ADDR + 0x74] 0xFFFFFFFF
164 mww [expr $CCM_BASE_ADDR + 0x78] 0xFFFFFFFF
165 mww [expr $CCM_BASE_ADDR + 0x7C] 0xFFFFFFFF
166 mww [expr $CCM_BASE_ADDR + 0x80] 0xFFFFFFFF
167 mww [expr $CCM_BASE_ADDR + 0x84] 0xFFFFFFFF
169 mww [expr $CCM_BASE_ADDR + $CLKCTL_CCDR] 0x00000
171 ; # for cko - for ARM div by 8
172 mww [expr $CCM_BASE_ADDR + 0x60] [expr 0x000A0000 & 0x00000F0]
176 proc setup_pll { PLL_ADDR CLK } {
178 set PLL_DP_CONFIG 0x04
180 set PLL_DP_HFS_OP 0x1C
182 set PLL_DP_HFS_MFD 0x20
184 set PLL_DP_HFS_MFN 0x24
187 set DP_OP [expr (10 << 4) + ((1 - 1) << 0)]
188 set DP_MFD [expr (12 - 1)]
190 } elseif {$CLK == 850} {
191 set DP_OP [expr (8 << 4) + ((1 - 1) << 0)]
192 set DP_MFD [expr (48 - 1)]
194 } elseif {$CLK == 800} {
195 set DP_OP [expr (8 << 4) + ((1 - 1) << 0)]
196 set DP_MFD [expr (3 - 1)]
198 } elseif {$CLK == 700} {
199 set DP_OP [expr (7 << 4) + ((1 - 1) << 0)]
200 set DP_MFD [expr (24 - 1)]
202 } elseif {$CLK == 600} {
203 set DP_OP [expr (6 << 4) + ((1 - 1) << 0)]
204 set DP_MFD [expr (4 - 1)]
206 } elseif {$CLK == 665} {
207 set DP_OP [expr (6 << 4) + ((1 - 1) << 0)]
208 set DP_MFD [expr (96 - 1)]
210 } elseif {$CLK == 532} {
211 set DP_OP [expr (5 << 4) + ((1 - 1) << 0)]
212 set DP_MFD [expr (24 - 1)]
214 } elseif {$CLK == 455} {
215 set DP_OP [expr (8 << 4) + ((2 - 1) << 0)]
216 set DP_MFD [expr (48 - 1)]
218 } elseif {$CLK == 400} {
219 set DP_OP [expr (8 << 4) + ((2 - 1) << 0)]
220 set DP_MFD [expr (3 - 1)]
222 } elseif {$CLK == 216} {
223 set DP_OP [expr (6 << 4) + ((3 - 1) << 0)]
224 set DP_MFD [expr (4 - 1)]
227 error "Error (setup_dll): clock not found!"
230 mww [expr $PLL_ADDR + $PLL_DP_CTL] 0x00001232
231 mww [expr $PLL_ADDR + $PLL_DP_CONFIG] 0x2
233 mww [expr $PLL_ADDR + $PLL_DP_OP] $DP_OP
234 mww [expr $PLL_ADDR + $PLL_DP_HFS_MFD] $DP_OP
236 mww [expr $PLL_ADDR + $PLL_DP_MFD] $DP_MFD
237 mww [expr $PLL_ADDR + $PLL_DP_HFS_MFD] $DP_MFD
239 mww [expr $PLL_ADDR + $PLL_DP_MFN] $DP_MFN
240 mww [expr $PLL_ADDR + $PLL_DP_HFS_MFN] $DP_MFN
242 mww [expr $PLL_ADDR + $PLL_DP_CTL] 0x00001232
243 while {[expr [mrw [expr $PLL_ADDR + $PLL_DP_CTL]] & 0x1] == 0} { sleep 1 }
247 proc CPU_2_BE_32 { L } {
248 return [expr (($L & 0x000000FF) << 24) | (($L & 0x0000FF00) << 8) | (($L & 0x00FF0000) >> 8) | (($L & 0xFF000000) >> 24)]
252 # Device Configuration Data
255 mww 0x53FA8554 0x00300000 ;# IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM3
256 mww 0x53FA8558 0x00300040 ;# IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS3
257 mww 0x53FA8560 0x00300000 ;# IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM2
258 mww 0x53FA8564 0x00300040 ;# IOMUXC_SW_PAD_CTL_PAD_DRAM_SDODT
259 mww 0x53FA8568 0x00300040 ;# IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS2
260 mww 0x53FA8570 0x00300000 ;# IOMUXC_SW_PAD_CTL_PAD_DRAM_SDCLK_1
261 mww 0x53FA8574 0x00300000 ;# IOMUXC_SW_PAD_CTL_PAD_DRAM_CAS
262 mww 0x53FA8578 0x00300000 ;# IOMUXC_SW_PAD_CTL_PAD_DRAM_SDCLK_0
263 mww 0x53FA857c 0x00300040 ;# IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS0
264 mww 0x53FA8580 0x00300040 ;# IOMUXC_SW_PAD_CTL_PAD_DRAM_SDODT0
265 mww 0x53FA8584 0x00300000 ;# IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM0
266 mww 0x53FA8588 0x00300000 ;# IOMUXC_SW_PAD_CTL_PAD_DRAM_RAS
267 mww 0x53FA8590 0x00300040 ;# IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS1
268 mww 0x53FA8594 0x00300000 ;# IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM1
269 mww 0x53FA86f0 0x00300000 ;# IOMUXC_SW_PAD_CTL_GRP_ADDDS
270 mww 0x53FA86f4 0x00000000 ;# IOMUXC_SW_PAD_CTL_GRP_DDRMODE_CTL
271 mww 0x53FA86fc 0x00000000 ;# IOMUXC_SW_PAD_CTL_GRP_DDRPKE
272 mww 0x53FA8714 0x00000000 ;# IOMUXC_SW_PAD_CTL_GRP_DDRMODE - CMOS mode
273 mww 0x53FA8718 0x00300000 ;# IOMUXC_SW_PAD_CTL_GRP_B0DS
274 mww 0x53FA871c 0x00300000 ;# IOMUXC_SW_PAD_CTL_GRP_B1DS
275 mww 0x53FA8720 0x00300000 ;# IOMUXC_SW_PAD_CTL_GRP_CTLDS
276 mww 0x53FA8724 0x04000000 ;# IOMUXC_SW_PAD_CTL_GRP_DDR_TYPE - DDR_SEL0=
277 mww 0x53FA8728 0x00300000 ;# IOMUXC_SW_PAD_CTL_GRP_B2DS
278 mww 0x53FA872c 0x00300000 ;# IOMUXC_SW_PAD_CTL_GRP_B3DS
280 # Initialize DDR2 memory
281 mww 0x63FD9088 0x35343535 ;# ESDCTL_RDDLCTL
282 mww 0x63FD9090 0x4d444c44 ;# ESDCTL_WRDLCTL
283 mww 0x63FD907c 0x01370138 ;# ESDCTL_DGCTRL0
284 mww 0x63FD9080 0x013b013c ;# ESDCTL_DGCTRL1
285 mww 0x63FD9018 0x00011740 ;# ESDCTL_ESDMISC
286 mww 0x63FD9000 0xc3190000 ;# ESDCTL_ESDCTL
287 mww 0x63FD900c 0x9f5152e3 ;# ESDCTL_ESDCFG0
288 mww 0x63FD9010 0xb68e8a63 ;# ESDCTL_ESDCFG1
289 mww 0x63FD9014 0x01ff00db ;# ESDCTL_ESDCFG2
290 mww 0x63FD902c 0x000026d2 ;# ESDCTL_ESDRWD
291 mww 0x63FD9030 0x009f0e21 ;# ESDCTL_ESDOR
292 mww 0x63FD9008 0x12273030 ;# ESDCTL_ESDOTC
293 mww 0x63FD9004 0x0002002d ;# ESDCTL_ESDPDC
294 mww 0x63FD901c 0x00008032 ;# ESDCTL_ESDSCR
295 mww 0x63FD901c 0x00008033 ;# ESDCTL_ESDSCR
296 mww 0x63FD901c 0x00028031 ;# ESDCTL_ESDSCR
297 mww 0x63FD901c 0x052080b0 ;# ESDCTL_ESDSCR
298 mww 0x63FD901c 0x04008040 ;# ESDCTL_ESDSCR
299 mww 0x63FD901c 0x0000803a ;# ESDCTL_ESDSCR
300 mww 0x63FD901c 0x0000803b ;# ESDCTL_ESDSCR
301 mww 0x63FD901c 0x00028039 ;# ESDCTL_ESDSCR
302 mww 0x63FD901c 0x05208138 ;# ESDCTL_ESDSCR
303 mww 0x63FD901c 0x04008048 ;# ESDCTL_ESDSCR
304 mww 0x63FD9020 0x00005800 ;# ESDCTL_ESDREF
305 mww 0x63FD9040 0x04b80003 ;# ESDCTL_ZQHWCTRL
306 mww 0x63FD9058 0x00022227 ;# ESDCTL_ODTCTRL
307 mww 0x63FD901C 0x00000000 ;# ESDCTL_ESDSCR