Skip to content

Commit

Permalink
Add capability to force stay in DFU (and erase app) with button if
Browse files Browse the repository at this point in the history
TINYUF2_DFU_BUTTON is set to 1.

This adds a check to see if a button is pressed.  If the board button is
pressed, stay if dfu mode.

If TINYUF2_DFU_BUTTON_ERASE is also set to 1, then the app is erased.
  • Loading branch information
ccrome committed Mar 1, 2023
1 parent c6093a5 commit a443c0e
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 1 deletion.
22 changes: 22 additions & 0 deletions ports/mimxrt10xx/boards.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,12 @@
#include "tusb.h"
#endif

// allow board.h to change the pin configuration for the button
#ifndef BUTTON_PIN_CONFIG
// default to 22k pull up
#define BUTTON_PIN_CONFIG ((1<<16) | (3<<14) | (1<<13) | (1<<12))
#endif

static bool _dfu_mode = false;

// needed by fsl_flexspi_nor_boot
Expand Down Expand Up @@ -80,11 +86,27 @@ void board_init(void)
GPIO_PinInit(NEOPIXEL_PORT, NEOPIXEL_PIN, &neopixel_config);
#endif

#if TINYUF2_DFU_BUTTON
// Button
IOMUXC_SetPinMux( BUTTON_PINMUX, 1U);
IOMUXC_SetPinConfig(BUTTON_PINMUX, BUTTON_PIN_CONFIG);
gpio_pin_config_t button_config = { kGPIO_DigitalInput, 0, kGPIO_NoIntmode };
GPIO_PinInit(BUTTON_PORT, BUTTON_PIN, &button_config);
#endif

#if TUF2_LOG
board_uart_init(BOARD_UART_BAUDRATE);
#endif
}

#if TINYUF2_DFU_BUTTON
int board_button_read(void)
{
// active low
return BUTTON_STATE_ACTIVE == GPIO_PinRead(BUTTON_PORT, BUTTON_PIN);
}
#endif

void board_teardown(void)
{
// no GPIO deinit for GPIO: LED, Neopixel, Button
Expand Down
15 changes: 15 additions & 0 deletions src/board_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,16 @@
#define TINYUF2_DFU_DOUBLE_TAP 0
#endif

// Force boot to DFU mode when button is pressed
#ifndef TINYUF2_DFU_BUTTON
#define TINYUF2_DFU_BUTTON 0
// Should holding the DFU button perform an erase as well?
# ifndef TINYUF2_DFU_BUTTON_ERASE
# define TINYUF2_DFU_BUTTON_ERASE 0
# endif
#endif


// Use Display to draw DFU image
#ifndef TINYUF2_DISPLAY
#define TINYUF2_DISPLAY 0
Expand Down Expand Up @@ -91,6 +101,11 @@ void board_reset(void);
// Write PWM duty value to LED
void board_led_write(uint32_t value);

#if TINYUF2_DFU_BUTTON
// Read button. Return true if pressed
int board_button_read(void);
#endif

// Write color to rgb strip
void board_rgb_write(uint8_t const rgb[]);

Expand Down
23 changes: 22 additions & 1 deletion src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,15 @@
//--------------------------------------------------------------------+
// MACRO CONSTANT TYPEDEF PROTYPES
//--------------------------------------------------------------------+
//#define USE_DFU_BUTTON 1

// timeout for double tap detection
#define DBL_TAP_DELAY 500

// when sensing the button state, wait this long before sampling the pin
#define BUTTON_SETTLE_DELAY 20

#ifndef DBL_TAP_REG

// defined by linker script
extern uint32_t _board_dfu_dbl_tap[];
#define DBL_TAP_REG _board_dfu_dbl_tap[0]
Expand Down Expand Up @@ -104,6 +107,24 @@ int main(void)
static bool check_dfu_mode(void)
{
// TODO enable for all port instead of one with double tap
#if TINYUF2_DFU_BUTTON
// always stay in dfu mode if the button is pressed.
// wait for a few milliseconds for the switch pin to reach its pulled value.
_timer_count = 0;
board_timer_start(1);
while(_timer_count < BUTTON_SETTLE_DELAY) {}
board_timer_stop();
if (board_button_read()) {
// force erase app if forced into bootloader mode.
#if TINYUF2_DFU_BUTTON_ERASE
indicator_set(STATE_WRITING_STARTED);
board_flash_erase_app();
indicator_set(STATE_WRITING_FINISHED);
#endif
return true;
}
#endif

#if TINYUF2_DFU_DOUBLE_TAP
// TUF2_LOG1_HEX(&DBL_TAP_REG);

Expand Down

0 comments on commit a443c0e

Please sign in to comment.