diff --git a/src/command.c b/src/command.c index 6526a0f9..1537a9de 100644 --- a/src/command.c +++ b/src/command.c @@ -64,6 +64,9 @@ static bool cmd_debug_bmp(target *t, int argc, const char **argv); #ifdef PLATFORM_HAS_UART_WHEN_SWDP static bool cmd_convert_tdio(target *t, int argc, const char **argv); #endif +#ifdef PLATFORM_HAS_BOOTLOADER +static bool cmd_enter_bootldr(target *t, int argc, const char **argv); +#endif const struct command_s cmd_list[] = { {"version", (cmd_handler)cmd_version, "Display firmware version info"}, @@ -85,6 +88,9 @@ const struct command_s cmd_list[] = { #endif #ifdef PLATFORM_HAS_UART_WHEN_SWDP {"convert_tdio", (cmd_handler)cmd_convert_tdio,"Switch TDI/O pins to UART TX/RX functions"}, +#endif +#ifdef PLATFORM_HAS_BOOTLOADER + {"enter_bootldr", (cmd_handler)cmd_enter_bootldr,"Force BMP into bootloader mode"}, #endif {NULL, NULL, NULL} }; @@ -322,3 +328,16 @@ static bool cmd_convert_tdio(target *t, int argc, const char **argv) return true; } #endif + +#ifdef PLATFORM_HAS_BOOTLOADER +static bool cmd_enter_bootldr(target *t, int argc, const char **argv) +{ + (void) t; + (void) argc; + (void) argv; + + scb_reset_system(); + + return true; +} +#endif diff --git a/src/platforms/jeff/platform.c b/src/platforms/jeff/platform.c index ed3ee04f..7ab57c10 100644 --- a/src/platforms/jeff/platform.c +++ b/src/platforms/jeff/platform.c @@ -94,23 +94,45 @@ static uint32_t timing_init(void) static void adc_init(void) { gpio_config_special(ADC_PORT, ADC_POS_PIN, SOC_GPIO_PERIPH_B); /* +input */ - gpio_config_special(ADC_PORT, ADC_REF_PIN, SOC_GPIO_PERIPH_B); /* reference */ + gpio_config_special(ADC_PORT, ADC_REF_PIN, SOC_GPIO_PERIPH_B); /* reference */ set_periph_clk(GCLK1, GCLK_ID_ADC); - periph_clk_en(GCLK_ID_ADC, 1); + periph_clk_en(GCLK_ID_ADC, 1); adc_enable(ADC_REFCTRL_VREFA,0,ADC_INPUTCTRL_GND,ADC_MUXPOS); } +#define EIC 0x40001800 +#define EIC_CONFIG1 0x4000181C +#define EIC_INTENSET 0x4000180C + +static void button_init(void) +{ + gpio_config_special(BUTTON_PORT, BUTTON_PIN, SOC_GPIO_PERIPH_A); + + INSERTBF(PM_APBAMASK_EIC, 1, PM->apbamask); + + set_periph_clk(GCLK0, GCLK_ID_EIC); + periph_clk_en(GCLK_ID_EIC, 1); + + /* configure falling edge */ + //EIC->evctrl = (1<<15); + *((uint32_t*)EIC_CONFIG1) = (2<<28); + + /* enable the IEC */ + *((uint8_t*)EIC) = (1<<1); + + /* enable interrupts */ + *((uint32_t*)EIC_INTENSET) = (1<<15); + nvic_enable_irq(NVIC_EIC_IRQ); +} + void platform_init(void) { gclk_init(&clock); usb_setup(); - //gpio_config_special(TCK_PORT, TCK_PIN, SOC_GPIO_NONE); - //gpio_config_special(TMS_PORT, TMS_PIN, SOC_GPIO_NONE); - gpio_config_output(LED_PORT, LED_IDLE_RUN, 0); gpio_config_output(TMS_PORT, TMS_PIN, 0); gpio_config_output(TCK_PORT, TCK_PIN, 0); @@ -136,23 +158,11 @@ void platform_init(void) gpio_clear(LED_PORT_UART, LED_UART); - /* NOT SURE IF NEED THIS */ - /* Enable internal pull-up on PWR_BR so that we don't drive - TPWR locally or inadvertently supply power to the target. */ - /* - if (1) { - gpio_set(PWR_BR_PORT, PWR_BR_PIN); - gpio_config_input(PWR_BR_PORT, PWR_BR_PIN, GPIO_IN_FLAG_PULLUP); - } else { - gpio_set(PWR_BR_PORT, PWR_BR_PIN); - gpio_set_mode(PWR_BR_PORT, GPIO_MODE_OUTPUT_50_MHZ, - GPIO_CNF_OUTPUT_OPENDRAIN, PWR_BR_PIN); - }*/ - timing_init(); usbuart_init(); cdcacm_init(); adc_init(); + button_init(); } void platform_srst_set_val(bool assert) @@ -192,7 +202,6 @@ const char *platform_target_voltage(void) out[2] = '0' + (char)((voltage/10) % 10); return out; - //return "not supported"; } char *serialno_read(char *s) @@ -219,3 +228,9 @@ char *serialno_read(char *s) void platform_request_boot(void) { } + +void eic_isr(void) +{ + + scb_reset_system(); +} diff --git a/src/platforms/jeff/platform.h b/src/platforms/jeff/platform.h index 2155f7d1..bfa63460 100644 --- a/src/platforms/jeff/platform.h +++ b/src/platforms/jeff/platform.h @@ -23,6 +23,8 @@ #include #include +#include +#include #include "timing.h" #include "version.h" @@ -30,12 +32,17 @@ //#define PLATFORM_HAS_DEBUG //#define USBUART_DEBUG #define PLATFORM_HAS_UART_WHEN_SWDP +#define PLATFORM_HAS_BOOTLOADER #define BOARD_IDENT "Black Magic Probe (SAMD), (Firmware " FIRMWARE_VERSION ")" #define BOARD_IDENT_DFU "Black Magic (Upgrade) for Launchpad, (Firmware " FIRMWARE_VERSION ")" #define DFU_IDENT "Black Magic Firmware Upgrade (SAMD)" #define DFU_IFACE_STRING "hid" +#define BOARD_IDENT_UPD "Black Magic (DFU Upgrade), SAMD21, (Firmware " FIRMWARE_VERSION ")" +#define UPD_IFACE_STRING "@Internal Flash /0x00000000/1*008Ka,15*8Kg" + + extern uint8_t running_status; #ifdef DEBUG_ME @@ -83,6 +90,9 @@ extern uint8_t running_status; #define ADC_POS_PIN GPIO4 #define ADC_MUXPOS 4 +#define BUTTON_PORT PORTA +#define BUTTON_PIN GPIO27 + #else /* Hardware definitions... */ @@ -139,6 +149,9 @@ extern uint8_t running_status; #define ADC_POS_PIN GPIO2 #define ADC_MUXPOS 0 +#define BUTTON_PORT PORTA +#define BUTTON_PIN GPIO27 + #endif #define TMS_SET_MODE() { \ diff --git a/src/platforms/samd/samd.ld b/src/platforms/samd/samd.ld index ca6071a5..de8baea7 100644 --- a/src/platforms/samd/samd.ld +++ b/src/platforms/samd/samd.ld @@ -20,9 +20,7 @@ /* Define memory regions. */ MEMORY { - /* rom (rx) : ORIGIN = 0x00000000, LENGTH = 256K */ - /* ram (rwx) : ORIGIN = 0x20000000, LENGTH = 32K */ - rom (rx) : ORIGIN = 0x00000000, LENGTH = 128K + rom (rx) : ORIGIN = 0x00002000, LENGTH = 120K /* 128k - 8k for bootloader */ ram (rwx) : ORIGIN = 0x20000000, LENGTH = 16K } diff --git a/src/platforms/samd/usbuart.c b/src/platforms/samd/usbuart.c index c9a1bed2..609be40c 100644 --- a/src/platforms/samd/usbuart.c +++ b/src/platforms/samd/usbuart.c @@ -87,7 +87,9 @@ void usbuart_init(void) //usart_enable(USART_NUM, current_baud); usart_setup(USART_NUM, current_baud); +#ifndef DEBUG_ME usart_set_pads(USART_NUM, 3, 0); /* uses different pads than the default */ +#endif usart_enable(USART_NUM, 0); /* baud==0 so setup is skipped */ usart_enable_rx_interrupt(USART_NUM);