From 3a415ab870655b443012c87de4a591d33702952b Mon Sep 17 00:00:00 2001 From: Jessy Diamond Exum Date: Fri, 14 Jul 2017 20:25:13 -0700 Subject: [PATCH] Can loopback now runtime configurable. Useful for board tests, customer troubleshooting, and linux driver loopback support. --- board/can.h | 4 ++-- board/config.h | 1 - board/main.c | 10 +++++++++- panda/__init__.py | 3 +++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/board/can.h b/board/can.h index f8387db1..3a2daa4e 100644 --- a/board/can.h +++ b/board/can.h @@ -17,9 +17,9 @@ void can_init(CAN_TypeDef *CAN, int silent) { CAN_BTR_TS2_0 | (prescaler - 1); // silent loopback mode for debugging - #ifdef CAN_LOOPBACK_MODE + if (can_loopback) { CAN->BTR |= CAN_BTR_SILM | CAN_BTR_LBKM; - #endif + } if (silent) { CAN->BTR |= CAN_BTR_SILM; diff --git a/board/config.h b/board/config.h index d9304bd8..523ac8bc 100644 --- a/board/config.h +++ b/board/config.h @@ -3,7 +3,6 @@ //#define DEBUG //#define DEBUG_USB -//#define CAN_LOOPBACK_MODE #ifdef STM32F4 #define PANDA diff --git a/board/main.c b/board/main.c index e36ebb61..dff891bc 100644 --- a/board/main.c +++ b/board/main.c @@ -24,7 +24,7 @@ int can_forwarding[] = {-1,-1,-1}; // debug safety check: is controls allowed? int controls_allowed = 0; int started = 0; -int can_live = 0, pending_can_live = 0; +int can_live = 0, pending_can_live = 0, can_loopback = 0; // optional features int gas_interceptor_detected = 0; @@ -715,6 +715,14 @@ int usb_cb_control_msg(USB_Setup_TypeDef *setup, uint8_t *resp, int hardwired) { if (!ur) break; uart_set_baud(ur->uart, (int)setup->b.wIndex.w*300); break; + case 0xe5: // Set CAN loopback (for testing) + can_loopback = (setup->b.wValue.w > 0); + can_init(CAN1, 0); + can_init(CAN2, 0); + #ifdef CAN3 + can_init(CAN3, 0); + #endif + break; case 0xf0: // k-line wValue pulse on uart2 if (setup->b.wValue.w == 1) { GPIOC->ODR &= ~(1 << 10); diff --git a/panda/__init__.py b/panda/__init__.py index ad690143..aa3c3b8f 100644 --- a/panda/__init__.py +++ b/panda/__init__.py @@ -152,6 +152,9 @@ class Panda(object): def set_gmlan(self, on, bus=2): self._handle.controlWrite(Panda.REQUEST_TYPE, 0xdb, 1, bus, b'') + def set_can_loopback(self, enable): + self._handle.controlWrite(Panda.REQUEST_TYPE, 0xe5, bool(enable), 0, b'') + def set_uart_baud(self, uart, rate): self._handle.controlWrite(Panda.REQUEST_TYPE, 0xe1, uart, rate, b'')