From 3f13c70cae9744cc19733c59c18681a8f24538c7 Mon Sep 17 00:00:00 2001 From: Daniel Agar Date: Wed, 13 Apr 2022 18:43:59 -0400 Subject: [PATCH] px4io cleanup LED and heater handling - most px4_io-v2 boards have a blue LED that breathes for status - the pixhawk 2.1 (hex) re-used this blue LED for as an IMU heater (active low), but kept the same board id (so we have to detect at runtime) - the new cubepilot boards (yellow, orange) inverted the polarity of this heater pin - untangle the mess slightly so that things we know statically (eg cubepilot cubeorange LEDs and heater polarity) are handled at build time. --- .../extras/cubepilot_io-v2_default.bin | Bin 39492 -> 39408 bytes .../extras/cubepilot_io-v2_default.bin | Bin 39492 -> 39408 bytes boards/cubepilot/io-v2/src/board_config.h | 40 +++-------- boards/cubepilot/io-v2/src/init.c | 37 +++------- .../durandal-v1/extras/px4_io-v2_default.bin | Bin 39492 -> 39632 bytes .../pix32v5/extras/px4_io-v2_default.bin | Bin 39492 -> 39632 bytes .../mro/x21-777/extras/px4_io-v2_default.bin | Bin 39492 -> 39632 bytes .../px4/fmu-v2/extras/px4_io-v2_default.bin | Bin 39492 -> 39632 bytes .../px4/fmu-v3/extras/px4_io-v2_default.bin | Bin 39492 -> 39632 bytes .../fmu-v4pro/extras/px4_io-v2_default.bin | Bin 39492 -> 39632 bytes .../px4/fmu-v5/extras/px4_io-v2_default.bin | Bin 39492 -> 39632 bytes .../px4/fmu-v5x/extras/px4_io-v2_default.bin | Bin 39492 -> 39632 bytes .../px4/fmu-v6x/extras/px4_io-v2_default.bin | Bin 39492 -> 39632 bytes boards/px4/io-v2/src/board_config.h | 36 +++++----- boards/px4/io-v2/src/init.c | 39 +++++----- src/modules/px4iofirmware/px4io.c | 67 ++++++++++-------- src/modules/px4iofirmware/px4io.h | 16 +---- 17 files changed, 89 insertions(+), 146 deletions(-) diff --git a/boards/cubepilot/cubeorange/extras/cubepilot_io-v2_default.bin b/boards/cubepilot/cubeorange/extras/cubepilot_io-v2_default.bin index 1767f928576956d236eae16b93deb332b606127a..ebf4aef07cb1b4c6e7fa934c10333f7671489fac 100755 GIT binary patch delta 2657 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 diff --git a/boards/cubepilot/io-v2/src/init.c b/boards/cubepilot/io-v2/src/init.c index 28811b621a..55ade132e1 100644 --- a/boards/cubepilot/io-v2/src/init.c +++ b/boards/cubepilot/io-v2/src/init.c @@ -32,7 +32,7 @@ ****************************************************************************/ /** - * @file px4iov2_init.c + * @file init.c * * PX4FMU-specific early startup code. This file implements the * stm32_boardinitialize() function that is called during cpu startup. @@ -84,38 +84,14 @@ __EXPORT void stm32_boardinitialize(void) { - /* configure GPIOs */ - /* Set up for sensing HW */ - - stm32_configgpio(GPIO_SENSE_PC14_DN); - stm32_configgpio(GPIO_SENSE_PC15_UP); + stm32_configgpio(GPIO_HEATER_OUTPUT); /* LEDS - default to off */ - stm32_configgpio(GPIO_LED1); - stm32_configgpio(GPIO_LED2); - stm32_configgpio(GPIO_LED3); - stm32_configgpio(GPIO_LED4); - - /* PixHawk 1: - * PC14 Floating - * PC15 Floating - * - * PixHawk 2: - * PC14 3.3v - * PC15 GND - */ - - uint8_t sense = stm32_gpioread(GPIO_SENSE_PC15_UP) << 1 | stm32_gpioread(GPIO_SENSE_PC14_DN); - - if (sense == SENSE_PH2) { - stm32_configgpio(GPIO_HEATER_OFF); - } - - stm32_configgpio(GPIO_PC14); - stm32_configgpio(GPIO_PC15); - + stm32_configgpio(GPIO_LED_AMBER); + stm32_configgpio(GPIO_LED_SAFETY); + stm32_configgpio(GPIO_LED_GREEN); stm32_configgpio(GPIO_BTN_SAFETY); @@ -163,4 +139,7 @@ __EXPORT void stm32_boardinitialize(void) stm32_gpiowrite(GPIO_PWM8, true); stm32_configgpio(GPIO_PWM8); + + /* disable heater */ + HEATER_OUTPUT_EN(false); } diff --git a/boards/holybro/durandal-v1/extras/px4_io-v2_default.bin b/boards/holybro/durandal-v1/extras/px4_io-v2_default.bin index 577ee46036a5d29d7706106fc44bb8d386c8b5be..9f901fd5cad88fcfe8e53687c2d8e2422ebb0049 100755 GIT binary patch delta 2928 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 diff --git a/boards/px4/io-v2/src/init.c b/boards/px4/io-v2/src/init.c index 28811b621a..404a3620f7 100644 --- a/boards/px4/io-v2/src/init.c +++ b/boards/px4/io-v2/src/init.c @@ -32,7 +32,7 @@ ****************************************************************************/ /** - * @file px4iov2_init.c + * @file init.c * * PX4FMU-specific early startup code. This file implements the * stm32_boardinitialize() function that is called during cpu startup. @@ -84,39 +84,33 @@ __EXPORT void stm32_boardinitialize(void) { - /* configure GPIOs */ /* Set up for sensing HW */ - stm32_configgpio(GPIO_SENSE_PC14_DN); stm32_configgpio(GPIO_SENSE_PC15_UP); - /* LEDS - default to off */ - stm32_configgpio(GPIO_LED1); - stm32_configgpio(GPIO_LED2); - stm32_configgpio(GPIO_LED3); - stm32_configgpio(GPIO_LED4); + /* some boards such as Pixhawk 2.1 made + the unfortunate choice to combine the blue led channel with + the IMU heater. We need a software hack to fix the hardware hack + by allowing to disable the LED / heater. + */ + if (SENSE_PIXHAWK2()) { + stm32_configgpio(GPIO_HEATER_OUTPUT); - /* PixHawk 1: - * PC14 Floating - * PC15 Floating - * - * PixHawk 2: - * PC14 3.3v - * PC15 GND - */ - - uint8_t sense = stm32_gpioread(GPIO_SENSE_PC15_UP) << 1 | stm32_gpioread(GPIO_SENSE_PC14_DN); - - if (sense == SENSE_PH2) { - stm32_configgpio(GPIO_HEATER_OFF); + } else { + stm32_configgpio(GPIO_LED_BLUE); } stm32_configgpio(GPIO_PC14); stm32_configgpio(GPIO_PC15); + /* LEDS - default to off */ + stm32_configgpio(GPIO_LED_AMBER); + stm32_configgpio(GPIO_LED_SAFETY); + stm32_configgpio(GPIO_LED_GREEN); + stm32_configgpio(GPIO_BTN_SAFETY); /* spektrum power enable is active high - enable it by default */ @@ -163,4 +157,7 @@ __EXPORT void stm32_boardinitialize(void) stm32_gpiowrite(GPIO_PWM8, true); stm32_configgpio(GPIO_PWM8); + + /* disable heater */ + HEATER_OUTPUT_EN(false); } diff --git a/src/modules/px4iofirmware/px4io.c b/src/modules/px4iofirmware/px4io.c index a84ad857d7..9da4b9431b 100644 --- a/src/modules/px4iofirmware/px4io.c +++ b/src/modules/px4iofirmware/px4io.c @@ -1,6 +1,6 @@ /**************************************************************************** * - * Copyright (c) 2012-2017 PX4 Development Team. All rights reserved. + * Copyright (c) 2012-2022 PX4 Development Team. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -173,18 +173,20 @@ update_mem_usage(void) static void heartbeat_blink(void) { +#if defined(LED_BLUE) static bool heartbeat = false; LED_BLUE(heartbeat = !heartbeat); +#endif /* LED_BLUE */ } static void ring_blink(void) { -#ifdef GPIO_LED4 +#if defined(LED_GREEN) if (/* IO armed */ (r_status_flags & PX4IO_P_STATUS_FLAGS_SAFETY_OFF) /* and FMU is armed */ && (r_setup_arming & PX4IO_P_SETUP_ARMING_FMU_ARMED)) { - LED_RING(1); + LED_GREEN(true); return; } @@ -205,7 +207,7 @@ ring_blink(void) // remove the ! in the line below // to return to the proper breathe // animation / pattern (currently inverted) - LED_RING(!on); + LED_GREEN(!on); brightness_counter++; if (on) { @@ -301,11 +303,13 @@ user_start(int argc, char *argv[]) /* default all the LEDs to off while we start */ LED_AMBER(false); +#if defined(LED_BLUE) LED_BLUE(false); +#endif /* LED_BLUE */ LED_SAFETY(false); -#ifdef GPIO_LED4 - LED_RING(false); -#endif +#if defined(LED_GREEN) + LED_GREEN(false); +#endif /* LED_GREEN */ /* turn off S.Bus out (if supported) */ #ifdef ENABLE_SBUS_OUT @@ -377,34 +381,35 @@ user_start(int argc, char *argv[]) perf_end(controls_perf); #endif - /* some boards such as Pixhawk 2.1 made - the unfortunate choice to combine the blue led channel with - the IMU heater. We need a software hack to fix the hardware hack - by allowing to disable the LED / heater. - */ - if (r_page_setup[PX4IO_P_SETUP_THERMAL] == PX4IO_THERMAL_IGNORE) { - /* - blink blue LED at 4Hz in normal operation. When in - override blink 4x faster so the user can clearly see - that override is happening. This helps when - pre-flight testing the override system - */ - uint32_t heartbeat_period_us = 250 * 1000UL; - if ((hrt_absolute_time() - last_heartbeat_time) > heartbeat_period_us) { - last_heartbeat_time = hrt_absolute_time(); - heartbeat_blink(); - } + /* + blink blue LED at 4Hz in normal operation. When in + override blink 4x faster so the user can clearly see + that override is happening. This helps when + pre-flight testing the override system + */ + uint32_t heartbeat_period_us = 250 * 1000UL; - } else if (r_page_setup[PX4IO_P_SETUP_THERMAL] < PX4IO_THERMAL_FULL) { - /* switch resistive heater off */ - LED_BLUE(false); - - } else { - /* switch resistive heater hard on */ - LED_BLUE(true); + if ((hrt_absolute_time() - last_heartbeat_time) > heartbeat_period_us) { + last_heartbeat_time = hrt_absolute_time(); + heartbeat_blink(); } +#if defined(HEATER_OUTPUT_EN) + + if (r_page_setup[PX4IO_P_SETUP_THERMAL] != PX4IO_THERMAL_IGNORE) { + if (r_page_setup[PX4IO_P_SETUP_THERMAL] < PX4IO_THERMAL_FULL) { + /* switch resistive heater off */ + HEATER_OUTPUT_EN(false); + + } else { + /* switch resistive heater hard on */ + HEATER_OUTPUT_EN(true); + } + } + +#endif /* HEATER_OUTPUT_EN */ + update_mem_usage(); ring_blink(); diff --git a/src/modules/px4iofirmware/px4io.h b/src/modules/px4iofirmware/px4io.h index c815f8b578..0ee36d4e71 100644 --- a/src/modules/px4iofirmware/px4io.h +++ b/src/modules/px4iofirmware/px4io.h @@ -1,6 +1,6 @@ /**************************************************************************** * - * Copyright (c) 2012-2017 PX4 Development Team. All rights reserved. + * Copyright (c) 2012-2022 PX4 Development Team. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -123,20 +123,6 @@ extern struct sys_state_s system_state; extern bool update_mc_thrust_param; extern bool update_trims; -/* - * GPIO handling. - */ -/* HEX Cube Orange and Cube Yellow uses an inverted signal to control the IMU heater */ -#ifdef CONFIG_ARCH_BOARD_CUBEPILOT_IO_V2 -#define LED_BLUE(_s) px4_arch_gpiowrite(GPIO_LED1, (_s)) -#else -#define LED_BLUE(_s) px4_arch_gpiowrite(GPIO_LED1, !(_s)) -#endif -#define LED_AMBER(_s) px4_arch_gpiowrite(GPIO_LED2, !(_s)) -#define LED_SAFETY(_s) px4_arch_gpiowrite(GPIO_LED3, !(_s)) -#define LED_RING(_s) px4_arch_gpiowrite(GPIO_LED4, (_s)) - - # define ENABLE_SBUS_OUT(_s) px4_arch_gpiowrite(GPIO_SBUS_OENABLE, !(_s)) # define VDD_SERVO_FAULT (!px4_arch_gpioread(GPIO_SERVO_FAULT_DETECT))