]> rtime.felk.cvut.cz Git - pes-rpp/rpp-test-sw.git/blob - source/sys_core.asm
Rewritten for using one task and direct usage of interrupts
[pes-rpp/rpp-test-sw.git] / source / sys_core.asm
1 ;-------------------------------------------------------------------------------\r
2 ; sys_core.asm\r
3 ;\r
4 ; (c) Texas Instruments 2009-2012, All rights reserved.\r
5 ;\r
6 \r
7     .text\r
8     .arm\r
9 \r
10 ;-------------------------------------------------------------------------------\r
11 ; Initialize CPU Registers\r
12 \r
13         .def     _coreInitRegisters_\r
14     .asmfunc\r
15     \r
16 \r
17 _coreInitRegisters_\r
18 \r
19 \r
20         ; After reset, the CPU is in the Supervisor mode (M = 10011)\r
21             mov r0, lr\r
22             mov r1, #0x0000\r
23             mov r2, #0x0000\r
24             mov r3, #0x0000\r
25             mov r4, #0x0000\r
26             mov r5, #0x0000\r
27             mov r6, #0x0000\r
28             mov r7, #0x0000\r
29             mov r8, #0x0000\r
30             mov r9, #0x0000\r
31             mov r10, #0x0000\r
32             mov r11, #0x0000\r
33             mov r12, #0x0000\r
34             mov r13, #0x0000\r
35             mrs r1, cpsr\r
36             msr spsr_cxsf, r1 \r
37             ; Switch to FIQ mode (M = 10001)\r
38             cps #17\r
39             mov lr, r0\r
40             mov r8, #0x0000\r
41             mov r9, #0x0000\r
42             mov r10, #0x0000\r
43             mov r11, #0x0000\r
44             mov r12, #0x0000\r
45             mrs r1, cpsr\r
46             msr spsr_cxsf, r1 \r
47             ; Switch to IRQ mode (M = 10010)\r
48             cps #18\r
49             mov lr, r0\r
50             mrs r1,cpsr\r
51             msr spsr_cxsf, r1       \r
52             ; Switch to Abort mode (M = 10111)\r
53             cps #23\r
54             mov lr, r0\r
55             mrs r1,cpsr\r
56             msr spsr_cxsf, r1       \r
57             ; Switch to Undefined Instruction Mode (M = 11011)\r
58             cps #27\r
59             mov lr, r0\r
60             mrs r1,cpsr\r
61             msr spsr_cxsf, r1       \r
62             ; Switch back to Supervisor Mode (M = 10011)\r
63             cps #19\r
64 \r
65 \r
66         mrc   p15,     #0x00,      r2,       c1, c0, #0x02\r
67         orr   r2,      r2,         #0xF00000\r
68         mcr   p15,     #0x00,      r2,       c1, c0, #0x02\r
69         mov   r2,      #0x40000000\r
70         fmxr  fpexc,   r2\r
71 \r
72                 fmdrr d0,         r1,     r1\r
73         fmdrr d1,         r1,     r1\r
74         fmdrr d2,         r1,     r1\r
75         fmdrr d3,         r1,     r1\r
76         fmdrr d4,         r1,     r1\r
77         fmdrr d5,         r1,     r1\r
78         fmdrr d6,         r1,     r1\r
79         fmdrr d7,         r1,     r1\r
80         fmdrr d8,         r1,     r1\r
81         fmdrr d9,         r1,     r1\r
82         fmdrr d10,        r1,     r1\r
83         fmdrr d11,        r1,     r1\r
84         fmdrr d12,        r1,     r1\r
85         fmdrr d13,        r1,     r1\r
86         fmdrr d14,        r1,     r1\r
87         fmdrr d15,        r1,     r1\r
88         bl    next1\r
89 next1\r
90         bl    next2\r
91 next2\r
92         bl    next3\r
93 next3\r
94         bl    next4\r
95 next4\r
96         bx    r0\r
97 \r
98     .endasmfunc\r
99 \r
100 \r
101 ;-------------------------------------------------------------------------------\r
102 ; Initialize Stack Pointers\r
103 \r
104     .def     _coreInitStackPointer_\r
105     .asmfunc\r
106 \r
107 _coreInitStackPointer_\r
108 \r
109         cps   #17\r
110         ldr   sp,       fiqSp\r
111         cps   #18\r
112         ldr   sp,       irqSp\r
113         cps   #23\r
114         ldr   sp,       abortSp\r
115         cps   #27\r
116         ldr   sp,       undefSp\r
117         cps   #31\r
118         ldr   sp,       userSp\r
119         cps   #19\r
120         ldr   sp,       svcSp\r
121         bx    lr\r
122 \r
123 userSp  .word 0x08000000+0x00001000\r
124 svcSp   .word 0x08000000+0x00001000+0x00000100\r
125 fiqSp   .word 0x08000000+0x00001000+0x00000100+0x00000100\r
126 irqSp   .word 0x08000000+0x00001000+0x00000100+0x00000100+0x00000100\r
127 abortSp .word 0x08000000+0x00001000+0x00000100+0x00000100+0x00000100+0x00000100\r
128 undefSp .word 0x08000000+0x00001000+0x00000100+0x00000100+0x00000100+0x00000100+0x00000100\r
129 \r
130     .endasmfunc\r
131 \r
132 ;-------------------------------------------------------------------------------\r
133 ; Get CPSR Value\r
134 \r
135     .def     _getCPSRValue_\r
136     .asmfunc\r
137 \r
138 _getCPSRValue_\r
139 \r
140         mrs   r0, CPSR\r
141         bx    lr\r
142 \r
143     .endasmfunc\r
144         \r
145 ;-------------------------------------------------------------------------------\r
146 ; Take CPU to IDLE state\r
147 \r
148     .def     _gotoCPUIdle_\r
149     .asmfunc\r
150 \r
151 _gotoCPUIdle_\r
152 \r
153         WFI\r
154                 nop\r
155                 nop\r
156                 nop\r
157                 nop\r
158                 \r
159     .endasmfunc\r
160         \r
161 \r
162 ;-------------------------------------------------------------------------------\r
163 ; Enable VFP Unit\r
164 \r
165     .def     _coreEnableVfp_\r
166     .asmfunc\r
167 \r
168 _coreEnableVfp_\r
169 \r
170         mrc   p15,     #0x00,      r0,       c1, c0, #0x02\r
171         orr   r0,      r0,         #0xF00000\r
172         mcr   p15,     #0x00,      r0,       c1, c0, #0x02\r
173         mov   r0,      #0x40000000\r
174         fmxr  fpexc,   r0\r
175         bx    lr\r
176 \r
177     .endasmfunc\r
178 \r
179 ;-------------------------------------------------------------------------------\r
180 ; Enable Event Bus Export\r
181 \r
182     .def     _coreEnableEventBusExport_\r
183     .asmfunc\r
184 \r
185 _coreEnableEventBusExport_\r
186 \r
187         stmfd sp!, {r0}\r
188         mrc   p15, #0x00, r0,         c9, c12, #0x00\r
189         orr   r0,  r0,    #0x10\r
190         mcr   p15, #0x00, r0,         c9, c12, #0x00\r
191         ldmfd sp!, {r0}\r
192         bx    lr\r
193 \r
194     .endasmfunc\r
195 \r
196 \r
197 ;-------------------------------------------------------------------------------\r
198 ; Disable Event Bus Export\r
199 \r
200     .def     _coreDisableEventBusExport_\r
201     .asmfunc\r
202 \r
203 _coreDisableEventBusExport_\r
204 \r
205         stmfd sp!, {r0}\r
206         mrc   p15, #0x00, r0,         c9, c12, #0x00\r
207         bic   r0,  r0,    #0x10\r
208         mcr   p15, #0x00, r0,         c9, c12, #0x00\r
209         ldmfd sp!, {r0}         \r
210         bx    lr\r
211 \r
212     .endasmfunc\r
213 \r
214 \r
215 ;-------------------------------------------------------------------------------\r
216 ; Enable RAM ECC Support\r
217 \r
218     .def     _coreEnableRamEcc_\r
219     .asmfunc\r
220 \r
221 _coreEnableRamEcc_\r
222 \r
223         stmfd sp!, {r0}\r
224         mrc   p15, #0x00, r0,         c1, c0,  #0x01\r
225         orr   r0,  r0,    #0x0C000000\r
226         mcr   p15, #0x00, r0,         c1, c0,  #0x01\r
227         ldmfd sp!, {r0}         \r
228         bx    lr\r
229 \r
230     .endasmfunc\r
231 \r
232 \r
233 ;-------------------------------------------------------------------------------\r
234 ; Disable RAM ECC Support\r
235 \r
236     .def     _coreDisableRamEcc_\r
237     .asmfunc\r
238 \r
239 _coreDisableRamEcc_\r
240 \r
241         stmfd sp!, {r0}\r
242         mrc   p15, #0x00, r0,         c1, c0,  #0x01\r
243         bic   r0,  r0,    #0x0C000000\r
244         mcr   p15, #0x00, r0,         c1, c0,  #0x01\r
245         ldmfd sp!, {r0}         \r
246         bx    lr\r
247 \r
248     .endasmfunc\r
249 \r
250 \r
251 ;-------------------------------------------------------------------------------\r
252 ; Enable Flash ECC Support\r
253 \r
254     .def     _coreEnableFlashEcc_\r
255     .asmfunc\r
256 \r
257 _coreEnableFlashEcc_\r
258 \r
259         stmfd sp!, {r0}\r
260         mrc   p15, #0x00, r0,         c1, c0,  #0x01\r
261         orr   r0,  r0,    #0x02000000\r
262         dmb\r
263         mcr   p15, #0x00, r0,         c1, c0,  #0x01\r
264         ldmfd sp!, {r0}         \r
265         bx    lr\r
266 \r
267     .endasmfunc\r
268 \r
269 \r
270 ;-------------------------------------------------------------------------------\r
271 ; Disable Flash ECC Support\r
272 \r
273     .def     _coreDisableFlashEcc_\r
274     .asmfunc\r
275 \r
276 _coreDisableFlashEcc_\r
277 \r
278         stmfd sp!, {r0}\r
279         mrc   p15, #0x00, r0,         c1, c0,  #0x01\r
280         bic   r0,  r0,    #0x02000000\r
281         mcr   p15, #0x00, r0,         c1, c0,  #0x01\r
282         ldmfd sp!, {r0}         \r
283         bx    lr\r
284 \r
285     .endasmfunc\r
286 \r
287 \r
288 ;-------------------------------------------------------------------------------\r
289 ; Enable Offset via Vic controller\r
290 \r
291     .def     _coreEnableIrqVicOffset_\r
292     .asmfunc\r
293 \r
294 _coreEnableIrqVicOffset_\r
295 \r
296         stmfd sp!, {r0}\r
297         mrc   p15, #0, r0,         c1, c0,  #0\r
298         orr   r0,  r0,    #0x01000000\r
299         mcr   p15, #0, r0,         c1, c0,  #0\r
300         ldmfd sp!, {r0}         \r
301         bx    lr\r
302 \r
303     .endasmfunc\r
304 \r
305 \r
306 ;-------------------------------------------------------------------------------\r
307 ; Get data fault status register\r
308 \r
309     .def     _coreGetDataFault_\r
310     .asmfunc\r
311 \r
312 _coreGetDataFault_\r
313 \r
314         mrc   p15, #0, r0, c5, c0,  #0\r
315         bx    lr\r
316 \r
317     .endasmfunc\r
318 \r
319 \r
320 ;-------------------------------------------------------------------------------\r
321 ; Clear data fault status register\r
322 \r
323     .def     _coreClearDataFault_\r
324     .asmfunc\r
325 \r
326 _coreClearDataFault_\r
327 \r
328         stmfd sp!, {r0}\r
329         mov   r0,  #0\r
330         mcr   p15, #0, r0, c5, c0,  #0\r
331         ldmfd sp!, {r0}         \r
332         bx    lr\r
333 \r
334     .endasmfunc\r
335 \r
336 \r
337 ;-------------------------------------------------------------------------------\r
338 ; Get instruction fault status register\r
339 \r
340     .def     _coreGetInstructionFault_\r
341     .asmfunc\r
342 \r
343 _coreGetInstructionFault_\r
344 \r
345         mrc   p15, #0, r0, c5, c0, #1\r
346         bx    lr\r
347 \r
348     .endasmfunc\r
349 \r
350 \r
351 ;-------------------------------------------------------------------------------\r
352 ; Clear instruction fault status register\r
353 \r
354     .def     _coreClearInstructionFault_\r
355     .asmfunc\r
356 \r
357 _coreClearInstructionFault_\r
358 \r
359         stmfd sp!, {r0}\r
360         mov   r0,  #0\r
361         mcr   p15, #0, r0, c5, c0, #1\r
362         ldmfd sp!, {r0}         \r
363         bx    lr\r
364 \r
365     .endasmfunc\r
366 \r
367 \r
368 ;-------------------------------------------------------------------------------\r
369 ; Get data fault address register\r
370 \r
371     .def     _coreGetDataFaultAddress_\r
372     .asmfunc\r
373 \r
374 _coreGetDataFaultAddress_\r
375 \r
376         mrc   p15, #0, r0, c6, c0,  #0\r
377         bx    lr\r
378 \r
379     .endasmfunc\r
380 \r
381 \r
382 ;-------------------------------------------------------------------------------\r
383 ; Clear data fault address register\r
384 \r
385     .def     _coreClearDataFaultAddress_\r
386     .asmfunc\r
387 \r
388 _coreClearDataFaultAddress_\r
389 \r
390         stmfd sp!, {r0}\r
391         mov   r0,  #0\r
392         mcr   p15, #0, r0, c6, c0,  #0\r
393         ldmfd sp!, {r0}         \r
394         bx    lr\r
395 \r
396     .endasmfunc\r
397 \r
398 \r
399 ;-------------------------------------------------------------------------------\r
400 ; Get instruction fault address register\r
401 \r
402     .def     _coreGetInstructionFaultAddress_\r
403     .asmfunc\r
404 \r
405 _coreGetInstructionFaultAddress_\r
406 \r
407         mrc   p15, #0, r0, c6, c0, #2\r
408         bx    lr\r
409 \r
410     .endasmfunc\r
411 \r
412 \r
413 ;-------------------------------------------------------------------------------\r
414 ; Clear instruction fault address register\r
415 \r
416     .def     _coreClearInstructionFaultAddress_\r
417     .asmfunc\r
418 \r
419 _coreClearInstructionFaultAddress_\r
420 \r
421         stmfd sp!, {r0}\r
422         mov   r0,  #0\r
423         mcr   p15, #0, r0, c6, c0, #2\r
424         ldmfd sp!, {r0}         \r
425         bx    lr\r
426 \r
427     .endasmfunc\r
428 \r
429 \r
430 ;-------------------------------------------------------------------------------\r
431 ; Get auxiliary data fault status register\r
432 \r
433     .def     _coreGetAuxiliaryDataFault_\r
434     .asmfunc\r
435 \r
436 _coreGetAuxiliaryDataFault_\r
437 \r
438         mrc   p15, #0, r0, c5, c1, #0\r
439         bx    lr\r
440 \r
441     .endasmfunc\r
442 \r
443 \r
444 ;-------------------------------------------------------------------------------\r
445 ; Clear auxiliary data fault status register\r
446 \r
447     .def     _coreClearAuxiliaryDataFault_\r
448     .asmfunc\r
449 \r
450 _coreClearAuxiliaryDataFault_\r
451 \r
452         stmfd sp!, {r0}\r
453         mov   r0,  #0\r
454         mcr   p15, #0, r0, c5, c1, #0\r
455         ldmfd sp!, {r0}         \r
456         bx    lr\r
457 \r
458     .endasmfunc\r
459 \r
460 \r
461 ;-------------------------------------------------------------------------------\r
462 ; Get auxiliary instruction fault status register\r
463 \r
464     .def     _coreGetAuxiliaryInstructionFault_\r
465     .asmfunc\r
466 \r
467 _coreGetAuxiliaryInstructionFault_\r
468 \r
469         mrc   p15, #0, r0, c5, c1, #1\r
470         bx    lr\r
471 \r
472     .endasmfunc\r
473 \r
474 ;-------------------------------------------------------------------------------\r
475 ; Clear auxiliary instruction fault status register\r
476 \r
477     .def     _coreClearAuxiliaryInstructionFault_\r
478     .asmfunc\r
479 \r
480 _coreClearAuxiliaryInstructionFault_\r
481 \r
482         stmfd sp!, {r0}\r
483         mov   r0,  #0\r
484         mrc   p15, #0, r0, c5, c1, #1\r
485         ldmfd sp!, {r0}         \r
486         bx    lr\r
487 \r
488     .endasmfunc\r
489 \r
490 ;-------------------------------------------------------------------------------\r
491 ; Disable interrupts - R4 IRQ & FIQ\r
492 \r
493         .def _disable_interrupt_\r
494         .asmfunc\r
495                 \r
496 _disable_interrupt_\r
497 \r
498         cpsid if\r
499         bx    lr\r
500                 \r
501         .endasmfunc\r
502 \r
503 ;-------------------------------------------------------------------------------\r
504 ; Disable FIQ interrupt\r
505 \r
506         .def _disable_FIQ_interrupt_\r
507         .asmfunc\r
508                 \r
509 _disable_FIQ_interrupt_\r
510 \r
511         cpsid f\r
512         bx    lr\r
513                 \r
514         .endasmfunc\r
515 \r
516 ;-------------------------------------------------------------------------------\r
517 ; Disable FIQ interrupt\r
518 \r
519         .def _disable_IRQ_interrupt_    \r
520         .asmfunc\r
521                 \r
522 _disable_IRQ_interrupt_\r
523 \r
524         cpsid i\r
525         bx    lr\r
526                 \r
527         .endasmfunc\r
528                 \r
529 ;-------------------------------------------------------------------------------\r
530 ; Enable interrupts - R4 IRQ & FIQ\r
531 \r
532        .def _enable_interrupt_\r
533        .asmfunc\r
534 \r
535 _enable_interrupt_\r
536 \r
537         cpsie if\r
538         bx    lr\r
539                 \r
540         .endasmfunc\r
541 \r
542                 \r
543 ;-------------------------------------------------------------------------------\r
544 ; Clear ESM CCM errorss\r
545 \r
546        .def _esmCcmErrorsClear_\r
547        .asmfunc\r
548 \r
549 _esmCcmErrorsClear_\r
550 \r
551         stmfd sp!, {r0-r2}              \r
552         ldr   r0, ESMSR1_REG    ; load the ESMSR1 status register address\r
553         ldr   r2, ESMSR1_ERR_CLR\r
554         str   r2, [r0]          ; clear the ESMSR1 register\r
555 \r
556         ldr   r0, ESMSR2_REG    ; load the ESMSR2 status register address\r
557         ldr   r2, ESMSR2_ERR_CLR\r
558         str   r2, [r0]          ; clear the ESMSR2 register\r
559 \r
560         ldr   r0, ESMSSR2_REG   ; load the ESMSSR2 status register address\r
561         ldr   r2, ESMSSR2_ERR_CLR\r
562         str   r2, [r0]              ; clear the ESMSSR2 register\r
563 \r
564         ldr   r0, ESMKEY_REG    ; load the ESMKEY register address\r
565         mov   r2, #0x5             ; load R2 with 0x5\r
566         str   r2, [r0]              ; clear the ESMKEY register\r
567 \r
568         ldr   r0, VIM_INTREQ    ; load the INTREQ register address\r
569         ldr   r2, VIM_INT_CLR\r
570         str   r2, [r0]          ; clear the INTREQ register\r
571         ldr   r0, CCMR4_STAT_REG        ; load the CCMR4 status register address\r
572         ldr   r2, CCMR4_ERR_CLR\r
573         str   r2, [r0]          ; clear the CCMR4 status register\r
574         ldmfd sp!, {r0-r2}        \r
575         bx    lr\r
576 \r
577 ESMSR1_REG        .word 0xFFFFF518\r
578 ESMSR2_REG        .word 0xFFFFF51C\r
579 ESMSR3_REG        .word 0xFFFFF520\r
580 ESMKEY_REG        .word 0xFFFFF538\r
581 ESMSSR2_REG       .word 0xFFFFF53C\r
582 CCMR4_STAT_REG    .word 0xFFFFF600\r
583 ERR_CLR_WRD       .word 0xFFFFFFFF\r
584 CCMR4_ERR_CLR     .word 0x00010000\r
585 ESMSR1_ERR_CLR    .word 0x80000000\r
586 ESMSR2_ERR_CLR    .word 0x00000004\r
587 ESMSSR2_ERR_CLR   .word 0x00000004\r
588 VIM_INT_CLR       .word 0x00000001\r
589 VIM_INTREQ        .word 0xFFFFFE20\r
590 \r
591         .endasmfunc     \r
592                 \r
593 \r
594 ;-------------------------------------------------------------------------------\r
595 ; C++ construct table pointers\r
596 \r
597     .def    __TI_PINIT_Base, __TI_PINIT_Limit\r
598     .weak   SHT$$INIT_ARRAY$$Base, SHT$$INIT_ARRAY$$Limit\r
599 \r
600 __TI_PINIT_Base  .long SHT$$INIT_ARRAY$$Base\r
601 __TI_PINIT_Limit .long SHT$$INIT_ARRAY$$Limit\r
602 \r
603     \r
604 \r
605 ;-------------------------------------------------------------------------------\r
606 \r