source: rtems/c/src/lib/libbsp/m68k/mcf52235/startup/init52235.c @ 3aac2db

4.104.114.95
Last change on this file since 3aac2db was 3aac2db, checked in by Chris Johns <chrisj@…>, on Jun 11, 2008 at 7:59:03 AM

2008-06-10 Matthew Riek <matthew.riek@…>

  • .cvsignore, ChangeLog?, Makefile.am, README, bsp_specs, clock/clock.c, configure.ac, console/console.c, gdb-init, include/bsp.h, include/bspopts.h.in, include/coverhd.h, include/tm27.h, preinstall.am, start/start.S, startup/bspclean.c, startup/bspstart.c, startup/cfinit.c, startup/init52235.c, startup/linkcmds, timer/timer.c: New.
  • Property mode set to 100644
File size: 6.1 KB
Line 
1/*
2 *  This is where the real hardware setup is done. A minimal stack
3 *  has been provided by the start.S code. No normal C or RTEMS
4 *  functions can be called from here.
5 */
6
7#include <rtems.h>
8#include <bsp.h>
9
10extern void _wr_vbr(uint32_t);
11extern void init_main();
12extern int boot_card(int, char **, char **);
13
14/*
15 * From linkcmds
16 */
17
18extern uint8_t _RamBase[];
19extern uint8_t _INTERRUPT_VECTOR[];
20
21extern uint8_t _clear_start[];
22extern uint8_t _clear_end[];
23
24extern uint8_t _data_src_start[];
25extern uint8_t _data_dest_start[];
26extern uint8_t _data_dest_end[];     
27
28
29void Init52235 (void)
30{
31        register uint32_t i;
32        register uint32_t *dp, *sp;
33    register uint8_t *dbp, *sbp;
34
35    /*
36     * Initialize the hardware
37     */
38    init_main();
39
40        /*
41     * Copy the vector table to RAM
42     */
43
44        if(_RamBase != _INTERRUPT_VECTOR)
45        {
46        sp = (uint32_t *) _INTERRUPT_VECTOR;
47        dp = (uint32_t *) _RamBase;
48        for(i = 0; i < 256; i++)
49                {
50                        *dp++ = *sp++;
51                }
52        }
53
54        _wr_vbr((uint32_t) _RamBase);
55
56    /*
57         * Move initialized data from ROM to RAM.
58         */
59        if (_data_src_start != _data_dest_start)
60        {
61                dbp = (uint8_t *) _data_dest_start;
62                sbp = (uint8_t *) _data_src_start;
63                i = _data_dest_end - _data_dest_start;
64                while (i--)
65                        *dbp++ = *sbp++;
66        }
67   
68        /*
69         * Zero uninitialized data
70         */
71
72        if (_clear_start != _clear_end)
73        {
74        sbp = _clear_start;
75        dbp = _clear_end;       
76                i = dbp - sbp;
77                while (i--)
78                        *sbp++ = 0;
79        }
80   
81    /*
82     * We have to call some kind of RTEMS function here!
83     */
84   
85    boot_card(0, 0, 0);
86    for(;;);
87}
88
89#if 0
90/***********************************************************************
91 *
92 * This is the exception handler for all defined exceptions.  Most
93 * exceptions do nothing, but some of the more important ones are
94 * handled to some extent.
95 *
96 * Called by asm_exception_handler
97 *
98 * The ColdFire family of processors has a simplified exception stack
99 * frame that looks like the following:
100 *
101 *              3322222222221111 111111
102 *              1098765432109876 5432109876543210
103 *           8 +----------------+----------------+
104 *             |         Program Counter         |
105 *           4 +----------------+----------------+
106 *             |FS/Fmt/Vector/FS|      SR        |
107 *   SP -->  0 +----------------+----------------+
108 *
109 * The stack self-aligns to a 4-byte boundary at an exception, with
110 * the FS/Fmt/Vector/FS field indicating the size of the adjustment
111 * (SP += 0,1,2,3 bytes).
112 */
113#define MCF5XXX_RD_SF_FORMAT(PTR)       \
114        ((*((uint16_t *)(PTR)) >> 12) & 0x00FF)
115
116#define MCF5XXX_RD_SF_VECTOR(PTR)       \
117        ((*((uint16_t *)(PTR)) >>  2) & 0x00FF)
118
119#define MCF5XXX_RD_SF_FS(PTR)           \
120        ( ((*((uint16_t *)(PTR)) & 0x0C00) >> 8) | (*((uint16_t *)(PTR)) & 0x0003) )
121
122#define MCF5XXX_SF_SR(PTR)      *((uint16_t *)(PTR)+1)
123#define MCF5XXX_SF_PC(PTR)      *((uint32_t *)(PTR)+1)
124
125void ecatch(const char* a_error, uint32_t a_pc)
126{
127    volatile const char* error = a_error;
128    volatile uint32_t pc = a_pc;
129    return;
130}
131
132void mcf5xxx_exception_handler(void *framep)
133{
134    volatile uint16_t sr;
135    volatile uint32_t pc;
136   
137        switch (MCF5XXX_RD_SF_FORMAT(framep))
138        {
139                case 4:
140                case 5:
141                case 6:
142                case 7:
143                        break;
144                default:
145            // Illegal stack type
146                        ecatch("Illegal stack type", MCF5XXX_SF_PC(framep));
147                        break;
148        }
149
150        switch (MCF5XXX_RD_SF_VECTOR(framep))
151        {
152                case 2:
153                        ecatch("Access Error", MCF5XXX_SF_PC(framep));
154                        switch (MCF5XXX_RD_SF_FS(framep))
155                        {
156                                case 4:
157                                        ecatch("Error on instruction fetch\n", 0);
158                                        break;
159                                case 8:
160                                        ecatch("Error on operand write\n", 0);
161                                        break;
162                                case 9:
163                                        ecatch("Attempted write to write-protected space\n", 0);
164                                        break;
165                                case 12:
166                                        ecatch("Error on operand read\n", 0);
167                                        break;
168                                default:
169                                        ecatch("Reserved Fault Status Encoding\n", 0);
170                                        break;
171                        }
172                        break;
173                case 3:
174                        ecatch("Address Error", MCF5XXX_SF_PC(framep));
175                        switch (MCF5XXX_RD_SF_FS(framep))
176                        {
177                                case 4:
178                                        ecatch("Error on instruction fetch\n", 0);
179                                        break;
180                                case 8:
181                                        ecatch("Error on operand write\n", 0);
182                                        break;
183                                case 9:
184                                        ecatch("Attempted write to write-protected space\n", 0);
185                                        break;
186                                case 12:
187                                        ecatch("Error on operand read\n", 0);
188                                        break;
189                                default:
190                                        ecatch("Reserved Fault Status Encoding\n", 0);
191                                        break;
192                        }
193                        break;
194                case 4:
195                        ecatch("Illegal instruction", MCF5XXX_SF_PC(framep));
196                        break;
197                case 8:
198                        ecatch("Privilege violation", MCF5XXX_SF_PC(framep));
199                        break;
200                case 9:
201                        ecatch("Trace Exception", MCF5XXX_SF_PC(framep));
202                        break;
203                case 10:
204                        ecatch("Unimplemented A-Line Instruction", MCF5XXX_SF_PC(framep));
205                        break;
206                case 11:
207                        ecatch("Unimplemented F-Line Instruction", MCF5XXX_SF_PC(framep));
208                        break;
209                case 12:
210                        ecatch("Debug Interrupt", MCF5XXX_SF_PC(framep));
211                        break;
212                case 14:
213                        ecatch("Format Error", MCF5XXX_SF_PC(framep));
214                        break;
215                case 15:
216                        ecatch("Unitialized Interrupt", MCF5XXX_SF_PC(framep));
217                        break;
218                case 24:
219                        ecatch("Spurious Interrupt", MCF5XXX_SF_PC(framep));
220                        break;
221                case 25:
222                case 26:
223                case 27:
224                case 28:
225                case 29:
226                case 30:
227                case 31:
228                        ecatch("Autovector interrupt level %d\n", MCF5XXX_RD_SF_VECTOR(framep) - 24);
229                        break;
230                case 32:
231                case 33:
232                case 34:
233                case 35:
234                case 36:
235                case 37:
236                case 38:
237                case 39:
238                case 40:
239                case 41:
240                case 42:
241                case 43:
242                case 44:
243                case 45:
244                case 46:
245                case 47:
246                        ecatch("TRAP #%d\n", MCF5XXX_RD_SF_VECTOR(framep) - 32);
247                        break;
248                case 5:
249                case 6:
250                case 7:
251                case 13:
252                case 16:
253                case 17:
254                case 18:
255                case 19:
256                case 20:
257                case 21:
258                case 22:
259                case 23:
260                case 48:
261                case 49:
262                case 50:
263                case 51:
264                case 52:
265                case 53:
266                case 54:
267                case 55:
268                case 56:
269                case 57:
270                case 58:
271                case 59:
272                case 60:
273                case 61:
274                case 62:
275                case 63:
276                        ecatch("Reserved: #%d\n", MCF5XXX_RD_SF_VECTOR(framep));
277                        break;
278                default:
279            ecatch("derivitave handler", MCF5XXX_RD_SF_VECTOR(framep));
280                        break;
281        }
282}
283#endif
Note: See TracBrowser for help on using the repository browser.