source: rtems/c/src/lib/libbsp/m68k/gen68360/startup/init68360.c @ 53cea31

4.104.114.84.95
Last change on this file since 53cea31 was d54de3f, checked in by Joel Sherrill <joel.sherrill@…>, on 11/18/97 at 22:31:37

Changed from DOS style CR/LF to Unix style.

  • Property mode set to 100644
File size: 14.1 KB
Line 
1/*
2 * MC68360 support routines
3 *
4 * W. Eric Norum
5 * Saskatchewan Accelerator Laboratory
6 * University of Saskatchewan
7 * Saskatoon, Saskatchewan, CANADA
8 * eric@skatter.usask.ca
9 *
10 *  $Id$
11 */
12
13#include <rtems.h>
14#include <bsp.h>
15#include <m68360.h>
16
17/*
18 * Send a command to the CPM RISC processer
19 */
20
21void M360ExecuteRISC(rtems_unsigned16 command)
22{
23        rtems_unsigned16 sr;
24
25        m68k_disable_interrupts (sr);
26        while (m360.cr & M360_CR_FLG)
27                continue;
28        m360.cr = command | M360_CR_FLG;
29        m68k_enable_interrupts (sr);
30}
31
32/*
33 * Initialize MC68360
34 */
35void _Init68360 (void)
36{
37        int i;
38        m68k_isr_entry *vbr;
39        extern void _CopyDataClearBSSAndStart (void);
40
41#if (defined (m68040) || defined (m68lc040) || defined (m68ec040))
42        /*
43         *******************************************
44         * Motorola 68040 and companion-mode 68360 *
45         *******************************************
46         */
47
48        /*
49         * Step 6: Is this a power-up reset?
50         * For now we just ignore this and do *all* the steps
51         * Someday we might want to:
52         *      if (Hard, Loss of Clock, Power-up)
53         *              Do all steps
54         *      else if (Double bus fault, watchdog or soft reset)
55         *              Skip to step 12
56         *      else (must be a reset command)
57         *              Skip to step 14
58         */
59
60        /*
61         * Step 7: Deal with clock synthesizer
62         * HARDWARE:
63         *      Change if you're not using an external 25 MHz oscillator.
64         */
65        m360.clkocr = 0x83;     /* No more writes, full-power CLKO2 */
66        m360.pllcr = 0xD000;    /* PLL, no writes, no prescale,
67                                   no LPSTOP slowdown, PLL X1 */
68        m360.cdvcr = 0x8000;    /* No more writes, no clock division */
69
70        /*
71         * Step 8: Initialize system protection
72         *      Enable watchdog
73         *      Watchdog causes system reset
74         *      Next-to-slowest watchdog timeout (21 seconds with 25 MHz oscillator)
75         *      Enable double bus fault monitor
76         *      Enable bus monitor for external cycles
77         *      1024 clocks for external timeout
78         */
79        m360.sypcr = 0xEC;
80
81        /*
82         * Step 9: Clear parameter RAM and reset communication processor module
83         */
84        for (i = 0 ; i < 192  ; i += sizeof (long)) {
85                *((long *)((char *)&m360 + 0xC00 + i)) = 0;
86                *((long *)((char *)&m360 + 0xD00 + i)) = 0;
87                *((long *)((char *)&m360 + 0xE00 + i)) = 0;
88                *((long *)((char *)&m360 + 0xF00 + i)) = 0;
89        }
90        M360ExecuteRISC (M360_CR_RST);
91
92        /*
93         * Step 10: Write PEPAR
94         *      SINTOUT standard M68000 family interrupt level encoding
95         *      CF1MODE=10 (BCLRO* output)
96         *      No RAS1* double drive
97         *      A31 - A28
98         *      AMUX output
99         *      CAS2* - CAS3*
100         *      CAS0* - CAS1*
101         *      CS7*
102         *      AVEC*
103         */
104        m360.pepar = 0x3440;
105
106        /*
107         * Step 11: Remap Chip Select 0 (CS0*), set up GMR
108         */
109        /*
110         * 512 addresses per DRAM page (256K DRAM chips)
111         * 70 nsec DRAM
112         * 180 nsec ROM (3 wait states)
113         */
114        m360.gmr = M360_GMR_RCNT(23) | M360_GMR_RFEN |
115                                M360_GMR_RCYC(0) | M360_GMR_PGS(1) |
116                                M360_GMR_DPS_32BIT | M360_GMR_NCS |
117                                M360_GMR_TSS40;
118        m360.memc[0].br = (unsigned long)&_RomBase | M360_MEMC_BR_WP |
119                                                        M360_MEMC_BR_V;
120        m360.memc[0].or = M360_MEMC_OR_WAITS(3) | M360_MEMC_OR_1MB |
121                                                M360_MEMC_OR_32BIT;
122
123        /*
124         * Step 12: Initialize the system RAM
125         */
126        /*
127         *      Set up option/base registers
128         *              1M DRAM
129         *              70 nsec DRAM
130         *      Enable burst mode
131         *      No parity checking
132         *      Wait for chips to power up
133         *      Perform 8 read cycles
134         */
135        m360.memc[1].or = M360_MEMC_OR_TCYC(0) |
136                                        M360_MEMC_OR_1MB |
137                                        M360_MEMC_OR_DRAM;
138        m360.memc[1].br = (unsigned long)&_RamBase |
139                                        M360_MEMC_BR_BACK40 |
140                                        M360_MEMC_BR_V;
141        for (i = 0; i < 50000; i++)
142                continue;
143        for (i = 0; i < 8; ++i)
144                *((volatile unsigned long *)(unsigned long)&_RamBase);
145
146        /*
147         * Step 13: Copy  the exception vector table to system RAM
148         */
149        m68k_get_vbr (vbr);
150        for (i = 0; i < 256; ++i)
151                M68Kvec[i] = vbr[i];
152        m68k_set_vbr (M68Kvec);
153       
154        /*
155         * Step 14: More system initialization
156         * SDCR (Serial DMA configuration register)
157         *      Enable SDMA during FREEZE
158         *      Give SDMA priority over all interrupt handlers
159         *      Set DMA arbiration level to 4
160         * CICR (CPM interrupt configuration register):
161         *      SCC1 requests at SCCa position
162         *      SCC2 requests at SCCb position
163         *      SCC3 requests at SCCc position
164         *      SCC4 requests at SCCd position
165         *      Interrupt request level 4
166         *      Maintain original priority order
167         *      Vector base 128
168         *      SCCs priority grouped at top of table
169         */
170        m360.sdcr = M360_SDMA_SISM_7 | M360_SDMA_SAID_4;
171        m360.cicr = (3 << 22) | (2 << 20) | (1 << 18) | (0 << 16) |
172                                                (4 << 13) | (0x1F << 8) | (128);
173
174        /*
175         * Step 15: Set module configuration register
176         *      Bus request MC68040 Arbitration ID 3
177         *      Bus asynchronous timing mode (work around bug in Rev. B)
178         *      Arbitration asynchronous timing mode
179         *      Disable timers during FREEZE
180         *      Disable bus monitor during FREEZE
181         *      BCLRO* arbitration level 3
182         *      No show cycles
183         *      User/supervisor access
184         *      Bus clear in arbitration ID level  3
185         *      SIM60 interrupt sources higher priority than CPM
186         */
187        m360.mcr = 0x6000EC3F;
188
189#elif (defined (M68360_ATLAS_HSB))
190        /*
191         ******************************************
192         * Standalone Motorola 68360 -- ATLAS HSB *
193         ******************************************
194         */
195
196        /*
197         * Step 6: Is this a power-up reset?
198         * For now we just ignore this and do *all* the steps
199         * Someday we might want to:
200         *      if (Hard, Loss of Clock, Power-up)
201         *              Do all steps
202         *      else if (Double bus fault, watchdog or soft reset)
203         *              Skip to step 12
204         *      else (must be a CPU32+ reset command)
205         *              Skip to step 14
206         */
207
208        /*
209         * Step 7: Deal with clock synthesizer
210         * HARDWARE:
211         *      Change if you're not using an external 25 MHz oscillator.
212         */
213        m360.clkocr = 0x8F;     /* No more writes, no clock outputs */
214        m360.pllcr = 0xD000;    /* PLL, no writes, no prescale,
215                                   no LPSTOP slowdown, PLL X1 */
216        m360.cdvcr = 0x8000;    /* No more writes, no clock division */
217
218        /*
219         * Step 8: Initialize system protection
220         *      Enable watchdog
221         *      Watchdog causes system reset
222         *      Next-to-slowest watchdog timeout (21 seconds with 25 MHz oscillator)
223         *      Enable double bus fault monitor
224         *      Enable bus monitor for external cycles
225         *      1024 clocks for external timeout
226         */
227        m360.sypcr = 0xEC;
228
229        /*
230         * Step 9: Clear parameter RAM and reset communication processor module
231         */
232        for (i = 0 ; i < 192  ; i += sizeof (long)) {
233                *((long *)((char *)&m360 + 0xC00 + i)) = 0;
234                *((long *)((char *)&m360 + 0xD00 + i)) = 0;
235                *((long *)((char *)&m360 + 0xE00 + i)) = 0;
236                *((long *)((char *)&m360 + 0xF00 + i)) = 0;
237        }
238        M360ExecuteRISC (M360_CR_RST);
239
240        /*
241         * Step 10: Write PEPAR
242         *      SINTOUT not used (CPU32+ mode)
243         *      CF1MODE=00 (CONFIG1 input)
244         *      RAS1* double drive
245         *      WE0* - WE3*
246         *      OE* output
247         *      CAS2* - CAS3*
248         *      CAS0* - CAS1*
249         *      CS7*
250         *      AVEC*
251         * HARDWARE:
252         *      Change if you are using a different memory configuration
253         *      (static RAM, external address multiplexing, etc).
254         */
255        m360.pepar = 0x0180;
256
257        /*
258         * Step 11: Remap Chip Select 0 (CS0*), set up GMR
259         */
260        m360.gmr = M360_GMR_RCNT(12) | M360_GMR_RFEN |
261                                M360_GMR_RCYC(0) | M360_GMR_PGS(1) |
262                                M360_GMR_DPS_32BIT | M360_GMR_DWQ |
263                                M360_GMR_GAMX;
264        m360.memc[0].br = (unsigned long)&_RomBase | M360_MEMC_BR_WP |
265                                                                M360_MEMC_BR_V;
266        m360.memc[0].or = M360_MEMC_OR_WAITS(3) | M360_MEMC_OR_1MB |
267                                                        M360_MEMC_OR_8BIT;
268
269        /*
270         * Step 12: Initialize the system RAM
271         */
272        /* first bank 1MByte DRAM */
273        m360.memc[1].or = M360_MEMC_OR_TCYC(2) | M360_MEMC_OR_1MB |
274                                        M360_MEMC_OR_PGME | M360_MEMC_OR_DRAM;
275        m360.memc[1].br = (unsigned long)&_RamBase | M360_MEMC_BR_V;
276
277        /* second bank 1MByte DRAM */
278        m360.memc[2].or = M360_MEMC_OR_TCYC(2) | M360_MEMC_OR_1MB |
279                                        M360_MEMC_OR_PGME | M360_MEMC_OR_DRAM;
280        m360.memc[2].br = ((unsigned long)&_RamBase + 0x100000) |
281                                        M360_MEMC_BR_V;
282
283        /* flash rom socket U6 on CS5 */
284        m360.memc[5].br = (unsigned long)ATLASHSB_ROM_U6 | M360_MEMC_BR_WP |
285                                                                M360_MEMC_BR_V;
286        m360.memc[5].or = M360_MEMC_OR_WAITS(2) | M360_MEMC_OR_512KB |
287                                                                M360_MEMC_OR_8BIT;
288
289        /* CSRs on CS7 */
290        m360.memc[7].or = M360_MEMC_OR_TCYC(4) | M360_MEMC_OR_64KB |
291                                        M360_MEMC_OR_8BIT;
292        m360.memc[7].br = ATLASHSB_ESR | 0x01;
293        for (i = 0; i < 50000; i++)
294                continue;
295        for (i = 0; i < 8; ++i)
296                *((volatile unsigned long *)(unsigned long)&_RamBase);
297
298        /*
299         * Step 13: Copy  the exception vector table to system RAM
300         */
301        m68k_get_vbr (vbr);
302        for (i = 0; i < 256; ++i)
303                M68Kvec[i] = vbr[i];
304        m68k_set_vbr (M68Kvec);
305       
306        /*
307         * Step 14: More system initialization
308         * SDCR (Serial DMA configuration register)
309         *      Enable SDMA during FREEZE
310         *      Give SDMA priority over all interrupt handlers
311         *      Set DMA arbiration level to 4
312         * CICR (CPM interrupt configuration register):
313         *      SCC1 requests at SCCa position
314         *      SCC2 requests at SCCb position
315         *      SCC3 requests at SCCc position
316         *      SCC4 requests at SCCd position
317         *      Interrupt request level 4
318         *      Maintain original priority order
319         *      Vector base 128
320         *      SCCs priority grouped at top of table
321         */
322        m360.sdcr = M360_SDMA_SISM_7 | M360_SDMA_SAID_4;
323        m360.cicr = (3 << 22) | (2 << 20) | (1 << 18) | (0 << 16) |
324                                                (4 << 13) | (0x1F << 8) | (128);
325
326        /*
327         * Step 15: Set module configuration register
328         *      Disable timers during FREEZE
329         *      Enable bus monitor during FREEZE
330         *      BCLRO* arbitration level 3
331         *      No show cycles
332         *      User/supervisor access
333         *      Bus clear interrupt service level 7
334         *      SIM60 interrupt sources higher priority than CPM
335         */
336        m360.mcr = 0x4C7F;
337
338#else
339        /*
340         ***************************************************
341         * Generic Standalone Motorola 68360               *
342         *           As described in MC68360 User's Manual *
343         *           Atlas ACE360                          *
344         ***************************************************
345         */
346
347        /*
348         * Step 6: Is this a power-up reset?
349         * For now we just ignore this and do *all* the steps
350         * Someday we might want to:
351         *      if (Hard, Loss of Clock, Power-up)
352         *              Do all steps
353         *      else if (Double bus fault, watchdog or soft reset)
354         *              Skip to step 12
355         *      else (must be a CPU32+ reset command)
356         *              Skip to step 14
357         */
358
359        /*
360         * Step 7: Deal with clock synthesizer
361         * HARDWARE:
362         *      Change if you're not using an external 25 MHz oscillator.
363         */
364        m360.clkocr = 0x8F;     /* No more writes, no clock outputs */
365        m360.pllcr = 0xD000;    /* PLL, no writes, no prescale,
366                                   no LPSTOP slowdown, PLL X1 */
367        m360.cdvcr = 0x8000;    /* No more writes, no clock division */
368
369        /*
370         * Step 8: Initialize system protection
371         *      Enable watchdog
372         *      Watchdog causes system reset
373         *      Next-to-slowest watchdog timeout (21 seconds with 25 MHz oscillator)
374         *      Enable double bus fault monitor
375         *      Enable bus monitor for external cycles
376         *      1024 clocks for external timeout
377         */
378        m360.sypcr = 0xEC;
379
380        /*
381         * Step 9: Clear parameter RAM and reset communication processor module
382         */
383        for (i = 0 ; i < 192  ; i += sizeof (long)) {
384                *((long *)((char *)&m360 + 0xC00 + i)) = 0;
385                *((long *)((char *)&m360 + 0xD00 + i)) = 0;
386                *((long *)((char *)&m360 + 0xE00 + i)) = 0;
387                *((long *)((char *)&m360 + 0xF00 + i)) = 0;
388        }
389        M360ExecuteRISC (M360_CR_RST);
390
391        /*
392         * Step 10: Write PEPAR
393         *      SINTOUT not used (CPU32+ mode)
394         *      CF1MODE=00 (CONFIG1 input)
395         *      RAS1* double drive
396         *      WE0* - WE3*
397         *      OE* output
398         *      CAS2* - CAS3*
399         *      CAS0* - CAS1*
400         *      CS7*
401         *      AVEC*
402         * HARDWARE:
403         *      Change if you are using a different memory configuration
404         *      (static RAM, external address multiplexing, etc).
405         */
406        m360.pepar = 0x0180;
407
408        /*
409         * Step 11: Remap Chip Select 0 (CS0*), set up GMR
410         */
411        /*
412         * 1024/2048/4096 addresses per DRAM page (1M/4M/16M DRAM chips)
413         * 60 nsec DRAM
414         * 180 nsec ROM (3 wait states)
415         */
416        switch ((unsigned long)&_RamSize) {
417        default:
418        case 4*1024*1024:
419                m360.gmr = M360_GMR_RCNT(23) | M360_GMR_RFEN |
420                                        M360_GMR_RCYC(0) | M360_GMR_PGS(3) |
421                                        M360_GMR_DPS_32BIT | M360_GMR_NCS |
422                                        M360_GMR_GAMX;
423                break;
424
425        case 16*1024*1024:
426                m360.gmr = M360_GMR_RCNT(23) | M360_GMR_RFEN |
427                                        M360_GMR_RCYC(0) | M360_GMR_PGS(5) |
428                                        M360_GMR_DPS_32BIT | M360_GMR_NCS |
429                                        M360_GMR_GAMX;
430                break;
431
432        case 64*1024*1024:
433                m360.gmr = M360_GMR_RCNT(23) | M360_GMR_RFEN |
434                                        M360_GMR_RCYC(0) | M360_GMR_PGS(7) |
435                                        M360_GMR_DPS_32BIT | M360_GMR_NCS |
436                                        M360_GMR_GAMX;
437                break;
438        }
439        m360.memc[0].br = (unsigned long)&_RomBase | M360_MEMC_BR_WP |
440                                                                M360_MEMC_BR_V;
441        m360.memc[0].or = M360_MEMC_OR_WAITS(3) | M360_MEMC_OR_1MB |
442                                                        M360_MEMC_OR_8BIT;
443
444        /*
445         * Step 12: Initialize the system RAM
446         */
447        /*
448         *      Set up option/base registers
449         *              4M/16M/64M DRAM
450         *              60 nsec DRAM
451         *      Wait for chips to power up
452         *      Perform 8 read cycles
453         *      Set all parity bits to correct state
454         *      Enable parity checking
455         */
456        switch ((unsigned long)&_RamSize) {
457        default:
458        case 4*1024*1024:
459                m360.memc[1].or = M360_MEMC_OR_TCYC(0) |
460                                        M360_MEMC_OR_4MB |
461                                        M360_MEMC_OR_DRAM;
462                break;
463
464        case 16*1024*1024:
465                m360.memc[1].or = M360_MEMC_OR_TCYC(0) |
466                                        M360_MEMC_OR_16MB |
467                                        M360_MEMC_OR_DRAM;
468                break;
469
470        case 64*1024*1024:
471                m360.memc[1].or = M360_MEMC_OR_TCYC(0) |
472                                        M360_MEMC_OR_64MB |
473                                        M360_MEMC_OR_DRAM;
474                break;
475        }
476        m360.memc[1].br = (unsigned long)&_RamBase | M360_MEMC_BR_V;
477        for (i = 0; i < 50000; i++)
478                continue;
479        for (i = 0; i < 8; ++i)
480                *((volatile unsigned long *)(unsigned long)&_RamBase);
481        for (i = 0 ; i < (unsigned long)&_RamSize ; i += sizeof (unsigned long)) {
482                volatile unsigned long *lp;
483                lp = (unsigned long *)((unsigned char *)&_RamBase + i);
484                *lp = *lp;
485        }
486        m360.memc[1].br = (unsigned long)&_RamBase |
487                                M360_MEMC_BR_PAREN | M360_MEMC_BR_V;
488
489        /*
490         * Step 13: Copy  the exception vector table to system RAM
491         */
492        m68k_get_vbr (vbr);
493        for (i = 0; i < 256; ++i)
494                M68Kvec[i] = vbr[i];
495        m68k_set_vbr (M68Kvec);
496       
497        /*
498         * Step 14: More system initialization
499         * SDCR (Serial DMA configuration register)
500         *      Enable SDMA during FREEZE
501         *      Give SDMA priority over all interrupt handlers
502         *      Set DMA arbiration level to 4
503         * CICR (CPM interrupt configuration register):
504         *      SCC1 requests at SCCa position
505         *      SCC2 requests at SCCb position
506         *      SCC3 requests at SCCc position
507         *      SCC4 requests at SCCd position
508         *      Interrupt request level 4
509         *      Maintain original priority order
510         *      Vector base 128
511         *      SCCs priority grouped at top of table
512         */
513        m360.sdcr = M360_SDMA_SISM_7 | M360_SDMA_SAID_4;
514        m360.cicr = (3 << 22) | (2 << 20) | (1 << 18) | (0 << 16) |
515                                                (4 << 13) | (0x1F << 8) | (128);
516
517        /*
518         * Step 15: Set module configuration register
519         *      Disable timers during FREEZE
520         *      Enable bus monitor during FREEZE
521         *      BCLRO* arbitration level 3
522         *      No show cycles
523         *      User/supervisor access
524         *      Bus clear interrupt service level 7
525         *      SIM60 interrupt sources higher priority than CPM
526         */
527        m360.mcr = 0x4C7F;
528#endif
529
530        /*
531         * Copy data, clear BSS, switch stacks and call main()
532         */
533        _CopyDataClearBSSAndStart ();
534}
Note: See TracBrowser for help on using the repository browser.