From 2e42858537c06d660bf975e5363173da0c843c9d Mon Sep 17 00:00:00 2001 From: hathach Date: Mon, 1 Mar 2021 00:39:48 +0700 Subject: [PATCH 1/3] move lpc55 into its own family --- .../LPC55S69_cm33_core0_uf2.ld | 0 .../lpc55/boards/double_m33_express/board.h | 60 +++++ .../lpc55/boards/double_m33_express/board.mk | 10 + hw/bsp/lpc55/boards/lpcxpresso55s69/board.h | 53 ++++ hw/bsp/lpc55/boards/lpcxpresso55s69/board.mk | 9 + .../double_m33_express.c => lpc55/family.c} | 72 ++---- .../board.mk => lpc55/family.mk} | 20 +- hw/bsp/lpcxpresso55s69/board.mk | 49 ---- hw/bsp/lpcxpresso55s69/lpcxpresso55s69.c | 227 ------------------ hw/bsp/stm32f4/family.mk | 3 +- 10 files changed, 170 insertions(+), 333 deletions(-) rename hw/bsp/{ => lpc55/boards}/double_m33_express/LPC55S69_cm33_core0_uf2.ld (100%) create mode 100644 hw/bsp/lpc55/boards/double_m33_express/board.h create mode 100644 hw/bsp/lpc55/boards/double_m33_express/board.mk create mode 100644 hw/bsp/lpc55/boards/lpcxpresso55s69/board.h create mode 100644 hw/bsp/lpc55/boards/lpcxpresso55s69/board.mk rename hw/bsp/{double_m33_express/double_m33_express.c => lpc55/family.c} (80%) rename hw/bsp/{double_m33_express/board.mk => lpc55/family.mk} (77%) delete mode 100644 hw/bsp/lpcxpresso55s69/board.mk delete mode 100644 hw/bsp/lpcxpresso55s69/lpcxpresso55s69.c diff --git a/hw/bsp/double_m33_express/LPC55S69_cm33_core0_uf2.ld b/hw/bsp/lpc55/boards/double_m33_express/LPC55S69_cm33_core0_uf2.ld similarity index 100% rename from hw/bsp/double_m33_express/LPC55S69_cm33_core0_uf2.ld rename to hw/bsp/lpc55/boards/double_m33_express/LPC55S69_cm33_core0_uf2.ld diff --git a/hw/bsp/lpc55/boards/double_m33_express/board.h b/hw/bsp/lpc55/boards/double_m33_express/board.h new file mode 100644 index 000000000..e73d700ba --- /dev/null +++ b/hw/bsp/lpc55/boards/double_m33_express/board.h @@ -0,0 +1,60 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2021, 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. + */ + +#ifndef BOARD_H_ +#define BOARD_H_ + +#ifdef __cplusplus + extern "C" { +#endif + +// LED +#define LED_PORT 0 +#define LED_PIN 1 +#define LED_STATE_ON 1 + +// WAKE button +#define BUTTON_PORT 0 +#define BUTTON_PIN 5 +#define BUTTON_STATE_ACTIVE 0 + +// Number of neopixels +#define NEOPIXEL_NUMBER 2 +#define NEOPIXEL_PORT 0 +#define NEOPIXEL_PIN 27 +#define NEOPIXEL_CH 6 +#define NEOPIXEL_TYPE 0 + +// UART +#define UART_DEV USART0 +#define UART_RX_PINMUX 0U, 29U, IOCON_PIO_DIG_FUNC1_EN +#define UART_TX_PINMUX 0U, 30U, IOCON_PIO_DIG_FUNC1_EN + +#ifdef __cplusplus + } +#endif + +#endif diff --git a/hw/bsp/lpc55/boards/double_m33_express/board.mk b/hw/bsp/lpc55/boards/double_m33_express/board.mk new file mode 100644 index 000000000..e6c58be38 --- /dev/null +++ b/hw/bsp/lpc55/boards/double_m33_express/board.mk @@ -0,0 +1,10 @@ +MCU_VARIANT = LPC55S69_cm33_core0 + +CFLAGS += -DCPU_LPC55S69JBD100_cm33_core0 +LD_FILE = $(BOARD_PATH)/LPC55S69_cm33_core0_uf2.ld + +JLINK_DEVICE = LPC55S69 +PYOCD_TARGET = LPC55S69 + +# flash using pyocd +flash: flash-pyocd diff --git a/hw/bsp/lpc55/boards/lpcxpresso55s69/board.h b/hw/bsp/lpc55/boards/lpcxpresso55s69/board.h new file mode 100644 index 000000000..7e76df953 --- /dev/null +++ b/hw/bsp/lpc55/boards/lpcxpresso55s69/board.h @@ -0,0 +1,53 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2021, 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. + */ + +#ifndef BOARD_H_ +#define BOARD_H_ + +#ifdef __cplusplus + extern "C" { +#endif + +// LED +#define LED_PORT 1 +#define LED_PIN 6 +#define LED_STATE_ON 0 + +// WAKE button +#define BUTTON_PORT 1 +#define BUTTON_PIN 18 +#define BUTTON_STATE_ACTIVE 0 + +// UART +//#define UART_DEV USART0 +//#define UART_RX_PINMUX 0U, 29U, IOCON_PIO_DIG_FUNC1_EN +//#define UART_TX_PINMUX 0U, 30U, IOCON_PIO_DIG_FUNC1_EN + +#ifdef __cplusplus + } +#endif + +#endif diff --git a/hw/bsp/lpc55/boards/lpcxpresso55s69/board.mk b/hw/bsp/lpc55/boards/lpcxpresso55s69/board.mk new file mode 100644 index 000000000..fd01c7d72 --- /dev/null +++ b/hw/bsp/lpc55/boards/lpcxpresso55s69/board.mk @@ -0,0 +1,9 @@ +MCU_VARIANT = LPC55S69_cm33_core0 + +CFLAGS += -DCPU_LPC55S69JBD100_cm33_core0 + +JLINK_DEVICE = LPC55S69 +PYOCD_TARGET = LPC55S69 + +# flash using pyocd +flash: flash-pyocd diff --git a/hw/bsp/double_m33_express/double_m33_express.c b/hw/bsp/lpc55/family.c similarity index 80% rename from hw/bsp/double_m33_express/double_m33_express.c rename to hw/bsp/lpc55/family.c index 655f23cc0..0e238129d 100644 --- a/hw/bsp/double_m33_express/double_m33_express.c +++ b/hw/bsp/lpc55/family.c @@ -24,7 +24,8 @@ * This file is part of the TinyUSB stack. */ -#include "../board.h" +#include "bsp/board.h" +#include "board.h" #include "fsl_device_registers.h" #include "fsl_gpio.h" #include "fsl_power.h" @@ -49,45 +50,23 @@ void USB1_IRQHandler(void) //--------------------------------------------------------------------+ // MACRO TYPEDEF CONSTANT ENUM //--------------------------------------------------------------------+ -#define LED_PORT 0 -#define LED_PIN 1 -#define LED_STATE_ON 1 - -// WAKE button -#define BUTTON_PORT 0 -#define BUTTON_PIN 5 -#define BUTTON_STATE_ACTIVE 0 - -// Number of neopixels -#define NEOPIXEL_NUMBER 2 -#define NEOPIXEL_PORT 0 -#define NEOPIXEL_PIN 27 -#define NEOPIXEL_CH 6 -#define NEOPIXEL_TYPE 0 - -// UART -#define UART_DEV USART0 // IOCON pin mux -#define IOCON_PIO_DIGITAL_EN 0x0100u /*!<@brief Enables digital function */ -#define IOCON_PIO_FUNC0 0x00u /*!<@brief Selects pin function 0 */ -#define IOCON_PIO_FUNC1 0x01u /*!<@brief Selects pin function 1 */ -#define IOCON_PIO_FUNC4 0x04u /*!<@brief Selects pin function 4 */ -#define IOCON_PIO_FUNC7 0x07u /*!<@brief Selects pin function 7 */ -#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input function is not inverted */ -#define IOCON_PIO_MODE_INACT 0x00u /*!<@brief No addition pin function */ -#define IOCON_PIO_OPENDRAIN_DI 0x00u /*!<@brief Open drain is disabled */ -#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */ +#define IOCON_PIO_DIGITAL_EN 0x0100u /*!<@brief Enables digital function */ +#define IOCON_PIO_FUNC0 0x00u /*!<@brief Selects pin function 0 */ +#define IOCON_PIO_FUNC1 0x01u /*!<@brief Selects pin function 1 */ +#define IOCON_PIO_FUNC4 0x04u /*!<@brief Selects pin function 4 */ +#define IOCON_PIO_FUNC7 0x07u /*!<@brief Selects pin function 7 */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input function is not inverted */ +#define IOCON_PIO_MODE_INACT 0x00u /*!<@brief No addition pin function */ +#define IOCON_PIO_OPENDRAIN_DI 0x00u /*!<@brief Open drain is disabled */ +#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */ #define IOCON_PIO_DIG_FUNC0_EN (IOCON_PIO_DIGITAL_EN | IOCON_PIO_FUNC0) /*!<@brief Digital pin function 0 enabled */ #define IOCON_PIO_DIG_FUNC1_EN (IOCON_PIO_DIGITAL_EN | IOCON_PIO_FUNC1) /*!<@brief Digital pin function 1 enabled */ #define IOCON_PIO_DIG_FUNC4_EN (IOCON_PIO_DIGITAL_EN | IOCON_PIO_FUNC4) /*!<@brief Digital pin function 2 enabled */ #define IOCON_PIO_DIG_FUNC7_EN (IOCON_PIO_DIGITAL_EN | IOCON_PIO_FUNC7) /*!<@brief Digital pin function 2 enabled */ - -// Global Variables -uint32_t pixelData[NEOPIXEL_NUMBER]; - /**************************************************************** name: BOARD_BootClockFROHF96M outputs: @@ -138,18 +117,20 @@ void board_init(void) NVIC_SetPriority(USB0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY ); #endif + // Init all GPIO ports GPIO_PortInit(GPIO, 0); GPIO_PortInit(GPIO, 1); // LED - /* PORT0 PIN1 configured as PIO0_1 */ - IOCON_PinMuxSet(IOCON, 0U, 1U, IOCON_PIO_DIG_FUNC0_EN); - + IOCON_PinMuxSet(IOCON, LED_PORT, LED_PIN, IOCON_PIO_DIG_FUNC0_EN); gpio_pin_config_t const led_config = { kGPIO_DigitalOutput, 1}; GPIO_PinInit(GPIO, LED_PORT, LED_PIN, &led_config); + board_led_write(0); + +#ifdef NEOPIXEL_PIN // Neopixel - /* PORT0 PIN27 configured as SCT0_OUT6 */ + static uint32_t pixelData[NEOPIXEL_NUMBER]; IOCON_PinMuxSet(IOCON, NEOPIXEL_PORT, NEOPIXEL_PIN, IOCON_PIO_DIG_FUNC4_EN); sctpix_init(NEOPIXEL_TYPE); @@ -157,22 +138,18 @@ void board_init(void) sctpix_setPixel(NEOPIXEL_CH, 0, 0x100010); sctpix_setPixel(NEOPIXEL_CH, 1, 0x100010); sctpix_show(); - +#endif // Button - /* PORT0 PIN5 configured as PIO0_5 */ IOCON_PinMuxSet(IOCON, BUTTON_PORT, BUTTON_PIN, IOCON_PIO_DIG_FUNC0_EN); - gpio_pin_config_t const button_config = { kGPIO_DigitalInput, 0}; GPIO_PinInit(GPIO, BUTTON_PORT, BUTTON_PIN, &button_config); +#if defined(UART_DEV) // UART - /* PORT0 PIN29 (coords: 92) is configured as FC0_RXD_SDA_MOSI_DATA */ - IOCON_PinMuxSet(IOCON, 0U, 29U, IOCON_PIO_DIG_FUNC1_EN); - /* PORT0 PIN30 (coords: 94) is configured as FC0_TXD_SCL_MISO_WS */ - IOCON_PinMuxSet(IOCON, 0U, 30U, IOCON_PIO_DIG_FUNC1_EN); + IOCON_PinMuxSet(IOCON, UART_RX_PINMUX); + IOCON_PinMuxSet(IOCON, UART_TX_PINMUX); -#if defined(UART_DEV) && CFG_TUSB_DEBUG // Enable UART when debug log is on CLOCK_AttachClk(kFRO12M_to_FLEXCOMM0); usart_config_t uart_config; @@ -200,7 +177,7 @@ void board_init(void) RESET_PeripheralReset(kUSB1_RST_SHIFT_RSTn); RESET_PeripheralReset(kUSB1RAM_RST_SHIFT_RSTn); -#if (defined CFG_TUSB_RHPORT1_MODE) && (CFG_TUSB_RHPORT1_MODE & OPT_MODE_DEVICE) +#if CFG_TUSB_RHPORT1_MODE & OPT_MODE_DEVICE CLOCK_EnableClock(kCLOCK_Usbh1); /* Put PHY powerdown under software control */ USBHSH->PORTMODE = USBHSH_PORTMODE_SW_PDCOM_MASK; @@ -210,7 +187,7 @@ void board_init(void) CLOCK_DisableClock(kCLOCK_Usbh1); #endif -#if (defined CFG_TUSB_RHPORT0_MODE) && (CFG_TUSB_RHPORT0_MODE & OPT_MODE_DEVICE) +#if CFG_TUSB_RHPORT0_MODE & OPT_MODE_DEVICE // Enable USB Clock Adjustments to trim the FRO for the full speed controller ANACTRL->FRO192M_CTRL |= ANACTRL_FRO192M_CTRL_USBCLKADJ_MASK; CLOCK_SetClkDiv(kCLOCK_DivUsb0Clk, 1, false); @@ -233,6 +210,8 @@ void board_init(void) void board_led_write(bool state) { GPIO_PinWrite(GPIO, LED_PORT, LED_PIN, state ? LED_STATE_ON : (1-LED_STATE_ON)); + +#ifdef NEOPIXEL_PIN if (state) { sctpix_setPixel(NEOPIXEL_CH, 0, 0x100000); sctpix_setPixel(NEOPIXEL_CH, 1, 0x101010); @@ -241,6 +220,7 @@ void board_led_write(bool state) sctpix_setPixel(NEOPIXEL_CH, 1, 0x000010); } sctpix_show(); +#endif } uint32_t board_button_read(void) diff --git a/hw/bsp/double_m33_express/board.mk b/hw/bsp/lpc55/family.mk similarity index 77% rename from hw/bsp/double_m33_express/board.mk rename to hw/bsp/lpc55/family.mk index 5757aa5cd..08f3ec251 100644 --- a/hw/bsp/double_m33_express/board.mk +++ b/hw/bsp/lpc55/family.mk @@ -1,3 +1,7 @@ +UF2_FAMILY_ID = 0x2abc77ec + +include $(TOP)/$(BOARD_PATH)/board.mk + CFLAGS += \ -flto \ -mthumb \ @@ -5,7 +9,6 @@ CFLAGS += \ -mcpu=cortex-m33 \ -mfloat-abi=hard \ -mfpu=fpv5-sp-d16 \ - -DCPU_LPC55S69JBD100_cm33_core0 \ -DCFG_TUSB_MCU=OPT_MCU_LPC55XX \ -DCFG_TUSB_MEM_SECTION='__attribute__((section(".data")))' \ -DCFG_TUSB_MEM_ALIGN='__attribute__((aligned(64)))' @@ -16,10 +19,10 @@ CFLAGS += -Wno-error=unused-parameter -Wno-error=float-equal MCU_DIR = hw/mcu/nxp/sdk/devices/LPC55S69 # All source paths should be relative to the top level. -LD_FILE = hw/bsp/$(BOARD)/LPC55S69_cm33_core0_uf2.ld +LD_FILE ?= $(MCU_DIR)/gcc/$(MCU_VARIANT)_flash.ld SRC_C += \ - $(MCU_DIR)/system_LPC55S69_cm33_core0.c \ + $(MCU_DIR)/system_$(MCU_VARIANT).c \ $(MCU_DIR)/drivers/fsl_clock.c \ $(MCU_DIR)/drivers/fsl_gpio.c \ $(MCU_DIR)/drivers/fsl_power.c \ @@ -29,14 +32,13 @@ SRC_C += \ lib/sct_neopixel/sct_neopixel.c INC += \ - $(TOP)/hw/bsp/ \ - $(TOP)/hw/bsp/$(BOARD) \ + $(TOP)/$(BOARD_PATH) \ $(TOP)/lib/sct_neopixel \ $(TOP)/$(MCU_DIR)/../../CMSIS/Include \ $(TOP)/$(MCU_DIR) \ $(TOP)/$(MCU_DIR)/drivers -SRC_S += $(MCU_DIR)/gcc/startup_LPC55S69_cm33_core0.S +SRC_S += $(MCU_DIR)/gcc/startup_$(MCU_VARIANT).S LIBS += $(TOP)/$(MCU_DIR)/gcc/libpower_hardabi.a @@ -48,8 +50,8 @@ CHIP_FAMILY = lpc_ip3511 FREERTOS_PORT = ARM_CM33_NTZ/non_secure # For flash-jlink target -JLINK_DEVICE = LPC55S69 +#JLINK_DEVICE = LPC55S69 # flash using pyocd -flash: $(BUILD)/$(PROJECT).hex - pyocd flash -t LPC55S69 $< +#flash: $(BUILD)/$(PROJECT).hex +# pyocd flash -t LPC55S69 $< diff --git a/hw/bsp/lpcxpresso55s69/board.mk b/hw/bsp/lpcxpresso55s69/board.mk deleted file mode 100644 index 646ca2833..000000000 --- a/hw/bsp/lpcxpresso55s69/board.mk +++ /dev/null @@ -1,49 +0,0 @@ -CFLAGS += \ - -flto \ - -mthumb \ - -mabi=aapcs \ - -mcpu=cortex-m33 \ - -mfloat-abi=hard \ - -mfpu=fpv5-sp-d16 \ - -DCPU_LPC55S69JBD100_cm33_core0 \ - -DCFG_TUSB_MCU=OPT_MCU_LPC55XX \ - -DCFG_TUSB_MEM_SECTION='__attribute__((section(".data")))' \ - -DCFG_TUSB_MEM_ALIGN='__attribute__((aligned(64)))' - -# mcu driver cause following warnings -CFLAGS += -Wno-error=unused-parameter -Wno-error=float-equal - -MCU_DIR = hw/mcu/nxp/sdk/devices/LPC55S69 - -# All source paths should be relative to the top level. -LD_FILE = $(MCU_DIR)/gcc/LPC55S69_cm33_core0_flash.ld - -SRC_C += \ - $(MCU_DIR)/system_LPC55S69_cm33_core0.c \ - $(MCU_DIR)/drivers/fsl_clock.c \ - $(MCU_DIR)/drivers/fsl_gpio.c \ - $(MCU_DIR)/drivers/fsl_power.c \ - $(MCU_DIR)/drivers/fsl_reset.c - -INC += \ - $(TOP)/$(MCU_DIR)/../../CMSIS/Include \ - $(TOP)/$(MCU_DIR) \ - $(TOP)/$(MCU_DIR)/drivers - -SRC_S += $(MCU_DIR)/gcc/startup_LPC55S69_cm33_core0.S - -LIBS += $(TOP)/$(MCU_DIR)/gcc/libpower_hardabi.a - -# For TinyUSB port source -VENDOR = nxp -CHIP_FAMILY = lpc_ip3511 - -# For freeRTOS port source -FREERTOS_PORT = ARM_CM33_NTZ/non_secure - -# For flash-jlink target -JLINK_DEVICE = LPC55S69 - -# flash using pyocd -flash: $(BUILD)/$(PROJECT).hex - pyocd flash -t LPC55S69 $< diff --git a/hw/bsp/lpcxpresso55s69/lpcxpresso55s69.c b/hw/bsp/lpcxpresso55s69/lpcxpresso55s69.c deleted file mode 100644 index a17cffe9c..000000000 --- a/hw/bsp/lpcxpresso55s69/lpcxpresso55s69.c +++ /dev/null @@ -1,227 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2018, hathach (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 "../board.h" -#include "fsl_device_registers.h" -#include "fsl_gpio.h" -#include "fsl_power.h" -#include "fsl_iocon.h" - -//--------------------------------------------------------------------+ -// Forward USB interrupt events to TinyUSB IRQ Handler -//--------------------------------------------------------------------+ -void USB0_IRQHandler(void) -{ - tud_int_handler(0); -} - -void USB1_IRQHandler(void) -{ - tud_int_handler(1); -} - -//--------------------------------------------------------------------+ -// MACRO TYPEDEF CONSTANT ENUM -//--------------------------------------------------------------------+ -#define LED_PORT 1 -#define LED_PIN 6 -#define LED_STATE_ON 0 - -// WAKE button -#define BUTTON_PORT 1 -#define BUTTON_PIN 18 -#define BUTTON_STATE_ACTIVE 0 - -// IOCON pin mux -#define IOCON_PIO_DIGITAL_EN 0x0100u /*!<@brief Enables digital function */ -#define IOCON_PIO_FUNC0 0x00u /*!<@brief Selects pin function 0 */ -#define IOCON_PIO_FUNC1 0x01u /*!<@brief Selects pin function 1 */ -#define IOCON_PIO_FUNC7 0x07u /*!<@brief Selects pin function 7 */ -#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input function is not inverted */ -#define IOCON_PIO_MODE_INACT 0x00u /*!<@brief No addition pin function */ -#define IOCON_PIO_OPENDRAIN_DI 0x00u /*!<@brief Open drain is disabled */ -#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */ - -/**************************************************************** -name: BOARD_BootClockFROHF96M -outputs: -- {id: SYSTICK_clock.outFreq, value: 96 MHz} -- {id: System_clock.outFreq, value: 96 MHz} -settings: -- {id: SYSCON.MAINCLKSELA.sel, value: SYSCON.fro_hf} -sources: -- {id: SYSCON.fro_hf.outFreq, value: 96 MHz} -******************************************************************/ -void BootClockFROHF96M(void) -{ - /*!< Set up the clock sources */ - /*!< Set up FRO */ - POWER_DisablePD(kPDRUNCFG_PD_FRO192M); /*!< Ensure FRO is on */ - CLOCK_SetupFROClocking(12000000U); /*!< Set up FRO to the 12 MHz, just for sure */ - CLOCK_AttachClk(kFRO12M_to_MAIN_CLK); /*!< Switch to FRO 12MHz first to ensure we can change voltage without - accidentally being below the voltage for current speed */ - - CLOCK_SetupFROClocking(96000000U); /*!< Set up high frequency FRO output to selected frequency */ - - POWER_SetVoltageForFreq(96000000U); /*!< Set voltage for the one of the fastest clock outputs: System clock output */ - CLOCK_SetFLASHAccessCyclesForFreq(96000000U); /*!< Set FLASH wait states for core */ - - /*!< Set up dividers */ - CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false); /*!< Set AHBCLKDIV divider to value 1 */ - - /*!< Set up clock selectors - Attach clocks to the peripheries */ - CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK); /*!< Switch MAIN_CLK to FRO_HF */ - - /*!< Set SystemCoreClock variable. */ - SystemCoreClock = 96000000U; -} - -void board_init(void) -{ - // Enable IOCON clock - CLOCK_EnableClock(kCLOCK_Iocon); - - // Init 96 MHz clock - BootClockFROHF96M(); - -#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 - - GPIO_PortInit(GPIO, LED_PORT); - GPIO_PortInit(GPIO, BUTTON_PORT); - - // LED - gpio_pin_config_t const led_config = { kGPIO_DigitalOutput, 0}; - GPIO_PinInit(GPIO, LED_PORT, LED_PIN, &led_config); - board_led_write(true); - - // Button - const uint32_t port1_pin18_config = ( - IOCON_PIO_FUNC0 | /* Pin is configured as PIO1_18 */ - IOCON_PIO_MODE_INACT | /* No addition pin function */ - IOCON_PIO_SLEW_STANDARD | /* Standard mode, output slew rate control is enabled */ - IOCON_PIO_INV_DI | /* Input function is not inverted */ - IOCON_PIO_DIGITAL_EN | /* Enables digital function */ - IOCON_PIO_OPENDRAIN_DI /* Open drain is disabled */ - ); - /* PORT1 PIN18 (coords: 64) is configured as PIO1_18 */ - IOCON_PinMuxSet(IOCON, 1U, 18U, port1_pin18_config); - - gpio_pin_config_t const button_config = { kGPIO_DigitalInput, 0}; - GPIO_PinInit(GPIO, BUTTON_PORT, BUTTON_PIN, &button_config); - - // USB VBUS - const uint32_t port0_pin22_config = ( - IOCON_PIO_FUNC7 | /* Pin is configured as USB0_VBUS */ - IOCON_PIO_MODE_INACT | /* No addition pin function */ - IOCON_PIO_SLEW_STANDARD | /* Standard mode, output slew rate control is enabled */ - IOCON_PIO_INV_DI | /* Input function is not inverted */ - IOCON_PIO_DIGITAL_EN | /* Enables digital function */ - IOCON_PIO_OPENDRAIN_DI /* Open drain is disabled */ - ); - /* PORT0 PIN22 (coords: 78) is configured as USB0_VBUS */ - IOCON_PinMuxSet(IOCON, 0U, 22U, port0_pin22_config); - - // USB Controller - POWER_DisablePD(kPDRUNCFG_PD_USB0_PHY); /*Turn on USB0 Phy */ - POWER_DisablePD(kPDRUNCFG_PD_USB1_PHY); /*< Turn on USB1 Phy */ - - /* reset the IP to make sure it's in reset state. */ - RESET_PeripheralReset(kUSB0D_RST_SHIFT_RSTn); - RESET_PeripheralReset(kUSB0HSL_RST_SHIFT_RSTn); - RESET_PeripheralReset(kUSB0HMR_RST_SHIFT_RSTn); - RESET_PeripheralReset(kUSB1H_RST_SHIFT_RSTn); - RESET_PeripheralReset(kUSB1D_RST_SHIFT_RSTn); - RESET_PeripheralReset(kUSB1_RST_SHIFT_RSTn); - RESET_PeripheralReset(kUSB1RAM_RST_SHIFT_RSTn); - -#if (defined USB_DEVICE_CONFIG_LPCIP3511HS) && (USB_DEVICE_CONFIG_LPCIP3511HS) - CLOCK_EnableClock(kCLOCK_Usbh1); - /* Put PHY powerdown under software control */ - *((uint32_t *)(USBHSH_BASE + 0x50)) = USBHSH_PORTMODE_SW_PDCOM_MASK; - /* According to reference mannual, device mode setting has to be set by access usb host register */ - *((uint32_t *)(USBHSH_BASE + 0x50)) |= USBHSH_PORTMODE_DEV_ENABLE_MASK; - /* enable usb1 host clock */ - CLOCK_DisableClock(kCLOCK_Usbh1); -#endif - -#if 1 || (defined USB_DEVICE_CONFIG_LPCIP3511FS) && (USB_DEVICE_CONFIG_LPCIP3511FS) - CLOCK_SetClkDiv(kCLOCK_DivUsb0Clk, 1, false); - CLOCK_AttachClk(kFRO_HF_to_USB0_CLK); - /* enable usb0 host clock */ - CLOCK_EnableClock(kCLOCK_Usbhsl0); - /*According to reference mannual, device mode setting has to be set by access usb host register */ - *((uint32_t *)(USBFSH_BASE + 0x5C)) |= USBFSH_PORTMODE_DEV_ENABLE_MASK; - /* disable usb0 host clock */ - CLOCK_DisableClock(kCLOCK_Usbhsl0); - CLOCK_EnableUsbfs0DeviceClock(kCLOCK_UsbfsSrcFro, CLOCK_GetFreq(kCLOCK_FroHf)); /* enable USB Device clock */ -#endif -} - -//--------------------------------------------------------------------+ -// Board porting API -//--------------------------------------------------------------------+ - -void board_led_write(bool state) -{ - GPIO_PinWrite(GPIO, LED_PORT, LED_PIN, state ? LED_STATE_ON : (1-LED_STATE_ON)); -} - -uint32_t board_button_read(void) -{ - // active low - return BUTTON_STATE_ACTIVE == GPIO_PinRead(GPIO, BUTTON_PORT, BUTTON_PIN); -} - -int board_uart_read(uint8_t* buf, int len) -{ - (void) buf; (void) len; - return 0; -} - -int board_uart_write(void const * 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/hw/bsp/stm32f4/family.mk b/hw/bsp/stm32f4/family.mk index 332d6ee02..384e7b1c2 100644 --- a/hw/bsp/stm32f4/family.mk +++ b/hw/bsp/stm32f4/family.mk @@ -32,8 +32,7 @@ INC += \ $(TOP)/$(BOARD_PATH) \ $(TOP)/lib/CMSIS_5/CMSIS/Core/Include \ $(TOP)/$(ST_CMSIS)/Include \ - $(TOP)/$(ST_HAL_DRIVER)/Inc \ - $(TOP)/hw/bsp/$(BOARD) + $(TOP)/$(ST_HAL_DRIVER)/Inc # For TinyUSB port source VENDOR = st From e9059b5d84bdf1a12d3d89c7b6ce5e6b1c7d179e Mon Sep 17 00:00:00 2001 From: hathach Date: Mon, 1 Mar 2021 12:18:37 +0700 Subject: [PATCH 2/3] added lpcxpresso 55s28 --- .../lpc55/boards/double_m33_express/board.mk | 3 +- hw/bsp/lpc55/boards/lpcxpresso55s28/board.h | 53 +++++++++++++++++++ hw/bsp/lpc55/boards/lpcxpresso55s28/board.mk | 10 ++++ hw/bsp/lpc55/boards/lpcxpresso55s69/board.mk | 3 +- hw/bsp/lpc55/family.mk | 21 ++++++-- 5 files changed, 83 insertions(+), 7 deletions(-) create mode 100644 hw/bsp/lpc55/boards/lpcxpresso55s28/board.h create mode 100644 hw/bsp/lpc55/boards/lpcxpresso55s28/board.mk diff --git a/hw/bsp/lpc55/boards/double_m33_express/board.mk b/hw/bsp/lpc55/boards/double_m33_express/board.mk index e6c58be38..9bbfcc330 100644 --- a/hw/bsp/lpc55/boards/double_m33_express/board.mk +++ b/hw/bsp/lpc55/boards/double_m33_express/board.mk @@ -1,4 +1,5 @@ -MCU_VARIANT = LPC55S69_cm33_core0 +MCU_VARIANT = LPC55S69 +MCU_CORE = LPC55S69_cm33_core0 CFLAGS += -DCPU_LPC55S69JBD100_cm33_core0 LD_FILE = $(BOARD_PATH)/LPC55S69_cm33_core0_uf2.ld diff --git a/hw/bsp/lpc55/boards/lpcxpresso55s28/board.h b/hw/bsp/lpc55/boards/lpcxpresso55s28/board.h new file mode 100644 index 000000000..7e76df953 --- /dev/null +++ b/hw/bsp/lpc55/boards/lpcxpresso55s28/board.h @@ -0,0 +1,53 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2021, 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. + */ + +#ifndef BOARD_H_ +#define BOARD_H_ + +#ifdef __cplusplus + extern "C" { +#endif + +// LED +#define LED_PORT 1 +#define LED_PIN 6 +#define LED_STATE_ON 0 + +// WAKE button +#define BUTTON_PORT 1 +#define BUTTON_PIN 18 +#define BUTTON_STATE_ACTIVE 0 + +// UART +//#define UART_DEV USART0 +//#define UART_RX_PINMUX 0U, 29U, IOCON_PIO_DIG_FUNC1_EN +//#define UART_TX_PINMUX 0U, 30U, IOCON_PIO_DIG_FUNC1_EN + +#ifdef __cplusplus + } +#endif + +#endif diff --git a/hw/bsp/lpc55/boards/lpcxpresso55s28/board.mk b/hw/bsp/lpc55/boards/lpcxpresso55s28/board.mk new file mode 100644 index 000000000..e01a3d04f --- /dev/null +++ b/hw/bsp/lpc55/boards/lpcxpresso55s28/board.mk @@ -0,0 +1,10 @@ +MCU_VARIANT = LPC55S28 +MCU_CORE = LPC55S28 + +CFLAGS += -DCPU_LPC55S28JBD100 + +JLINK_DEVICE = LPC55S28 +PYOCD_TARGET = LPC55S28 + +# flash using pyocd +flash: flash-pyocd diff --git a/hw/bsp/lpc55/boards/lpcxpresso55s69/board.mk b/hw/bsp/lpc55/boards/lpcxpresso55s69/board.mk index fd01c7d72..88a065d4c 100644 --- a/hw/bsp/lpc55/boards/lpcxpresso55s69/board.mk +++ b/hw/bsp/lpc55/boards/lpcxpresso55s69/board.mk @@ -1,4 +1,5 @@ -MCU_VARIANT = LPC55S69_cm33_core0 +MCU_VARIANT = LPC55S69 +MCU_CORE = LPC55S69_cm33_core0 CFLAGS += -DCPU_LPC55S69JBD100_cm33_core0 diff --git a/hw/bsp/lpc55/family.mk b/hw/bsp/lpc55/family.mk index 08f3ec251..f5949b875 100644 --- a/hw/bsp/lpc55/family.mk +++ b/hw/bsp/lpc55/family.mk @@ -2,6 +2,9 @@ UF2_FAMILY_ID = 0x2abc77ec include $(TOP)/$(BOARD_PATH)/board.mk +# TODO change Default to Highspeed PORT1 +PORT ?= 0 + CFLAGS += \ -flto \ -mthumb \ @@ -11,18 +14,26 @@ CFLAGS += \ -mfpu=fpv5-sp-d16 \ -DCFG_TUSB_MCU=OPT_MCU_LPC55XX \ -DCFG_TUSB_MEM_SECTION='__attribute__((section(".data")))' \ - -DCFG_TUSB_MEM_ALIGN='__attribute__((aligned(64)))' + -DCFG_TUSB_MEM_ALIGN='__attribute__((aligned(64)))' \ + -DBOARD_DEVICE_RHPORT_NUM=$(PORT) + +ifeq ($(PORT), 1) + CFLAGS += -DBOARD_DEVICE_RHPORT_SPEED=OPT_MODE_HIGH_SPEED + $(info "PORT1 High Speed") +else + $(info "PORT0 Full Speed") +endif # mcu driver cause following warnings CFLAGS += -Wno-error=unused-parameter -Wno-error=float-equal -MCU_DIR = hw/mcu/nxp/sdk/devices/LPC55S69 +MCU_DIR = hw/mcu/nxp/sdk/devices/$(MCU_VARIANT) # All source paths should be relative to the top level. -LD_FILE ?= $(MCU_DIR)/gcc/$(MCU_VARIANT)_flash.ld +LD_FILE ?= $(MCU_DIR)/gcc/$(MCU_CORE)_flash.ld SRC_C += \ - $(MCU_DIR)/system_$(MCU_VARIANT).c \ + $(MCU_DIR)/system_$(MCU_CORE).c \ $(MCU_DIR)/drivers/fsl_clock.c \ $(MCU_DIR)/drivers/fsl_gpio.c \ $(MCU_DIR)/drivers/fsl_power.c \ @@ -38,7 +49,7 @@ INC += \ $(TOP)/$(MCU_DIR) \ $(TOP)/$(MCU_DIR)/drivers -SRC_S += $(MCU_DIR)/gcc/startup_$(MCU_VARIANT).S +SRC_S += $(MCU_DIR)/gcc/startup_$(MCU_CORE).S LIBS += $(TOP)/$(MCU_DIR)/gcc/libpower_hardabi.a From 31aa77a85b1d985e500d047ef49d1ab459298511 Mon Sep 17 00:00:00 2001 From: hathach Date: Mon, 1 Mar 2021 12:35:17 +0700 Subject: [PATCH 3/3] add lpc55 to ci --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5ec29686a..77903d65e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -37,6 +37,7 @@ jobs: family: # Alphabetical order - 'imxrt' + - 'lpc55' - 'nrf' - 'rp2040' - 'samd11'