From 346258934b99c0ea50acfb5ea05fdf0537b3194a Mon Sep 17 00:00:00 2001 From: Fredrik Ahlberg Date: Sun, 23 Nov 2014 22:59:16 +0100 Subject: Added support for TI TM4C123 Launchpad --- src/platforms/launchpad-icdi/Makefile.inc | 23 +++++ src/platforms/launchpad-icdi/platform.c | 86 +++++++++++++++++++ src/platforms/launchpad-icdi/platform.h | 137 ++++++++++++++++++++++++++++++ 3 files changed, 246 insertions(+) create mode 100644 src/platforms/launchpad-icdi/Makefile.inc create mode 100644 src/platforms/launchpad-icdi/platform.c create mode 100644 src/platforms/launchpad-icdi/platform.h (limited to 'src/platforms/launchpad-icdi') diff --git a/src/platforms/launchpad-icdi/Makefile.inc b/src/platforms/launchpad-icdi/Makefile.inc new file mode 100644 index 0000000..8a0f9a3 --- /dev/null +++ b/src/platforms/launchpad-icdi/Makefile.inc @@ -0,0 +1,23 @@ +CROSS_COMPILE ?= arm-none-eabi- +CC = $(CROSS_COMPILE)gcc +OBJCOPY = $(CROSS_COMPILE)objcopy + +INCLUDES = -I../libopencm3/include + +CPU_FLAGS = -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard +CFLAGS += $(INCLUDES) $(CPU_FLAGS) -DTARGET_IS_BLIZZARD_RB1 -DLM4F -DPART_TM4C123GH6PM + +LINKER_SCRIPT="platforms/tm4c/tm4c.ld" +LDFLAGS = -nostartfiles -lc $(CPU_FLAGS) -nodefaultlibs -T$(LINKER_SCRIPT) -Wl,--gc-sections \ + -L../libopencm3/lib -lopencm3_lm4f -lnosys -lm -lgcc + +VPATH += platforms/tm4c + +SRC += cdcacm.c \ + usbuart.c \ + traceswo.o + +all: blackmagic.bin + +blackmagic.bin: blackmagic + $(OBJCOPY) -O binary $^ $@ diff --git a/src/platforms/launchpad-icdi/platform.c b/src/platforms/launchpad-icdi/platform.c new file mode 100644 index 0000000..848271e --- /dev/null +++ b/src/platforms/launchpad-icdi/platform.c @@ -0,0 +1,86 @@ +#include "platform.h" +#include "gdb_if.h" +#include "usbuart.h" + +#include +#include +#include +#include + +#define SYSTICKHZ 100 +#define SYSTICKMS (1000 / SYSTICKHZ) + +#define PLL_DIV_80MHZ 5 +#define PLL_DIV_25MHZ 16 + +extern void trace_tick(void); + +jmp_buf fatal_error_jmpbuf; +uint8_t running_status; +volatile uint32_t timeout_counter; + +const char *morse_msg; + +void morse(const char *msg, char repeat) +{ + (void) msg; + (void) repeat; +} + +void sys_tick_handler(void) +{ + if(timeout_counter) + timeout_counter--; + trace_tick(); +} + +int +platform_init(void) +{ + int i; + for(i=0; i<1000000; i++); + + rcc_sysclk_config(OSCSRC_MOSC, XTAL_16M, PLL_DIV_80MHZ); + + // Enable all JTAG ports and set pins to output + periph_clock_enable(RCC_GPIOA); + periph_clock_enable(RCC_GPIOB); + + gpio_enable_ahb_aperture(); + + gpio_mode_setup(TMS_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, TMS_PIN); + gpio_mode_setup(TCK_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, TCK_PIN); + gpio_mode_setup(TDI_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, TDI_PIN); + gpio_mode_setup(TDO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE, TDO_PIN); + gpio_mode_setup(SRST_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SRST_PIN); + gpio_set_output_config(SRST_PORT, GPIO_OTYPE_OD, GPIO_DRIVE_2MA, SRST_PIN); + gpio_set(SRST_PORT, SRST_PIN); + + systick_set_clocksource(STK_CSR_CLKSOURCE_AHB_DIV8); + systick_set_reload(rcc_get_system_clock_frequency() / (SYSTICKHZ * 8)); + + systick_interrupt_enable(); + systick_counter_enable(); + + nvic_enable_irq(NVIC_SYSTICK_IRQ); + nvic_enable_irq(NVIC_UART0_IRQ); + + usbuart_init(); + cdcacm_init(); + + //jtag_scan(NULL); + + return 0; +} + +void platform_delay(uint32_t delay) +{ + timeout_counter = delay * 10; + while(timeout_counter); +} + +const char *platform_target_voltage(void) +{ + return "not supported"; +} + diff --git a/src/platforms/launchpad-icdi/platform.h b/src/platforms/launchpad-icdi/platform.h new file mode 100644 index 0000000..7f5d55f --- /dev/null +++ b/src/platforms/launchpad-icdi/platform.h @@ -0,0 +1,137 @@ +#ifndef __PLATFORM_H +#define __PLATFORM_H + +#include + +#include +#include + +#include +#include + +#include "gdb_packet.h" + +#define CDCACM_PACKET_SIZE 64 +#define BOARD_IDENT "Black Magic Probe (Launchpad ICDI), (Firmware 1.5" VERSION_SUFFIX ", build " BUILDDATE ")" +#define BOARD_IDENT_DFU "Black Magic (Upgrade) for Launchpad, (Firmware 1.5" VERSION_SUFFIX ", build " BUILDDATE ")" +#define DFU_IDENT "Black Magic Firmware Upgrade (Launchpad)" +#define DFU_IFACE_STRING "lolwut" + +extern usbd_device *usbdev; +#define CDCACM_GDB_ENDPOINT 1 +#define CDCACM_UART_ENDPOINT 3 + +extern jmp_buf fatal_error_jmpbuf; +extern uint8_t running_status; +extern const char *morse_msg; +extern volatile uint32_t timeout_counter; + +#define TMS_PORT GPIOA_BASE +#define TMS_PIN GPIO3 + +#define TCK_PORT GPIOA_BASE +#define TCK_PIN GPIO2 + +#define TDI_PORT GPIOA_BASE +#define TDI_PIN GPIO5 + +#define TDO_PORT GPIOA_BASE +#define TDO_PIN GPIO4 + +#define SWO_PORT GPIOD_BASE +#define SWO_PIN GPIO6 + +#define SWDIO_PORT TMS_PORT +#define SWDIO_PIN TMS_PIN + +#define SWCLK_PORT TCK_PORT +#define SWCLK_PIN TCK_PIN + +#define SRST_PORT GPIOA_BASE +#define SRST_PIN GPIO6 + +#define TMS_SET_MODE() { \ + gpio_mode_setup(TMS_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, TMS_PIN); \ + gpio_set_output_config(TMS_PORT, GPIO_OTYPE_PP, GPIO_DRIVE_2MA, TMS_PIN); \ +} + +#define SWDIO_MODE_FLOAT() { \ + gpio_mode_setup(SWDIO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE, SWDIO_PIN); \ +} + +#define SWDIO_MODE_DRIVE() { \ + gpio_mode_setup(SWDIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SWDIO_PIN); \ + gpio_set_output_config(SWDIO_PORT, GPIO_OTYPE_PP, GPIO_DRIVE_2MA, SWDIO_PIN); \ +} + +extern usbd_driver lm4f_usb_driver; +#define USB_DRIVER lm4f_usb_driver +#define USB_IRQ NVIC_USB0_IRQ +#define USB_ISR usb0_isr + +#define IRQ_PRI_USB (2 << 4) + +#define USBUART UART0 +#define USBUART_CLK RCC_UART0 +#define USBUART_IRQ NVIC_UART0_IRQ +#define USBUART_ISR uart0_isr +#define UART_PIN_SETUP() do { \ + periph_clock_enable(RCC_GPIOA); \ + __asm__("nop"); __asm__("nop"); __asm__("nop"); \ + gpio_set_af(GPIOA_BASE, 0x1, GPIO0 | GPIO1); \ + gpio_mode_setup(GPIOA_BASE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO0); \ + gpio_mode_setup(GPIOA_BASE, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO1); \ + } while (0) + +#define TRACEUART UART2 +#define TRACEUART_CLK RCC_UART2 +#define TRACEUART_IRQ NVIC_UART2_IRQ +#define TRACEUART_ISR uart2_isr + +/* Use newlib provided integer only stdio functions */ +#define sscanf siscanf +#define sprintf siprintf +#define vasprintf vasiprintf + +#define DEBUG(...) + +#define SET_RUN_STATE(state) {running_status = (state);} +#define SET_IDLE_STATE(state) {} +#define SET_ERROR_STATE(state) SET_IDLE_STATE(state) + +#define PLATFORM_SET_FATAL_ERROR_RECOVERY() {setjmp(fatal_error_jmpbuf);} +#define PLATFORM_FATAL_ERROR(error) { \ + if( running_status ) gdb_putpacketz("X1D"); \ + else gdb_putpacketz("EFF"); \ + running_status = 0; \ + target_list_free(); \ + morse("TARGET LOST.", 1); \ + longjmp(fatal_error_jmpbuf, (error)); \ +} + +#define PLATFORM_HAS_TRACESWO + +int platform_init(void); +void morse(const char *msg, char repeat); + +inline static void gpio_set_val(uint32_t port, uint8_t pin, uint8_t val) { + gpio_write(port, pin, val == 0 ? 0 : 0xff); +} + +inline static uint8_t gpio_get(uint32_t port, uint8_t pin) { + return !(gpio_read(port, pin) == 0); +} + +void platform_delay(uint32_t delay); +const char *platform_target_voltage(void); + +/* */ +void cdcacm_init(void); +/* Returns current usb configuration, or 0 if not configured. */ +int cdcacm_get_config(void); +int cdcacm_get_dtr(void); + +#define disconnect_usb() do { usbd_disconnect(usbdev,1); nvic_disable_irq(USB_IRQ);} while(0) +#define setup_vbus_irq() + +#endif -- cgit v1.2.3