Skip to content

Commit 060cb67

Browse files
committed
pbio/platform/ev3: Hook up exception handlers to invoke C code
1 parent 1279e54 commit 060cb67

File tree

2 files changed

+72
-5
lines changed

2 files changed

+72
-5
lines changed

lib/pbio/platform/ev3/exceptionhandler.S

Lines changed: 60 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@
1111

1212
.equ I_F_BIT, 0xC0
1313
.equ MASK_SWI_NUM, 0xFF000000
14+
.equ MASK_SR_MODE, 0x1F
15+
.equ EXCEPT_TYPE_UNKNOWN, 0
16+
.equ EXCEPT_TYPE_UNDEF, 1
17+
.equ EXCEPT_TYPE_PREFETCH_ABORT, 2
18+
.equ EXCEPT_TYPE_DATA_ABORT, 3
1419

1520
@ This will be placed at 0xffff0000 by the linker script
1621
.section .vector,"ax",%progbits
@@ -19,13 +24,63 @@
1924

2025
ResetToEntry:
2126
B Entry
22-
B ResetToEntry
27+
B UndefHandlder
2328
B SWIHandler
24-
B ResetToEntry
25-
B ResetToEntry
26-
B ResetToEntry
29+
B PrefetchAbortHandler
30+
B DataAbortHandler
31+
B UnknownExceptionHandler
2732
B IRQHandler
28-
NOP @ Fall to FIQHandler
33+
B FIQHandler
34+
35+
UndefHandlder:
36+
@ Save r0-r12, lr
37+
stmfd sp!, {r0-r12, lr}
38+
mov r7, #EXCEPT_TYPE_UNDEF
39+
b CommonPanicHandler
40+
41+
PrefetchAbortHandler:
42+
@ Save r0-r12, lr
43+
stmfd sp!, {r0-r12, lr}
44+
mov r7, #EXCEPT_TYPE_PREFETCH_ABORT
45+
b CommonPanicHandler
46+
47+
DataAbortHandler:
48+
@ Save r0-r12, lr
49+
stmfd sp!, {r0-r12, lr}
50+
mov r7, #EXCEPT_TYPE_DATA_ABORT
51+
b CommonPanicHandler
52+
53+
UnknownExceptionHandler:
54+
@ Save r0-r12, lr
55+
stmfd sp!, {r0-r12, lr}
56+
mov r7, #EXCEPT_TYPE_UNKNOWN
57+
@ b CommonPanicHandler
58+
@ fall through
59+
60+
CommonPanicHandler:
61+
@ Save SPSR
62+
mrs r0, spsr
63+
stmfd sp!, {r0}
64+
@ Switch to previous mode to read its sp/lr
65+
@ NOTE: Assumes we never use User mode
66+
and r0, #MASK_SR_MODE
67+
mrs r1, cpsr
68+
and r2, r1, #MASK_SR_MODE
69+
orr r2, r0
70+
msr cpsr, r2
71+
mov r3, r13
72+
mov r4, r14
73+
msr cpsr, r1
74+
stmfd sp!, {r3, r4}
75+
@ Call panic handler
76+
mov r0, r7
77+
mov r1, sp
78+
bl ev3_panic_handler_
79+
@ Reset
80+
b ResetToEntry
81+
82+
ev3_panic_handler_:
83+
ldr pc, =ev3_panic_handler
2984

3085
FIQHandler:
3186
STMFD r13!, {r0-r7, lr}

lib/pbio/platform/ev3/platform.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
#include <tiam1808/hw/soc_AM1808.h>
5050
#include <tiam1808/i2c.h>
5151
#include <tiam1808/psc.h>
52+
#include <tiam1808/uart.h>
5253

5354
#include <pbdrv/ioport.h>
5455
#include <pbio/port_interface.h>
@@ -397,6 +398,17 @@ unsigned int EDMAVersionGet(void) {
397398
return 1;
398399
}
399400

401+
void ev3_panic_handler(int except_type, void *except_data) {
402+
// Regardless of what's going on, configure the UART1 for a debug console
403+
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
404+
UARTConfigSetExpClk(SOC_UART_1_REGS, SOC_UART_1_MODULE_FREQ, 115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_13);
405+
UARTFIFOEnable(SOC_UART_1_REGS);
406+
407+
// TODO: Implement panic handler
408+
UARTCharPut(SOC_UART_1_REGS, 'H');
409+
UARTCharPut(SOC_UART_1_REGS, 'i');
410+
}
411+
400412
/**
401413
* Callback for completion of all EDMA3 transfers on this platform.
402414
*

0 commit comments

Comments
 (0)