Merge branch 'upstream-fixes'
[mw/micromonitor-lm32.git] / umon_ports / bf537 / cpuinit.c
1 #include "config.h"
2 #include "cpuio.h"
3 #include "cpu.h"
4 #include "cdefBF537.h"
5
6 /* cpuInit():
7  * This function is called at CPU reset time to initialize the basic
8  * stuff on the BF537.  It is called VERY early in the startup, so
9  * don't assume printf is available.
10  */
11 void
12 cpuinit(void)
13 {
14         volatile int c;
15         volatile unsigned short stmp;
16
17         /* PLL setup:
18          */
19         asm("ssync;");
20         *pPLL_CTL = (MSEL_VAL << 9) | PLL_DF_VAL;
21         *pSIC_IWR = 1;
22         asm("ssync;");
23         asm("cli r0;");
24         asm("idle;");
25         asm("sti r0;");
26         asm("ssync;");
27
28         *pPLL_LOCKCNT = 0x0300;
29         *pPLL_DIV = (SSEL_VAL) | (CSEL_VAL << 4);
30         asm("ssync;");
31
32         *pDTEST_COMMAND = 0;
33
34         /* Memory bank init:
35          * All banks are tied to the 1 4Mg flash, so they're all configured
36          * the same...
37          *   - BWAT: 8 cycles
38          *   - BRAT: 4 cycles
39          *   - BHT:  1 cycle 
40          *   - BST:  2 cycles 
41          *   - BTT:  1 cycle 
42          */
43 #if PLATFORM_PCORE537
44         *pEBIU_AMBCTL0 = 0x7bb07bb0;
45         *pEBIU_AMBCTL1 = 0x7bb07bb0;
46 #else
47         *pEBIU_AMBCTL0 = 0x84668466;
48         *pEBIU_AMBCTL1 = 0x84668466;
49 #endif
50         asm("ssync;");
51
52         /* SDRAM ctrlr init:
53          * (should be done 100us after reset)
54          * Refer to pg 6-60 of HW reference.
55          */
56         for(c=0;c<100000;c++);
57         *pEBIU_SDRRC = (((SYSCLKFREQ/1000) * 64) / 8192) - (TRAS + TRP);
58         asm("ssync;");
59         *pEBIU_SDBCTL = (EBCAW_10 | EBSZ_64 | EBE);
60         asm("ssync;");
61         if (*pEBIU_SDSTAT & SDRS)
62                 *pEBIU_SDGCTL = (PSS | TWR_2 | TRCD_2 | TRP_2 | TRAS_5 | CL_3 | SCTLE);
63         else
64                 *pEBIU_SDGCTL = (TWR_2 | TRCD_2 | TRP_2 | TRAS_5 | CL_3 | SCTLE);
65         asm("ssync;");
66
67         *pEBIU_AMGCTL = 0x00ff;
68         asm("ssync;");
69         
70         for(c=0;c<10000;c++);
71                 *(char *)c = (char)c;
72
73         *pPORT_MUX = 0x0000;
74
75 #if PLATFORM_VTCEZ
76         /* Port F configuration:
77          * Mix of GPIO and special function...
78          */
79         stmp = *pPORTF_FER;
80         *pPORTF_FER = 0x838f;
81         *pPORTF_FER = 0x838f;
82         *pPORTFIO_DIR = 0x7470;
83
84         /* Port G configuration:
85          * All bits configured as PPI (FER bits=1)
86          */
87         stmp = *pPORTG_FER;
88         *pPORTG_FER = 0xffff;
89         *pPORTG_FER = 0xffff;
90
91 #else
92
93         /* Port F configuration:
94          */
95         stmp = *pPORTF_FER;
96         *pPORTF_FER = 0x000f;
97         *pPORTF_FER = 0x000f;
98         *pPORTFIO_DIR = LED_BITMASK;
99
100         /* Port G configuration:
101          */
102         stmp = *pPORTG_FER;
103         *pPORTG_FER = 0x0000;
104         *pPORTG_FER = 0x0000;
105
106 #endif
107
108         /* Port H configuration:
109          */
110         stmp = *pPORTH_FER;
111         *pPORTH_FER = 0xffff;
112         *pPORTH_FER = 0xffff;
113
114         /* Enable the RTC pre-Scaler:
115          */
116         *pRTC_PREN = 1;
117 }
118
119 void
120 icache_off(void)
121 {
122         int i;
123         volatile unsigned long *icplb;
124
125         /* Disable I-cache...
126          */
127         *pIMEM_CONTROL = 0x00000000;
128         asm("ssync;");
129
130         icplb = pICPLB_DATA0;
131         for(i=0;i<16;i++) {
132                 *icplb++ = 0;
133                 asm("csync;");
134         }
135
136         asm("ssync;");
137 }
138
139 void
140 dcache_off(void)
141 {
142         int i;
143         volatile unsigned long *dcplb;
144
145         /* Disable I-cache...
146          */
147         *pDMEM_CONTROL = 0x00000000;
148         asm("ssync;");
149
150         dcplb = pDCPLB_DATA0;
151         for(i=0;i<16;i++) {
152                 *dcplb++ = 0;
153                 asm("csync;");
154         }
155
156         asm("ssync;");
157 }
158
159 /* bootinit(), ramtstinit() & braminit():
160  * One of these functions is called for each of the three different
161  * builds created for the BF537.  Refer to reset.S.
162  */
163 void
164 bootinit(void)
165 {
166 }
167
168 void
169 ramtstinit(void)
170 {
171 }
172
173 void
174 braminit(void)
175 {
176 #if 0
177         extern void icache_off(void);
178
179         icache_off();
180
181         /* Enable I-cache for the top 1Mg of SDRAM used by uMon
182          */
183         *pICPLB_DATA0 = 0x00021105;
184         *pICPLB_ADDR0 = (void *)0x03f00000;
185         *pIMEM_CONTROL = 0x00000007;
186         asm("ssync;");
187 #endif
188 }
189