Просмотр исходного кода

merge pull request 670 for tm4c123gxl bsp

hathach 4 лет назад
Родитель
Сommit
23e6e0ef33

+ 3 - 0
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

+ 50 - 0
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"

+ 65 - 0
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
+}

+ 163 - 0
hw/bsp/ek-tm4c123gxl/tm4c123gxl.c

@@ -0,0 +1,163 @@
+#include <TM4C123.h>
+#include <board.h>
+
+#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<<BOARD_BTN); 
+    GPIOF->PUR |=  (1<<BOARD_BTN); 
+    GPIOF->DEN |=  (1<<BOARD_BTN); 
+}
+
+static void WriteGPIOPin(GPIOA_Type* port, uint8_t PinMsk, bool state)
+{
+    if(state)
+        port->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<<LED_PIN_RED) | (1<<LED_PIN_BLUE) | (1<<LED_PIN_GREEN) ; 
+    uint8_t dirmsk = (1<<LED_PIN_RED) | (1<<LED_PIN_BLUE) | (1<<LED_PIN_GREEN) ; 
+
+    /* Configure GPIO for board LED */
+    initialize_board_led(LED_PORT,leds, dirmsk); 
+
+    /* Configure GPIO for board switch */
+    board_switch_init(); 
+
+    /* Initialize board UART */
+    board_uart_init(); 
+
+}
+
+void board_led_write(bool state)
+{
+    WriteGPIOPin(LED_PORT, (1<<LED_PIN_BLUE), state); 
+}
+
+uint32_t board_button_read(void)
+{
+    return ReadGPIOPin(BOARD_BTN_PORT, BOARD_BTN_Msk);
+}
+
+int board_uart_write(void const* buf, int len)
+{
+    uint8_t const* data = buf; 
+
+    for(int i=0; i<len; i++)
+    {
+        while((UART0->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
+

+ 1 - 0
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