Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions board/early_init.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,19 @@ void early_initialization(void) {
jump_to_bootloader();
}
}

// we might hit NMI / HardFault close to brown-out.
// we don't want to infinitely loop, so let's set a logging cookie and reset.
#define NMI_COOKIE 0x4E4D4921U
#define HARDFAULT_COOKIE 0x48464C54U
extern uint32_t fault_cookie;

void NMI_Handler(void) {
fault_cookie = NMI_COOKIE;
NVIC_SystemReset();
}

void HardFault_Handler(void) {
fault_cookie = HARDFAULT_COOKIE;
NVIC_SystemReset();
}
2 changes: 2 additions & 0 deletions board/health.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
#define HEALTH_FLAG_HEARTBEAT_LOST (1U << 4)
#define HEALTH_FLAG_SAFETY_RX_CHECKS_INVALID (1U << 5)
#define HEALTH_FLAG_SOM_RESET_TRIGGERED (1U << 6)
#define HEALTH_FLAG_NMI_RESET (1U << 7)
#define HEALTH_FLAG_HARDFAULT_RESET ((uint16_t)1U << 8)

struct __attribute__((packed)) health_t {
uint32_t uptime_pkt;
Expand Down
8 changes: 8 additions & 0 deletions board/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,14 @@ int main(void) {
led_set(LED_GREEN, false);
led_set(LED_BLUE, false);

if (fault_cookie == NMI_COOKIE) {
reset_flags |= HEALTH_FLAG_NMI_RESET;
}
if (fault_cookie == HARDFAULT_COOKIE) {
reset_flags |= HEALTH_FLAG_HARDFAULT_RESET;
}
fault_cookie = 0U;

print("**** INTERRUPTS ON ****\n");
enable_interrupts();

Expand Down
1 change: 1 addition & 0 deletions board/main_comms.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ static int get_health_pkt(void *dat) {
health->flags_pkt |= heartbeat_lost ? HEALTH_FLAG_HEARTBEAT_LOST : 0U;
health->flags_pkt |= safety_rx_checks_invalid ? HEALTH_FLAG_SAFETY_RX_CHECKS_INVALID : 0U;
health->flags_pkt |= bootkick_reset_triggered ? HEALTH_FLAG_SOM_RESET_TRIGGERED : 0U;
health->flags_pkt |= reset_flags;

health->safety_tx_blocked_pkt = safety_tx_blocked;
health->safety_rx_invalid_pkt = safety_rx_invalid;
Expand Down
1 change: 1 addition & 0 deletions board/main_declarations.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ void pwm_set(TIM_TypeDef *TIM, uint8_t channel, uint8_t percentage);
extern uint8_t hw_type;
extern board *current_board;
extern uint32_t uptime_cnt;
extern uint16_t reset_flags;

// heartbeat state
extern uint32_t heartbeat_counter;
Expand Down
1 change: 1 addition & 0 deletions board/main_definitions.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
uint8_t hw_type = 0;
board *current_board;
uint32_t uptime_cnt = 0;
uint16_t reset_flags = 0U;

// heartbeat state
uint32_t heartbeat_counter = 0;
Expand Down
2 changes: 2 additions & 0 deletions board/stm32h7/stm32h7x5_flash.ld
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ ENTRY(Reset_Handler)

/* Highest address of the user mode stack */
enter_bootloader_mode = 0x38001FFC;
fault_cookie = 0x38003FFC;

_estack = 0x20020000; /* end of RAM */
_app_start = 0x08020000; /* Reserve Sector 0(128K) for bootloader */

Expand Down
4 changes: 4 additions & 0 deletions python/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,8 @@ class Panda:
HEALTH_FLAG_HEARTBEAT_LOST = 1 << 4
HEALTH_FLAG_SAFETY_RX_CHECKS_INVALID = 1 << 5
HEALTH_FLAG_SOM_RESET_TRIGGERED = 1 << 6
HEALTH_FLAG_NMI_RESET = 1 << 7
HEALTH_FLAG_HARDFAULT_RESET = 1 << 8

H7_DEVICES = [HW_TYPE_RED_PANDA, HW_TYPE_TRES, HW_TYPE_CUATRO, HW_TYPE_BODY]
SUPPORTED_DEVICES = H7_DEVICES
Expand Down Expand Up @@ -549,6 +551,8 @@ def health(self):
"sbu1_voltage_mV": a[17],
"sbu2_voltage_mV": a[18],
"som_reset_triggered": bool(flags & self.HEALTH_FLAG_SOM_RESET_TRIGGERED),
"nmi_reset": bool(flags & self.HEALTH_FLAG_NMI_RESET),
"hardfault_reset": bool(flags & self.HEALTH_FLAG_HARDFAULT_RESET),
"sound_output_level": a[19],
"temperature": a[20] - 40.0,
}
Expand Down
Loading