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