CMakeLists.txt 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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/bt/bt_control_stub.c
  42. ${CMAKE_CURRENT_SOURCE_DIR}/src/bt/bt_host.c
  43. ${CMAKE_CURRENT_SOURCE_DIR}/src/bt/bt_valve.c
  44. ${CMAKE_CURRENT_SOURCE_DIR}/src/bt/bt_hogp.c
  45. ${CMAKE_CURRENT_SOURCE_DIR}/src/bt/input_driver.c
  46. ${CMAKE_CURRENT_SOURCE_DIR}/src/bt/drv_xinput.c
  47. ${CMAKE_CURRENT_SOURCE_DIR}/src/bt/drv_sc2.c
  48. ${CMAKE_CURRENT_SOURCE_DIR}/src/bt/drv_ds4.c
  49. )
  50. target_include_directories(picopuck PRIVATE
  51. ${CMAKE_CURRENT_SOURCE_DIR}/src
  52. ${CMAKE_CURRENT_SOURCE_DIR}/src/config
  53. )
  54. target_compile_definitions(picopuck PRIVATE
  55. CYW43_LWIP=0 # no networking; we only use the radio for BT
  56. BTSTACK_USE_CYW43=1 # BTstack runs on the CYW43 async_context
  57. ENABLE_BTSTACK=1
  58. PICOPUCK_GIT_COMMIT="${PICOPUCK_GIT_COMMIT}"
  59. )
  60. # LED blink + BT radio need cyw43_arch. The _poll variant (no background IRQ
  61. # thread) is what BTstack-on-CYW43 uses; it is serviced by cyw43_arch_poll().
  62. # USB (tinyusb_device) and BTstack libraries are added in later phases.
  63. target_link_libraries(picopuck PRIVATE
  64. pico_stdlib
  65. pico_unique_id
  66. pico_cyw43_arch_poll
  67. pico_btstack_ble
  68. pico_btstack_classic
  69. pico_btstack_cyw43
  70. tinyusb_device
  71. tinyusb_board
  72. )
  73. # Debug console on UART (GP0/GP1); USB is reserved for the puck interfaces.
  74. pico_enable_stdio_uart(picopuck 1)
  75. pico_enable_stdio_usb(picopuck 0)
  76. pico_add_extra_outputs(picopuck)
  77. # Name the UF2 per board so both artifacts can live side by side.
  78. set_target_properties(picopuck PROPERTIES OUTPUT_NAME "picopuck_${PICO_BOARD}")
  79. message(STATUS "PicoPuck: board=${PICO_BOARD} commit=${PICOPUCK_GIT_COMMIT}")