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)