diff --git a/board/drivers/interrupts.h b/board/drivers/interrupts.h index c03d40d5..9cb46d4b 100644 --- a/board/drivers/interrupts.h +++ b/board/drivers/interrupts.h @@ -2,6 +2,7 @@ typedef struct interrupt { IRQn_Type irq_type; void (*handler)(void); uint32_t call_counter; + uint32_t call_rate; uint32_t max_call_rate; // Call rate is defined as the amount of calls each second uint32_t call_rate_fault; } interrupt; @@ -17,11 +18,12 @@ void unused_interrupt_handler(void) { interrupt interrupts[NUM_INTERRUPTS]; -#define REGISTER_INTERRUPT(irq_num, func_ptr, call_rate, rate_fault) \ +#define REGISTER_INTERRUPT(irq_num, func_ptr, call_rate_max, rate_fault) \ interrupts[irq_num].irq_type = (irq_num); \ interrupts[irq_num].handler = (func_ptr); \ interrupts[irq_num].call_counter = 0U; \ - interrupts[irq_num].max_call_rate = (call_rate); \ + interrupts[irq_num].call_rate = 0U; \ + interrupts[irq_num].max_call_rate = (call_rate_max); \ interrupts[irq_num].call_rate_fault = (rate_fault); bool check_interrupt_rate = false; @@ -70,6 +72,7 @@ void interrupt_timer_handler(void) { } // Reset interrupt counters + interrupts[i].call_rate = interrupts[i].call_counter; interrupts[i].call_counter = 0U; } diff --git a/board/main_comms.h b/board/main_comms.h index 19e642bc..1e47cc69 100644 --- a/board/main_comms.h +++ b/board/main_comms.h @@ -181,6 +181,17 @@ int comms_control_handler(ControlPacket_t *req, uint8_t *resp) { (void)memcpy(resp, ((uint8_t *)UID_BASE), 12); resp_len = 12; break; + case 0xc4: + // **** 0xc4: get interrupt call rate + if (req->param1 < NUM_INTERRUPTS) { + uint32_t load = interrupts[req->param1].call_rate; + resp[0] = (load & 0x000000FFU); + resp[1] = ((load & 0x0000FF00U) >> 8U); + resp[2] = ((load & 0x00FF0000U) >> 16U); + resp[3] = ((load & 0xFF000000U) >> 24U); + resp_len = 4U; + } + break; // **** 0xd0: fetch serial (aka the provisioned dongle ID) case 0xd0: // addresses are OTP diff --git a/python/__init__.py b/python/__init__.py index 112857e4..0a266d47 100644 --- a/python/__init__.py +++ b/python/__init__.py @@ -736,6 +736,10 @@ class Panda: def get_secret(self): return self._handle.controlRead(Panda.REQUEST_IN, 0xd0, 1, 0, 0x10) + def get_interrupt_call_rate(self, irqnum): + dat = self._handle.controlRead(Panda.REQUEST_IN, 0xc4, int(irqnum), 0, 4) + return struct.unpack("I", dat)[0] + # ******************* configuration ******************* def set_power_save(self, power_save_enabled=0):