diff --git a/hw/bsp/board_mcu.h b/hw/bsp/board_mcu.h index ea2f23fe9..2928ea657 100644 --- a/hw/bsp/board_mcu.h +++ b/hw/bsp/board_mcu.h @@ -143,6 +143,9 @@ #elif CFG_TUSB_MCU == OPT_MCU_XMC4000 #include "xmc_device.h" +#elif CFG_TUSB_MCU == OPT_MCU_TM4C123 + #include "TM4C123.h" + #else #error "Missing MCU header" #endif diff --git a/hw/bsp/ek-tm4c123gxl/board.mk b/hw/bsp/ek-tm4c123gxl/board.mk new file mode 100644 index 000000000..f6522dc2c --- /dev/null +++ b/hw/bsp/ek-tm4c123gxl/board.mk @@ -0,0 +1,50 @@ + +DEPS_SUBMODULES += hw/mcu/ti + +CFLAGS += \ + -flto \ + -mthumb \ + -mabi=aapcs \ + -mcpu=cortex-m4 \ + -mfloat-abi=hard \ + -mfpu=fpv4-sp-d16 \ + -DCFG_TUSB_MCU=OPT_MCU_TM4C123 \ + -uvectors \ + -DTM4C123GH6PM + +# lpc_types.h cause following errors +CFLAGS += -Wno-error=strict-prototypes + +MCU_DIR=hw/mcu/ti/tm4c123xx/ + +CMSIS=$(TOP)/hw/mcu/ti/tm4c123xx/CMSIS/5.7.0/CMSIS/Include + +TI_HDR=$(TOP)/hw/mcu/ti/tm4c123xx/Include/TM4C123/ + +# All source paths should be relative to the top level. + +LD_FILE = hw/bsp/$(BOARD)/tm4c123.ld + +INC += \ + $(CMSIS) \ + $(TI_HDR) \ + $(TOP)/hw/bsp + + +SRC_C += \ + $(MCU_DIR)/Source/system_TM4C123.c \ + $(MCU_DIR)/Source/GCC/tm4c123_startup.c + +# For TinyUSB port source +VENDOR = ti +CHIP_FAMILY = tm4c123xx + +# For freeRTOS port source +FREERTOS_PORT = ARM_CM4F + +# For flash-jlink target +JLINK_DEVICE = LPC1769 + +# flash using jlink +flash: $(BUILD)/$(PROJECT).elf + openocd -f board/ti_ek-tm4c123gxl.cfg -c "program $< verify reset exit" diff --git a/hw/bsp/ek-tm4c123gxl/tm4c123.ld b/hw/bsp/ek-tm4c123gxl/tm4c123.ld new file mode 100644 index 000000000..e2720a9ac --- /dev/null +++ b/hw/bsp/ek-tm4c123gxl/tm4c123.ld @@ -0,0 +1,65 @@ +ENTRY(Reset_Handler) + +_estack = 0x20008000; /* end of RAM */ +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x1000; /* required amount of stack */ + + +MEMORY +{ + FLASH(rx) : ORIGIN = 0x00000000, LENGTH = 256K + SRAM(rwx) : ORIGIN = 0x20000000, LENGTH = 32K +} + +SECTIONS +{ + .text : + { + . = ALIGN(4) ; + *(.vectors) + *(.text) + *(.text.*) + *(.init) + *(.fini) + *(.rodata) + *(.rodata.*) + . = ALIGN(4) ; + __end_text = . ; + } >FLASH + + .data : AT(ADDR(.text) + SIZEOF(.text)) + { + . = ALIGN(4); + __start_data = . ; + __la_data = LOADADDR(.data); + *(.data) + *(.data.*) + . = ALIGN(4); + __end_data = . ; + + } >SRAM + + .bss : + { + . = ALIGN(4) ; + __start_bss = . ; + __bss_start__ = __start_bss; + *(.bss) + *(.bss.*) + *(.COMMON) + __end_bss = . ; + . = ALIGN(4); + }>SRAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >SRAM +} diff --git a/hw/bsp/ek-tm4c123gxl/tm4c123gxl.c b/hw/bsp/ek-tm4c123gxl/tm4c123gxl.c new file mode 100644 index 000000000..d78b0f7e3 --- /dev/null +++ b/hw/bsp/ek-tm4c123gxl/tm4c123gxl.c @@ -0,0 +1,163 @@ +#include +#include + +#define BOARD_UART UART0 +#define BOARD_UART_PORT GPIOA +#define BOARD_BTN_PORT GPIOF +#define BOARD_BTN 4 +#define BOARD_BTN_Msk (1u<<4) +#define LED_PORT GPIOF +#define LED_PIN_RED 1 +#define LED_PIN_BLUE 2 +#define LED_PIN_GREEN 3 +#define LED_STATE_ON 1 + +static void board_uart_init(void) +{ + SYSCTL->RCGCUART |= (1<<0); // Enable the clock to UART0 + SYSCTL->RCGCGPIO |= (1<<0); // Enable the clock to GPIOA + + GPIOA->AFSEL |= (1<<1)|(1<<0); // Enable the alternate function on pin PA0 & PA1 + GPIOA->PCTL |= (1<<0)|(1<<4); // Configure the GPIOPCTL register to select UART0 in PA0 and PA1 + GPIOA->DEN |= (1<<0)|(1<<1); // Enable the digital functionality in PA0 and PA1 + + /** BAUDRATE = 9600 bits per second, refer manual for calculation **/ + + UART0->CTL &= ~(1<<0); // Disable UART0 by clearing UARTEN bit in the UARTCTL register + UART0->IBRD = 325; // Write the integer portion of the BRD to the UARTIRD register + UART0->FBRD = 33; // Write the fractional portion of the BRD to the UARTFBRD registerer + + UART0->LCRH = (0x3<<5); // 8-bit, no parity, 1 stop bit + UART0->CC = 0x0; // Configure the UART clock source as system clock + + UART0->CTL = (1<<0)|(1<<8)|(1<<9); // UART0 Enable, Transmit Enable, Recieve Enable +} + +static void initialize_board_led(GPIOA_Type* port, uint8_t PinMsk, uint8_t dirmsk) +{ + /* Enable PortF Clock */ + SYSCTL -> RCGCGPIO |= (1<<5) ; + + /* Let the clock stabilize */ + while(! ((SYSCTL->PRGPIO) & (1<<5)) ) ; + + /* Port Digital Enable */ + port->DEN |= PinMsk; + + /* Set direction */ + port->DIR = dirmsk ; +} + +static void board_switch_init(void) +{ + GPIOF->DIR &= ~(1<PUR |= (1<DEN |= (1<DATA |= PinMsk; + else + port->DATA &= ~(PinMsk); +} + +static uint32_t ReadGPIOPin(GPIOA_Type *port, uint8_t pinMsk) +{ + return (port -> DATA & pinMsk) ; +} + +void board_init(void) +{ + SystemCoreClockUpdate(); + +#if CFG_TUSB_OS == OPT_OS_NONE + // 1ms tick timer + SysTick_Config(SystemCoreClock / 1000); +#elif CFG_TUSB_OS == OPT_OS_FREERTOS + // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher ) + NVIC_SetPriority(USB0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY ); +#endif + + /* Reset USB */ + SYSCTL->SRCR2 |= (1u<<16); + + for (volatile uint8_t i=0; i<20; i++); + + SYSCTL->SRCR2 &= ~(1u<<16); + + /* Open the USB clock gate */ + SYSCTL->RCGCUSB |= (1<<0); + + /* Power-up USB PLL */ + SYSCTL->RCC2 &= ~(1u<<14); + + /* USB IO Initialization */ + SYSCTL->RCGCGPIO |= (1u<<3); + + /* Let the clock stabilize */ + while(!(SYSCTL->PRGPIO & (1u<<3))); + + /* USB IOs to Analog Mode */ + GPIOD->AFSEL &= ~ ( (1u<<4) | (1u<<5) ); + GPIOD->DEN &= ~ ( (1u<<4) | (1u<<5) ); + GPIOD->AMSEL |= ( (1u<<4) | (1u<<5) ); + + uint8_t leds = (1<FR &(1<<5)) != 0); // Poll until previous data was shofted out + UART0->DR= data[i]; // Write UART0 DATA REGISTER + } + + return len; +} + +int board_uart_read(uint8_t* buf, int len) +{ + (void) buf; (void) len; + return 0; +} + + +#if CFG_TUSB_OS == OPT_OS_NONE +volatile uint32_t system_ticks = 0; +void SysTick_Handler (void) +{ + system_ticks++; +} + +uint32_t board_millis(void) +{ + return system_ticks; +} +#endif + diff --git a/src/tusb_option.h b/src/tusb_option.h index aaf4f3657..50a922840 100644 --- a/src/tusb_option.h +++ b/src/tusb_option.h @@ -87,6 +87,7 @@ // TI MSP430 #define OPT_MCU_MSP430x5xx 500 ///< TI MSP430x5xx #define OPT_MCU_MSP432E4xx 510 ///< TI MSP432E4xx +#define OPT_MCU_TM4C123 511 ///< TI Tiva C 123x // ValentyUSB eptri #define OPT_MCU_VALENTYUSB_EPTRI 600 ///< Fomu eptri config