From 49e203409880cfbadb96c579a968cfd985c9b7b1 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 3 Nov 2022 16:34:18 -0700 Subject: [PATCH] tres (#1130) * tres * pull out chiplet * add to python lib --- board/boards/board_declarations.h | 1 + board/boards/red_chiplet.h | 115 ++++++++++++++++++++++++++++ board/boards/red_v2.h | 120 +----------------------------- board/boards/tres.h | 29 ++++++++ board/stm32h7/board.h | 19 +++-- python/__init__.py | 5 +- 6 files changed, 165 insertions(+), 124 deletions(-) create mode 100644 board/boards/red_chiplet.h create mode 100644 board/boards/tres.h diff --git a/board/boards/board_declarations.h b/board/boards/board_declarations.h index b6216da8..46abf497 100644 --- a/board/boards/board_declarations.h +++ b/board/boards/board_declarations.h @@ -51,6 +51,7 @@ struct board { #define HW_TYPE_DOS 6U #define HW_TYPE_RED_PANDA 7U #define HW_TYPE_RED_PANDA_V2 8U +#define HW_TYPE_TRES 9U // LED colors #define LED_RED 0U diff --git a/board/boards/red_chiplet.h b/board/boards/red_chiplet.h new file mode 100644 index 00000000..3eb09832 --- /dev/null +++ b/board/boards/red_chiplet.h @@ -0,0 +1,115 @@ +// ///////////////////// // +// Red Panda chiplet + Harness // +// ///////////////////// // + +// Most hardware functionality is similar to red panda + +void red_chiplet_enable_can_transceiver(uint8_t transceiver, bool enabled) { + switch (transceiver) { + case 1U: + set_gpio_output(GPIOG, 11, !enabled); + break; + case 2U: + set_gpio_output(GPIOB, 10, !enabled); + break; + case 3U: + set_gpio_output(GPIOD, 7, !enabled); + break; + case 4U: + set_gpio_output(GPIOB, 11, !enabled); + break; + default: + break; + } +} + +void red_chiplet_enable_can_transceivers(bool enabled) { + uint8_t main_bus = (car_harness_status == HARNESS_STATUS_FLIPPED) ? 3U : 1U; + for (uint8_t i=1U; i<=4U; i++) { + // Leave main CAN always on for CAN-based ignition detection + if (i == main_bus) { + red_chiplet_enable_can_transceiver(i, true); + } else { + red_chiplet_enable_can_transceiver(i, enabled); + } + } +} + +void red_chiplet_set_usb_load_switch(bool enabled) { + set_gpio_output(GPIOD, 3, enabled); +} + +void red_chiplet_init(void) { + common_init_gpio(); + + //A8, A9 : OBD_SBU1_RELAY, OBD_SBU2_RELAY + set_gpio_output_type(GPIOA, 8, OUTPUT_TYPE_OPEN_DRAIN); + set_gpio_pullup(GPIOA, 8, PULL_NONE); + set_gpio_mode(GPIOA, 8, MODE_OUTPUT); + set_gpio_output(GPIOA, 8, 1); + + set_gpio_output_type(GPIOA, 9, OUTPUT_TYPE_OPEN_DRAIN); + set_gpio_pullup(GPIOA, 9, PULL_NONE); + set_gpio_mode(GPIOA, 9, MODE_OUTPUT); + set_gpio_output(GPIOA, 9, 1); + + // G11,B10,D7,B11: transceiver enable + set_gpio_pullup(GPIOG, 11, PULL_NONE); + set_gpio_mode(GPIOG, 11, MODE_OUTPUT); + + set_gpio_pullup(GPIOB, 10, PULL_NONE); + set_gpio_mode(GPIOB, 10, MODE_OUTPUT); + + set_gpio_pullup(GPIOD, 7, PULL_NONE); + set_gpio_mode(GPIOD, 7, MODE_OUTPUT); + + set_gpio_pullup(GPIOB, 11, PULL_NONE); + set_gpio_mode(GPIOB, 11, MODE_OUTPUT); + + // D3: usb load switch + set_gpio_pullup(GPIOD, 3, PULL_NONE); + set_gpio_mode(GPIOD, 3, MODE_OUTPUT); + + //B0: 5VOUT_S + set_gpio_pullup(GPIOB, 0, PULL_NONE); + set_gpio_mode(GPIOB, 0, MODE_ANALOG); + + // Turn on USB load switch. + red_chiplet_set_usb_load_switch(true); + + // Initialize harness + harness_init(); + + // Initialize RTC + rtc_init(); + + // Enable CAN transceivers + red_chiplet_enable_can_transceivers(true); + + // Disable LEDs + red_set_led(LED_RED, false); + red_set_led(LED_GREEN, false); + red_set_led(LED_BLUE, false); + + // Set normal CAN mode + red_set_can_mode(CAN_MODE_NORMAL); + + // flip CAN0 and CAN2 if we are flipped + if (car_harness_status == HARNESS_STATUS_FLIPPED) { + can_flip_buses(0, 2); + } +} + +const harness_configuration red_chiplet_harness_config = { + .has_harness = true, + .GPIO_SBU1 = GPIOC, + .GPIO_SBU2 = GPIOA, + .GPIO_relay_SBU1 = GPIOA, + .GPIO_relay_SBU2 = GPIOA, + .pin_SBU1 = 4, + .pin_SBU2 = 1, + .pin_relay_SBU1 = 8, + .pin_relay_SBU2 = 9, + .adc_channel_SBU1 = 4, // ADC12_INP4 + .adc_channel_SBU2 = 17 // ADC1_INP17 +}; diff --git a/board/boards/red_v2.h b/board/boards/red_v2.h index 3eef77e0..9f8dbfd2 100644 --- a/board/boards/red_v2.h +++ b/board/boards/red_v2.h @@ -2,122 +2,10 @@ // Red Panda V2 with chiplet + Harness // // ///////////////////// // -// Most hardware functionality is similar to red panda - -void red_v2_enable_can_transceiver(uint8_t transceiver, bool enabled) { - switch (transceiver) { - case 1U: - set_gpio_output(GPIOG, 11, !enabled); - break; - case 2U: - set_gpio_output(GPIOB, 10, !enabled); - break; - case 3U: - set_gpio_output(GPIOD, 7, !enabled); - break; - case 4U: - set_gpio_output(GPIOB, 11, !enabled); - break; - default: - break; - } -} - -void red_v2_enable_can_transceivers(bool enabled) { - uint8_t main_bus = (car_harness_status == HARNESS_STATUS_FLIPPED) ? 3U : 1U; - for (uint8_t i=1U; i<=4U; i++) { - // Leave main CAN always on for CAN-based ignition detection - if (i == main_bus) { - red_v2_enable_can_transceiver(i, true); - } else { - red_v2_enable_can_transceiver(i, enabled); - } - } -} - -void red_v2_set_usb_load_switch(bool enabled) { - set_gpio_output(GPIOD, 3, enabled); -} - -void red_v2_init(void) { - common_init_gpio(); - - //A8, A9 : OBD_SBU1_RELAY, OBD_SBU2_RELAY - set_gpio_output_type(GPIOA, 8, OUTPUT_TYPE_OPEN_DRAIN); - set_gpio_pullup(GPIOA, 8, PULL_NONE); - set_gpio_mode(GPIOA, 8, MODE_OUTPUT); - set_gpio_output(GPIOA, 8, 1); - - set_gpio_output_type(GPIOA, 9, OUTPUT_TYPE_OPEN_DRAIN); - set_gpio_pullup(GPIOA, 9, PULL_NONE); - set_gpio_mode(GPIOA, 9, MODE_OUTPUT); - set_gpio_output(GPIOA, 9, 1); - - // G11,B10,D7,B11: transceiver enable - set_gpio_pullup(GPIOG, 11, PULL_NONE); - set_gpio_mode(GPIOG, 11, MODE_OUTPUT); - - set_gpio_pullup(GPIOB, 10, PULL_NONE); - set_gpio_mode(GPIOB, 10, MODE_OUTPUT); - - set_gpio_pullup(GPIOD, 7, PULL_NONE); - set_gpio_mode(GPIOD, 7, MODE_OUTPUT); - - set_gpio_pullup(GPIOB, 11, PULL_NONE); - set_gpio_mode(GPIOB, 11, MODE_OUTPUT); - - // D3: usb load switch - set_gpio_pullup(GPIOD, 3, PULL_NONE); - set_gpio_mode(GPIOD, 3, MODE_OUTPUT); - - //B0: 5VOUT_S - set_gpio_pullup(GPIOB, 0, PULL_NONE); - set_gpio_mode(GPIOB, 0, MODE_ANALOG); - - // Turn on USB load switch. - red_v2_set_usb_load_switch(true); - - // Initialize harness - harness_init(); - - // Initialize RTC - rtc_init(); - - // Enable CAN transceivers - red_v2_enable_can_transceivers(true); - - // Disable LEDs - red_set_led(LED_RED, false); - red_set_led(LED_GREEN, false); - red_set_led(LED_BLUE, false); - - // Set normal CAN mode - red_set_can_mode(CAN_MODE_NORMAL); - - // flip CAN0 and CAN2 if we are flipped - if (car_harness_status == HARNESS_STATUS_FLIPPED) { - can_flip_buses(0, 2); - } -} - -const harness_configuration red_v2_harness_config = { - .has_harness = true, - .GPIO_SBU1 = GPIOC, - .GPIO_SBU2 = GPIOA, - .GPIO_relay_SBU1 = GPIOA, - .GPIO_relay_SBU2 = GPIOA, - .pin_SBU1 = 4, - .pin_SBU2 = 1, - .pin_relay_SBU1 = 8, - .pin_relay_SBU2 = 9, - .adc_channel_SBU1 = 4, //ADC12_INP4 - .adc_channel_SBU2 = 17 //ADC1_INP17 -}; - const board board_red_v2 = { .board_type = "Red_v2", .board_tick = unused_board_tick, - .harness_config = &red_v2_harness_config, + .harness_config = &red_chiplet_harness_config, .has_gps = false, .has_hw_gmlan = false, .has_obd = true, @@ -125,9 +13,9 @@ const board board_red_v2 = { .has_canfd = true, .has_rtc_battery = true, .fan_max_rpm = 0U, - .init = red_v2_init, - .enable_can_transceiver = red_v2_enable_can_transceiver, - .enable_can_transceivers = red_v2_enable_can_transceivers, + .init = red_chiplet_init, + .enable_can_transceiver = red_chiplet_enable_can_transceiver, + .enable_can_transceivers = red_chiplet_enable_can_transceivers, .set_led = red_set_led, .set_gps_mode = unused_set_gps_mode, .set_can_mode = red_set_can_mode, diff --git a/board/boards/tres.h b/board/boards/tres.h new file mode 100644 index 00000000..c3910851 --- /dev/null +++ b/board/boards/tres.h @@ -0,0 +1,29 @@ +// ///////////////// +// Tres + Harness // +// ///////////////// + +const board board_tres = { + .board_type = "Tres", + .board_tick = unused_board_tick, + .harness_config = &red_chiplet_harness_config, + .has_gps = false, + .has_hw_gmlan = false, + .has_obd = true, + .has_lin = false, + .has_canfd = true, + .has_rtc_battery = true, + .fan_max_rpm = 0U, + .init = red_chiplet_init, + .enable_can_transceiver = red_chiplet_enable_can_transceiver, + .enable_can_transceivers = red_chiplet_enable_can_transceivers, + .set_led = red_set_led, + .set_gps_mode = unused_set_gps_mode, + .set_can_mode = red_set_can_mode, + .check_ignition = red_check_ignition, + .read_current = unused_read_current, + .set_fan_enabled = unused_set_fan_enabled, + .set_ir_power = unused_set_ir_power, + .set_phone_power = unused_set_phone_power, + .set_clock_source_mode = unused_set_clock_source_mode, + .set_siren = unused_set_siren +}; diff --git a/board/stm32h7/board.h b/board/stm32h7/board.h index 108dbfd8..a8b4617c 100644 --- a/board/stm32h7/board.h +++ b/board/stm32h7/board.h @@ -11,23 +11,30 @@ #include "stm32h7/llrtc.h" #include "drivers/rtc.h" #include "boards/red.h" +#include "boards/red_chiplet.h" #include "boards/red_v2.h" +#include "boards/tres.h" -uint8_t board_id(void) { +uint8_t get_board_id(void) { return detect_with_pull(GPIOF, 7, PULL_UP) | - (detect_with_pull(GPIOF, 8, PULL_UP) << 1U) | - (detect_with_pull(GPIOF, 9, PULL_UP) << 2U) | - (detect_with_pull(GPIOF, 10, PULL_UP) << 3U); + (detect_with_pull(GPIOF, 8, PULL_UP) << 1U) | + (detect_with_pull(GPIOF, 9, PULL_UP) << 2U) | + (detect_with_pull(GPIOF, 10, PULL_UP) << 3U); } void detect_board_type(void) { - if(board_id() == 0U){ + const uint8_t board_id = get_board_id(); + + if (board_id == 0U) { hw_type = HW_TYPE_RED_PANDA; current_board = &board_red; - } else if(board_id() == 1U){ + } else if (board_id == 1U) { hw_type = HW_TYPE_RED_PANDA_V2; current_board = &board_red_v2; + } else if (board_id == 2U) { + hw_type = HW_TYPE_TRES; + current_board = &board_tres; } else { hw_type = HW_TYPE_UNKNOWN; puts("Hardware type is UNKNOWN!\n"); diff --git a/python/__init__.py b/python/__init__.py index 89870073..ceb66627 100644 --- a/python/__init__.py +++ b/python/__init__.py @@ -183,6 +183,7 @@ class Panda: HW_TYPE_DOS = b'\x06' HW_TYPE_RED_PANDA = b'\x07' HW_TYPE_RED_PANDA_V2 = b'\x08' + HW_TYPE_TRES = b'\x09' CAN_PACKET_VERSION = 2 HEALTH_PACKET_VERSION = 11 @@ -192,10 +193,10 @@ class Panda: F2_DEVICES = (HW_TYPE_PEDAL, ) F4_DEVICES = (HW_TYPE_WHITE_PANDA, HW_TYPE_GREY_PANDA, HW_TYPE_BLACK_PANDA, HW_TYPE_UNO, HW_TYPE_DOS) - H7_DEVICES = (HW_TYPE_RED_PANDA, HW_TYPE_RED_PANDA_V2) + H7_DEVICES = (HW_TYPE_RED_PANDA, HW_TYPE_RED_PANDA_V2, HW_TYPE_TRES) INTERNAL_DEVICES = (HW_TYPE_UNO, HW_TYPE_DOS) - HAS_OBD = (HW_TYPE_BLACK_PANDA, HW_TYPE_UNO, HW_TYPE_DOS, HW_TYPE_RED_PANDA, HW_TYPE_RED_PANDA_V2) + HAS_OBD = (HW_TYPE_BLACK_PANDA, HW_TYPE_UNO, HW_TYPE_DOS, HW_TYPE_RED_PANDA, HW_TYPE_RED_PANDA_V2, HW_TYPE_TRES) CLOCK_SOURCE_MODE_DISABLED = 0 CLOCK_SOURCE_MODE_FREE_RUNNING = 1