added license
[rpikern] / src / intrasm.s
1         .code 32
2
3 @       .section .vect,"a"
4 @       .extern startup
5 @intr_vector:
6 @       b startup
7 @       b intr_entry_undef
8 @       b intr_entry_swi
9 @       b intr_entry_iabort
10 @       b intr_entry_dabort
11 @       b intr_entry_irq
12 @
13 @       @ FIQ entry point used for timer interrupts
14 @intr_entry_fiq:
15 @       ldr r9, =num_ticks
16 @       ldr r8, [r9]
17 @       add r8, #1
18 @       str r8, [r9]
19 @       subs pc, lr, #4
20 @       .align 8
21 @       .ascii "xyzzy"
22 @
23         .text
24
25         .global intr_entry_nop
26         .global intr_entry_undef
27         .global intr_entry_swi
28         .global intr_entry_iabort
29         .global intr_entry_dabort
30         .global intr_entry_irq
31         .global intr_entry_fiq
32
33 intr_entry_undef:
34 intr_entry_swi:
35 intr_entry_iabort:
36 intr_entry_dabort:
37 intr_entry_nop:
38         subs pc, lr, #4
39
40 intr_entry_irq:
41         ldr sp, =_stacktop      @ HACK
42
43         stmfd sp!, {r0, r1}
44
45         mov r0, #'.'
46         .extern ser_putchar
47         bl ser_putchar
48
49         ldr r1, =num_ticks
50         ldr r0, [r1]
51         add r0, #1
52         str r0, [r1]
53
54         @ setup next interrupt
55         ldr r1, =#0x3f003004    @ low counter in rpi2 TODO use rpi_iobase
56         ldr r0, [r1]
57         add r0, #4000           @ 1Mhz / 250hz = 4k counts
58         ldr r1, =#0x3f003010    @ compare 1 reg
59         str r0, [r1]
60
61         @ clear interrupt
62         ldr r1, =#0x3f003000
63         mov r0, #2      @ set bit 1 to clear interrupt from C1
64         str r0, [r1]
65
66         ldmfd sp!, {r0, r1}
67         subs pc, lr, #4
68
69 intr_entry_fiq:
70         ldr r9, =num_ticks
71         ldr r8, [r9]
72         add r8, #1
73         str r8, [r9]
74         subs pc, lr, #4
75
76 @ vi:set ft=armasm: