summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcin Bukat <marcin.bukat@gmail.com>2013-04-15 21:02:43 +0200
committerMarcin Bukat <marcin.bukat@gmail.com>2013-04-15 21:04:21 +0200
commitb2dd1f8d466d83d305981cf84883e698edf2c461 (patch)
treebc56a5435061e6d47118530feec881c7abc74ee8
parent5261b19bdfaf64bebfff05556139dbbcf723876f (diff)
downloadrockbox-b2dd1f8d466d83d305981cf84883e698edf2c461.tar.gz
rockbox-b2dd1f8d466d83d305981cf84883e698edf2c461.zip
rk27load: Fix stage1 (dram init routine)
Change-Id: I9f7bbb7e938bd5886c11533b1aa939bd27cab555
-rw-r--r--utils/rk27utils/rk27load/stage1/main.S122
-rw-r--r--utils/rk27utils/rk27load/stage1/stage1.lds9
2 files changed, 95 insertions, 36 deletions
diff --git a/utils/rk27utils/rk27load/stage1/main.S b/utils/rk27utils/rk27load/stage1/main.S
index d8a3225fff..6e2770b369 100644
--- a/utils/rk27utils/rk27load/stage1/main.S
+++ b/utils/rk27utils/rk27load/stage1/main.S
@@ -1,42 +1,92 @@
1/* rk27xx DRAM init routine
2 * Based on disassembly of the first binary image uploaded in rom DFU mode
3 * Copyright (C) 2013 Marcin Bukat
4 */
5
1.section .text,"ax",%progbits 6.section .text,"ax",%progbits
2.global start 7.global start
3 8
4start: 9start:
5 msr cpsr_c,#0xd3 /* enter supervisor mode, disable IRQ/FIQ */ 10 push {r4,r5,r6,r7,lr}
6 11
12/* setup 200 MHz clock */
7pll_setup: 13pll_setup:
8 mov r0,#0x18000000 14 ldr r0,=0x180e8000
9 add r0,r0,#0x1c000 15 mov r1, #0x81
10 16 str r1, [r0, #4] /* FMWAIT */
11 /* setup ARM core freq = 200MHz */ 17
12 /* AHB bus freq (HCLK) = 100MHz */ 18 ldr r0,=0x1801c000
13 /* APB bus freq (PCLK) = 50MHz */ 19 ldr r1, [r0,#0x14] /* SCU_DIVCON1 */
14 ldr r1,[r0,#0x14] /* SCU_DIVCON1 */ 20 bic r1, r1, #0x1f
15 orr r1,#9 /* ARM slow mode, HCLK:PCLK = 2:1 */ 21 orr r1, r1, #9 /* ((1<<3)|(1<<0)) ARM slow mode,
16 str r1,[r0,#0x14] 22 * HCLK:PCLK = 2:1
17 23 */
18 ldr r1,=0x01970c70 /* (1<<24) | (1<<23) | (23<<16) | (199<<4) */ 24 str r1, [r0,#0x14]
19 str r1,[r0,#0x08] 25
20 26 ldr r1,=0x1850310 /* ((1<<24)|(1<<23)|(5<<16)|(49<<4)) */
21 ldr r2,=0x40000 27 str r1, [r0,#0x08] /* SCU_PLLCON1 */
221: 28
23 ldr r1,[r0,#0x2c] /* SCU_STATUS */ 29 ldr r2,=0x40000
24 tst r1,#1 /* ARM pll lock */ 30
25 bne 1f 31pll_lock_wait:
26 subs r2,#1 32 ldr r1, [r0,#0x2c] /* SCU_STATUS */
27 bne 1b 33 tst r1, #1 /* ARM pll lock */
281: 34 bne pll_locked
29 ldr r1,[r0,#0x14] /* SCU_DIVCON1 */ 35 subs r2, r2, #1
30 bic r1,#5 /* leave ARM slow mode, ARMclk:HCLK = 2:1 */ 36 bne pll_lock_wait
31 str r1,[r0,#0x14] 37
32 38pll_locked:
33sdram_config: 39 ldr r1, [r0,#0x14] /* SCU_DIVCON1 */
34 add r0,r0, #0x94000 /* SDRAM base */ 40 bic r1, #1 /* leave ARM slow mode */
35 41 str r1, [r0,#0x14]
36 mov r1,#1 42
37 str r1,[r0,#0x10c] /* MCSDR_BASIC Round-robin, SDRAM width 16bits */ 43/* detect SDRAM organization */
38 44 ldr r0,=0x180b0000 /* SDRAM controller base addr */
39 add r1,#0x10 45 mov r2, #0x60000000 /* start of DRAM */
40 str r1,[r0,#0x108] /* MCSDR_ADDCFG 12 bits row/9 bits col addr */ 46 ldr r1,=0x5aa5f00f /* test pattern */
41 47 mov r3, #1 /* used for bitshifts */
42 mov pc,lr /* we are done, return to bootrom code */ 48 mov r4, #4 /* reg cfg 12bits col address */
49
50col_loop:
51 str r4, [r0, #0x108] /* MCSDR_ADDCFG */
52 add r5, r4, #8 /* col_num_bits */
53 mov r6, r3, lsl r5 /* offset to the col1 (1<<col_num_bits) */
54 mov r7, #0
55 str r7, [r1] /* *(0x60000000) = 0 */
56 str r1, [r1, r6] /* store test pattern in col1 addr */
57 ldr r7, [r1]
58 cmp r7, #0 /* check if beginning of dram is not touched */
59 ldreq r7, [r1, r6] /* readback col1 addr */
60 cmpeq r7, r1 /* check if test pattern is valid */
61 beq row_loop_setup /* quit column loop */
62 subs r4, #1
63 bpl col_loop
64
65row_loop_setup:
66 mov r5, #2 /* reg cfg 13bits row address */
67
68row_loop:
69 orr r7, r4, r5, lsl#4
70 str r7, [r0, #0x108] /* MCSDR_ADDCFG */
71
72 add r7, r5, #11 /* row_num_bits */
73 mov r7, r3, lsl r7 /* 1<<row_num_bits */
74 mla lr, r7, r6, r6 /* (1<<row_num_bits)*(1<<col_num_bits) +
75 * (1<<col_num_bits) (row1, col1 mem cell)
76 */
77
78 mov r7, #0
79 str r7, [r1] /* *(0x60000000) = 0 */
80 str r2, [r1, lr] /* store test pattern */
81 ldr r7, [r1]
82 cmp r7, #0 /* check if beginning of dram is not touched */
83 ldreq lr, [r1, lr] /* readback row1,col1 addr */
84 cmpeq lr, r2 /* check if test pattern is valid */
85 beq end
86 subs r5, #1
87 bpl row_loop
88
89end:
90 orr r0, r4, r5, lsl#4
91 pop {r4,r5,r6,r7,pc}
92
diff --git a/utils/rk27utils/rk27load/stage1/stage1.lds b/utils/rk27utils/rk27load/stage1/stage1.lds
index 4af8b93c55..dbcc7e5249 100644
--- a/utils/rk27utils/rk27load/stage1/stage1.lds
+++ b/utils/rk27utils/rk27load/stage1/stage1.lds
@@ -20,4 +20,13 @@ SECTIONS
20 *(.rodata*) 20 *(.rodata*)
21 *(.data*) 21 *(.data*)
22 } > IRAM 22 } > IRAM
23
24 .magic 0x18200ff8 : {
25 BYTE(0x51); /* R */
26 BYTE(0x4B); /* K */
27 BYTE(0x32); /* 2 */
28 BYTE(0x37); /* 7 */
29 BYTE(0x56); /* V */
30 BYTE(0x31); /* 1 */
31 }
23} 32}