support magic reset-to-bootloader command issued from picotool
This commit is contained in:
parent
7010cd8f85
commit
1b35f7f63c
|
@ -50,6 +50,7 @@ extern "C" {
|
||||||
#define UART_RX_PIN PICO_DEFAULT_UART_RX_PIN
|
#define UART_RX_PIN PICO_DEFAULT_UART_RX_PIN
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// (not actually for TinyUSB overrides)
|
||||||
// Reset to bootloader
|
// Reset to bootloader
|
||||||
#define bsp_reset_bootloader() reset_usb_boot(0, 0)
|
#define bsp_reset_bootloader() reset_usb_boot(0, 0)
|
||||||
|
|
||||||
|
|
|
@ -2,17 +2,45 @@
|
||||||
|
|
||||||
#include <hardware/irq.h>
|
#include <hardware/irq.h>
|
||||||
#include <pico/binary_info.h>
|
#include <pico/binary_info.h>
|
||||||
|
#include <pico/bootrom.h>
|
||||||
#include <pico/mutex.h>
|
#include <pico/mutex.h>
|
||||||
#include <pico/stdio.h>
|
#include <pico/stdio.h>
|
||||||
#include <pico/stdio/driver.h>
|
#include <pico/stdio/driver.h>
|
||||||
#include <pico/time.h>
|
#include <pico/time.h>
|
||||||
|
|
||||||
|
#include "tusb_config.h"
|
||||||
#include <tusb.h>
|
#include <tusb.h>
|
||||||
|
|
||||||
|
|
||||||
|
// PICO_CONFIG: PICO_STDIO_USB_STDOUT_TIMEOUT_US, Number of microseconds to be blocked trying to write USB output before assuming the host has disappeared and discarding data, default=500000, group=pico_stdio_usb
|
||||||
#ifndef PICO_STDIO_USB_STDOUT_TIMEOUT_US
|
#ifndef PICO_STDIO_USB_STDOUT_TIMEOUT_US
|
||||||
#define PICO_STDIO_USB_STDOUT_TIMEOUT_US 500000
|
#define PICO_STDIO_USB_STDOUT_TIMEOUT_US 500000
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// PICO_CONFIG: PICO_STDIO_USB_ENABLE_RESET_VIA_BAUD_RATE, Enable/disable resetting into BOOTSEL mode if the host sets the baud rate to a magic value (PICO_STDIO_USB_RESET_MAGIC_BAUD_RATE), type=bool, default=1, group=pico_stdio_usb
|
||||||
|
#ifndef PICO_STDIO_USB_ENABLE_RESET_VIA_BAUD_RATE
|
||||||
|
#define PICO_STDIO_USB_ENABLE_RESET_VIA_BAUD_RATE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// PICO_CONFIG: PICO_STDIO_USB_RESET_MAGIC_BAUD_RATE, baud rate that if selected causes a reset into BOOTSEL mode (if PICO_STDIO_USB_ENABLE_RESET_VIA_BAUD_RATE is set), default=1200, group=pico_stdio_usb
|
||||||
|
#ifndef PICO_STDIO_USB_RESET_MAGIC_BAUD_RATE
|
||||||
|
#define PICO_STDIO_USB_RESET_MAGIC_BAUD_RATE 1200
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// PICO_CONFIG: PICO_STDIO_USB_RESET_BOOTSEL_ACTIVITY_LED, Optionally define a pin to use as bootloader activity LED when BOOTSEL mode is entered via USB (either VIA_BAUD_RATE or VIA_VENDOR_INTERFACE), type=int, min=0, max=29, group=pico_stdio_usb
|
||||||
|
|
||||||
|
// PICO_CONFIG: PICO_STDIO_USB_RESET_BOOTSEL_FIXED_ACTIVITY_LED, Whether the pin specified by PICO_STDIO_USB_RESET_BOOTSEL_ACTIVITY_LED is fixed or can be modified by picotool over the VENDOR USB interface, type=bool, default=0, group=pico_stdio_usb
|
||||||
|
#ifndef PICO_STDIO_USB_RESET_BOOTSEL_FIXED_ACTIVITY_LED
|
||||||
|
#define PICO_STDIO_USB_RESET_BOOTSEL_FIXED_ACTIVITY_LED 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Any modes disabled here can't be re-enabled by picotool via VENDOR_INTERFACE.
|
||||||
|
// PICO_CONFIG: PICO_STDIO_USB_RESET_BOOTSEL_INTERFACE_DISABLE_MASK, Optionally disable either the mass storage interface (bit 0) or the PICOBOOT interface (bit 1) when entering BOOTSEL mode via USB (either VIA_BAUD_RATE or VIA_VENDOR_INTERFACE), type=int, min=0, max=3, default=0, group=pico_stdio_usb
|
||||||
|
#ifndef PICO_STDIO_USB_RESET_BOOTSEL_INTERFACE_DISABLE_MASK
|
||||||
|
#define PICO_STDIO_USB_RESET_BOOTSEL_INTERFACE_DISABLE_MASK 0u
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// *mostly* the same as the SDK code, *except* we have to explicitely pass the
|
// *mostly* the same as the SDK code, *except* we have to explicitely pass the
|
||||||
// CDC interface number to the tusb functions, making the SDK code itself very
|
// CDC interface number to the tusb functions, making the SDK code itself very
|
||||||
// non-reusable >__>
|
// non-reusable >__>
|
||||||
|
@ -110,3 +138,18 @@ bool stdio_usb_init(void) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void stdio_usb_line_coding_cb(cdc_line_coding_t const* line_coding) {
|
||||||
|
#if PICO_STDIO_USB_ENABLE_RESET_VIA_BAUD_RATE
|
||||||
|
if (line_coding->bit_rate == PICO_STDIO_USB_RESET_MAGIC_BAUD_RATE) {
|
||||||
|
uint32_t gpio = 0;
|
||||||
|
|
||||||
|
#ifdef PICO_STDIO_USB_RESET_BOOTSEL_ACTIVITY_LED
|
||||||
|
gpio = 1u << PICO_STDIO_USB_RESET_BOOTSEL_FIXED_ACTIVITY_LED;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
reset_usb_boot(gpio, PICO_STDIO_USB_RESET_BOOTSEL_INTERFACE_DISABLE_MASK);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -373,6 +373,7 @@ static void my_cdc_line_coding_cb(uint8_t itf, cdc_line_coding_t const* line_cod
|
||||||
#endif
|
#endif
|
||||||
#ifdef USE_USBCDC_FOR_STDIO
|
#ifdef USE_USBCDC_FOR_STDIO
|
||||||
case CDC_N_STDIO:
|
case CDC_N_STDIO:
|
||||||
|
stdio_usb_line_coding_cb(line_coding);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -184,6 +184,18 @@ static const char* string_desc_arr[] = {
|
||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
#if CFG_TUD_CDC > 0
|
||||||
|
static void my_cdc_line_coding_cb(uint8_t itf, cdc_line_coding_t const* line_coding) {
|
||||||
|
switch (itf) {
|
||||||
|
#ifdef USE_USBCDC_FOR_STDIO
|
||||||
|
case CDC_N_STDIO:
|
||||||
|
stdio_usb_line_coding_cb(line_coding);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
extern struct mode m_03_jscan;
|
extern struct mode m_03_jscan;
|
||||||
// clang-format off
|
// clang-format off
|
||||||
struct mode m_03_jscan = {
|
struct mode m_03_jscan = {
|
||||||
|
@ -198,6 +210,10 @@ struct mode m_03_jscan = {
|
||||||
.leave = leave_cb,
|
.leave = leave_cb,
|
||||||
.task = task_cb,
|
.task = task_cb,
|
||||||
.handle_cmd = handle_cmd_cb,
|
.handle_cmd = handle_cmd_cb,
|
||||||
|
|
||||||
|
#if CFG_TUD_CDC > 0
|
||||||
|
.tud_cdc_line_coding_cb = my_cdc_line_coding_cb,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
|
|
@ -166,6 +166,18 @@ static const char* string_desc_arr[] = {
|
||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
#if CFG_TUD_CDC > 0
|
||||||
|
static void my_cdc_line_coding_cb(uint8_t itf, cdc_line_coding_t const* line_coding) {
|
||||||
|
switch (itf) {
|
||||||
|
#ifdef USE_USBCDC_FOR_STDIO
|
||||||
|
case CDC_N_STDIO:
|
||||||
|
stdio_usb_line_coding_cb(line_coding);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
extern struct mode m_04_sump;
|
extern struct mode m_04_sump;
|
||||||
// clang-format off
|
// clang-format off
|
||||||
struct mode m_04_sump = {
|
struct mode m_04_sump = {
|
||||||
|
@ -180,6 +192,10 @@ struct mode m_04_sump = {
|
||||||
.leave = leave_cb,
|
.leave = leave_cb,
|
||||||
.task = task_cb,
|
.task = task_cb,
|
||||||
.handle_cmd = handle_cmd_cb,
|
.handle_cmd = handle_cmd_cb,
|
||||||
|
|
||||||
|
#if CFG_TUD_CDC > 0
|
||||||
|
.tud_cdc_line_coding_cb = my_cdc_line_coding_cb,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
|
|
@ -2,10 +2,15 @@
|
||||||
#ifndef USBSTDIO_H_
|
#ifndef USBSTDIO_H_
|
||||||
#define USBSTDIO_H_
|
#define USBSTDIO_H_
|
||||||
|
|
||||||
|
#include "tusb_config.h"
|
||||||
|
#include <tusb.h>
|
||||||
|
|
||||||
#ifdef USE_USBCDC_FOR_STDIO
|
#ifdef USE_USBCDC_FOR_STDIO
|
||||||
void stdio_usb_init(void);
|
void stdio_usb_init(void);
|
||||||
|
|
||||||
void stdio_usb_set_itf_num(int itf);
|
void stdio_usb_set_itf_num(int itf);
|
||||||
|
|
||||||
|
void stdio_usb_line_coding_cb(cdc_line_coding_t const* line_coding);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <tusb.h>
|
#include <tusb.h>
|
||||||
|
|
||||||
#include "board.h"
|
|
||||||
#include "info.h"
|
#include "info.h"
|
||||||
#include "mode.h"
|
#include "mode.h"
|
||||||
#include "vnd_cfg.h"
|
#include "vnd_cfg.h"
|
||||||
|
|
Loading…
Reference in New Issue