Skip to content

Commit cadf8a7

Browse files
committed
pbio/platform/ev3: Implement panic handler
1 parent 5c33a7c commit cadf8a7

File tree

1 file changed

+87
-4
lines changed

1 file changed

+87
-4
lines changed

lib/pbio/platform/ev3/platform.c

Lines changed: 87 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -410,15 +410,98 @@ unsigned int EDMAVersionGet(void) {
410410
return 1;
411411
}
412412

413-
void ev3_panic_handler(int except_type, void *except_data) {
413+
static void panic_puts(const char *c) {
414+
while (*c) {
415+
UARTCharPut(SOC_UART_1_REGS, *(c++));
416+
}
417+
}
418+
static void panic_putu8(uint8_t x) {
419+
const char *hex = "0123456789ABCDEF";
420+
UARTCharPut(SOC_UART_1_REGS, hex[x >> 4]);
421+
UARTCharPut(SOC_UART_1_REGS, hex[x & 0xf]);
422+
}
423+
static void panic_putu32(uint32_t x) {
424+
panic_putu8(x >> 24);
425+
panic_putu8(x >> 16);
426+
panic_putu8(x >> 8);
427+
panic_putu8(x);
428+
}
429+
// This needs to be kept in sync with exceptionhandler.S
430+
static const char *const panic_types[] = {
431+
"UNKNOWN",
432+
"Undefined Instruction",
433+
"Prefetch Abort",
434+
"Data Abort",
435+
};
436+
typedef struct {
437+
uint32_t r13;
438+
uint32_t r14;
439+
uint32_t spsr;
440+
uint32_t r0;
441+
uint32_t r1;
442+
uint32_t r2;
443+
uint32_t r3;
444+
uint32_t r4;
445+
uint32_t r5;
446+
uint32_t r6;
447+
uint32_t r7;
448+
uint32_t r8;
449+
uint32_t r9;
450+
uint32_t r10;
451+
uint32_t r11;
452+
uint32_t r12;
453+
uint32_t exc_lr;
454+
} ev3_panic_ctx;
455+
456+
void ev3_panic_handler(int except_type, ev3_panic_ctx *except_data) {
414457
// Regardless of what's going on, configure the UART1 for a debug console
415458
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
416459
UARTConfigSetExpClk(SOC_UART_1_REGS, SOC_UART_1_MODULE_FREQ, 115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_13);
417460
UARTFIFOEnable(SOC_UART_1_REGS);
418461

419-
// TODO: Implement panic handler
420-
UARTCharPut(SOC_UART_1_REGS, 'H');
421-
UARTCharPut(SOC_UART_1_REGS, 'i');
462+
panic_puts("********************************************************************************\r\n");
463+
panic_puts("* Pybricks on EV3 Panic *\r\n");
464+
panic_puts("********************************************************************************\r\n");
465+
466+
panic_puts("Exception type: ");
467+
panic_puts(panic_types[except_type]);
468+
469+
panic_puts("\r\nR0: 0x");
470+
panic_putu32(except_data->r0);
471+
panic_puts("\r\nR1: 0x");
472+
panic_putu32(except_data->r1);
473+
panic_puts("\r\nR2: 0x");
474+
panic_putu32(except_data->r2);
475+
panic_puts("\r\nR3: 0x");
476+
panic_putu32(except_data->r3);
477+
panic_puts("\r\nR4: 0x");
478+
panic_putu32(except_data->r4);
479+
panic_puts("\r\nR5: 0x");
480+
panic_putu32(except_data->r5);
481+
panic_puts("\r\nR6: 0x");
482+
panic_putu32(except_data->r6);
483+
panic_puts("\r\nR7: 0x");
484+
panic_putu32(except_data->r7);
485+
panic_puts("\r\nR8: 0x");
486+
panic_putu32(except_data->r8);
487+
panic_puts("\r\nR9: 0x");
488+
panic_putu32(except_data->r9);
489+
panic_puts("\r\nR10: 0x");
490+
panic_putu32(except_data->r10);
491+
panic_puts("\r\nR11: 0x");
492+
panic_putu32(except_data->r11);
493+
panic_puts("\r\nR12: 0x");
494+
panic_putu32(except_data->r12);
495+
panic_puts("\r\nR13: 0x");
496+
panic_putu32(except_data->r13);
497+
panic_puts("\r\nR14: 0x");
498+
panic_putu32(except_data->r14);
499+
panic_puts("\r\nR15: 0x");
500+
panic_putu32(except_data->exc_lr);
501+
panic_puts("\r\nSPSR: 0x");
502+
panic_putu32(except_data->spsr);
503+
504+
panic_puts("\r\nSystem will now reboot...\r\n");
422505
}
423506

424507
/**

0 commit comments

Comments
 (0)