diff options
Diffstat (limited to 'tinyusb/hw/bsp/mbed1768')
| -rwxr-xr-x | tinyusb/hw/bsp/mbed1768/board.mk | 45 | ||||
| -rwxr-xr-x | tinyusb/hw/bsp/mbed1768/lpc1768.ld | 184 | ||||
| -rwxr-xr-x | tinyusb/hw/bsp/mbed1768/mbed1768.c | 197 | 
3 files changed, 426 insertions, 0 deletions
diff --git a/tinyusb/hw/bsp/mbed1768/board.mk b/tinyusb/hw/bsp/mbed1768/board.mk new file mode 100755 index 00000000..e99df9f0 --- /dev/null +++ b/tinyusb/hw/bsp/mbed1768/board.mk @@ -0,0 +1,45 @@ +DEPS_SUBMODULES += hw/mcu/nxp/lpcopen + +CFLAGS += \ +  -flto \ +  -mthumb \ +  -mabi=aapcs \ +  -mcpu=cortex-m3 \ +  -nostdlib \ +  -DCORE_M3 \ +  -D__USE_LPCOPEN \ +  -DCFG_TUSB_MCU=OPT_MCU_LPC175X_6X \ +  -DRTC_EV_SUPPORT=0 + +# startup.c and lpc_types.h cause following errors +CFLAGS += -Wno-error=strict-prototypes + +MCU_DIR = hw/mcu/nxp/lpcopen/lpc175x_6x/lpc_chip_175x_6x + +# All source paths should be relative to the top level. +LD_FILE = hw/bsp/$(BOARD)/lpc1768.ld + +SRC_C += \ +	src/portable/nxp/lpc17_40/dcd_lpc17_40.c \ +	$(MCU_DIR)/../gcc/cr_startup_lpc175x_6x.c \ +	$(MCU_DIR)/src/chip_17xx_40xx.c \ +	$(MCU_DIR)/src/clock_17xx_40xx.c \ +	$(MCU_DIR)/src/gpio_17xx_40xx.c \ +	$(MCU_DIR)/src/iocon_17xx_40xx.c \ +	$(MCU_DIR)/src/sysctl_17xx_40xx.c \ +	$(MCU_DIR)/src/sysinit_17xx_40xx.c \ +	$(MCU_DIR)/src/uart_17xx_40xx.c + +INC += \ +	$(TOP)/$(MCU_DIR)/inc + +# For freeRTOS port source +FREERTOS_PORT = ARM_CM3 + +# For flash-jlink target +JLINK_DEVICE = LPC1768 + +# flash using pyocd  +flash: $(BUILD)/$(PROJECT).hex +	pyocd flash -t lpc1768 $< + diff --git a/tinyusb/hw/bsp/mbed1768/lpc1768.ld b/tinyusb/hw/bsp/mbed1768/lpc1768.ld new file mode 100755 index 00000000..d1c83d8e --- /dev/null +++ b/tinyusb/hw/bsp/mbed1768/lpc1768.ld @@ -0,0 +1,184 @@ +/* + * GENERATED FILE - DO NOT EDIT + * (c) Code Red Technologies Ltd, 2008-2013 + * (c) NXP Semiconductors 2013-2019 + * Generated linker script file for LPC1769 + * Created from linkscript.ldt by FMCreateLinkLibraries + * Using Freemarker v2.3.23 + * MCUXpresso IDE v10.2.1 [Build 795] [2018-07-25] on May 14, 2019 6:39:29 PM + */ + +MEMORY +{ +  /* Define each memory region */ +  MFlash512 (rx) : ORIGIN = 0x0, LENGTH = 0x80000 /* 512K bytes (alias Flash) */   +  RamLoc32 (rwx) : ORIGIN = 0x10000000, LENGTH = 0x8000 /* 32K bytes (alias RAM) */   +  RamAHB32 (rwx) : ORIGIN = 0x2007c000, LENGTH = 0x8000 /* 32K bytes (alias RAM2) */   +} + +  /* Define a symbol for the top of each memory region */ +  __base_MFlash512 = 0x0  ; /* MFlash512 */   +  __base_Flash = 0x0 ; /* Flash */   +  __top_MFlash512 = 0x0 + 0x80000 ; /* 512K bytes */   +  __top_Flash = 0x0 + 0x80000 ; /* 512K bytes */   +  __base_RamLoc32 = 0x10000000  ; /* RamLoc32 */   +  __base_RAM = 0x10000000 ; /* RAM */   +  __top_RamLoc32 = 0x10000000 + 0x8000 ; /* 32K bytes */   +  __top_RAM = 0x10000000 + 0x8000 ; /* 32K bytes */   +  __base_RamAHB32 = 0x2007c000  ; /* RamAHB32 */   +  __base_RAM2 = 0x2007c000 ; /* RAM2 */   +  __top_RamAHB32 = 0x2007c000 + 0x8000 ; /* 32K bytes */   +  __top_RAM2 = 0x2007c000 + 0x8000 ; /* 32K bytes */   + +ENTRY(ResetISR) + +SECTIONS +{ +    /* MAIN TEXT SECTION */ +    .text : ALIGN(4) +    { +        FILL(0xff) +        __vectors_start__ = ABSOLUTE(.) ; +        KEEP(*(.isr_vector)) +        /* Global Section Table */ +        . = ALIGN(4) ; +        __section_table_start = .; +        __data_section_table = .; +        LONG(LOADADDR(.data)); +        LONG(    ADDR(.data)); +        LONG(  SIZEOF(.data)); +        LONG(LOADADDR(.data_RAM2)); +        LONG(    ADDR(.data_RAM2)); +        LONG(  SIZEOF(.data_RAM2)); +        __data_section_table_end = .; +        __bss_section_table = .; +        LONG(    ADDR(.bss)); +        LONG(  SIZEOF(.bss)); +        LONG(    ADDR(.bss_RAM2)); +        LONG(  SIZEOF(.bss_RAM2)); +        __bss_section_table_end = .; +        __section_table_end = . ; +        /* End of Global Section Table */ + +        *(.after_vectors*) + +    } > MFlash512 + +    .text : ALIGN(4) +    { +       *(.text*) +       *(.rodata .rodata.* .constdata .constdata.*) +       . = ALIGN(4); +    } > MFlash512 +    /* +     * for exception handling/unwind - some Newlib functions (in common +     * with C++ and STDC++) use this.  +     */ +    .ARM.extab : ALIGN(4)  +    { +        *(.ARM.extab* .gnu.linkonce.armextab.*) +    } > MFlash512 + +    __exidx_start = .; + +    .ARM.exidx : ALIGN(4) +    { +        *(.ARM.exidx* .gnu.linkonce.armexidx.*) +    } > MFlash512 +    __exidx_end = .; + +    _etext = .; +         +    /* DATA section for RamAHB32 */ + +    .data_RAM2 : ALIGN(4) +    { +        FILL(0xff) +        PROVIDE(__start_data_RAM2 = .) ; +        *(.ramfunc.$RAM2) +        *(.ramfunc.$RamAHB32) +        *(.data.$RAM2*) +        *(.data.$RamAHB32*) +        . = ALIGN(4) ; +        PROVIDE(__end_data_RAM2 = .) ; +     } > RamAHB32 AT>MFlash512 +    /* MAIN DATA SECTION */ +    .uninit_RESERVED : ALIGN(4) +    { +        KEEP(*(.bss.$RESERVED*)) +        . = ALIGN(4) ; +        _end_uninit_RESERVED = .; +    } > RamLoc32 + +    /* Main DATA section (RamLoc32) */ +    .data : ALIGN(4) +    { +       FILL(0xff) +       _data = . ; +       *(vtable) +       *(.ramfunc*) +       *(.data*) +       . = ALIGN(4) ; +       _edata = . ; +    } > RamLoc32 AT>MFlash512 + +    /* BSS section for RamAHB32 */ +    .bss_RAM2 : ALIGN(4) +    { +       PROVIDE(__start_bss_RAM2 = .) ; +       *(.bss.$RAM2*) +       *(.bss.$RamAHB32*) +       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */ +       PROVIDE(__end_bss_RAM2 = .) ; +    } > RamAHB32  + +    /* MAIN BSS SECTION */ +    .bss : ALIGN(4) +    { +        _bss = .; +        *(.bss*) +        *(COMMON) +        . = ALIGN(4) ; +        _ebss = .; +        PROVIDE(end = .); +    } > RamLoc32 + +    /* NOINIT section for RamAHB32 */ +    .noinit_RAM2 (NOLOAD) : ALIGN(4) +    { +       *(.noinit.$RAM2*) +       *(.noinit.$RamAHB32*) +       . = ALIGN(4) ; +    } > RamAHB32  + +    /* DEFAULT NOINIT SECTION */ +    .noinit (NOLOAD): ALIGN(4) +    { +        _noinit = .; +        *(.noinit*)  +         . = ALIGN(4) ; +        _end_noinit = .; +    } > RamLoc32 +    PROVIDE(_pvHeapStart = DEFINED(__user_heap_base) ? __user_heap_base : .); +    PROVIDE(_vStackTop = DEFINED(__user_stack_top) ? __user_stack_top : __top_RamLoc32 - 0); + +    /* ## Create checksum value (used in startup) ## */ +    PROVIDE(__valid_user_code_checksum = 0 -  +                                         (_vStackTop  +                                         + (ResetISR + 1)  +                                         + (NMI_Handler + 1)  +                                         + (HardFault_Handler + 1)  +                                         + (( DEFINED(MemManage_Handler) ? MemManage_Handler : 0 ) + 1)   /* MemManage_Handler may not be defined */ +                                         + (( DEFINED(BusFault_Handler) ? BusFault_Handler : 0 ) + 1)     /* BusFault_Handler may not be defined */ +                                         + (( DEFINED(UsageFault_Handler) ? UsageFault_Handler : 0 ) + 1) /* UsageFault_Handler may not be defined */ +                                         ) ); + +    /* Provide basic symbols giving location and size of main text +     * block, including initial values of RW data sections. Note that +     * these will need extending to give a complete picture with +     * complex images (e.g multiple Flash banks). +     */ +    _image_start = LOADADDR(.text); +    _image_end = LOADADDR(.data) + SIZEOF(.data); +    _image_size = _image_end - _image_start; +}
\ No newline at end of file diff --git a/tinyusb/hw/bsp/mbed1768/mbed1768.c b/tinyusb/hw/bsp/mbed1768/mbed1768.c new file mode 100755 index 00000000..5495ed16 --- /dev/null +++ b/tinyusb/hw/bsp/mbed1768/mbed1768.c @@ -0,0 +1,197 @@ +/*  + * The MIT License (MIT) + * + * Copyright (c) 2019 Ha Thach (tinyusb.org) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * This file is part of the TinyUSB stack. + */ + +#include "chip.h" +#include "../board.h" + +#define LED_PORT              1 +#define LED_PIN               18 +#define LED_STATE_ON          1 + +// JOYSTICK_DOWN if using LPCXpresso Base Board +#define BUTTON_PORT           0 +#define BUTTON_PIN            15 +#define BUTTON_STATE_ACTIVE   0 + +#define BOARD_UART_PORT   LPC_UART3 + +/* System oscillator rate and RTC oscillator rate */ +const uint32_t OscRateIn = 10000000; +const uint32_t RTCOscRateIn = 32768; + +/* Pin muxing configuration */ +static const PINMUX_GRP_T pinmuxing[] = +{ +  {LED_PORT,  LED_PIN,  IOCON_MODE_INACT | IOCON_FUNC0}, +  {BUTTON_PORT, BUTTON_PIN, IOCON_FUNC0 | IOCON_MODE_PULLUP}, +}; + +static const PINMUX_GRP_T pin_usb_mux[] = +{ +  {0, 29, IOCON_MODE_INACT | IOCON_FUNC1}, // D+ +  {0, 30, IOCON_MODE_INACT | IOCON_FUNC1}, // D- +  {2,  9, IOCON_MODE_INACT | IOCON_FUNC1}, // Connect + +  {1, 19, IOCON_MODE_INACT | IOCON_FUNC2}, // USB_PPWR +  {1, 22, IOCON_MODE_INACT | IOCON_FUNC2}, // USB_PWRD + +  /* VBUS is not connected on this board, so leave the pin at default setting. */ +  /*Chip_IOCON_PinMux(LPC_IOCON, 1, 30, IOCON_MODE_INACT, IOCON_FUNC2);*/ /* USB VBUS */ +}; + +// Invoked by startup code +void SystemInit(void) +{ +#ifdef __USE_LPCOPEN +	extern void (* const g_pfnVectors[])(void); +  unsigned int *pSCB_VTOR = (unsigned int *) 0xE000ED08; +	*pSCB_VTOR = (unsigned int) g_pfnVectors; +#endif + +  Chip_IOCON_Init(LPC_IOCON); +  Chip_IOCON_SetPinMuxing(LPC_IOCON, pinmuxing, sizeof(pinmuxing) / sizeof(PINMUX_GRP_T)); +  Chip_SetupXtalClocking(); +} + +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(USB_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY ); +#endif + +  Chip_GPIO_Init(LPC_GPIO); + +  // LED +  Chip_GPIO_SetPinDIROutput(LPC_GPIO, LED_PORT, LED_PIN); + +  // Button +  Chip_GPIO_SetPinDIRInput(LPC_GPIO, BUTTON_PORT, BUTTON_PIN); + +#if 0 +  //------------- UART -------------// +  PINSEL_CFG_Type PinCfg = +  { +      .Portnum   = 0, +      .Pinnum    = 0, // TXD is P0.0 +      .Funcnum   = 2, +      .OpenDrain = 0, +      .Pinmode   = 0 +  }; +	PINSEL_ConfigPin(&PinCfg); + +	PinCfg.Portnum = 0; +	PinCfg.Pinnum  = 1; // RXD is P0.1 +	PINSEL_ConfigPin(&PinCfg); + +	UART_CFG_Type UARTConfigStruct; +  UART_ConfigStructInit(&UARTConfigStruct); +	UARTConfigStruct.Baud_rate = CFG_BOARD_UART_BAUDRATE; + +	UART_Init(BOARD_UART_PORT, &UARTConfigStruct); +	UART_TxCmd(BOARD_UART_PORT, ENABLE); // Enable UART Transmit +#endif + +	//------------- USB -------------// +  Chip_IOCON_SetPinMuxing(LPC_IOCON, pin_usb_mux, sizeof(pin_usb_mux) / sizeof(PINMUX_GRP_T)); +	Chip_USB_Init(); + +  enum { +    USBCLK_DEVCIE = 0x12,     // AHB + Device +    USBCLK_HOST   = 0x19,     // AHB + Host + OTG +//    0x1B // Host + Device + OTG + AHB +  }; + +  uint32_t const clk_en = TUSB_OPT_DEVICE_ENABLED ? USBCLK_DEVCIE : USBCLK_HOST; + +  LPC_USB->OTGClkCtrl = clk_en; +  while ( (LPC_USB->OTGClkSt & clk_en) != clk_en ); + +#if TUSB_OPT_HOST_ENABLED +  // set portfunc to host !!! +  LPC_USB->StCtrl = 0x3; // should be 1 +#endif +} + +//--------------------------------------------------------------------+ +// USB Interrupt Handler +//--------------------------------------------------------------------+ +void USB_IRQHandler(void) +{ +  #if CFG_TUSB_RHPORT0_MODE & OPT_MODE_HOST +    tuh_int_handler(0); +  #endif + +  #if CFG_TUSB_RHPORT0_MODE & OPT_MODE_DEVICE +    tud_int_handler(0); +  #endif +} + +//--------------------------------------------------------------------+ +// Board porting API +//--------------------------------------------------------------------+ + +void board_led_write(bool state) +{ +  Chip_GPIO_SetPinState(LPC_GPIO, LED_PORT, LED_PIN, state ? LED_STATE_ON : (1-LED_STATE_ON)); +} + +uint32_t board_button_read(void) +{ +  return BUTTON_STATE_ACTIVE == Chip_GPIO_GetPinState(LPC_GPIO, BUTTON_PORT, BUTTON_PIN); +} + +int board_uart_read(uint8_t* buf, int len) +{ +//  return UART_ReceiveByte(BOARD_UART_PORT); +  (void) buf; (void) len; +  return 0; +} + +int board_uart_write(void const * buf, int len) +{ +//  UART_Send(BOARD_UART_PORT, &c, 1, BLOCKING); +  (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  | 
