diff --git a/src/platforms/f4discovery/Makefile.inc b/src/platforms/f4discovery/Makefile.inc index 13cee91..c7bfccb 100644 --- a/src/platforms/f4discovery/Makefile.inc +++ b/src/platforms/f4discovery/Makefile.inc @@ -3,7 +3,8 @@ CC = $(CROSS_COMPILE)gcc OBJCOPY = $(CROSS_COMPILE)objcopy CFLAGS += -Istm32/include -mcpu=cortex-m3 -mthumb \ - -DSTM32F4 -DF4DISCOVERY -I../libopencm3/include + -DSTM32F4 -DF4DISCOVERY -I../libopencm3/include \ + -Iplatforms/stm32 LDFLAGS_BOOT = -lopencm3_stm32f4 -Wl,--defsym,_stack=0x20020000 \ -Wl,-T,platforms/stm32/f4discovery.ld -nostartfiles -lc -lnosys \ diff --git a/src/platforms/f4discovery/usbdfu.c b/src/platforms/f4discovery/usbdfu.c new file mode 100644 index 0000000..998628b --- /dev/null +++ b/src/platforms/f4discovery/usbdfu.c @@ -0,0 +1,75 @@ +/* + * This file is part of the Black Magic Debug project. + * + * Copyright (C) 2013 Gareth McMullin + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include +#include + +#include "usbdfu.h" + +void dfu_detach(void) +{ + /* USB device must detach, we just reset... */ + scb_reset_system(); +} + +int main(void) +{ + /* Check the force bootloader pin*/ + rcc_peripheral_enable_clock(&RCC_AHB1ENR, RCC_AHB1ENR_IOPAEN); + if(!gpio_get(GPIOA, GPIO0)) + dfu_jump_app_if_valid(); + + dfu_protect_enable(); + + /* Set up clock*/ + rcc_clock_setup_hse_3v3(&hse_8mhz_3v3[CLOCK_3V3_168MHZ]); + systick_set_clocksource(STK_CTRL_CLKSOURCE_AHB_DIV8); + systick_set_reload(2100000); + + systick_interrupt_enable(); + systick_counter_enable(); + + /* Handle LEDs */ + rcc_peripheral_enable_clock(&RCC_AHB1ENR, RCC_AHB1ENR_IOPDEN); + gpio_clear(GPIOD, GPIO12 | GPIO13 | GPIO14 |GPIO15); + gpio_mode_setup(GPIOD, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, + GPIO12 | GPIO13 | GPIO14 |GPIO15); + + /* Set up USB*/ + rcc_peripheral_enable_clock(&RCC_AHB1ENR, RCC_AHB1ENR_IOPAEN); + rcc_peripheral_enable_clock(&RCC_AHB2ENR, RCC_AHB2ENR_OTGFSEN); + + /* Set up USB Pins and alternate function*/ + gpio_mode_setup(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, + GPIO9 | GPIO10 | GPIO11 | GPIO12); + gpio_set_af(GPIOA, GPIO_AF10, GPIO9 | GPIO10| GPIO11 | GPIO12); + dfu_init(&stm32f107_usb_driver); + + dfu_main(); +} + + +void sys_tick_handler(void) +{ + gpio_toggle(GPIOD, GPIO12); /* Green LED on/off */ +} + diff --git a/src/platforms/native/Makefile.inc b/src/platforms/native/Makefile.inc index 47fe9aa..77c07e9 100644 --- a/src/platforms/native/Makefile.inc +++ b/src/platforms/native/Makefile.inc @@ -3,7 +3,8 @@ CC = $(CROSS_COMPILE)gcc OBJCOPY = $(CROSS_COMPILE)objcopy CFLAGS += -Istm32/include -mcpu=cortex-m3 -mthumb \ - -DSTM32F1 -DBLACKMAGIC -I../libopencm3/include + -DSTM32F1 -DBLACKMAGIC -I../libopencm3/include \ + -Iplatforms/stm32 LDFLAGS_BOOT = -lopencm3_stm32f1 -Wl,--defsym,_stack=0x20005000 \ -Wl,-T,platforms/stm32/blackmagic.ld -nostartfiles -lc -lnosys \ diff --git a/src/platforms/native/usbdfu.c b/src/platforms/native/usbdfu.c new file mode 100644 index 0000000..35572a5 --- /dev/null +++ b/src/platforms/native/usbdfu.c @@ -0,0 +1,72 @@ +/* + * This file is part of the Black Magic Debug project. + * + * Copyright (C) 2013 Gareth McMullin + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include +#include + +#include "usbdfu.h" + +void dfu_detach(void) +{ + /* USB device must detach, we just reset... */ + scb_reset_system(); +} + +int main(void) +{ + /* Check the force bootloader pin*/ + rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPBEN); + if(gpio_get(GPIOB, GPIO12)) + dfu_jump_app_if_valid(); + + dfu_protect_enable(); + + rcc_clock_setup_in_hse_8mhz_out_72mhz(); + systick_set_clocksource(STK_CTRL_CLKSOURCE_AHB_DIV8); + systick_set_reload(900000); + + rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPAEN); + rcc_peripheral_enable_clock(&RCC_APB1ENR, RCC_APB1ENR_USBEN); + gpio_set_mode(GPIOA, GPIO_MODE_INPUT, 0, GPIO8); + + systick_interrupt_enable(); + systick_counter_enable(); + + gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_2_MHZ, + GPIO_CNF_OUTPUT_PUSHPULL, GPIO11); + gpio_set_mode(GPIOB, GPIO_MODE_INPUT, + GPIO_CNF_INPUT_FLOAT, GPIO2 | GPIO10); + + dfu_init(&stm32f103_usb_driver); + + gpio_set(GPIOA, GPIO8); + gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ, + GPIO_CNF_OUTPUT_PUSHPULL, GPIO8); + + dfu_main(); +} + +void sys_tick_handler(void) +{ + gpio_toggle(GPIOB, GPIO11); /* LED2 on/off */ +} + diff --git a/src/platforms/stlink/Makefile.inc b/src/platforms/stlink/Makefile.inc index a1b80e8..627b14b 100644 --- a/src/platforms/stlink/Makefile.inc +++ b/src/platforms/stlink/Makefile.inc @@ -3,7 +3,8 @@ CC = $(CROSS_COMPILE)gcc OBJCOPY = $(CROSS_COMPILE)objcopy CFLAGS += -mcpu=cortex-m3 -mthumb \ - -DSTM32F1 -DDISCOVERY_STLINK -I../libopencm3/include + -DSTM32F1 -DDISCOVERY_STLINK -I../libopencm3/include \ + -I platforms/stm32 LDFLAGS_BOOT = -lopencm3_stm32f1 -Wl,--defsym,_stack=0x20005000 \ -Wl,-T,platforms/stm32/stlink.ld -nostartfiles -lc -lnosys \ -Wl,-Map=mapfile -mthumb -mcpu=cortex-m3 -Wl,-gc-sections \ diff --git a/src/platforms/stlink/usbdfu.c b/src/platforms/stlink/usbdfu.c new file mode 100644 index 0000000..f688c1c --- /dev/null +++ b/src/platforms/stlink/usbdfu.c @@ -0,0 +1,136 @@ +/* + * This file is part of the Black Magic Debug project. + * + * Copyright (C) 2013 Gareth McMullin + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include +#include + +#include "usbdfu.h" + +static uint8_t rev; +static uint16_t led_idle_run; +static uint32_t led2_state = 0; + +static int stlink_test_nrst(void) +{ + /* Test if JRST/NRST is pulled down*/ + int i; + uint16_t nrst; + uint16_t pin; + + /* First, get Board revision by pulling PC13/14 up. Read + * 11 for ST-Link V1, e.g. on VL Discovery, tag as rev 0 + * 10 for ST-Link V2, e.g. on F4 Discovery, tag as rev 1 + */ + rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPCEN); + gpio_set_mode(GPIOC, GPIO_MODE_INPUT, + GPIO_CNF_INPUT_PULL_UPDOWN, GPIO14 | GPIO13); + gpio_set(GPIOC, GPIO14 | GPIO13); + for (i = 0; i < 100; i++) + rev = (~(gpio_get(GPIOC, GPIO14 | GPIO13)) >> 13) & 3; + + switch (rev) { + case 0: + pin = GPIO1; + led_idle_run = GPIO8; + break; + default: + pin = GPIO0; + led_idle_run = GPIO9; + } + gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ, + GPIO_CNF_OUTPUT_PUSHPULL, led_idle_run); + rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPBEN); + gpio_set_mode(GPIOB, GPIO_MODE_INPUT, + GPIO_CNF_INPUT_PULL_UPDOWN, pin); + gpio_set(GPIOB, pin); + for (i = 0; i < 100; i++) + nrst = gpio_get(GPIOB, pin); + return (nrst) ? 1 : 0; +} + +void dfu_detach(void) +{ + /* Disconnect USB cable by resetting USB Device + and pulling USB_DP low*/ + rcc_peripheral_reset(&RCC_APB1RSTR, RCC_APB1ENR_USBEN); + rcc_peripheral_clear_reset(&RCC_APB1RSTR, RCC_APB1ENR_USBEN); + rcc_peripheral_enable_clock(&RCC_APB1ENR, RCC_APB1ENR_USBEN); + rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPAEN); + gpio_clear(GPIOA, GPIO12); + gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ, + GPIO_CNF_OUTPUT_OPENDRAIN, GPIO12); + scb_reset_system(); +} + +int main(void) +{ + /* Check the force bootloader pin*/ + rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPAEN); + /* Check value of GPIOA1 configuration. This pin is unconnected on + * STLink V1 and V2. If we have a value other than the reset value (0x4), + * we have a warm start and request Bootloader entry + */ + if(((GPIOA_CRL & 0x40) == 0x40) && stlink_test_nrst()) + dfu_jump_app_if_valid(); + + dfu_protect_enable(); + + rcc_clock_setup_in_hse_8mhz_out_72mhz(); + systick_set_clocksource(STK_CTRL_CLKSOURCE_AHB_DIV8); + systick_set_reload(900000); + + /* Handle USB disconnect/connect */ + /* Just in case: Disconnect USB cable by resetting USB Device + * and pulling USB_DP low + * Device will reconnect automatically as Pull-Up is hard wired*/ + rcc_peripheral_reset(&RCC_APB1RSTR, RCC_APB1ENR_USBEN); + rcc_peripheral_clear_reset(&RCC_APB1RSTR, RCC_APB1ENR_USBEN); + rcc_peripheral_enable_clock(&RCC_APB1ENR, RCC_APB1ENR_USBEN); + rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPAEN); + gpio_clear(GPIOA, GPIO12); + gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ, + GPIO_CNF_OUTPUT_OPENDRAIN, GPIO12); + + systick_interrupt_enable(); + systick_counter_enable(); + + dfu_init(&stm32f103_usb_driver); + + dfu_main(); +} + +void sys_tick_handler(void) +{ + if (rev == 0) { + gpio_toggle(GPIOA, led_idle_run); + } else { + if (led2_state & 1) { + gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ, + GPIO_CNF_OUTPUT_PUSHPULL, led_idle_run); + } else { + gpio_set_mode(GPIOA, GPIO_MODE_INPUT, + GPIO_CNF_INPUT_ANALOG, led_idle_run); + } + led2_state++; + } +} + diff --git a/src/platforms/stm32/usbdfu.c b/src/platforms/stm32/usbdfu.c deleted file mode 100644 index c6e6a6c..0000000 --- a/src/platforms/stm32/usbdfu.c +++ /dev/null @@ -1,234 +0,0 @@ -/* - * This file is part of the Black Magic Debug project. - * - * Copyright (C) 2013 Gareth McMullin - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include -#include -#include -#include -#include - -#include "usbdfu.h" - -#if defined(DISCOVERY_STLINK) -uint8_t rev; -uint16_t led_idle_run; -u32 led2_state = 0; -int stlink_test_nrst(void) { -/* Test if JRST/NRST is pulled down*/ - int i; - uint16_t nrst; - uint16_t pin; - - /* First, get Board revision by pulling PC13/14 up. Read - * 11 for ST-Link V1, e.g. on VL Discovery, tag as rev 0 - * 10 for ST-Link V2, e.g. on F4 Discovery, tag as rev 1 - */ - rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPCEN); - gpio_set_mode(GPIOC, GPIO_MODE_INPUT, - GPIO_CNF_INPUT_PULL_UPDOWN, GPIO14|GPIO13); - gpio_set(GPIOC, GPIO14|GPIO13); - for (i=0; i< 100; i++) - rev = (~(gpio_get(GPIOC, GPIO14|GPIO13))>>13) & 3; - - switch (rev) - { - case 0: - pin = GPIO1; - led_idle_run= GPIO8; - break; - default: - pin = GPIO0; - led_idle_run = GPIO9; - } - gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ, - GPIO_CNF_OUTPUT_PUSHPULL, led_idle_run); - rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPBEN); - gpio_set_mode(GPIOB, GPIO_MODE_INPUT, - GPIO_CNF_INPUT_PULL_UPDOWN, pin); - gpio_set(GPIOB, pin); - for (i=0; i< 100; i++) - nrst = gpio_get(GPIOB, pin); - return (nrst)?1:0; -} -#endif - -void dfu_detach(void) -{ -#if defined (DISCOVERY_STLINK) - /* Disconnect USB cable by resetting USB Device - and pulling USB_DP low*/ - rcc_peripheral_reset(&RCC_APB1RSTR, RCC_APB1ENR_USBEN); - rcc_peripheral_clear_reset(&RCC_APB1RSTR, RCC_APB1ENR_USBEN); - rcc_peripheral_enable_clock(&RCC_APB1ENR, RCC_APB1ENR_USBEN); - rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPAEN); - gpio_clear(GPIOA, GPIO12); - gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ, - GPIO_CNF_OUTPUT_OPENDRAIN, GPIO12); -#else - /* USB device must detach, we just reset... */ -#endif - scb_reset_system(); -} - -int main(void) -{ - /* Check the force bootloader pin*/ -#if defined (DISCOVERY_STLINK) - rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPAEN); -/* Check value of GPIOA1 configuration. This pin is unconnected on - * STLink V1 and V2. If we have a value other than the reset value (0x4), - * we have a warm start and request Bootloader entry - */ - if(((GPIOA_CRL & 0x40) == 0x40) && stlink_test_nrst()) { -#elif defined (STM32_CAN) - rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPAEN); - if(!gpio_get(GPIOA, GPIO0)) { -#elif defined (F4DISCOVERY) - rcc_peripheral_enable_clock(&RCC_AHB1ENR, RCC_AHB1ENR_IOPAEN); - if(!gpio_get(GPIOA, GPIO0)) { -#elif defined (USPS_F407) - rcc_peripheral_enable_clock(&RCC_AHB1ENR, RCC_AHB1ENR_IOPBEN); - /* Pull up an look if external pulled low or if we restart with PB1 low*/ - GPIOB_PUPDR |= 4; - { - int i; - for(i=0; i<100000; i++) __asm__("NOP"); - } - if(gpio_get(GPIOB, GPIO1)) { -#else - rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPBEN); - if(gpio_get(GPIOB, GPIO12)) { -#endif - dfu_jump_app_if_valid(); - } - - dfu_protect_enable(); - - /* Set up clock*/ -#if defined (F4DISCOVERY) || defined(USPS_F407) - rcc_clock_setup_hse_3v3(&hse_8mhz_3v3[CLOCK_3V3_168MHZ]); - systick_set_clocksource(STK_CTRL_CLKSOURCE_AHB_DIV8); - systick_set_reload(2100000); -#else - rcc_clock_setup_in_hse_8mhz_out_72mhz(); - systick_set_clocksource(STK_CTRL_CLKSOURCE_AHB_DIV8); - systick_set_reload(900000); -#endif - - /* Handle USB disconnect/connect */ -#if defined(DISCOVERY_STLINK) - /* Just in case: Disconnect USB cable by resetting USB Device - * and pulling USB_DP low - * Device will reconnect automatically as Pull-Up is hard wired*/ - rcc_peripheral_reset(&RCC_APB1RSTR, RCC_APB1ENR_USBEN); - rcc_peripheral_clear_reset(&RCC_APB1RSTR, RCC_APB1ENR_USBEN); - rcc_peripheral_enable_clock(&RCC_APB1ENR, RCC_APB1ENR_USBEN); - rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPAEN); - gpio_clear(GPIOA, GPIO12); - gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ, - GPIO_CNF_OUTPUT_OPENDRAIN, GPIO12); -#elif defined(F4DISCOVERY) -#elif defined(USPS_F407) -#elif defined(STM32_CAN) -#else - rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPAEN); - rcc_peripheral_enable_clock(&RCC_APB1ENR, RCC_APB1ENR_USBEN); - gpio_set_mode(GPIOA, GPIO_MODE_INPUT, 0, GPIO8); - -#endif - systick_interrupt_enable(); - systick_counter_enable(); - -/* Handle LEDs */ -#if defined(F4DISCOVERY) - rcc_peripheral_enable_clock(&RCC_AHB1ENR, RCC_AHB1ENR_IOPDEN); - gpio_clear(GPIOD, GPIO12 | GPIO13 | GPIO14 |GPIO15); - gpio_mode_setup(GPIOD, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, - GPIO12 | GPIO13 | GPIO14 |GPIO15); -#elif defined(USPS_F407) - rcc_peripheral_enable_clock(&RCC_AHB1ENR, RCC_AHB1ENR_IOPBEN); - gpio_clear(GPIOB, GPIO2); - gpio_mode_setup(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, - GPIO2); -#elif defined (STM32_CAN) - gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_2_MHZ, - GPIO_CNF_OUTPUT_PUSHPULL, GPIO0); -#else - gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_2_MHZ, - GPIO_CNF_OUTPUT_PUSHPULL, GPIO11); - gpio_set_mode(GPIOB, GPIO_MODE_INPUT, - GPIO_CNF_INPUT_FLOAT, GPIO2 | GPIO10); - -#endif - -/* Set up USB*/ -#if defined(STM32_CAN) - rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPAEN); - rcc_peripheral_enable_clock(&RCC_AHBENR, RCC_AHBENR_OTGFSEN); - rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPBEN); - dfu_init(&stm32f107_usb_driver); -#elif defined(STM32F2)||defined(STM32F4) - rcc_peripheral_enable_clock(&RCC_AHB1ENR, RCC_AHB1ENR_IOPAEN); - rcc_peripheral_enable_clock(&RCC_AHB2ENR, RCC_AHB2ENR_OTGFSEN); - - /* Set up USB Pins and alternate function*/ - gpio_mode_setup(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, - GPIO9 | GPIO10 | GPIO11 | GPIO12); - gpio_set_af(GPIOA, GPIO_AF10, GPIO9 | GPIO10| GPIO11 | GPIO12); - dfu_init(&stm32f107_usb_driver); -#else - dfu_init(&stm32f103_usb_driver); -#endif - -#if defined(BLACKMAGIC) - gpio_set(GPIOA, GPIO8); - gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ, - GPIO_CNF_OUTPUT_PUSHPULL, GPIO8); -#endif - - dfu_main(); -} - - -void sys_tick_handler() -{ -#if defined(DISCOVERY_STLINK) - if (rev == 0) - gpio_toggle(GPIOA, led_idle_run); - else - { - if (led2_state & 1) - gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ, - GPIO_CNF_OUTPUT_PUSHPULL, led_idle_run); - else - gpio_set_mode(GPIOA, GPIO_MODE_INPUT, - GPIO_CNF_INPUT_ANALOG, led_idle_run); - led2_state++; - } -#elif defined (F4DISCOVERY) - gpio_toggle(GPIOD, GPIO12); /* Green LED on/off */ -#elif defined (USPS_F407) - gpio_toggle(GPIOB, GPIO2); /* Green LED on/off */ -#elif defined(STM32_CAN) - gpio_toggle(GPIOB, GPIO0); /* LED2 on/off */ -#else - gpio_toggle(GPIOB, GPIO11); /* LED2 on/off */ -#endif -} - diff --git a/src/platforms/stm32_can/Makefile.inc b/src/platforms/stm32_can/Makefile.inc index d445f65..96a52d0 100644 --- a/src/platforms/stm32_can/Makefile.inc +++ b/src/platforms/stm32_can/Makefile.inc @@ -3,7 +3,8 @@ CC = $(CROSS_COMPILE)gcc OBJCOPY = $(CROSS_COMPILE)objcopy CFLAGS += -Istm32/include -mcpu=cortex-m3 -mthumb \ - -DSTM32F1 -DSTM32_CAN -I../libopencm3/include + -DSTM32F1 -DSTM32_CAN -I../libopencm3/include \ + -Iplatforms/stm32 LDFLAGS_BOOT = -lopencm3_stm32f1 -Wl,--defsym,_stack=0x20010000 \ -Wl,-T,platforms/stm32/stm32_can.ld -nostartfiles -lc -lnosys \ diff --git a/src/platforms/stm32_can/usbdfu.c b/src/platforms/stm32_can/usbdfu.c new file mode 100644 index 0000000..a051b96 --- /dev/null +++ b/src/platforms/stm32_can/usbdfu.c @@ -0,0 +1,71 @@ +/* + * This file is part of the Black Magic Debug project. + * + * Copyright (C) 2013 Gareth McMullin + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include +#include + +#include "usbdfu.h" + +void dfu_detach(void) +{ + /* USB device must detach, we just reset... */ + scb_reset_system(); +} + +int main(void) +{ + /* Check the force bootloader pin*/ + rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPAEN); + if(!gpio_get(GPIOA, GPIO0)) + dfu_jump_app_if_valid(); + + dfu_protect_enable(); + + rcc_clock_setup_in_hse_8mhz_out_72mhz(); + systick_set_clocksource(STK_CTRL_CLKSOURCE_AHB_DIV8); + systick_set_reload(900000); + + rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPAEN); + rcc_peripheral_enable_clock(&RCC_APB1ENR, RCC_APB1ENR_USBEN); + gpio_set_mode(GPIOA, GPIO_MODE_INPUT, 0, GPIO8); + + systick_interrupt_enable(); + systick_counter_enable(); + + gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_2_MHZ, + GPIO_CNF_OUTPUT_PUSHPULL, GPIO0); + + /* Set up USB*/ + rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPAEN); + rcc_peripheral_enable_clock(&RCC_AHBENR, RCC_AHBENR_OTGFSEN); + rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPBEN); + dfu_init(&stm32f107_usb_driver); + + dfu_main(); +} + + +void sys_tick_handler(void) +{ + gpio_toggle(GPIOB, GPIO0); /* LED2 on/off */ +} + diff --git a/src/platforms/usps_f407/Makefile.inc b/src/platforms/usps_f407/Makefile.inc index ea10465..9a4dfd2 100644 --- a/src/platforms/usps_f407/Makefile.inc +++ b/src/platforms/usps_f407/Makefile.inc @@ -3,7 +3,8 @@ CC = $(CROSS_COMPILE)gcc OBJCOPY = $(CROSS_COMPILE)objcopy CFLAGS += -Istm32/include -mcpu=cortex-m3 -mthumb \ - -DSTM32F4 -DUSPS_F407 -I../libopencm3/include + -DSTM32F4 -DUSPS_F407 -I../libopencm3/include \ + -Iplatforms/stm32 LDFLAGS_BOOT = -lopencm3_stm32f4 -Wl,--defsym,_stack=0x20020000 \ -Wl,-T,platforms/stm32/f4discovery.ld -nostartfiles -lc -lnosys \ diff --git a/src/platforms/usps_f407/usbdfu.c b/src/platforms/usps_f407/usbdfu.c new file mode 100644 index 0000000..af2cacd --- /dev/null +++ b/src/platforms/usps_f407/usbdfu.c @@ -0,0 +1,78 @@ +/* + * This file is part of the Black Magic Debug project. + * + * Copyright (C) 2013 Gareth McMullin + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include +#include + +#include "usbdfu.h" + +void dfu_detach(void) +{ + /* USB device must detach, we just reset... */ + scb_reset_system(); +} + +int main(void) +{ + /* Check the force bootloader pin*/ + rcc_peripheral_enable_clock(&RCC_AHB1ENR, RCC_AHB1ENR_IOPBEN); + /* Pull up an look if external pulled low or if we restart with PB1 low*/ + GPIOB_PUPDR |= 4; + for (int i = 0; i < 100000; i++) + __asm__("NOP"); + if (gpio_get(GPIOB, GPIO1)) + dfu_jump_app_if_valid(); + + dfu_protect_enable(); + + /* Set up clock*/ + rcc_clock_setup_hse_3v3(&hse_8mhz_3v3[CLOCK_3V3_168MHZ]); + systick_set_clocksource(STK_CTRL_CLKSOURCE_AHB_DIV8); + systick_set_reload(2100000); + + systick_interrupt_enable(); + systick_counter_enable(); + + /* Handle LEDs */ + rcc_peripheral_enable_clock(&RCC_AHB1ENR, RCC_AHB1ENR_IOPBEN); + gpio_clear(GPIOB, GPIO2); + gpio_mode_setup(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, + GPIO2); + + /* Set up USB*/ + rcc_peripheral_enable_clock(&RCC_AHB1ENR, RCC_AHB1ENR_IOPAEN); + rcc_peripheral_enable_clock(&RCC_AHB2ENR, RCC_AHB2ENR_OTGFSEN); + + /* Set up USB Pins and alternate function*/ + gpio_mode_setup(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, + GPIO9 | GPIO10 | GPIO11 | GPIO12); + gpio_set_af(GPIOA, GPIO_AF10, GPIO9 | GPIO10| GPIO11 | GPIO12); + dfu_init(&stm32f107_usb_driver); + + dfu_main(); +} + +void sys_tick_handler(void) +{ + gpio_toggle(GPIOB, GPIO2); /* Green LED on/off */ +} +