CMakeLists.txt 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. # PicoPuck — a Steam-Controller-2 puck emulator for Raspberry Pi Pico W / Pico 2 W.
  2. #
  3. # Presents the same Valve puck USB identity as OpenPuck (28DE:1304) while
  4. # connecting to controllers over Bluetooth (Classic + BLE) via the CYW43 radio
  5. # and BTstack. See README.md for the build instructions and PLAN/phase notes.
  6. #
  7. # SPDX-License-Identifier: AGPL-3.0-or-later
  8. cmake_minimum_required(VERSION 3.13)
  9. # Board must be chosen on the command line: -DPICO_BOARD=pico_w | pico2_w.
  10. if(NOT DEFINED PICO_BOARD)
  11. set(PICO_BOARD pico_w CACHE STRING "Target board (pico_w or pico2_w)")
  12. endif()
  13. # Pull in the SDK (PICO_SDK_PATH env var or -DPICO_SDK_PATH=...) before project().
  14. include(pico_sdk_import.cmake)
  15. project(picopuck C CXX ASM)
  16. set(CMAKE_C_STANDARD 11)
  17. set(CMAKE_CXX_STANDARD 17)
  18. pico_sdk_init()
  19. # --- version / build id -----------------------------------------------------
  20. execute_process(
  21. COMMAND git rev-parse --short HEAD
  22. WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  23. OUTPUT_VARIABLE PICOPUCK_GIT_COMMIT
  24. OUTPUT_STRIP_TRAILING_WHITESPACE
  25. ERROR_QUIET)
  26. if(NOT PICOPUCK_GIT_COMMIT)
  27. set(PICOPUCK_GIT_COMMIT "unknown")
  28. endif()
  29. add_executable(picopuck)
  30. target_sources(picopuck PRIVATE
  31. ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c
  32. ${CMAKE_CURRENT_SOURCE_DIR}/src/usb/usb_descriptors.c
  33. ${CMAKE_CURRENT_SOURCE_DIR}/src/usb/puck_desc.c
  34. ${CMAKE_CURRENT_SOURCE_DIR}/src/usb/usb_tx.c
  35. ${CMAKE_CURRENT_SOURCE_DIR}/src/usb/webusb.c
  36. ${CMAKE_CURRENT_SOURCE_DIR}/src/puck/identity.c
  37. ${CMAKE_CURRENT_SOURCE_DIR}/src/puck/slots.c
  38. ${CMAKE_CURRENT_SOURCE_DIR}/src/puck/personality.c
  39. ${CMAKE_CURRENT_SOURCE_DIR}/src/puck/relay.c
  40. ${CMAKE_CURRENT_SOURCE_DIR}/src/puck/triton.c
  41. ${CMAKE_CURRENT_SOURCE_DIR}/src/puck/chord.c
  42. ${CMAKE_CURRENT_SOURCE_DIR}/src/puck/emu.c
  43. ${CMAKE_CURRENT_SOURCE_DIR}/src/puck/emu_present.c
  44. ${CMAKE_CURRENT_SOURCE_DIR}/src/puck/mode_switch_hori.c
  45. ${CMAKE_CURRENT_SOURCE_DIR}/src/puck/mode_ds4.c
  46. ${CMAKE_CURRENT_SOURCE_DIR}/src/puck/mode_ps5.c
  47. ${CMAKE_CURRENT_SOURCE_DIR}/src/puck/mode_ps3.c
  48. ${CMAKE_CURRENT_SOURCE_DIR}/src/puck/mode_switch_pro.c
  49. ${CMAKE_CURRENT_SOURCE_DIR}/src/puck/xinput.c
  50. ${CMAKE_CURRENT_SOURCE_DIR}/src/sys/settings.c
  51. ${CMAKE_CURRENT_SOURCE_DIR}/src/sys/pplog.c
  52. ${CMAKE_CURRENT_SOURCE_DIR}/src/bt/bt_control_stub.c
  53. ${CMAKE_CURRENT_SOURCE_DIR}/src/bt/bt_host.c
  54. ${CMAKE_CURRENT_SOURCE_DIR}/src/bt/bt_valve.c
  55. ${CMAKE_CURRENT_SOURCE_DIR}/src/bt/bt_hogp.c
  56. ${CMAKE_CURRENT_SOURCE_DIR}/src/bt/input_driver.c
  57. ${CMAKE_CURRENT_SOURCE_DIR}/src/bt/drv_xinput.c
  58. ${CMAKE_CURRENT_SOURCE_DIR}/src/bt/drv_sc2.c
  59. ${CMAKE_CURRENT_SOURCE_DIR}/src/bt/drv_ds4.c
  60. # Shared source of truth, compiled by BOTH firmwares (see ../OpenPuck/src/common).
  61. ${CMAKE_CURRENT_SOURCE_DIR}/../OpenPuck/src/common/hid_reports.c
  62. ${CMAKE_CURRENT_SOURCE_DIR}/../OpenPuck/src/common/hd_rumble.c
  63. ${CMAKE_CURRENT_SOURCE_DIR}/../OpenPuck/src/common/gamepad_util.c
  64. ${CMAKE_CURRENT_SOURCE_DIR}/../OpenPuck/src/common/usb_mount.c
  65. ${CMAKE_CURRENT_SOURCE_DIR}/../OpenPuck/src/common/report_build.c
  66. )
  67. target_include_directories(picopuck PRIVATE
  68. ${CMAKE_CURRENT_SOURCE_DIR}/src
  69. ${CMAKE_CURRENT_SOURCE_DIR}/src/config
  70. ${CMAKE_CURRENT_SOURCE_DIR}/../OpenPuck/src/common
  71. )
  72. target_compile_definitions(picopuck PRIVATE
  73. CYW43_LWIP=0 # no networking; we only use the radio for BT
  74. BTSTACK_USE_CYW43=1 # BTstack runs on the CYW43 async_context
  75. ENABLE_BTSTACK=1
  76. PICOPUCK_GIT_COMMIT="${PICOPUCK_GIT_COMMIT}"
  77. )
  78. # LED blink + BT radio need cyw43_arch. The _poll variant (no background IRQ
  79. # thread) is what BTstack-on-CYW43 uses; it is serviced by cyw43_arch_poll().
  80. # USB (tinyusb_device) and BTstack libraries are added in later phases.
  81. target_link_libraries(picopuck PRIVATE
  82. pico_stdlib
  83. pico_unique_id
  84. pico_cyw43_arch_poll
  85. pico_btstack_ble
  86. pico_btstack_classic
  87. pico_btstack_cyw43
  88. tinyusb_device
  89. tinyusb_board
  90. )
  91. # Debug console on UART (GP0/GP1); USB is reserved for the puck interfaces.
  92. pico_enable_stdio_uart(picopuck 1)
  93. pico_enable_stdio_usb(picopuck 0)
  94. pico_add_extra_outputs(picopuck)
  95. # Name the UF2 per board so both artifacts can live side by side.
  96. set_target_properties(picopuck PROPERTIES OUTPUT_NAME "picopuck_${PICO_BOARD}")
  97. message(STATUS "PicoPuck: board=${PICO_BOARD} commit=${PICOPUCK_GIT_COMMIT}")