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

4.104.114.84.95
Last change on this file since c95013a0 was c95013a0, checked in by Joel Sherrill <joel.sherrill@…>, on Feb 12, 2005 at 1:35:32 AM

2005-02-11 Joel Sherrill <joel@…>

  • include/bsp.h, startup/init68360.c: Correct type of symbols from linkcmds to compile with gcc 4.x.
  • Property mode set to 100644
File size: 18.7 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 <rtems/m68k/m68360.h>
16
17/*
18 * Send a command to the CPM RISC processer
19 */
20
21void M360ExecuteRISC(uint16_t         command)
22{
23        uint16_t         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        unsigned long ramSize;
40        extern void _CopyDataClearBSSAndStart (unsigned long ramSize);
41        extern char _RamBase[];
42
43#if (defined (__mc68040__))
44        /*
45         *******************************************
46         * Motorola 68040 and companion-mode 68360 *
47         *******************************************
48         */
49
50        /*
51         * Step 6: Is this a power-up reset?
52         * For now we just ignore this and do *all* the steps
53         * Someday we might want to:
54         *      if (Hard, Loss of Clock, Power-up)
55         *              Do all steps
56         *      else if (Double bus fault, watchdog or soft reset)
57         *              Skip to step 12
58         *      else (must be a reset command)
59         *              Skip to step 14
60         */
61
62        /*
63         * Step 7: Deal with clock synthesizer
64         * HARDWARE:
65         *      Change if you're not using an external 25 MHz oscillator.
66         */
67        m360.clkocr = 0x83;     /* No more writes, full-power CLKO2 */
68        m360.pllcr = 0xD000;    /* PLL, no writes, no prescale,
69                                   no LPSTOP slowdown, PLL X1 */
70        m360.cdvcr = 0x8000;    /* No more writes, no clock division */
71
72        /*
73         * Step 8: Initialize system protection
74         *      Enable watchdog
75         *      Watchdog causes system reset
76         *      Next-to-slowest watchdog timeout (21 seconds with 25 MHz oscillator)
77         *      Enable double bus fault monitor
78         *      Enable bus monitor for external cycles
79         *      1024 clocks for external timeout
80         */
81        m360.sypcr = 0xEC;
82
83        /*
84         * Step 9: Clear parameter RAM and reset communication processor module
85         */
86        for (i = 0 ; i < 192  ; i += sizeof (long)) {
87                *((long *)((char *)&m360 + 0xC00 + i)) = 0;
88                *((long *)((char *)&m360 + 0xD00 + i)) = 0;
89                *((long *)((char *)&m360 + 0xE00 + i)) = 0;
90                *((long *)((char *)&m360 + 0xF00 + i)) = 0;
91        }
92        M360ExecuteRISC (M360_CR_RST);
93
94        /*
95         * Step 10: Write PEPAR
96         *      SINTOUT standard M68000 family interrupt level encoding
97         *      CF1MODE=10 (BCLRO* output)
98         *      No RAS1* double drive
99         *      A31 - A28
100         *      AMUX output
101         *      CAS2* - CAS3*
102         *      CAS0* - CAS1*
103         *      CS7*
104         *      AVEC*
105         */
106        m360.pepar = 0x3440;
107
108        /*
109         * Step 11: Remap Chip Select 0 (CS0*), set up GMR
110         */
111        /*
112         * 512 addresses per DRAM page (256K DRAM chips)
113         * 70 nsec DRAM
114         * 180 nsec ROM (3 wait states)
115         */
116        m360.gmr = M360_GMR_RCNT(23) | M360_GMR_RFEN |
117                                M360_GMR_RCYC(0) | M360_GMR_PGS(1) |
118                                M360_GMR_DPS_32BIT | M360_GMR_NCS |
119                                M360_GMR_TSS40;
120        m360.memc[0].br = (unsigned long)&_RomBase | M360_MEMC_BR_WP |
121                                                        M360_MEMC_BR_V;
122        m360.memc[0].or = M360_MEMC_OR_WAITS(3) | M360_MEMC_OR_1MB |
123                                                M360_MEMC_OR_32BIT;
124
125        /*
126         * Step 12: Initialize the system RAM
127         */
128        /*
129         *      Set up option/base registers
130         *              1M DRAM
131         *              70 nsec DRAM
132         *      Enable burst mode
133         *      No parity checking
134         *      Wait for chips to power up
135         *      Perform 8 read cycles
136         */
137        ramSize = 1 * 1024 * 1024;
138        m360.memc[1].or = M360_MEMC_OR_TCYC(0) |
139                                        M360_MEMC_OR_1MB |
140                                        M360_MEMC_OR_DRAM;
141        m360.memc[1].br = (unsigned long)&_RamBase |
142                                        M360_MEMC_BR_BACK40 |
143                                        M360_MEMC_BR_V;
144        for (i = 0; i < 50000; i++)
145                continue;
146        for (i = 0; i < 8; ++i)
147                *((volatile unsigned long *)(unsigned long)&_RamBase);
148
149        /*
150         * Step 13: Copy  the exception vector table to system RAM
151         */
152        m68k_get_vbr (vbr);
153        for (i = 0; i < 256; ++i)
154                M68Kvec[i] = vbr[i];
155        m68k_set_vbr (M68Kvec);
156
157        /*
158         * Step 14: More system initialization
159         * SDCR (Serial DMA configuration register)
160         *      Enable SDMA during FREEZE
161         *      Give SDMA priority over all interrupt handlers
162         *      Set DMA arbiration level to 4
163         * CICR (CPM interrupt configuration register):
164         *      SCC1 requests at SCCa position
165         *      SCC2 requests at SCCb position
166         *      SCC3 requests at SCCc position
167         *      SCC4 requests at SCCd position
168         *      Interrupt request level 4
169         *      Maintain original priority order
170         *      Vector base 128
171         *      SCCs priority grouped at top of table
172         */
173        m360.sdcr = M360_SDMA_SISM_7 | M360_SDMA_SAID_4;
174        m360.cicr = (3 << 22) | (2 << 20) | (1 << 18) | (0 << 16) |
175                                                (4 << 13) | (0x1F << 8) | (128);
176
177        /*
178         * Step 15: Set module configuration register
179         *      Bus request MC68040 Arbitration ID 3
180         *      Bus asynchronous timing mode (work around bug in Rev. B)
181         *      Arbitration asynchronous timing mode
182         *      Disable timers during FREEZE
183         *      Disable bus monitor during FREEZE
184         *      BCLRO* arbitration level 3
185         *      No show cycles
186         *      User/supervisor access
187         *      Bus clear in arbitration ID level  3
188         *      SIM60 interrupt sources higher priority than CPM
189         */
190        m360.mcr = 0x6000EC3F;
191
192#elif (defined (M68360_ATLAS_HSB))
193        /*
194         ******************************************
195         * Standalone Motorola 68360 -- ATLAS HSB *
196         ******************************************
197         */
198
199        /*
200         * Step 6: Is this a power-up reset?
201         * For now we just ignore this and do *all* the steps
202         * Someday we might want to:
203         *      if (Hard, Loss of Clock, Power-up)
204         *              Do all steps
205         *      else if (Double bus fault, watchdog or soft reset)
206         *              Skip to step 12
207         *      else (must be a CPU32+ reset command)
208         *              Skip to step 14
209         */
210
211        /*
212         * Step 7: Deal with clock synthesizer
213         * HARDWARE:
214         *      Change if you're not using an external 25 MHz oscillator.
215         */
216        m360.clkocr = 0x8F;     /* No more writes, no clock outputs */
217        m360.pllcr = 0xD000;    /* PLL, no writes, no prescale,
218                                   no LPSTOP slowdown, PLL X1 */
219        m360.cdvcr = 0x8000;    /* No more writes, no clock division */
220
221        /*
222         * Step 8: Initialize system protection
223         *      Enable watchdog
224         *      Watchdog causes system reset
225         *      Next-to-slowest watchdog timeout (21 seconds with 25 MHz oscillator)
226         *      Enable double bus fault monitor
227         *      Enable bus monitor for external cycles
228         *      1024 clocks for external timeout
229         */
230        m360.sypcr = 0xEC;
231
232        /*
233         * Step 9: Clear parameter RAM and reset communication processor module
234         */
235        for (i = 0 ; i < 192  ; i += sizeof (long)) {
236                *((long *)((char *)&m360 + 0xC00 + i)) = 0;
237                *((long *)((char *)&m360 + 0xD00 + i)) = 0;
238                *((long *)((char *)&m360 + 0xE00 + i)) = 0;
239                *((long *)((char *)&m360 + 0xF00 + i)) = 0;
240        }
241        M360ExecuteRISC (M360_CR_RST);
242
243        /*
244         * Step 10: Write PEPAR
245         *      SINTOUT not used (CPU32+ mode)
246         *      CF1MODE=00 (CONFIG1 input)
247         *      RAS1* double drive
248         *      WE0* - WE3*
249         *      OE* output
250         *      CAS2* - CAS3*
251         *      CAS0* - CAS1*
252         *      CS7*
253         *      AVEC*
254         * HARDWARE:
255         *      Change if you are using a different memory configuration
256         *      (static RAM, external address multiplexing, etc).
257         */
258        m360.pepar = 0x0180;
259
260        /*
261         * Step 11: Remap Chip Select 0 (CS0*), set up GMR
262         */
263        m360.gmr = M360_GMR_RCNT(12) | M360_GMR_RFEN |
264                                M360_GMR_RCYC(0) | M360_GMR_PGS(1) |
265                                M360_GMR_DPS_32BIT | M360_GMR_DWQ |
266                                M360_GMR_GAMX;
267        m360.memc[0].br = (unsigned long)&_RomBase | M360_MEMC_BR_WP |
268                                                                M360_MEMC_BR_V;
269        m360.memc[0].or = M360_MEMC_OR_WAITS(3) | M360_MEMC_OR_1MB |
270                                                        M360_MEMC_OR_8BIT;
271
272        /*
273         * Step 12: Initialize the system RAM
274         */
275        ramSize = 2 * 1024 * 1024;
276        /* first bank 1MByte DRAM */
277        m360.memc[1].or = M360_MEMC_OR_TCYC(2) | M360_MEMC_OR_1MB |
278                                        M360_MEMC_OR_PGME | M360_MEMC_OR_DRAM;
279        m360.memc[1].br = (unsigned long)&_RamBase | M360_MEMC_BR_V;
280
281        /* second bank 1MByte DRAM */
282        m360.memc[2].or = M360_MEMC_OR_TCYC(2) | M360_MEMC_OR_1MB |
283                                        M360_MEMC_OR_PGME | M360_MEMC_OR_DRAM;
284        m360.memc[2].br = ((unsigned long)&_RamBase + 0x100000) |
285                                        M360_MEMC_BR_V;
286
287        /* flash rom socket U6 on CS5 */
288        m360.memc[5].br = (unsigned long)ATLASHSB_ROM_U6 | M360_MEMC_BR_WP |
289                                                                M360_MEMC_BR_V;
290        m360.memc[5].or = M360_MEMC_OR_WAITS(2) | M360_MEMC_OR_512KB |
291                                                                M360_MEMC_OR_8BIT;
292
293        /* CSRs on CS7 */
294        m360.memc[7].or = M360_MEMC_OR_TCYC(4) | M360_MEMC_OR_64KB |
295                                        M360_MEMC_OR_8BIT;
296        m360.memc[7].br = ATLASHSB_ESR | 0x01;
297        for (i = 0; i < 50000; i++)
298                continue;
299        for (i = 0; i < 8; ++i)
300                *((volatile unsigned long *)(unsigned long)&_RamBase);
301
302        /*
303         * Step 13: Copy  the exception vector table to system RAM
304         */
305        m68k_get_vbr (vbr);
306        for (i = 0; i < 256; ++i)
307                M68Kvec[i] = vbr[i];
308        m68k_set_vbr (M68Kvec);
309
310        /*
311         * Step 14: More system initialization
312         * SDCR (Serial DMA configuration register)
313         *      Enable SDMA during FREEZE
314         *      Give SDMA priority over all interrupt handlers
315         *      Set DMA arbiration level to 4
316         * CICR (CPM interrupt configuration register):
317         *      SCC1 requests at SCCa position
318         *      SCC2 requests at SCCb position
319         *      SCC3 requests at SCCc position
320         *      SCC4 requests at SCCd position
321         *      Interrupt request level 4
322         *      Maintain original priority order
323         *      Vector base 128
324         *      SCCs priority grouped at top of table
325         */
326        m360.sdcr = M360_SDMA_SISM_7 | M360_SDMA_SAID_4;
327        m360.cicr = (3 << 22) | (2 << 20) | (1 << 18) | (0 << 16) |
328                                                (4 << 13) | (0x1F << 8) | (128);
329
330        /*
331         * Step 15: Set module configuration register
332         *      Disable timers during FREEZE
333         *      Enable bus monitor during FREEZE
334         *      BCLRO* arbitration level 3
335         */
336
337#elif (defined (GEN68360_WITH_SRAM))
338   /*
339    ***************************************************
340    * Generic Standalone Motorola 68360               *
341    *           As described in MC68360 User's Manual *
342    * But uses SRAM instead of DRAM                   *
343    *  CS0* - 512kx8 flash memory                     *
344    *  CS1* - 512kx32 static RAM                      *
345    *  CS2* - 512kx32 static RAM                      *
346    ***************************************************
347    */
348
349   /*
350    * Step 7: Deal with clock synthesizer
351    * HARDWARE:
352    * Change if you're not using an external oscillator which
353    * oscillates at the system clock rate.
354    */
355   m360.clkocr = 0x8F;     /* No more writes, no clock outputs */
356   m360.pllcr = 0xD000;    /* PLL, no writes, no prescale,
357                              no LPSTOP slowdown, PLL X1 */
358   m360.cdvcr = 0x8000;    /* No more writes, no clock division */
359
360   /*
361    * Step 8: Initialize system protection
362    * Enable watchdog
363    * Watchdog causes system reset
364    * Next-to-slowest watchdog timeout (21 seconds with 25 MHz oscillator)
365    * Enable double bus fault monitor
366    * Enable bus monitor for external cycles
367    * 1024 clocks for external timeout
368    */
369    m360.sypcr = 0xEC;
370
371   /*
372    * Step 9: Clear parameter RAM and reset communication processor module
373    */
374   for (i = 0 ; i < 192  ; i += sizeof (long)) {
375      *((long *)((char *)&m360 + 0xC00 + i)) = 0;
376      *((long *)((char *)&m360 + 0xD00 + i)) = 0;
377      *((long *)((char *)&m360 + 0xE00 + i)) = 0;
378      *((long *)((char *)&m360 + 0xF00 + i)) = 0;
379   }
380   M360ExecuteRISC (M360_CR_RST);
381
382   /*
383    * Step 10: Write PEPAR
384    * SINTOUT not used (CPU32+ mode)
385    * CF1MODE=00 (CONFIG1 input)
386    * IPIPE1*
387    * WE0* - WE3*
388    * OE* output
389    * CAS2* - CAS3*
390    * CAS0* - CAS1*
391    * CS7*
392    * AVEC*
393    * HARDWARE:
394    * Change if you are using a different memory configuration
395    * (static RAM, external address multiplexing, etc).
396    */
397   m360.pepar = 0x0080;
398
399   /*
400    * Step 11: Set up GMR
401    *
402    */
403   m360.gmr = 0x0;
404
405   /*
406    * Step 11a: Remap 512Kx8 flash memory on CS0*
407    * 2 wait states
408    * Make it read-only for now
409    */
410   m360.memc[0].br = (unsigned long)&_RomBase | M360_MEMC_BR_WP |
411                                                   M360_MEMC_BR_V;
412   m360.memc[0].or = M360_MEMC_OR_WAITS(2) | M360_MEMC_OR_512KB |
413                                                   M360_MEMC_OR_8BIT;
414   /*
415    * Step 12: Set up main memory
416    * 512Kx32 SRAM on CS1*
417    * 512Kx32 SRAM on CS2*
418    * 0 wait states
419    */
420   ramSize = 4 * 1024 * 1024;
421   m360.memc[1].br = (unsigned long)&_RamBase | M360_MEMC_BR_V;
422   m360.memc[1].or = M360_MEMC_OR_WAITS(0) | M360_MEMC_OR_2MB |
423                                                   M360_MEMC_OR_32BIT;
424   m360.memc[2].br = ((unsigned long)&_RamBase + 0x200000) | M360_MEMC_BR_V;
425   m360.memc[2].or = M360_MEMC_OR_WAITS(0) | M360_MEMC_OR_2MB |
426                                                   M360_MEMC_OR_32BIT;
427   /*
428    * Step 13: Copy  the exception vector table to system RAM
429    */
430   m68k_get_vbr (vbr);
431   for (i = 0; i < 256; ++i)
432           M68Kvec[i] = vbr[i];
433   m68k_set_vbr (M68Kvec);
434
435   /*
436    * Step 14: More system initialization
437    * SDCR (Serial DMA configuration register)
438    * Enable SDMA during FREEZE
439    * Give SDMA priority over all interrupt handlers
440    * Set DMA arbiration level to 4
441    * CICR (CPM interrupt configuration register):
442    * SCC1 requests at SCCa position
443    * SCC2 requests at SCCb position
444    * SCC3 requests at SCCc position
445    * SCC4 requests at SCCd position
446    * Interrupt request level 4
447    * Maintain original priority order
448    * Vector base 128
449    * SCCs priority grouped at top of table
450    */
451   m360.sdcr = M360_SDMA_SISM_7 | M360_SDMA_SAID_4;
452   m360.cicr = (3 << 22) | (2 << 20) | (1 << 18) | (0 << 16) |
453                  (4 << 13) | (0x1F << 8) | (128);
454
455   /*
456    * Step 15: Set module configuration register
457    * Disable timers during FREEZE
458    * Enable bus monitor during FREEZE
459    * BCLRO* arbitration level 3
460    * No show cycles
461    * User/supervisor access
462    * Bus clear interrupt service level 7
463    * SIM60 interrupt sources higher priority than CPM
464    */
465   m360.mcr = 0x4C7F;
466
467#else
468        /*
469         ***************************************************
470         * Generic Standalone Motorola 68360               *
471         *           As described in MC68360 User's Manual *
472         *           Atlas ACE360                          *
473         ***************************************************
474         */
475
476        /*
477         * Step 6: Is this a power-up reset?
478         * For now we just ignore this and do *all* the steps
479         * Someday we might want to:
480         *      if (Hard, Loss of Clock, Power-up)
481         *              Do all steps
482         *      else if (Double bus fault, watchdog or soft reset)
483         *              Skip to step 12
484         *      else (must be a CPU32+ reset command)
485         *              Skip to step 14
486         */
487
488        /*
489         * Step 7: Deal with clock synthesizer
490         * HARDWARE:
491         *      Change if you're not using an external 25 MHz oscillator.
492         */
493        m360.clkocr = 0x8F;     /* No more writes, no clock outputs */
494        m360.pllcr = 0xD000;    /* PLL, no writes, no prescale,
495                                   no LPSTOP slowdown, PLL X1 */
496        m360.cdvcr = 0x8000;    /* No more writes, no clock division */
497
498        /*
499         * Step 8: Initialize system protection
500         *      Enable watchdog
501         *      Watchdog causes system reset
502         *      Next-to-slowest watchdog timeout (21 seconds with 25 MHz oscillator)
503         *      Enable double bus fault monitor
504         *      Enable bus monitor for external cycles
505         *      1024 clocks for external timeout
506         */
507        m360.sypcr = 0xEC;
508
509        /*
510         * Step 9: Clear parameter RAM and reset communication processor module
511         */
512        for (i = 0 ; i < 192  ; i += sizeof (long)) {
513                *((long *)((char *)&m360 + 0xC00 + i)) = 0;
514                *((long *)((char *)&m360 + 0xD00 + i)) = 0;
515                *((long *)((char *)&m360 + 0xE00 + i)) = 0;
516                *((long *)((char *)&m360 + 0xF00 + i)) = 0;
517        }
518        M360ExecuteRISC (M360_CR_RST);
519
520        /*
521         * Step 10: Write PEPAR
522         *      SINTOUT not used (CPU32+ mode)
523         *      CF1MODE=00 (CONFIG1 input)
524         *      RAS1* double drive
525         *      WE0* - WE3*
526         *      OE* output
527         *      CAS2* - CAS3*
528         *      CAS0* - CAS1*
529         *      CS7*
530         *      AVEC*
531         * HARDWARE:
532         *      Change if you are using a different memory configuration
533         *      (static RAM, external address multiplexing, etc).
534         */
535        m360.pepar = 0x0180;
536
537        /*
538         * Step 11: Remap Chip Select 0 (CS0*), set up GMR
539         *      32-bit DRAM
540         *      Internal DRAM address multiplexing
541         *      60 nsec DRAM
542         *      180 nsec ROM (3 wait states)
543         *      15.36 usec DRAM refresh interval
544         *      The DRAM page size selection is not modified since this
545         *      startup code may be running in a bootstrap PROM or in
546         *      a program downloaded by the bootstrap PROM.
547         */
548        m360.gmr = (m360.gmr & 0x001C0000) | M360_GMR_RCNT(23) |
549                                        M360_GMR_RFEN | M360_GMR_RCYC(0) |
550                                        M360_GMR_DPS_32BIT | M360_GMR_NCS |
551                                        M360_GMR_GAMX;
552        m360.memc[0].br = (unsigned long)&_RomBase | M360_MEMC_BR_WP |
553                                                                M360_MEMC_BR_V;
554        m360.memc[0].or = M360_MEMC_OR_WAITS(3) | M360_MEMC_OR_1MB |
555                                                        M360_MEMC_OR_8BIT;
556
557        /*
558         * Step 12: Initialize the system RAM
559         * Do this only if the DRAM has not already been set up
560         */
561        if ((m360.memc[1].br & M360_MEMC_BR_V) == 0) {
562                /*
563                 * Set up GMR DRAM page size, option and  base registers
564                 *      Assume 16Mbytes of DRAM
565                 *      60 nsec DRAM
566                 */
567                m360.gmr = (m360.gmr & ~0x001C0000) | M360_GMR_PGS(5);
568                m360.memc[1].or = M360_MEMC_OR_TCYC(0) |
569                                                M360_MEMC_OR_16MB |
570                                                M360_MEMC_OR_DRAM;
571                m360.memc[1].br = (unsigned long)&_RamBase | M360_MEMC_BR_V;
572
573                /*
574                 * Wait for chips to power up
575                 *      Perform 8 read cycles
576                 */
577                for (i = 0; i < 50000; i++)
578                        continue;
579                for (i = 0; i < 8; ++i)
580                        *((volatile unsigned long *)(unsigned long)&_RamBase);
581
582                /*
583                 * Determine memory size (1, 4, or 16 Mbytes)
584                 * Set GMR DRAM page size appropriately.
585                 * The OR is left at 16 Mbytes.  The bootstrap PROM places its
586                 * .data and .bss segments at the top of the 16 Mbyte space.
587                 * A 1 Mbyte or 4 Mbyte DRAM will show up several times in
588                 * the memory map, but will work with the same bootstrap PROM.
589                 */
590                *(volatile char *)&_RamBase = 0;
591                *((volatile char *)&_RamBase+0x00C01800) = 1;
592                if (*(volatile char *)&_RamBase) {
593                        m360.gmr = (m360.gmr & ~0x001C0000) | M360_GMR_PGS(1);
594                }
595                else {
596                        *((volatile char *)&_RamBase+0x00801000) = 1;
597                        if (*(volatile char *)&_RamBase) {
598                                m360.gmr = (m360.gmr & ~0x001C0000) | M360_GMR_PGS(3);
599                        }
600                }
601
602                /*
603                 * Enable parity checking
604                 */
605                m360.memc[1].br |= M360_MEMC_BR_PAREN;
606        }
607        switch (m360.gmr & 0x001C0000) {
608        default:                ramSize =  4 * 1024 * 1024;     break;
609        case M360_GMR_PGS(1):   ramSize =  1 * 1024 * 1024;     break;
610        case M360_GMR_PGS(3):   ramSize =  4 * 1024 * 1024;     break;
611        case M360_GMR_PGS(5):   ramSize = 16 * 1024 * 1024;     break;
612        }
613
614        /*
615         * Step 13: Copy  the exception vector table to system RAM
616         */
617        m68k_get_vbr (vbr);
618        for (i = 0; i < 256; ++i)
619                M68Kvec[i] = vbr[i];
620        m68k_set_vbr (M68Kvec);
621
622        /*
623         * Step 14: More system initialization
624         * SDCR (Serial DMA configuration register)
625         *      Enable SDMA during FREEZE
626         *      Give SDMA priority over all interrupt handlers
627         *      Set DMA arbiration level to 4
628         * CICR (CPM interrupt configuration register):
629         *      SCC1 requests at SCCa position
630         *      SCC2 requests at SCCb position
631         *      SCC3 requests at SCCc position
632         *      SCC4 requests at SCCd position
633         *      Interrupt request level 4
634         *      Maintain original priority order
635         *      Vector base 128
636         *      SCCs priority grouped at top of table
637         */
638        m360.sdcr = M360_SDMA_SISM_7 | M360_SDMA_SAID_4;
639        m360.cicr = (3 << 22) | (2 << 20) | (1 << 18) | (0 << 16) |
640                                                (4 << 13) | (0x1F << 8) | (128);
641
642        /*
643         * Step 15: Set module configuration register
644         *      Disable timers during FREEZE
645         *      Enable bus monitor during FREEZE
646         *      BCLRO* arbitration level 3
647         *      No show cycles
648         *      User/supervisor access
649         *      Bus clear interrupt service level 7
650         *      SIM60 interrupt sources higher priority than CPM
651         */
652        m360.mcr = 0x4C7F;
653#endif
654
655        /*
656         * Copy data, clear BSS, switch stacks and call main()
657         * Must pass ramSize as argument since the data/bss segment
658         * may be overwritten.
659         */
660        _CopyDataClearBSSAndStart (ramSize);
661}
Note: See TracBrowser for help on using the repository browser.