]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/bitsy/bitsyreset.s
merge
[plan9front.git] / sys / src / 9 / bitsy / bitsyreset.s
1 #include "mem.h"
2
3         // Bitsy development board uses two banks: KM416S4030C,
4         // 12 row address bits, 8 col address bits
5         // Bitsy uses two banks KM416S8030C, 12 row address bits,
6         // 9 col address bits
7     // Have to set DRAC0 to 14 row bits or else you only get 8 col bits
8         // from the formfactor unit configuration registers:     0xF3536257
9 mdcnfg:     // DRAM Configuration Register 10.2.1
10         WORD    1<<0 | 1<<2 | 0<<3 | 0x5<<4 | 0x3<<8 | 3<<12 | 3<<14
11 mdrefr0:                // DRAM Refresh Control Register 10.2.2
12         WORD    1<<0 | 0x200<<4 | 1<<21 | 1<<22 | 1 <<31
13 mdrefr1:                // DRAM Refresh Control Register 10.2.2
14         WORD    1<<0 | 0x200<<4 | 1<<21 | 1<<22
15 mdrefr2:                // DRAM Refresh Control Register 10.2.2
16         WORD    1<<0 | 0x200<<4 | 1<<20 | 1<<21 | 1<<22
17
18         /* MDCAS settings from [1] Table 10-3 (page 10-18) */
19 waveform0:
20         WORD    0xAAAAAAA7
21 waveform1:
22         WORD    0xAAAAAAAA
23 waveform2:
24         WORD    0xAAAAAAAA
25
26 delay:          // delay without using memory
27         mov     $100, r1        // 200MHz: 100 × (2 instructions @ 5 ns) == 1 ms
28 l1:
29         sub $1, r1
30         bgt l1
31         sub $1, r0
32         bgt delay
33         ret
34         
35 reset:
36         mov     $INTREGS+4, r0          // turn off interrupts
37         mov     $0, (r0)
38
39         // Is this necessary on wakeup?
40         mov     $POWERREGS+14, r0       // set clock speed to 191.7MHz
41         mov     $0xb, (r0)
42
43         // This is necessary on hard reset, but not on sleep reset
44         mov     $0x80, r0                       // wait ±128 µs
45         bl      delay
46
47         /* check to see if we're operating out of DRAM */
48         bic     $0x000000ff, pc, r4
49         bic     $0x0000ff00, r4
50         bic     $0x00ff0000, r4
51         cmp     r4, $PHYSDRAM0
52         beq     dram
53
54 dramwakeup:
55
56         mov     $POWERREGS+0x4, r1      // Clear DH in Power Manager Sleep Status Register
57         bic $(1<<3), (r1)               // DH == DRAM Hold
58         // This releases nCAS/DQM and nRAS/nSDCS pins to make DRAM exit selfrefresh
59
60         /* Set up the DRAM in banks 0 and 1 [1] 10.3 */
61         mov     $MEMCONFREGS, r1
62
63         mov     mdrefr0, r2             // Turn on K1RUN
64         mov     r2, 0x1c(r1)
65
66         mov     mdrefr1, r2             // Turn off SLFRSH
67         mov     r2, 0x1c(r1)
68
69         mov     mdrefr2, r2             // Turn on E1PIN
70         mov     r2, 0x1c(r1)
71
72     mov waveform0, r2
73         mov     r2, 0x4(r1)
74
75         mov     waveform1, r2
76         mov     r2, 0x8(r1)
77
78         mov     waveform2, r2
79         mov     r2, 0xc(r1)
80
81         mov     $PHYSDRAM0, r0  
82         mov 0x00(r0), r2        // Eight non-burst read cycles
83         mov 0x20(r0), r2
84         mov 0x40(r0), r2
85         mov 0x60(r0), r2
86         mov 0x80(r0), r2
87         mov 0xa0(r0), r2
88         mov 0xc0(r0), r2
89         mov 0xe0(r0), r2
90
91         mov     mdcnfg, r2              // Enable memory banks
92         mov     r2, 0x0(r1)
93
94         // Is there any use in turning on EAPD and KAPD in the MDREFR register?
95
96         ret
97
98
99
100
101 dram:
102
103