diff --git a/.idea/cmake.xml b/.idea/cmake.xml
index 291da5371..4d9fc9aa5 100644
--- a/.idea/cmake.xml
+++ b/.idea/cmake.xml
@@ -23,6 +23,7 @@
+
\ No newline at end of file
diff --git a/.idea/runConfigurations/msc_dual_lun.xml b/.idea/runConfigurations/msc_dual_lun.xml
index 6e0d74f5b..5c1ea270b 100644
--- a/.idea/runConfigurations/msc_dual_lun.xml
+++ b/.idea/runConfigurations/msc_dual_lun.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/cmake/cpu/cortex-m7.cmake b/cmake/cpu/cortex-m7.cmake
new file mode 100644
index 000000000..2b258726f
--- /dev/null
+++ b/cmake/cpu/cortex-m7.cmake
@@ -0,0 +1,6 @@
+set(TOOLCHAIN_COMMON_FLAGS
+ -mthumb
+ -mcpu=cortex-m7
+ -mfloat-abi=hard
+ -mfpu=fpv5-d16
+ )
diff --git a/cmake/toolchain/arm_gcc.cmake b/cmake/toolchain/arm_gcc.cmake
new file mode 100644
index 000000000..44683118e
--- /dev/null
+++ b/cmake/toolchain/arm_gcc.cmake
@@ -0,0 +1,19 @@
+set(CMAKE_SYSTEM_NAME Generic)
+
+set(CMAKE_ASM_COMPILER "arm-none-eabi-gcc")
+set(CMAKE_C_COMPILER "arm-none-eabi-gcc")
+set(CMAKE_CXX_COMPILER "arm-none-eabi-g++")
+set(GCC_ELF2BIN "arm-none-eabi-objcopy")
+set_property(GLOBAL PROPERTY ELF2BIN ${GCC_ELF2BIN})
+
+# 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)
+include(${CMAKE_CURRENT_LIST_DIR}/set_flags.cmake)
diff --git a/cmake/toolchain/set_flags.cmake b/cmake/toolchain/set_flags.cmake
new file mode 100644
index 000000000..e6c7b6feb
--- /dev/null
+++ b/cmake/toolchain/set_flags.cmake
@@ -0,0 +1,22 @@
+get_property(IS_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE)
+
+# join the toolchain flags into a single string
+list(JOIN TOOLCHAIN_COMMON_FLAGS " " TOOLCHAIN_COMMON_FLAGS)
+
+foreach(LANG IN ITEMS C CXX ASM)
+ set(CMAKE_${LANG}_FLAGS_INIT "${TOOLCHAIN_COMMON_FLAGS}")
+ if (PICO_DEOPTIMIZED_DEBUG)
+ set(CMAKE_${LANG}_FLAGS_DEBUG_INIT "-O0")
+ else()
+ set(CMAKE_${LANG}_FLAGS_DEBUG_INIT "-Og")
+ endif()
+ set(CMAKE_${LANG}_LINK_FLAGS "-Wl,--build-id=none")
+
+ # try_compile is where the feature testing is done, and at that point,
+ # pico_standard_link is not ready to be linked in to provide essential
+ # functions like _exit. So pass -nostdlib so it doesn't link in an exit()
+ # function at all.
+ if(IS_IN_TRY_COMPILE)
+ set(CMAKE_${LANG}_LINK_FLAGS "${CMAKE_${LANG}_LINK_FLAGS} -nostdlib")
+ endif()
+endforeach()
diff --git a/examples/device/board_test/CMakeLists.txt b/examples/device/board_test/CMakeLists.txt
index 4435bd523..ac47bf0b4 100644
--- a/examples/device/board_test/CMakeLists.txt
+++ b/examples/device/board_test/CMakeLists.txt
@@ -1,4 +1,10 @@
-cmake_minimum_required(VERSION 3.5)
+cmake_minimum_required(VERSION 3.13)
+include(CMakePrintHelpers)
+
+# default toolchain is gcc
+if (NOT TOOLCHAIN)
+ set(TOOLCHAIN "gcc")
+endif ()
include(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)
@@ -24,7 +30,40 @@ if(NOT FAMILY STREQUAL "espressif")
${CMAKE_CURRENT_SOURCE_DIR}/src
)
- # Configure compilation flags and libraries for the example... see the corresponding function
- # in hw/bsp/FAMILY/family.cmake for details.
- family_configure_device_example(${PROJECT})
+ if(FAMILY STREQUAL "rp2040")
+ # Configure compilation flags and libraries for the example... see the corresponding function
+ # in hw/bsp/FAMILY/family.cmake for details.
+ family_configure_device_example(${PROJECT})
+ else ()
+ # TOP is absolute path to root directory of TinyUSB git repo
+ set(TOP "${CMAKE_CURRENT_LIST_DIR}/../../..")
+ get_filename_component(TOP "${TOP}" REALPATH)
+
+ # re-include family.cmake
+ include(${TOP}/hw/bsp/${FAMILY}/family.cmake)
+
+ target_sources(${PROJECT} PUBLIC
+ ${TOP}/src/device/usbd.c
+ ${TOP}/src/device/usbd_control.c
+ ${TOP}/src/class/audio/audio_device.c
+ ${TOP}/src/class/cdc/cdc_device.c
+ ${TOP}/src/class/dfu/dfu_device.c
+ ${TOP}/src/class/dfu/dfu_rt_device.c
+ ${TOP}/src/class/hid/hid_device.c
+ ${TOP}/src/class/midi/midi_device.c
+ ${TOP}/src/class/msc/msc_device.c
+ ${TOP}/src/class/net/ecm_rndis_device.c
+ ${TOP}/src/class/net/ncm_device.c
+ ${TOP}/src/class/usbtmc/usbtmc_device.c
+ ${TOP}/src/class/vendor/vendor_device.c
+ ${TOP}/src/class/video/video_device.c
+ )
+
+ target_include_directories(${PROJECT} PUBLIC
+ ${TOP}/hw
+ ${TOP}/src
+ )
+
+
+ endif ()
endif()
diff --git a/examples/device/cdc_msc/CMakeLists.txt b/examples/device/cdc_msc/CMakeLists.txt
index 8e4db9d29..caac260d1 100644
--- a/examples/device/cdc_msc/CMakeLists.txt
+++ b/examples/device/cdc_msc/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.5)
+cmake_minimum_required(VERSION 3.13)
include(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)
diff --git a/hw/bsp/imxrt/boards/mimxrt1010_evk/board.cmake b/hw/bsp/imxrt/boards/mimxrt1010_evk/board.cmake
new file mode 100644
index 000000000..52d1846ea
--- /dev/null
+++ b/hw/bsp/imxrt/boards/mimxrt1010_evk/board.cmake
@@ -0,0 +1,10 @@
+set(MCU_VARIANT MIMXRT1011)
+
+target_sources(${PROJECT} PUBLIC
+ ${CMAKE_CURRENT_LIST_DIR}/evkmimxrt1010_flexspi_nor_config.c
+ )
+
+target_compile_definitions(${PROJECT} PUBLIC
+ CPU_MIMXRT1011DAE5A
+ CFG_EXAMPLE_VIDEO_READONLY
+ )
diff --git a/hw/bsp/imxrt/family.cmake b/hw/bsp/imxrt/family.cmake
new file mode 100644
index 000000000..1e095ebfb
--- /dev/null
+++ b/hw/bsp/imxrt/family.cmake
@@ -0,0 +1,69 @@
+# toolchain set up, include before project()
+if (NOT TARGET ${PROJECT})
+ set(CMAKE_SYSTEM_PROCESSOR cortex-m7 CACHE INTERNAL "System Processor")
+ set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_LIST_DIR}/../../../cmake/toolchain/arm_${TOOLCHAIN}.cmake)
+else ()
+ if (NOT BOARD)
+ message(FATAL_ERROR "BOARD not specified")
+ endif ()
+
+ set(SDK_DIR ${TOP}/hw/mcu/nxp/mcux-sdk)
+ set(DEPS_SUBMODULES ${SDK_DIR})
+
+ # include basic family CMake functionality
+ #set(FAMILY_MCUS RP2040)
+
+ include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
+
+ target_compile_definitions(${PROJECT} PUBLIC
+ CFG_TUSB_MCU=OPT_MCU_MIMXRT
+ __ARMVFP__=0
+ __ARMFPV5__=0
+ XIP_EXTERNAL_FLASH=1
+ XIP_BOOT_HEADER_ENABLE=1
+ )
+
+ target_link_options(${PROJECT} PUBLIC
+ --specs=nosys.specs
+ --specs=nano.specs
+ #-lgcc -lm -lnosys
+ )
+
+# target_link_libraries(${PROJECT} PUBLIC
+# -lgcc -lm -lnosys
+# )
+
+ target_sources(${PROJECT} PUBLIC
+ # TinyUSB
+ ${TOP}/src/portable/chipidea/ci_hs/dcd_ci_hs.c
+ ${TOP}/src/portable/chipidea/ci_hs/hcd_ci_hs.c
+ ${TOP}/src/portable/ehci/ehci.c
+ # BSP
+ ${CMAKE_CURRENT_LIST_DIR}/family.c
+ ${SDK_DIR}/drivers/common/fsl_common.c
+ ${SDK_DIR}/drivers/igpio/fsl_gpio.c
+ ${SDK_DIR}/drivers/lpuart/fsl_lpuart.c
+ ${SDK_DIR}/devices/${MCU_VARIANT}/system_${MCU_VARIANT}.c
+ ${SDK_DIR}/devices/${MCU_VARIANT}/xip/fsl_flexspi_nor_boot.c
+ ${SDK_DIR}/devices/${MCU_VARIANT}/project_template/clock_config.c
+ ${SDK_DIR}/devices/${MCU_VARIANT}/drivers/fsl_clock.c
+ )
+
+ if (TOOLCHAIN STREQUAL "gcc")
+ target_sources(${PROJECT} PUBLIC
+ ${SDK_DIR}/devices/${MCU_VARIANT}/gcc/startup_${MCU_VARIANT}.S
+ )
+ endif ()
+
+ target_include_directories(${PROJECT} PUBLIC
+ ${CMAKE_CURRENT_LIST_DIR}
+ ${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}
+ ${SDK_DIR}/CMSIS/Include
+ ${SDK_DIR}/devices/${MCU_VARIANT}
+ ${SDK_DIR}/devices/${MCU_VARIANT}/project_template
+ ${SDK_DIR}/devices/${MCU_VARIANT}/drivers
+ ${SDK_DIR}/drivers/common
+ ${SDK_DIR}/drivers/igpio
+ ${SDK_DIR}/drivers/lpuart
+ )
+endif ()