diff options
author | Marcin Bukat <marcin.bukat@gmail.com> | 2013-04-15 21:02:43 +0200 |
---|---|---|
committer | Marcin Bukat <marcin.bukat@gmail.com> | 2013-04-15 21:04:21 +0200 |
commit | b2dd1f8d466d83d305981cf84883e698edf2c461 (patch) | |
tree | bc56a5435061e6d47118530feec881c7abc74ee8 | |
parent | 5261b19bdfaf64bebfff05556139dbbcf723876f (diff) | |
download | rockbox-b2dd1f8d466d83d305981cf84883e698edf2c461.tar.gz rockbox-b2dd1f8d466d83d305981cf84883e698edf2c461.zip |
rk27load: Fix stage1 (dram init routine)
Change-Id: I9f7bbb7e938bd5886c11533b1aa939bd27cab555
-rw-r--r-- | utils/rk27utils/rk27load/stage1/main.S | 122 | ||||
-rw-r--r-- | utils/rk27utils/rk27load/stage1/stage1.lds | 9 |
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 | ||
4 | start: | 9 | start: |
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 */ | ||
7 | pll_setup: | 13 | pll_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 */ |
22 | 1: | 28 | |
23 | ldr r1,[r0,#0x2c] /* SCU_STATUS */ | 29 | ldr r2,=0x40000 |
24 | tst r1,#1 /* ARM pll lock */ | 30 | |
25 | bne 1f | 31 | pll_lock_wait: |
26 | subs r2,#1 | 32 | ldr r1, [r0,#0x2c] /* SCU_STATUS */ |
27 | bne 1b | 33 | tst r1, #1 /* ARM pll lock */ |
28 | 1: | 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 | 38 | pll_locked: | |
33 | sdram_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 | |||
50 | col_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 | |||
65 | row_loop_setup: | ||
66 | mov r5, #2 /* reg cfg 13bits row address */ | ||
67 | |||
68 | row_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 | |||
89 | end: | ||
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 | } |