project(GD32F4xx_usb_library LANGUAGES C CXX ASM)

# GD32F4xx USB 全栈库（device/host + 各 class），默认不参与构建：
#   1. 根 CMakeLists.txt 中 add_subdirectory(SDK/GD32F4xx_usb_library) 始终执行；
#   2. 需要使用 USB 时启用开关（写入 CMakePresets 缓存或命令行）：
#        cmake --preset Debug -DGD32_ENABLE_USB=ON
#   3. 然后在业务目标上链接：target_link_libraries(${PROJECT_NAME} PRIVATE GD32F4xx_usb_library)
option(GD32_ENABLE_USB "Build GD32F4xx USB device/host library" OFF)

if(NOT GD32_ENABLE_USB)
    return()
endif()

set(USB_SRC
    # USB driver (device & host common)
    driver/Source/drv_usb_core.c
    driver/Source/drv_usb_dev.c
    # host 专用驱动，默认 device 模式不编译（启用 host 时放开）：
    # driver/Source/drv_usb_host.c
    # driver/Source/drv_usbh_int.c
    driver/Source/drv_usbd_int.c

    # USB device core
    device/core/Source/usbd_core.c
    device/core/Source/usbd_enum.c
    device/core/Source/usbd_transc.c

    # USB device classes —— 注意：class 源文件依赖例程级配置宏（各例程 usbd_conf.h
    # 或专用头提供端点/包尺寸定义），模板默认只启用 CDC 虚拟串口（conf/ 的
    # usbd_conf.h 取自 cdc_acm 例程，含 CDC 全部所需宏）。
    # 启用其它 class 时：参考官方库 Examples/USB/USB_Device/<对应例程>/inc 下的
    # usbd_conf.h，把该 class 所需宏并入 conf/usbd_conf.h，再放开对应源文件。
    device/class/cdc/Source/cdc_acm_core.c
    # device/class/audio/Source/audio_core.c    # 需 audio 例程 conf（SPEAKER_OUT_PACKET 等）+ 板级 codec
    # device/class/audio/Source/audio_out_itf.c # 板级 codec 驱动（codec_gpio_init 等）
    # device/class/dfu/Source/dfu_core.c        # 需 dfu 例程 conf（TRANSFER_SIZE/dfu_*_cb 等）
    # device/class/dfu/Source/dfu_mem.c         # DFU 存储媒介适配层（例程级实现）
    # device/class/hid/Source/custom_hid_core.c # 需 custom_hid 例程 conf（CUSTOMHID_IN_EP 等）
    # device/class/hid/Source/standard_hid_core.c # 需 standard_hid 例程 conf（HID_IN_PACKET 等）
    # device/class/iap/Source/usb_iap_core.c    # 需 iap 例程 conf + flash_operation.h
    # device/class/msc/Source/usbd_msc_bbb.c    # 需 msc_udisk 例程 conf（MSC_IN_EP/MEM_LUN_NUM 等）
    # device/class/msc/Source/usbd_msc_core.c
    # device/class/msc/Source/usbd_msc_scsi.c
    # device/class/printer/Source/printer_core.c # 需 printer 例程 conf（PRINTER_IN_EP 等）

    # USB host core / classes —— 默认不编译：
    # conf/ 下的 usb_conf.h 目前为 device 模式（USE_DEVICE_MODE，CDC 例程基准），
    # 启用 host 时需将 conf 切换为 host/dual 模式（参考官方库 Examples/USB/USB_Host
    # 的 usb_conf.h + usbh_conf.h 组合，host 还依赖 USB_RX_FIFO_FS_SIZE 等 FIFO 宏），
    # 再放开以下源文件并链接：
    # host/core/Source/usbh_core.c
    # host/core/Source/usbh_enum.c
    # host/core/Source/usbh_pipe.c
    # host/core/Source/usbh_transc.c
    # host/class/hid/Source/usbh_hid_core.c
    # host/class/hid/Source/usbh_standard_hid.c
    # host/class/msc/Source/usbh_msc_bbb.c
    # host/class/msc/Source/usbh_msc_core.c
    # host/class/msc/Source/usbh_msc_scsi.c
    # host/class/msc/Source/usbh_msc_fatfs.c  # 另依赖 fat_fs（Demo Suites Utilities/Third_Party）
)

add_library(GD32F4xx_usb_library OBJECT ${USB_SRC})

target_include_directories(GD32F4xx_usb_library PUBLIC
    ${CMAKE_CURRENT_SOURCE_DIR}/conf
    ${CMAKE_CURRENT_SOURCE_DIR}/driver/Include
    ${CMAKE_CURRENT_SOURCE_DIR}/device/core/Include
    ${CMAKE_CURRENT_SOURCE_DIR}/device/class/audio/Include
    ${CMAKE_CURRENT_SOURCE_DIR}/device/class/cdc/Include
    ${CMAKE_CURRENT_SOURCE_DIR}/device/class/dfu/Include
    ${CMAKE_CURRENT_SOURCE_DIR}/device/class/hid/Include
    ${CMAKE_CURRENT_SOURCE_DIR}/device/class/iap/Include
    ${CMAKE_CURRENT_SOURCE_DIR}/device/class/msc/Include
    ${CMAKE_CURRENT_SOURCE_DIR}/device/class/printer/Include
    ${CMAKE_CURRENT_SOURCE_DIR}/host/core/Include
    ${CMAKE_CURRENT_SOURCE_DIR}/host/class/hid/Include
    ${CMAKE_CURRENT_SOURCE_DIR}/host/class/msc/Include
    ${CMAKE_CURRENT_SOURCE_DIR}/ustd
    ${CMAKE_CURRENT_SOURCE_DIR}/ustd/common
    ${CMAKE_CURRENT_SOURCE_DIR}/ustd/class/cdc
    ${CMAKE_CURRENT_SOURCE_DIR}/ustd/class/hid
    ${CMAKE_CURRENT_SOURCE_DIR}/ustd/class/msc
)

target_compile_definitions(GD32F4xx_usb_library PUBLIC GD32F405)
# GD32F405 仅集成 USBFS（全速）核心；USE_USB_FS 原例程由 Keil 工程宏传入
target_compile_definitions(GD32F4xx_usb_library PUBLIC USE_USB_FS)

# USB 库依赖标准外设库（RCU/GPIO 等）
target_link_libraries(GD32F4xx_usb_library PUBLIC CMSIS GD32F4xx_standard_peripheral)
