Add LEDs to ARK Can Bootloader

This commit is contained in:
alexklimaj
2021-03-16 18:47:03 -06:00
committed by Daniel Agar
parent 38ce892582
commit 69e57b22ac
6 changed files with 77 additions and 52 deletions

View File

@@ -20,9 +20,12 @@ px4_add_board(
load_mon load_mon
#sensors #sensors
SYSTEMCMDS SYSTEMCMDS
mft
mtd
param param
perf perf
reboot reboot
system_time
top top
topic_listener topic_listener
ver ver

View File

@@ -51,12 +51,14 @@ else()
can.c can.c
i2c.cpp i2c.cpp
init.c init.c
led.c
spi.cpp spi.cpp
) )
target_link_libraries(drivers_board target_link_libraries(drivers_board
PRIVATE PRIVATE
arch_spi arch_spi
drivers__led # drv_led_start
nuttx_arch nuttx_arch
nuttx_drivers nuttx_drivers
px4_layer px4_layer

View File

@@ -53,8 +53,12 @@
#define GPIO_BOOT_CONFIG /* PC15 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTC|GPIO_PIN15|GPIO_EXTI) #define GPIO_BOOT_CONFIG /* PC15 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTC|GPIO_PIN15|GPIO_EXTI)
/* LEDs are driven with push open drain to support Anode to 5V or 3.3V */ /* LEDs are driven with push open drain to support Anode to 5V or 3.3V */
#define GPIO_LED_RED /* PB3 */ (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN3) #define GPIO_nLED_RED /* PB3 */ (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN3)
#define GPIO_LED_BLUE /* PA8 */ (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTA|GPIO_PIN8) #define GPIO_nLED_BLUE /* PA8 */ (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTA|GPIO_PIN8)
#define BOARD_HAS_CONTROL_STATUS_LEDS 1
#define BOARD_OVERLOAD_LED LED_RED
#define BOARD_ARMED_STATE_LED LED_BLUE
#define FLASH_BASED_PARAMS #define FLASH_BASED_PARAMS

View File

@@ -49,6 +49,12 @@
#include <nuttx/board.h> #include <nuttx/board.h>
__BEGIN_DECLS
extern void led_init(void);
extern void bootloader_led_on(int led);
extern void bootloader_led_off(int led);
__END_DECLS
/************************************************************************************ /************************************************************************************
* Name: stm32_boardinitialize * Name: stm32_boardinitialize
* *
@@ -69,6 +75,8 @@ __EXPORT void stm32_boardinitialize(void)
putreg32(getreg32(STM32_RCC_APB1RSTR) | RCC_APB1RSTR_CAN1RST, STM32_RCC_APB1RSTR); putreg32(getreg32(STM32_RCC_APB1RSTR) | RCC_APB1RSTR_CAN1RST, STM32_RCC_APB1RSTR);
putreg32(getreg32(STM32_RCC_APB1RSTR) & ~RCC_APB1RSTR_CAN1RST, STM32_RCC_APB1RSTR); putreg32(getreg32(STM32_RCC_APB1RSTR) & ~RCC_APB1RSTR_CAN1RST, STM32_RCC_APB1RSTR);
led_init();
#if defined(OPT_WAIT_FOR_GETNODEINFO_JUMPER_GPIO) #if defined(OPT_WAIT_FOR_GETNODEINFO_JUMPER_GPIO)
stm32_configgpio(GPIO_GETNODEINFO_JUMPER); stm32_configgpio(GPIO_GETNODEINFO_JUMPER);
#endif #endif
@@ -152,48 +160,27 @@ size_t board_get_hardware_version(uavcan_HardwareVersion_t *hw_version)
* None * None
* *
****************************************************************************/ ****************************************************************************/
// #define led(n, code, r , g , b, h) {.red = (r),.green = (g), .blue = (b),.hz = (h)}
// typedef begin_packed_struct struct led_t {
// uint8_t red;
// uint8_t green;
// uint8_t blue;
// uint8_t hz;
// } end_packed_struct led_t;
// static const led_t i2l[] = {
// led(0, off, 0, 0, 0, 0),
// led(1, reset, 128, 128, 128, 30),
// led(2, autobaud_start, 0, 128, 0, 1),
// led(3, autobaud_end, 0, 128, 0, 2),
// led(4, allocation_start, 0, 0, 64, 2),
// led(5, allocation_end, 0, 128, 64, 3),
// led(6, fw_update_start, 32, 128, 64, 3),
// led(7, fw_update_erase_fail, 32, 128, 32, 3),
// led(8, fw_update_invalid_response, 64, 0, 0, 1),
// led(9, fw_update_timeout, 64, 0, 0, 2),
// led(a, fw_update_invalid_crc, 64, 0, 0, 4),
// led(b, jump_to_app, 0, 128, 0, 10),
// };
void board_indicate(uiindication_t indication) void board_indicate(uiindication_t indication)
{ {
// switch(indication) { if (indication == off) {
// case off: bootloader_led_off(GPIO_nLED_RED);
// led_off(GPIO_nLED_RED); bootloader_led_off(GPIO_nLED_BLUE);
// led_off(GPIO_nLED_BLUE);
// break; } else if (indication == fw_update_start) {
// case reset: bootloader_led_on(GPIO_nLED_RED);
// led_on(GPIO_nLED_RED); bootloader_led_on(GPIO_nLED_BLUE);
// led_on(GPIO_nLED_BLUE);
// break; } else if ((indication == fw_update_erase_fail) || (indication == fw_update_invalid_response)
// case jump_to_app: || (indication == fw_update_timeout) || (indication == fw_update_invalid_crc)) {
// led_on(GPIO_nLED_RED); bootloader_led_on(GPIO_nLED_RED);
// led_off(GPIO_nLED_BLUE); bootloader_led_off(GPIO_nLED_BLUE);
// break;
// default: } else if (indication == allocation_start) {
// break; bootloader_led_on(GPIO_nLED_RED);
// } bootloader_led_off(GPIO_nLED_BLUE);
} else {
bootloader_led_off(GPIO_nLED_RED);
bootloader_led_on(GPIO_nLED_BLUE);
}
} }

View File

@@ -69,6 +69,12 @@
# include <parameters/flashparams/flashfs.h> # include <parameters/flashparams/flashfs.h>
#endif #endif
__BEGIN_DECLS
extern void led_init(void);
extern void led_on(int led);
extern void led_off(int led);
__END_DECLS
/************************************************************************************ /************************************************************************************
* Name: stm32_boardinitialize * Name: stm32_boardinitialize
* *
@@ -121,6 +127,9 @@ __EXPORT int board_app_initialize(uintptr_t arg)
{ {
px4_platform_init(); px4_platform_init();
// Configure LEDs.
board_autoled_initialize();
#if defined(FLASH_BASED_PARAMS) #if defined(FLASH_BASED_PARAMS)
static sector_descriptor_t params_sector_map[] = { static sector_descriptor_t params_sector_map[] = {
{2, 16 * 1024, 0x08008000}, {2, 16 * 1024, 0x08008000},
@@ -138,7 +147,14 @@ __EXPORT int board_app_initialize(uintptr_t arg)
#endif // FLASH_BASED_PARAMS #endif // FLASH_BASED_PARAMS
//px4_platform_configure(); /* initial LED state */
drv_led_start();
led_off(LED_RED);
led_on(LED_BLUE);
/* Configure the HW based on the manifest */
px4_platform_configure();
return OK; return OK;
} }

View File

@@ -55,14 +55,17 @@
*/ */
__BEGIN_DECLS __BEGIN_DECLS
extern void led_init(void); extern void led_init(void);
extern void bootloader_led_on(int led);
extern void bootloader_led_off(int led);
extern void led_on(int led); extern void led_on(int led);
extern void led_off(int led); extern void led_off(int led);
extern void led_toggle(int led); extern void led_toggle(int led);
__END_DECLS __END_DECLS
# define xlat(p) (p)
static uint32_t g_ledmap[] = { static uint32_t g_ledmap[] = {
GPIO_LED_RED, GPIO_nLED_BLUE,
GPIO_LED_BLUE, GPIO_nLED_RED,
}; };
__EXPORT void led_init(void) __EXPORT void led_init(void)
@@ -70,10 +73,21 @@ __EXPORT void led_init(void)
/* Configure LED GPIOs for output */ /* Configure LED GPIOs for output */
for (size_t l = 0; l < (sizeof(g_ledmap) / sizeof(g_ledmap[0])); l++) { for (size_t l = 0; l < (sizeof(g_ledmap) / sizeof(g_ledmap[0])); l++) {
stm32_configgpio(g_ledmap[l]); stm32_configgpio(g_ledmap[l]);
stm32_gpiowrite(g_ledmap[l], true);
} }
} }
__EXPORT void bootloader_led_on(int led)
{
/* Pull Down to switch on */
stm32_gpiowrite(led, false);
}
__EXPORT void bootloader_led_off(int led)
{
/* Pull Up to switch on */
stm32_gpiowrite(led, true);
}
static void phy_set_led(int led, bool state) static void phy_set_led(int led, bool state)
{ {
/* Pull Down to switch on */ /* Pull Down to switch on */
@@ -82,21 +96,20 @@ static void phy_set_led(int led, bool state)
static bool phy_get_led(int led) static bool phy_get_led(int led)
{ {
return !stm32_gpioread(g_ledmap[led]); return !stm32_gpioread(g_ledmap[led]);
} }
__EXPORT void led_on(int led) __EXPORT void led_on(int led)
{ {
phy_set_led(led, true); phy_set_led(xlat(led), true);
} }
__EXPORT void led_off(int led) __EXPORT void led_off(int led)
{ {
phy_set_led(led, false); phy_set_led(xlat(led), false);
} }
__EXPORT void led_toggle(int led) __EXPORT void led_toggle(int led)
{ {
phy_set_led(led, !phy_get_led(led)); phy_set_led(xlat(led), !phy_get_led(xlat(led)));
} }