From 3d10650b720f0c8ba189800412ddc0e4cad7b2d1 Mon Sep 17 00:00:00 2001 From: Alex Taradov Date: Wed, 26 May 2021 23:35:58 -0700 Subject: [PATCH] Added VCP V3 board support and DFU bootloader support --- platform/samd11_vcp/dap_config.h | 50 ++++++++-- platform/samd11_vcp/hal_config.h | 64 +++++++++---- .../{samd11d14_bl.ld => samd11d14_bl_2k.ld} | 4 +- platform/samd11_vcp/linker/samd11d14_bl_4k.ld | 82 +++++++++++++++++ platform/samd11_vcp/make/Makefile_bl_2k | 91 +++++++++++++++++++ .../make/{Makefile_bl => Makefile_bl_4k} | 4 +- 6 files changed, 269 insertions(+), 26 deletions(-) rename platform/samd11_vcp/linker/{samd11d14_bl.ld => samd11d14_bl_2k.ld} (95%) create mode 100644 platform/samd11_vcp/linker/samd11d14_bl_4k.ld create mode 100644 platform/samd11_vcp/make/Makefile_bl_2k rename platform/samd11_vcp/make/{Makefile_bl => Makefile_bl_4k} (95%) diff --git a/platform/samd11_vcp/dap_config.h b/platform/samd11_vcp/dap_config.h index 6763dd3..bbf2f54 100644 --- a/platform/samd11_vcp/dap_config.h +++ b/platform/samd11_vcp/dap_config.h @@ -34,8 +34,6 @@ #include "hal_config.h" /*- Definitions -------------------------------------------------------------*/ -//#define DAP_CONFIG_ENABLE_JTAG - #define DAP_CONFIG_DEFAULT_PORT DAP_PORT_SWD #define DAP_CONFIG_DEFAULT_CLOCK 1000000 // Hz @@ -83,10 +81,24 @@ static inline void DAP_CONFIG_SWDIO_TMS_write(int value) HAL_GPIO_SWDIO_TMS_write(value); } +//----------------------------------------------------------------------------- +static inline void DAP_CONFIG_TDI_write(int value) +{ +#ifdef DAP_CONFIG_ENABLE_JTAG + HAL_GPIO_TDI_write(value); +#else + (void)value; +#endif +} + //----------------------------------------------------------------------------- static inline void DAP_CONFIG_TDO_write(int value) { +#ifdef DAP_CONFIG_ENABLE_JTAG + HAL_GPIO_TDO_write(value); +#else (void)value; +#endif } //----------------------------------------------------------------------------- @@ -114,15 +126,23 @@ static inline int DAP_CONFIG_SWDIO_TMS_read(void) } //----------------------------------------------------------------------------- -static inline int DAP_CONFIG_TDI_read(void) +static inline int DAP_CONFIG_TDO_read(void) { +#ifdef DAP_CONFIG_ENABLE_JTAG + return HAL_GPIO_TDO_read(); +#else return 0; +#endif } //----------------------------------------------------------------------------- -static inline int DAP_CONFIG_TDO_read(void) +static inline int DAP_CONFIG_TDI_read(void) { +#ifdef DAP_CONFIG_ENABLE_JTAG + return HAL_GPIO_TDI_read(); +#else return 0; +#endif } //----------------------------------------------------------------------------- @@ -167,8 +187,10 @@ static inline void DAP_CONFIG_SETUP(void) HAL_GPIO_SWCLK_TCK_in(); HAL_GPIO_SWDIO_TMS_in(); HAL_GPIO_nRESET_in(); - - HAL_GPIO_SWDIO_TMS_pullup(); +#ifdef DAP_CONFIG_ENABLE_JTAG + HAL_GPIO_TDO_in(); + HAL_GPIO_TDI_in(); +#endif } //----------------------------------------------------------------------------- @@ -177,6 +199,10 @@ static inline void DAP_CONFIG_DISCONNECT(void) HAL_GPIO_SWCLK_TCK_in(); HAL_GPIO_SWDIO_TMS_in(); HAL_GPIO_nRESET_in(); +#ifdef DAP_CONFIG_ENABLE_JTAG + HAL_GPIO_TDO_in(); + HAL_GPIO_TDI_in(); +#endif } //----------------------------------------------------------------------------- @@ -190,6 +216,11 @@ static inline void DAP_CONFIG_CONNECT_SWD(void) HAL_GPIO_nRESET_out(); HAL_GPIO_nRESET_set(); + +#ifdef DAP_CONFIG_ENABLE_JTAG + HAL_GPIO_TDO_in(); + HAL_GPIO_TDI_in(); +#endif } //----------------------------------------------------------------------------- @@ -203,6 +234,13 @@ static inline void DAP_CONFIG_CONNECT_JTAG(void) HAL_GPIO_nRESET_out(); HAL_GPIO_nRESET_set(); + +#ifdef DAP_CONFIG_ENABLE_JTAG + HAL_GPIO_TDO_in(); + + HAL_GPIO_TDI_out(); + HAL_GPIO_TDI_set(); +#endif } //----------------------------------------------------------------------------- diff --git a/platform/samd11_vcp/hal_config.h b/platform/samd11_vcp/hal_config.h index 9f7c60f..b286168 100644 --- a/platform/samd11_vcp/hal_config.h +++ b/platform/samd11_vcp/hal_config.h @@ -33,25 +33,57 @@ #include "hal_gpio.h" /*- Definitions -------------------------------------------------------------*/ -HAL_GPIO_PIN(SWCLK_TCK, A, 14) -HAL_GPIO_PIN(SWDIO_TMS, A, 15) -HAL_GPIO_PIN(nRESET, A, 9) +#define HAL_BOARD_V1 +//#define HAL_BOARD_V3 -HAL_GPIO_PIN(VCP_STATUS, A, 2); -HAL_GPIO_PIN(DAP_STATUS, A, 4); -HAL_GPIO_PIN(BOOT_ENTER, A, 31); +#if defined(HAL_BOARD_V1) + HAL_GPIO_PIN(SWCLK_TCK, A, 14) + HAL_GPIO_PIN(SWDIO_TMS, A, 15) + HAL_GPIO_PIN(nRESET, A, 9) -HAL_GPIO_PIN(UART_TX, A, 8); -HAL_GPIO_PIN(UART_RX, A, 5); + HAL_GPIO_PIN(VCP_STATUS, A, 2); + HAL_GPIO_PIN(DAP_STATUS, A, 4); + HAL_GPIO_PIN(BOOT_ENTER, A, 31); -#define UART_SERCOM SERCOM0 -#define UART_SERCOM_PMUX PORT_PMUX_PMUXE_D_Val -#define UART_SERCOM_GCLK_ID SERCOM0_GCLK_ID_CORE -#define UART_SERCOM_APBCMASK PM_APBCMASK_SERCOM0 -#define UART_SERCOM_IRQ_INDEX SERCOM0_IRQn -#define UART_SERCOM_IRQ_HANDLER irq_handler_sercom0 -#define UART_SERCOM_TXPO 1 -#define UART_SERCOM_RXPO 1 + HAL_GPIO_PIN(UART_TX, A, 8); + HAL_GPIO_PIN(UART_RX, A, 5); + + #define UART_SERCOM SERCOM0 + #define UART_SERCOM_PMUX PORT_PMUX_PMUXE_D_Val + #define UART_SERCOM_GCLK_ID SERCOM0_GCLK_ID_CORE + #define UART_SERCOM_APBCMASK PM_APBCMASK_SERCOM0 + #define UART_SERCOM_IRQ_INDEX SERCOM0_IRQn + #define UART_SERCOM_IRQ_HANDLER irq_handler_sercom0 + #define UART_SERCOM_TXPO 1 + #define UART_SERCOM_RXPO 1 + +#elif defined(HAL_BOARD_V3) + #define DAP_CONFIG_ENABLE_JTAG + + HAL_GPIO_PIN(SWCLK_TCK, A, 9) + HAL_GPIO_PIN(SWDIO_TMS, A, 8) + HAL_GPIO_PIN(TDI, A, 14) + HAL_GPIO_PIN(TDO, A, 10) + HAL_GPIO_PIN(nRESET, A, 15) + + HAL_GPIO_PIN(VCP_STATUS, A, 3); + HAL_GPIO_PIN(DAP_STATUS, A, 6); + HAL_GPIO_PIN(BOOT_ENTER, A, 31); + + HAL_GPIO_PIN(UART_TX, A, 16); + HAL_GPIO_PIN(UART_RX, A, 17); + + #define UART_SERCOM SERCOM1 + #define UART_SERCOM_PMUX PORT_PMUX_PMUXE_C_Val + #define UART_SERCOM_GCLK_ID SERCOM1_GCLK_ID_CORE + #define UART_SERCOM_APBCMASK PM_APBCMASK_SERCOM1 + #define UART_SERCOM_IRQ_INDEX SERCOM1_IRQn + #define UART_SERCOM_IRQ_HANDLER irq_handler_sercom1 + #define UART_SERCOM_TXPO 1 + #define UART_SERCOM_RXPO 3 +#else + #error No board defined +#endif #endif // _HAL_CONFIG_H_ diff --git a/platform/samd11_vcp/linker/samd11d14_bl.ld b/platform/samd11_vcp/linker/samd11d14_bl_2k.ld similarity index 95% rename from platform/samd11_vcp/linker/samd11d14_bl.ld rename to platform/samd11_vcp/linker/samd11d14_bl_2k.ld index a653082..41cd566 100644 --- a/platform/samd11_vcp/linker/samd11d14_bl.ld +++ b/platform/samd11_vcp/linker/samd11d14_bl_2k.ld @@ -28,8 +28,8 @@ MEMORY { - flash (rx) : ORIGIN = 0x00001000, LENGTH = 0x3000 - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x1000 + flash (rx) : ORIGIN = 0x00000800, LENGTH = 14K + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 4K } __top_flash = ORIGIN(flash) + LENGTH(flash); diff --git a/platform/samd11_vcp/linker/samd11d14_bl_4k.ld b/platform/samd11_vcp/linker/samd11d14_bl_4k.ld new file mode 100644 index 0000000..8b735cb --- /dev/null +++ b/platform/samd11_vcp/linker/samd11d14_bl_4k.ld @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2016-2017, Alex Taradov + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +MEMORY +{ + flash (rx) : ORIGIN = 0x00001000, LENGTH = 12K + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 4K +} + +__top_flash = ORIGIN(flash) + LENGTH(flash); +__top_ram = ORIGIN(ram) + LENGTH(ram); + +ENTRY(irq_handler_reset) + +SECTIONS +{ + .text : ALIGN(4) + { + FILL(0xff) + KEEP(*(.vectors)) + *(.text*) + *(.rodata) + *(.rodata.*) + . = ALIGN(4); + } > flash + + . = ALIGN(4); + _etext = .; + + .uninit_RESERVED : ALIGN(4) + { + KEEP(*(.bss.$RESERVED*)) + } > ram + + .data : ALIGN(4) + { + FILL(0xff) + _data = .; + *(.ramfunc .ramfunc.*); + *(vtable) + *(.data*) + . = ALIGN(4); + _edata = .; + } > ram AT > flash + + .bss : ALIGN(4) + { + _bss = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + _ebss = .; + PROVIDE(_end = .); + } > ram + + PROVIDE(_stack_top = __top_ram - 0); +} diff --git a/platform/samd11_vcp/make/Makefile_bl_2k b/platform/samd11_vcp/make/Makefile_bl_2k new file mode 100644 index 0000000..3dc0652 --- /dev/null +++ b/platform/samd11_vcp/make/Makefile_bl_2k @@ -0,0 +1,91 @@ +############################################################################## +BUILD = build +BIN = free_dap_d11_vcp_bl_2k + +############################################################################## +.PHONY: all directory clean size + +CC = arm-none-eabi-gcc +OBJCOPY = arm-none-eabi-objcopy +SIZE = arm-none-eabi-size + +ifeq ($(OS), Windows_NT) + MKDIR = gmkdir +else + MKDIR = mkdir +endif + +CFLAGS += -W -Wall --std=gnu11 -Os +CFLAGS += -fno-diagnostics-show-caret +CFLAGS += -fdata-sections -ffunction-sections +CFLAGS += -funsigned-char -funsigned-bitfields +CFLAGS += -mcpu=cortex-m0plus -mthumb +CFLAGS += -MD -MP -MT $(BUILD)/$(*F).o -MF $(BUILD)/$(@F).d +CFLAGS += -flto + +LDFLAGS += -mcpu=cortex-m0plus -mthumb +LDFLAGS += -Wl,--gc-sections +LDFLAGS += -Wl,--script=../linker/samd11d14_bl_2k.ld +LDFLAGS += -flto + +INCLUDES += \ + -I../include \ + -I../../.. \ + -I.. + +SRCS += \ + ../main.c \ + ../uart.c \ + ../usb.c \ + ../usb_std.c \ + ../usb_cdc.c \ + ../usb_hid.c \ + ../usb_descriptors.c \ + ../startup_samd11.c \ + ../../../dap.c \ + +DEFINES += \ + -D__SAMD11C14A__ \ + -DDONT_USE_CMSIS_INIT \ + -DF_CPU=48000000 + +CFLAGS += $(INCLUDES) $(DEFINES) + +OBJS = $(addprefix $(BUILD)/, $(notdir %/$(subst .c,.o, $(SRCS)))) + +all: directory $(BUILD)/$(BIN).elf $(BUILD)/$(BIN).hex $(BUILD)/$(BIN).bin size + +$(BUILD)/$(BIN).elf: $(OBJS) + @echo LD $@ + @$(CC) $(LDFLAGS) $(OBJS) $(LIBS) -o $@ + +$(BUILD)/$(BIN).hex: $(BUILD)/$(BIN).elf + @echo OBJCOPY $@ + @$(OBJCOPY) -O ihex $^ $@ + +$(BUILD)/$(BIN).bin: $(BUILD)/$(BIN).elf + @echo OBJCOPY $@ + @$(OBJCOPY) -O binary $^ $@ + +%.o: + @echo CC $@ + @$(CC) $(CFLAGS) $(filter %/$(subst .o,.c,$(notdir $@)), $(SRCS)) -c -o $@ + +directory: + @$(MKDIR) -p $(BUILD) + +size: $(BUILD)/$(BIN).elf + @echo size: + @$(SIZE) -t $^ + +clean: + @echo clean + @-rm -rf $(BUILD) + +dfu: $(BUILD)/$(BIN).bin + @echo DFU $@ + @cp $(BUILD)/$(BIN).bin $(BUILD)/$(BIN).dfu + @dfu-suffix -a $(BUILD)/$(BIN).dfu -v ffff -p ffff -d ffff + +-include $(wildcard $(BUILD)/*.d) + diff --git a/platform/samd11_vcp/make/Makefile_bl b/platform/samd11_vcp/make/Makefile_bl_4k similarity index 95% rename from platform/samd11_vcp/make/Makefile_bl rename to platform/samd11_vcp/make/Makefile_bl_4k index 1fb8b53..ee46162 100644 --- a/platform/samd11_vcp/make/Makefile_bl +++ b/platform/samd11_vcp/make/Makefile_bl_4k @@ -1,6 +1,6 @@ ############################################################################## BUILD = build -BIN = free_dap_d11_vcp_bl +BIN = free_dap_d11_vcp_bl_4k ############################################################################## .PHONY: all directory clean size @@ -25,7 +25,7 @@ CFLAGS += -flto LDFLAGS += -mcpu=cortex-m0plus -mthumb LDFLAGS += -Wl,--gc-sections -LDFLAGS += -Wl,--script=../linker/samd11d14_bl.ld +LDFLAGS += -Wl,--script=../linker/samd11d14_bl_4k.ld LDFLAGS += -flto INCLUDES += \