forked from commaai/openpilot
-
Notifications
You must be signed in to change notification settings - Fork 18
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* late usb * Added type support for black panda * Added harness presence and orientation detection * harness relay driving code * Added intercept support in black panda code. Switched around can0 and can2 * Disable ADCs after orientation detection. Ignition interrupts via harness * WIP: Hardware abstraction layer + black panda bringup * Fixed bootstub build * Fixed bootstub for pedal * Fixed infinite loops * Got CAN buses working on white again * Fixed pedal build and black can interfaces * Got CAN buses working on black panda * Finished loopback test for black panda * Erase all flash sectors on the panda. Increased binary limit. Added extra python functions. * Fixed python * Made new code MISRA compliant * Cleaned up ignition. Fixed build * Fixed health packet * Fixed CAN mode on black bug. Changed OBD to switch on ELM mode * Fixes from Github review * Fixed MISRA issue for pedal * Fixed failing gmlan tests * ELM327 safety: allow diagnostic on all buses * Cleaned up EON relay code * delete only 3 sectors instead of 11 to allow a new build to be flashed. Much faster to flash * Removed CAN only can0 output mode. Does not make sense on black panda due to reversibility issues. * Added heartbeat logic for EON code on panda. Go to NOOUTPUT if EON does not send a heartbeat for 5 seconds. * Remove all CAN buses live on EON startup. Shouldn't be necessary to have this separate case * Formatting * Added file I forgot to push * Added heartbeat to testing code to make sure EON tests don't fail. Should probably find a better way to do this though. Heartbeat thread didn't work, concurrent USB connection issues... * Safety: support black panda for Honda Bosch * Disable OBD2 if setting to NOOUTPUT mode * Run safety tests for all hw_types * Fail test if subtest fails * fix safety tests
- Loading branch information
Showing
31 changed files
with
1,611 additions
and
682 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
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 | ||
}; |
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,82 @@ | ||
#ifdef STM32F4 | ||
#include "stm32f4xx_hal_gpio_ex.h" | ||
#else | ||
#include "stm32f2xx_hal_gpio_ex.h" | ||
#endif | ||
|
||
// Common GPIO initialization | ||
void common_init_gpio(void){ | ||
// TODO: Is this block actually doing something??? | ||
// pull low to hold ESP in reset?? | ||
// enable OTG out tied to ground | ||
GPIOA->ODR = 0; | ||
GPIOB->ODR = 0; | ||
GPIOA->PUPDR = 0; | ||
GPIOB->AFR[0] = 0; | ||
GPIOB->AFR[1] = 0; | ||
|
||
// C2: Voltage sense line | ||
set_gpio_mode(GPIOC, 2, MODE_ANALOG); | ||
|
||
// A11,A12: USB | ||
set_gpio_alternate(GPIOA, 11, GPIO_AF10_OTG_FS); | ||
set_gpio_alternate(GPIOA, 12, GPIO_AF10_OTG_FS); | ||
GPIOA->OSPEEDR = GPIO_OSPEEDER_OSPEEDR11 | GPIO_OSPEEDER_OSPEEDR12; | ||
|
||
// A9,A10: USART 1 for talking to the ESP / GPS | ||
set_gpio_alternate(GPIOA, 9, GPIO_AF7_USART1); | ||
set_gpio_alternate(GPIOA, 10, GPIO_AF7_USART1); | ||
|
||
// B8,B9: CAN 1 | ||
#ifdef STM32F4 | ||
set_gpio_alternate(GPIOB, 8, GPIO_AF8_CAN1); | ||
set_gpio_alternate(GPIOB, 9, GPIO_AF8_CAN1); | ||
#else | ||
set_gpio_alternate(GPIOB, 8, GPIO_AF9_CAN1); | ||
set_gpio_alternate(GPIOB, 9, GPIO_AF9_CAN1); | ||
#endif | ||
} | ||
|
||
// Peripheral initialization | ||
void peripherals_init(void){ | ||
// enable GPIOB, UART2, CAN, USB clock | ||
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; | ||
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; | ||
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN; | ||
RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; | ||
|
||
RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN; | ||
RCC->APB1ENR |= RCC_APB1ENR_USART2EN; | ||
RCC->APB1ENR |= RCC_APB1ENR_USART3EN; | ||
#ifdef PANDA | ||
RCC->APB1ENR |= RCC_APB1ENR_UART5EN; | ||
#endif | ||
RCC->APB1ENR |= RCC_APB1ENR_CAN1EN; | ||
RCC->APB1ENR |= RCC_APB1ENR_CAN2EN; | ||
#ifdef CAN3 | ||
RCC->APB1ENR |= RCC_APB1ENR_CAN3EN; | ||
#endif | ||
RCC->APB1ENR |= RCC_APB1ENR_DACEN; | ||
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // main counter | ||
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; // slow loop and pedal | ||
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN; // gmlan_alt | ||
//RCC->APB1ENR |= RCC_APB1ENR_TIM5EN; | ||
//RCC->APB1ENR |= RCC_APB1ENR_TIM6EN; | ||
RCC->APB2ENR |= RCC_APB2ENR_USART1EN; | ||
RCC->AHB2ENR |= RCC_AHB2ENR_OTGFSEN; | ||
//RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; | ||
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; | ||
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; | ||
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; | ||
} | ||
|
||
// Detection with internal pullup | ||
#define PULL_EFFECTIVE_DELAY 10 | ||
bool detect_with_pull(GPIO_TypeDef *GPIO, int pin, int mode) { | ||
set_gpio_mode(GPIO, pin, MODE_INPUT); | ||
set_gpio_pullup(GPIO, pin, mode); | ||
for (volatile int i=0; i<PULL_EFFECTIVE_DELAY; i++); | ||
bool ret = get_gpio_input(GPIO, pin); | ||
set_gpio_pullup(GPIO, pin, PULL_NONE); | ||
return ret; | ||
} |
Oops, something went wrong.