-
Notifications
You must be signed in to change notification settings - Fork 9.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
519e39e Changed heartbeat timeout to be 2 seconds on no ignition 996dc40 Added heartbeat to black loopback testing 79b44cb bump version 59f5813 Black (#254) 0964866 no need to store safety only misra output anymore git-subtree-dir: panda git-subtree-split: 519e39e
- Loading branch information
Vehicle Researcher
committed
Jul 30, 2019
1 parent
1ff59ba
commit 30bb73d
Showing
33 changed files
with
1,615 additions
and
690 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
v1.4.1 | ||
v1.4.2 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
// ///////////////////////////////////////////////////////////// // | ||
// Hardware abstraction layer for all different supported boards // | ||
// ///////////////////////////////////////////////////////////// // | ||
#include "board_declarations.h" | ||
#include "boards/common.h" | ||
|
||
// ///// Board definition and detection ///// // | ||
#include "drivers/harness.h" | ||
#ifdef PANDA | ||
#include "boards/white.h" | ||
#include "boards/grey.h" | ||
#include "boards/black.h" | ||
#else | ||
#include "boards/pedal.h" | ||
#endif | ||
|
||
void detect_board_type(void) { | ||
#ifdef PANDA | ||
// SPI lines floating: white (TODO: is this reliable?) | ||
if((detect_with_pull(GPIOA, 4, PULL_DOWN)) || (detect_with_pull(GPIOA, 5, PULL_DOWN)) || (detect_with_pull(GPIOA, 6, PULL_DOWN)) || (detect_with_pull(GPIOA, 7, PULL_DOWN))){ | ||
hw_type = HW_TYPE_WHITE_PANDA; | ||
current_board = &board_white; | ||
} else if(detect_with_pull(GPIOA, 13, PULL_DOWN)) { // Rev AB deprecated, so no pullup means black. In REV C, A13 is pulled up to 5V with a 10K | ||
hw_type = HW_TYPE_GREY_PANDA; | ||
current_board = &board_grey; | ||
} else { | ||
hw_type = HW_TYPE_BLACK_PANDA; | ||
current_board = &board_black; | ||
} | ||
#else | ||
#ifdef PEDAL | ||
hw_type = HW_TYPE_PEDAL; | ||
current_board = &board_pedal; | ||
#else | ||
hw_type = HW_TYPE_UNKNOWN; | ||
puts("Hardware type is UNKNOWN!\n"); | ||
#endif | ||
#endif | ||
} | ||
|
||
|
||
// ///// Configuration detection ///// // | ||
bool has_external_debug_serial = 0; | ||
bool is_entering_bootmode = 0; | ||
|
||
void detect_configuration(void) { | ||
// detect if external serial debugging is present | ||
has_external_debug_serial = detect_with_pull(GPIOA, 3, PULL_DOWN); | ||
|
||
#ifdef PANDA | ||
// check if the ESP is trying to put me in boot mode | ||
is_entering_bootmode = !detect_with_pull(GPIOB, 0, PULL_UP); | ||
#else | ||
is_entering_bootmode = 0; | ||
#endif | ||
} | ||
|
||
// ///// Board functions ///// // | ||
bool board_has_gps(void) { | ||
return ((hw_type == HW_TYPE_GREY_PANDA) || (hw_type == HW_TYPE_BLACK_PANDA)); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
// ******************** Prototypes ******************** | ||
typedef void (*board_init)(void); | ||
typedef void (*board_enable_can_transciever)(uint8_t transciever, bool enabled); | ||
typedef void (*board_enable_can_transcievers)(bool enabled); | ||
typedef void (*board_set_led)(uint8_t color, bool enabled); | ||
typedef void (*board_set_usb_power_mode)(uint8_t mode); | ||
typedef void (*board_set_esp_gps_mode)(uint8_t mode); | ||
typedef void (*board_set_can_mode)(uint8_t mode); | ||
typedef void (*board_usb_power_mode_tick)(uint64_t tcnt); | ||
typedef bool (*board_check_ignition)(void); | ||
|
||
struct board { | ||
const char *board_type; | ||
const harness_configuration *harness_config; | ||
board_init init; | ||
board_enable_can_transciever enable_can_transciever; | ||
board_enable_can_transcievers enable_can_transcievers; | ||
board_set_led set_led; | ||
board_set_usb_power_mode set_usb_power_mode; | ||
board_set_esp_gps_mode set_esp_gps_mode; | ||
board_set_can_mode set_can_mode; | ||
board_usb_power_mode_tick usb_power_mode_tick; | ||
board_check_ignition check_ignition; | ||
}; | ||
|
||
// ******************* Definitions ******************** | ||
// These should match the enum in cereal/log.capnp | ||
#define HW_TYPE_UNKNOWN 0U | ||
#define HW_TYPE_WHITE_PANDA 1U | ||
#define HW_TYPE_GREY_PANDA 2U | ||
#define HW_TYPE_BLACK_PANDA 3U | ||
#define HW_TYPE_PEDAL 4U | ||
|
||
// LED colors | ||
#define LED_RED 0U | ||
#define LED_GREEN 1U | ||
#define LED_BLUE 2U | ||
|
||
// USB power modes | ||
#define USB_POWER_NONE 0U | ||
#define USB_POWER_CLIENT 1U | ||
#define USB_POWER_CDP 2U | ||
#define USB_POWER_DCP 3U | ||
|
||
// ESP modes | ||
#define ESP_GPS_DISABLED 0U | ||
#define ESP_GPS_ENABLED 1U | ||
#define ESP_GPS_BOOTMODE 2U | ||
|
||
// CAN modes | ||
#define CAN_MODE_NORMAL 0U | ||
#define CAN_MODE_GMLAN_CAN2 1U | ||
#define CAN_MODE_GMLAN_CAN3 2U | ||
#define CAN_MODE_OBD_CAN2 3U | ||
|
||
// ********************* Globals ********************** | ||
uint8_t usb_power_mode = USB_POWER_NONE; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,188 @@ | ||
// ///////////////////// // | ||
// Black Panda + Harness // | ||
// ///////////////////// // | ||
|
||
void black_enable_can_transciever(uint8_t transciever, bool enabled) { | ||
switch (transciever){ | ||
case 1U: | ||
set_gpio_output(GPIOC, 1, !enabled); | ||
break; | ||
case 2U: | ||
set_gpio_output(GPIOC, 13, !enabled); | ||
break; | ||
case 3U: | ||
set_gpio_output(GPIOA, 0, !enabled); | ||
break; | ||
case 4U: | ||
set_gpio_output(GPIOB, 10, !enabled); | ||
break; | ||
default: | ||
puts("Invalid CAN transciever ("); puth(transciever); puts("): enabling failed\n"); | ||
break; | ||
} | ||
} | ||
|
||
void black_enable_can_transcievers(bool enabled) { | ||
for(uint8_t i=1; i<=4U; i++) | ||
black_enable_can_transciever(i, enabled); | ||
} | ||
|
||
void black_set_led(uint8_t color, bool enabled) { | ||
switch (color){ | ||
case LED_RED: | ||
set_gpio_output(GPIOC, 9, !enabled); | ||
break; | ||
case LED_GREEN: | ||
set_gpio_output(GPIOC, 7, !enabled); | ||
break; | ||
case LED_BLUE: | ||
set_gpio_output(GPIOC, 6, !enabled); | ||
break; | ||
default: | ||
break; | ||
} | ||
} | ||
|
||
void black_set_usb_power_mode(uint8_t mode){ | ||
usb_power_mode = mode; | ||
puts("Trying to set USB power mode on black panda. This is not supported.\n"); | ||
} | ||
|
||
void black_set_esp_gps_mode(uint8_t mode) { | ||
switch (mode) { | ||
case ESP_GPS_DISABLED: | ||
// ESP OFF | ||
set_gpio_output(GPIOC, 14, 0); | ||
set_gpio_output(GPIOC, 5, 0); | ||
break; | ||
case ESP_GPS_ENABLED: | ||
// ESP ON | ||
set_gpio_output(GPIOC, 14, 1); | ||
set_gpio_output(GPIOC, 5, 1); | ||
break; | ||
case ESP_GPS_BOOTMODE: | ||
set_gpio_output(GPIOC, 14, 1); | ||
set_gpio_output(GPIOC, 5, 0); | ||
break; | ||
default: | ||
puts("Invalid ESP/GPS mode\n"); | ||
break; | ||
} | ||
} | ||
|
||
void black_set_can_mode(uint8_t mode){ | ||
switch (mode) { | ||
case CAN_MODE_NORMAL: | ||
case CAN_MODE_OBD_CAN2: | ||
if ((bool)(mode == CAN_MODE_NORMAL) != (bool)(car_harness_status == HARNESS_STATUS_NORMAL)) { | ||
// B12,B13: disable OBD mode | ||
set_gpio_mode(GPIOB, 12, MODE_INPUT); | ||
set_gpio_mode(GPIOB, 13, MODE_INPUT); | ||
|
||
// B5,B6: normal CAN2 mode | ||
set_gpio_alternate(GPIOB, 5, GPIO_AF9_CAN2); | ||
set_gpio_alternate(GPIOB, 6, GPIO_AF9_CAN2); | ||
} else { | ||
// B5,B6: disable normal CAN2 mode | ||
set_gpio_mode(GPIOB, 5, MODE_INPUT); | ||
set_gpio_mode(GPIOB, 6, MODE_INPUT); | ||
|
||
// B12,B13: OBD mode | ||
set_gpio_alternate(GPIOB, 12, GPIO_AF9_CAN2); | ||
set_gpio_alternate(GPIOB, 13, GPIO_AF9_CAN2); | ||
} | ||
break; | ||
default: | ||
puts("Tried to set unsupported CAN mode: "); puth(mode); puts("\n"); | ||
break; | ||
} | ||
} | ||
|
||
void black_usb_power_mode_tick(uint64_t tcnt){ | ||
UNUSED(tcnt); | ||
// Not applicable | ||
} | ||
|
||
bool black_check_ignition(void){ | ||
// ignition is checked through harness | ||
return harness_check_ignition(); | ||
} | ||
|
||
void black_init(void) { | ||
common_init_gpio(); | ||
|
||
// A8,A15: normal CAN3 mode | ||
set_gpio_alternate(GPIOA, 8, GPIO_AF11_CAN3); | ||
set_gpio_alternate(GPIOA, 15, GPIO_AF11_CAN3); | ||
|
||
// C0: OBD_SBU1 (orientation detection) | ||
// C3: OBD_SBU2 (orientation detection) | ||
set_gpio_mode(GPIOC, 0, MODE_ANALOG); | ||
set_gpio_mode(GPIOC, 3, MODE_ANALOG); | ||
|
||
// C10: OBD_SBU1_RELAY (harness relay driving output) | ||
// C11: OBD_SBU2_RELAY (harness relay driving output) | ||
set_gpio_mode(GPIOC, 10, MODE_OUTPUT); | ||
set_gpio_mode(GPIOC, 11, MODE_OUTPUT); | ||
set_gpio_output_type(GPIOC, 10, OUTPUT_TYPE_OPEN_DRAIN); | ||
set_gpio_output_type(GPIOC, 11, OUTPUT_TYPE_OPEN_DRAIN); | ||
set_gpio_output(GPIOC, 10, 1); | ||
set_gpio_output(GPIOC, 11, 1); | ||
|
||
// C8: FAN aka TIM3_CH3 | ||
set_gpio_alternate(GPIOC, 8, GPIO_AF2_TIM3); | ||
|
||
// C12: GPS load switch. Turn on permanently for now | ||
set_gpio_output(GPIOC, 12, true); | ||
//set_gpio_output(GPIOC, 12, false); //TODO: stupid inverted switch on prototype | ||
|
||
// Initialize harness | ||
harness_init(); | ||
|
||
// Enable CAN transcievers | ||
black_enable_can_transcievers(true); | ||
|
||
// Disable LEDs | ||
black_set_led(LED_RED, false); | ||
black_set_led(LED_GREEN, false); | ||
black_set_led(LED_BLUE, false); | ||
|
||
// Set normal CAN mode | ||
black_set_can_mode(CAN_MODE_NORMAL); | ||
|
||
// flip CAN0 and CAN2 if we are flipped | ||
if (car_harness_status == HARNESS_STATUS_NORMAL) { | ||
can_flip_buses(0, 2); | ||
} | ||
|
||
// init multiplexer | ||
can_set_obd(car_harness_status, false); | ||
} | ||
|
||
const harness_configuration black_harness_config = { | ||
.has_harness = true, | ||
.GPIO_SBU1 = GPIOC, | ||
.GPIO_SBU2 = GPIOC, | ||
.GPIO_relay_normal = GPIOC, | ||
.GPIO_relay_flipped = GPIOC, | ||
.pin_SBU1 = 0, | ||
.pin_SBU2 = 3, | ||
.pin_relay_normal = 10, | ||
.pin_relay_flipped = 11, | ||
.adc_channel_SBU1 = 10, | ||
.adc_channel_SBU2 = 13 | ||
}; | ||
|
||
const board board_black = { | ||
.board_type = "Black", | ||
.harness_config = &black_harness_config, | ||
.init = black_init, | ||
.enable_can_transciever = black_enable_can_transciever, | ||
.enable_can_transcievers = black_enable_can_transcievers, | ||
.set_led = black_set_led, | ||
.set_usb_power_mode = black_set_usb_power_mode, | ||
.set_esp_gps_mode = black_set_esp_gps_mode, | ||
.set_can_mode = black_set_can_mode, | ||
.usb_power_mode_tick = black_usb_power_mode_tick, | ||
.check_ignition = black_check_ignition | ||
}; |
Oops, something went wrong.