cmake_minimum_required(VERSION 3.20)

set(ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../..)
set(SYSTEM_DIR ${ROOT_DIR}/devices/eliot1)
set(ARM_GCC_DIR ${ROOT_DIR}/devices/eliot1/gcc)
set(DRIVERS_DIR ${ROOT_DIR}/devices/eliot1/drivers)
set(BOARD_CFG_DIR ${ROOT_DIR}/boards/eliot1m_mo_cfg)
set(BOARD_BSP_DIR ${BOARD_CFG_DIR}/armgcc/bsp_core0/build)
set(EMBEDDED_CLI_DIR ${ROOT_DIR}/middleware/embeddedcli)
set(GDBINIT_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/eliot1_multicore.gdbinit)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

include(FetchContent)

set(TINYUSB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/tinyusb)
if(IS_DIRECTORY ${TINYUSB_DIR})
    message(STATUS "Using TinyUSB = ${TINYUSB_DIR}")
else()
    message(STATUS "Fetching TinyUSB")
    FetchContent_Declare(tinyusb
        GIT_REPOSITORY ssh://git@warlock.elvees.com:2222/external_middleware/tinyusb.git
        GIT_TAG        eliot1-dev
        GIT_SUBMODULES "" # Don't grab any submodules since not latest
        SOURCE_DIR     ${TINYUSB_DIR}
    )
    FetchContent_MakeAvailable(tinyusb)
    set(TINYUSB_DIR ${tinyusb_SOURCE_DIR})
endif()

project(tinyusb_examples)

set(TINYUSB_SRCS
# TinyUSB src
    ${TINYUSB_DIR}/src/tusb.c
    ${TINYUSB_DIR}/src/common/tusb_fifo.c
# TinyUSB device src
    ${TINYUSB_DIR}/src/device/usbd_control.c
    ${TINYUSB_DIR}/src/device/usbd.c
# TinyUSB host src
    ${TINYUSB_DIR}/src/host/hub.c
    ${TINYUSB_DIR}/src/host/usbh.c
# TinyUSB class
    ${TINYUSB_DIR}/src/class/cdc/cdc_device.c
    ${TINYUSB_DIR}/src/class/audio/audio_device.c
    ${TINYUSB_DIR}/src/class/bth/bth_device.c
    ${TINYUSB_DIR}/src/class/dfu/dfu_device.c
    ${TINYUSB_DIR}/src/class/dfu/dfu_rt_device.c
    ${TINYUSB_DIR}/src/class/hid/hid_device.c
    ${TINYUSB_DIR}/src/class/hid/hid_host.c
    ${TINYUSB_DIR}/src/class/midi/midi_device.c
    ${TINYUSB_DIR}/src/class/msc/msc_device.c
    ${TINYUSB_DIR}/src/class/msc/msc_host.c
    ${TINYUSB_DIR}/src/class/net/ecm_rndis_device.c
    ${TINYUSB_DIR}/src/class/net/ncm_device.c
    ${TINYUSB_DIR}/src/class/usbtmc/usbtmc_device.c
    ${TINYUSB_DIR}/src/class/vendor/vendor_device.c
    ${TINYUSB_DIR}/src/class/vendor/vendor_host.c
    ${TINYUSB_DIR}/src/class/video/video_device.c
# TinyUSB portable
    ${TINYUSB_DIR}/hw/bsp/eliot1/family.c
    ${TINYUSB_DIR}/src/portable/synopsys/dwc2/dcd_dwc2.c
    ${TINYUSB_DIR}/src/portable/synopsys/dwc2/hcd_dwc2.c
    ${TINYUSB_DIR}/src/portable/synopsys/dwc2/dwc2_common.c
)

set(TINYUSB_INCLDS
# TinyUSB src
    ${TINYUSB_DIR}/src
    ${TINYUSB_DIR}/src/common
    ${TINYUSB_DIR}/src/device
    ${TINYUSB_DIR}/src/host/
    ${TINYUSB_DIR}/src/osal
    ${TINYUSB_DIR}/src/portable/synopsys/dwc2
# TinyUSB class
    ${TINYUSB_DIR}/src/class/cdc
    ${TINYUSB_DIR}/src/class/audio
    ${TINYUSB_DIR}/src/class/bth
    ${TINYUSB_DIR}/src/class/dfu
    ${TINYUSB_DIR}/src/class/hid
    ${TINYUSB_DIR}/src/class/midi
    ${TINYUSB_DIR}/src/class/msc
    ${TINYUSB_DIR}/src/class/net
    ${TINYUSB_DIR}/src/class/usbtmc
    ${TINYUSB_DIR}/src/class/vendor
    ${TINYUSB_DIR}/src/class/video

    ${TINYUSB_DIR}/hw
    ${TINYUSB_DIR}/lib/fatfs/source
)

set(TINYUSB_STD_COMPILE_DEFS
    "CFG_TUSB_MCU=OPT_MCU_ELIOT1"
    "CFG_TUSB_OS=OPT_OS_NONE"
    "BOARD_TUD_MAX_SPEED=OPT_MODE_HIGH_SPEED"
    "CFG_TUD_DWC2_DMA_ENABLE_DEFAULT=1"
    "CFG_TUH_DWC2_DMA_ENABLE_DEFAULT=1"
    "CFG_TUH_DWC2_SLAVE_ENABLE_DEFAULT=0"
)

function(init_ld_flags)
    set(target ${ARGV0})
    set(ld_script "${ARM_GCC_DIR}/eliot1_cm33_core0_flash_secure.ld")

    target_include_directories(${target}
        PUBLIC
            ${ROOT_DIR}/CMSIS/Include
            ${SYSTEM_DIR}
            ${DRIVERS_DIR}
            ${BOARD_CFG_DIR}
    )
    target_compile_options(${target}
        PUBLIC
            -DBOARD -DELIOT1M -DCPU_ELIOT1M_cm33_core0 -Os -g
            -fdata-sections -ffunction-sections
            -Wno-pedantic
    )
    target_link_options(${target}
        PRIVATE
            -fdata-sections -ffunction-sections
            -Wl,--gc-sections -T${ld_script}
    )
    target_link_directories(${target}
        PUBLIC
            ${BOARD_BSP_DIR}
    )
    target_link_libraries(${target}
        PRIVATE
            bsp_core0
    )
endfunction()

function(init_post_commands target)
    add_custom_command(TARGET ${target} POST_BUILD
        COMMAND ${CMAKE_OBJDUMP} -D ${target} > ${PROJECT_NAME}.dis
    )
    add_custom_command(TARGET ${target} POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy ${GDBINIT_DIR}/${GDBINIT_TEMPLATE} ${CMAKE_CURRENT_BINARY_DIR}
    )
endfunction()

file(GLOB GROUP_DIRS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/*")

add_subdirectory(device)
