diff --git a/ports/mimxrt10xx/boards.c b/ports/mimxrt10xx/boards.c index 350bd717f..63c3e3197 100644 --- a/ports/mimxrt10xx/boards.c +++ b/ports/mimxrt10xx/boards.c @@ -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 @@ -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 diff --git a/src/board_api.h b/src/board_api.h index 5180eca84..6065ca55b 100644 --- a/src/board_api.h +++ b/src/board_api.h @@ -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 @@ -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[]); diff --git a/src/main.c b/src/main.c index 39b04b672..1d018448c 100644 --- a/src/main.c +++ b/src/main.c @@ -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] @@ -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);