@@ -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