Skip to content

Commit

Permalink
Merge pull request #2134 from clhenry/non-bus-powered-re-enumeration
Browse files Browse the repository at this point in the history
Non-bus-powered MSP430 support.
  • Loading branch information
hathach authored Apr 15, 2024
2 parents d816a9b + afb66a9 commit fb21b6a
Show file tree
Hide file tree
Showing 12 changed files with 322 additions and 27 deletions.
11 changes: 6 additions & 5 deletions .github/workflows/build_msp430.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,11 @@ jobs:
tar -C ~/cache/toolchain -xaf toolchain.tar.bz2
- name: Set Toolchain Path
run: echo >> $GITHUB_PATH `echo ~/cache/toolchain/*/bin`

- name: Get Dependencies
run: python3 tools/get_deps.py ${{ matrix.family }}
run: |
echo >> $GITHUB_PATH `echo ~/cache/toolchain/*/bin`
sudo apt install -y ninja-build
- name: Build
run: python3 tools/build_make.py ${{ matrix.family }}
run: |
python3 tools/get_deps.py ${{ matrix.family }}
python tools/build_cmake.py ${{ matrix.family }} -DCMAKE_BUILD_TYPE=MinSizeRel
12 changes: 8 additions & 4 deletions .idea/cmake.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions examples/build_system/cmake/cpu/msp430.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
if (TOOLCHAIN STREQUAL "gcc")
set(FREERTOS_PORT GCC_MSP430F449 CACHE INTERNAL "")

elseif (TOOLCHAIN STREQUAL "iar")
set(FREERTOS_PORT IAR_MSP430 CACHE INTERNAL "")

endif ()
52 changes: 52 additions & 0 deletions examples/build_system/cmake/toolchain/msp430_gcc.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
set(CMAKE_SYSTEM_NAME Generic)

if (NOT DEFINED CMAKE_C_COMPILER)
set(CMAKE_C_COMPILER "msp430-elf-gcc")
endif ()

if (NOT DEFINED CMAKE_CXX_COMPILER)
set(CMAKE_CXX_COMPILER "msp430-elf-g++")
endif ()

set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})

set(CMAKE_SIZE "msp430-elf-size" CACHE FILEPATH "")
set(CMAKE_OBJCOPY "msp430-elf-objcopy" CACHE FILEPATH "")
set(CMAKE_OBJDUMP "msp430-elf-objdump" CACHE FILEPATH "")

set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS FALSE)

# Look for includes and libraries only in the target system prefix.
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

# pass TOOLCHAIN_CPU to
set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES CMAKE_SYSTEM_PROCESSOR)

include(${CMAKE_CURRENT_LIST_DIR}/../cpu/${CMAKE_SYSTEM_PROCESSOR}.cmake)

# enable all possible warnings for building examples
list(APPEND TOOLCHAIN_COMMON_FLAGS
-fdata-sections
-ffunction-sections
-fsingle-precision-constant
-fno-strict-aliasing
)

list(APPEND TOOLCHAIN_EXE_LINKER_FLAGS
-Wl,--print-memory-usage
-Wl,--gc-sections
-Wl,--cref
)

include(${CMAKE_CURRENT_LIST_DIR}/set_flags.cmake)

# try_compile is cmake test compiling its own example,
# pass -nostdlib to skip stdlib linking
get_property(IS_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE)
if (IS_IN_TRY_COMPILE)
set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -nostdlib")
set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -nostdlib")
endif ()
8 changes: 8 additions & 0 deletions examples/build_system/make/cpu/msp430.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
ifeq ($(TOOLCHAIN),gcc)
# nothing to add
else ifeq ($(TOOLCHAIN),iar)
# nothing to add
endif

# For freeRTOS port source
FREERTOS_PORTABLE_SRC ?= $(FREERTOS_PORTABLE_PATH)/GCC_MSP430F449
15 changes: 15 additions & 0 deletions hw/bsp/family_support.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -460,6 +460,21 @@ function(family_flash_dfu_util TARGET OPTION)
)
endfunction()

function(family_flash_msp430flasher TARGET)
if (NOT DEFINED MSP430Flasher)
set(MSP430FLASHER MSP430Flasher)
endif ()

# set LD_LIBRARY_PATH to find libmsp430.so (directory containing MSP430Flasher)
find_program(MSP430FLASHER_PATH MSP430Flasher)
get_filename_component(MSP430FLASHER_PARENT_DIR "${MSP430FLASHER_PATH}" DIRECTORY)
add_custom_target(${TARGET}-msp430flasher
DEPENDS ${TARGET}
COMMAND ${CMAKE_COMMAND} -E env LD_LIBRARY_PATH=${MSP430FLASHER_PARENT_DIR}
${MSP430FLASHER} -w $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.hex -z [VCC]
)
endfunction()

#----------------------------------
# Family specific
#----------------------------------
Expand Down
9 changes: 9 additions & 0 deletions hw/bsp/msp430/boards/msp_exp430f5529lp/board.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
set(MCU_VARIANT msp430f5529)
set(LD_FILE_GNU ${SDK_DIR}/msp430f5529.ld)

function(update_board TARGET)
target_compile_definitions(${TARGET} INTERFACE
__MSP430F5529__
)

endfunction()
4 changes: 4 additions & 0 deletions hw/bsp/msp430/boards/msp_exp430f5529lp/board.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
CFLAGS += \
-D__MSP430F5529__ \

LD_FILE = ${SDK_DIR}/msp430f5529.ld
84 changes: 84 additions & 0 deletions hw/bsp/msp430/family.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
include_guard()

set(SDK_DIR ${TOP}/hw/mcu/ti/msp430/msp430-gcc-support-files/include)

# include board specific
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)

# toolchain set up
set(CMAKE_SYSTEM_PROCESSOR msp430 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/msp430_${TOOLCHAIN}.cmake)

set(FAMILY_MCUS MSP430x5xx CACHE INTERNAL "")


#------------------------------------
# BOARD_TARGET
#------------------------------------
# only need to be built ONCE for all examples
function(add_board_target BOARD_TARGET)
if (NOT TARGET ${BOARD_TARGET})
add_library(${BOARD_TARGET} INTERFACE)
target_compile_definitions(${BOARD_TARGET} INTERFACE
CFG_TUD_ENDPOINT0_SIZE=8
CFG_EXAMPLE_VIDEO_READONLY
CFG_EXAMPLE_MSC_READONLY
)
target_include_directories(${BOARD_TARGET} INTERFACE
${CMAKE_CURRENT_FUNCTION_LIST_DIR}
${SDK_DIR}
)

update_board(${BOARD_TARGET})

if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
target_link_options(${BOARD_TARGET} INTERFACE
"LINKER:--script=${LD_FILE_GNU}"
-L${SDK_DIR}
)
elseif (CMAKE_C_COMPILER_ID STREQUAL "IAR")
target_link_options(${BOARD_TARGET} INTERFACE
"LINKER:--config=${LD_FILE_IAR}"
)
endif ()
endif ()
endfunction()


#------------------------------------
# Functions
#------------------------------------
function(family_configure_example TARGET RTOS)
family_configure_common(${TARGET} ${RTOS})

# Board target
add_board_target(board_${BOARD})

#---------- Port Specific ----------
# These files are built for each example since it depends on example's tusb_config.h
target_sources(${TARGET} PUBLIC
# BSP
${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c
${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c
)
target_include_directories(${TARGET} PUBLIC
# family, hw, board
${CMAKE_CURRENT_FUNCTION_LIST_DIR}
${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../
${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}
)

# Add TinyUSB target and port source
family_add_tinyusb(${TARGET} OPT_MCU_MSP430x5xx ${RTOS})
target_sources(${TARGET}-tinyusb PUBLIC
${TOP}/src/portable/ti/msp430x5xx/dcd_msp430x5xx.c
)
target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})

# Link dependencies
target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)

# Flashing
family_add_bin_hex(${TARGET})
family_flash_msp430flasher(${TARGET})
endfunction()
12 changes: 6 additions & 6 deletions hw/bsp/msp430/family.mk
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,21 @@ CROSS_COMPILE = msp430-elf-
DEPS_SUBMODULES += hw/mcu/ti
SKIP_NANOLIB = 1

SDK_DIR = hw/mcu/ti/msp430/msp430-gcc-support-files/include

include $(TOP)/$(BOARD_PATH)/board.mk

CFLAGS += \
-D__MSP430F5529__ \
-DCFG_TUSB_MCU=OPT_MCU_MSP430x5xx \
-DCFG_EXAMPLE_MSC_READONLY \
-DCFG_TUD_ENDPOINT0_SIZE=8

# All source paths should be relative to the top level.
LD_FILE = hw/mcu/ti/msp430/msp430-gcc-support-files/include/msp430f5529.ld
LDINC += $(TOP)/hw/mcu/ti/msp430/msp430-gcc-support-files/include
LDFLAGS += $(addprefix -L,$(LDINC))
LDFLAGS += -L${TOP}/${SDK_DIR}

SRC_C += src/portable/ti/msp430x5xx/dcd_msp430x5xx.c

INC += \
$(TOP)/hw/mcu/ti/msp430/msp430-gcc-support-files/include \
${TOP}/${SDK_DIR} \
$(TOP)/$(BOARD_PATH)

# export for libmsp430.so to same installation
Expand Down
4 changes: 2 additions & 2 deletions src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -535,14 +535,14 @@ static void dcd_ep_ctr_rx_handler(uint32_t wIstr)
* - Software should ensure that a small delay is included before accessing the SRAM contents. This delay
* should be 800 ns in Full Speed mode and 6.4 μs in Low Speed mode
* - Since H5 can run up to 250Mhz -> 1 cycle = 4ns. Per errata, we need to wait 200 cycles. Though executing code
* also takes time, so we'll wait 40 cycles (count = 20).
* also takes time, so we'll wait 60 cycles (count = 20).
* - Since Low Speed mode is not supported/popular, we will ignore it for now.
*
* Note: this errata also seems to apply to G0, U5, H5 etc.
*/
volatile uint32_t cycle_count = 20; // defined as PCD_RX_PMA_CNT in stm32 hal_driver
while (cycle_count > 0U) {
cycle_count--; // each count take 2 cycle (1 cycle for sub, 1 cycle for compare/jump)
cycle_count--; // each count take 3 cycles (1 for sub, jump, and compare)
}
#endif

Expand Down
Loading

0 comments on commit fb21b6a

Please sign in to comment.