399 lines
15 KiB
CMake
399 lines
15 KiB
CMake
add_subdirectory(standalone)
|
|
|
|
set(BTSTACK_ROOT ${PICO_SDK_PATH}/lib/btstack)
|
|
set(BTSTACK_EXAMPLE_PATH ${BTSTACK_ROOT}/example)
|
|
set(BTSTACK_3RD_PARTY_PATH ${BTSTACK_ROOT}/3rd-party)
|
|
set(BT_EXAMPLE_COMMON_DIR "${CMAKE_CURRENT_LIST_DIR}")
|
|
|
|
if (NOT PICO_EXTRAS_PATH)
|
|
message("Skipping some Pico W BTstack examples that require pico-extras")
|
|
else()
|
|
add_library(pico_btstack_audio_example INTERFACE)
|
|
target_sources(pico_btstack_audio_example INTERFACE
|
|
${PICO_BTSTACK_PATH}/src/btstack_audio.c
|
|
${CMAKE_CURRENT_LIST_DIR}/btstack_audio_pico.c
|
|
)
|
|
target_link_libraries(pico_btstack_audio_example INTERFACE
|
|
pico_audio_i2s
|
|
)
|
|
endif()
|
|
|
|
# mod player used by a2dp_source_demo and mod_player and demo song
|
|
add_library(pico_btstack_hxcmod_player INTERFACE)
|
|
target_sources(pico_btstack_hxcmod_player INTERFACE
|
|
${BTSTACK_3RD_PARTY_PATH}/hxcmod-player/hxcmod.c
|
|
${BTSTACK_3RD_PARTY_PATH}/hxcmod-player/mods/nao-deceased_by_disease.c
|
|
)
|
|
target_include_directories(pico_btstack_hxcmod_player INTERFACE
|
|
${BTSTACK_3RD_PARTY_PATH}/hxcmod-player
|
|
${BTSTACK_3RD_PARTY_PATH}/hxcmod-player/mods
|
|
)
|
|
|
|
add_library(pico_btstack_sco_demo_util INTERFACE)
|
|
target_sources(pico_btstack_sco_demo_util INTERFACE
|
|
# sco demo utils
|
|
${BTSTACK_EXAMPLE_PATH}/sco_demo_util.c
|
|
)
|
|
|
|
# Adds common stuff for all the examples
|
|
add_library(picow_bt_example_common INTERFACE)
|
|
target_sources(picow_bt_example_common INTERFACE
|
|
${CMAKE_CURRENT_LIST_DIR}/picow_bt_example_common.c
|
|
)
|
|
target_link_libraries(picow_bt_example_common INTERFACE
|
|
pico_stdlib
|
|
pico_btstack_ble
|
|
pico_btstack_classic
|
|
pico_btstack_cyw43
|
|
)
|
|
target_include_directories(picow_bt_example_common INTERFACE
|
|
${BT_EXAMPLE_COMMON_DIR}/config # Use our own config
|
|
${BTSTACK_EXAMPLE_PATH}/
|
|
)
|
|
target_compile_definitions(picow_bt_example_common INTERFACE
|
|
PICO_STDIO_USB_CONNECT_WAIT_TIMEOUT_MS=3000
|
|
#WANT_HCI_DUMP=1 # This enables btstack debug
|
|
#ENABLE_SEGGER_RTT=1
|
|
)
|
|
if (TARGET pico_btstack_audio_example)
|
|
target_link_libraries(picow_bt_example_common INTERFACE
|
|
pico_btstack_audio_example
|
|
)
|
|
target_compile_definitions(picow_bt_example_common INTERFACE
|
|
TEST_AUDIO=1
|
|
)
|
|
endif()
|
|
|
|
# Adds stuff needed for cyw43 lwip
|
|
add_library(picow_bt_example_cyw43_lwip INTERFACE)
|
|
target_link_libraries(picow_bt_example_cyw43_lwip INTERFACE
|
|
picow_bt_example_common
|
|
)
|
|
target_compile_definitions(picow_bt_example_cyw43_lwip INTERFACE
|
|
WIFI_SSID=\"${WIFI_SSID}\"
|
|
WIFI_PASSWORD=\"${WIFI_PASSWORD}\"
|
|
CYW43_LWIP=1
|
|
)
|
|
target_link_libraries(picow_bt_example_cyw43_lwip INTERFACE
|
|
pico_lwip_iperf
|
|
)
|
|
target_include_directories(picow_bt_example_cyw43_lwip INTERFACE
|
|
${CMAKE_CURRENT_LIST_DIR}/../wifi # for our common lwipopts
|
|
)
|
|
|
|
# disables cyw43 lwip
|
|
add_library(picow_bt_example_no_cyw43_lwip INTERFACE)
|
|
target_link_libraries(picow_bt_example_no_cyw43_lwip INTERFACE
|
|
picow_bt_example_common
|
|
)
|
|
target_compile_definitions(picow_bt_example_no_cyw43_lwip INTERFACE
|
|
CYW43_LWIP=0
|
|
)
|
|
|
|
# variant: no cyw43 lwip | poll
|
|
add_library(picow_bt_example_no_cyw43_lwip_poll INTERFACE)
|
|
target_sources(picow_bt_example_no_cyw43_lwip_poll INTERFACE
|
|
${BT_EXAMPLE_COMMON_DIR}/picow_bt_example_poll.c
|
|
)
|
|
target_link_libraries(picow_bt_example_no_cyw43_lwip_poll INTERFACE
|
|
picow_bt_example_no_cyw43_lwip
|
|
pico_cyw43_arch_poll
|
|
)
|
|
|
|
# variant: cyw43 lwip | poll
|
|
add_library(picow_bt_example_cyw43_lwip_poll INTERFACE)
|
|
target_sources(picow_bt_example_cyw43_lwip_poll INTERFACE
|
|
${BT_EXAMPLE_COMMON_DIR}/picow_bt_example_poll.c
|
|
)
|
|
target_link_libraries(picow_bt_example_cyw43_lwip_poll INTERFACE
|
|
picow_bt_example_cyw43_lwip
|
|
pico_cyw43_arch_lwip_poll
|
|
)
|
|
|
|
# variant: btstack lwip | poll
|
|
add_library(picow_bt_example_btstack_lwip_poll INTERFACE)
|
|
target_sources(picow_bt_example_btstack_lwip_poll INTERFACE
|
|
${BT_EXAMPLE_COMMON_DIR}/picow_bt_example_poll.c
|
|
)
|
|
target_link_libraries(picow_bt_example_btstack_lwip_poll INTERFACE
|
|
picow_bt_example_no_cyw43_lwip
|
|
pico_cyw43_arch_poll
|
|
pico_lwip_nosys
|
|
pico_btstack_bnep_lwip
|
|
)
|
|
target_include_directories(picow_bt_example_btstack_lwip_poll INTERFACE
|
|
${CMAKE_CURRENT_LIST_DIR}/../wifi # for our common lwipopts
|
|
)
|
|
|
|
# variant: no cyw43 lwip | background
|
|
add_library(picow_bt_example_no_cyw43_lwip_background INTERFACE)
|
|
target_sources(picow_bt_example_no_cyw43_lwip_background INTERFACE
|
|
${BT_EXAMPLE_COMMON_DIR}/picow_bt_example_background.c
|
|
)
|
|
target_link_libraries(picow_bt_example_no_cyw43_lwip_background INTERFACE
|
|
picow_bt_example_no_cyw43_lwip
|
|
pico_cyw43_arch_threadsafe_background
|
|
)
|
|
|
|
# variant: cyw43 lwip | background
|
|
add_library(picow_bt_example_cyw43_lwip_background INTERFACE)
|
|
target_sources(picow_bt_example_cyw43_lwip_background INTERFACE
|
|
${BT_EXAMPLE_COMMON_DIR}/picow_bt_example_background.c
|
|
)
|
|
target_link_libraries(picow_bt_example_cyw43_lwip_background INTERFACE
|
|
picow_bt_example_cyw43_lwip
|
|
pico_cyw43_arch_lwip_threadsafe_background
|
|
)
|
|
|
|
# variant: btstack lwip | background
|
|
add_library(picow_bt_example_btstack_lwip_background INTERFACE)
|
|
target_sources(picow_bt_example_btstack_lwip_background INTERFACE
|
|
${BT_EXAMPLE_COMMON_DIR}/picow_bt_example_background.c
|
|
)
|
|
target_link_libraries(picow_bt_example_btstack_lwip_background INTERFACE
|
|
picow_bt_example_no_cyw43_lwip
|
|
pico_cyw43_arch_threadsafe_background
|
|
pico_lwip_nosys
|
|
pico_btstack_bnep_lwip
|
|
)
|
|
target_include_directories(picow_bt_example_btstack_lwip_background INTERFACE
|
|
${CMAKE_CURRENT_LIST_DIR}/../wifi # for our common lwipopts
|
|
)
|
|
|
|
if (FREERTOS_KERNEL_PATH OR DEFINED ENV{FREERTOS_KERNEL_PATH})
|
|
include(FreeRTOS_Kernel_import.cmake)
|
|
endif()
|
|
|
|
if (TARGET FreeRTOS-Kernel)
|
|
# common freertos stuff
|
|
add_library(picow_bt_example_common_freertos INTERFACE)
|
|
target_sources(picow_bt_example_common_freertos INTERFACE
|
|
${BT_EXAMPLE_COMMON_DIR}/picow_bt_example_freertos.c
|
|
)
|
|
target_link_libraries(picow_bt_example_common_freertos INTERFACE
|
|
picow_bt_example_common
|
|
FreeRTOS-Kernel-Heap4 # FreeRTOS kernel and dynamic heap
|
|
)
|
|
target_compile_definitions(picow_bt_example_common_freertos INTERFACE
|
|
CYW43_TASK_STACK_SIZE=1024
|
|
NO_SYS=0
|
|
)
|
|
target_include_directories(picow_bt_example_common_freertos INTERFACE
|
|
${FREERTOS_KERNEL_PATH}/include
|
|
${FREERTOS_KERNEL_PATH}/portable/ThirdParty/GCC/RP2040/include
|
|
)
|
|
|
|
# variant: no cyw43 lwip | freertos
|
|
add_library(picow_bt_example_no_cyw43_lwip_freertos INTERFACE)
|
|
target_link_libraries(picow_bt_example_no_cyw43_lwip_freertos INTERFACE
|
|
picow_bt_example_common_freertos
|
|
picow_bt_example_no_cyw43_lwip
|
|
pico_cyw43_arch_sys_freertos
|
|
)
|
|
|
|
# variant: cyw43 lwip | freertos
|
|
add_library(picow_bt_example_cyw43_lwip_freertos INTERFACE)
|
|
target_link_libraries(picow_bt_example_cyw43_lwip_freertos INTERFACE
|
|
picow_bt_example_common_freertos
|
|
picow_bt_example_cyw43_lwip
|
|
pico_cyw43_arch_lwip_sys_freertos
|
|
)
|
|
target_compile_definitions(picow_bt_example_cyw43_lwip_freertos INTERFACE
|
|
HAVE_LWIP=1 # stops btstack calling lwip_init
|
|
)
|
|
|
|
# variant: btstack lwip | freertos
|
|
add_library(picow_bt_example_btstack_lwip_freertos INTERFACE)
|
|
target_link_libraries(picow_bt_example_btstack_lwip_freertos INTERFACE
|
|
picow_bt_example_common_freertos
|
|
picow_bt_example_no_cyw43_lwip
|
|
pico_cyw43_arch_sys_freertos
|
|
pico_btstack_bnep_lwip_sys_freertos
|
|
pico_lwip_freertos
|
|
)
|
|
target_include_directories(picow_bt_example_btstack_lwip_freertos INTERFACE
|
|
${CMAKE_CURRENT_LIST_DIR}/../wifi # for our common lwipopts
|
|
)
|
|
target_compile_definitions(picow_bt_example_btstack_lwip_freertos INTERFACE
|
|
HAVE_LWIP=1 # stops btstack calling lwip_init
|
|
)
|
|
endif()
|
|
|
|
# Common stuff for all examples. Pass the example name
|
|
function(picow_bt_example_common NAME)
|
|
if (NOT TARGET picow_bt_example_common_${NAME})
|
|
add_library(picow_bt_example_common_${NAME} INTERFACE)
|
|
target_sources(picow_bt_example_common_${NAME} INTERFACE
|
|
# actual example
|
|
${BTSTACK_EXAMPLE_PATH}/${NAME}.c
|
|
)
|
|
if (EXISTS "${BTSTACK_EXAMPLE_PATH}/${NAME}.gatt")
|
|
pico_btstack_make_gatt_header(picow_bt_example_common_${NAME} INTERFACE ${BTSTACK_EXAMPLE_PATH}/${NAME}.gatt)
|
|
endif()
|
|
endif()
|
|
endfunction()
|
|
|
|
# The type of example to build
|
|
if(NOT DEFINED BTSTACK_EXAMPLE_TYPE)
|
|
set(BTSTACK_EXAMPLE_TYPE "background")
|
|
endif()
|
|
if ((NOT BTSTACK_EXAMPLE_TYPE STREQUAL "poll") AND
|
|
(NOT BTSTACK_EXAMPLE_TYPE STREQUAL "background") AND
|
|
(NOT BTSTACK_EXAMPLE_TYPE STREQUAL "freertos") AND
|
|
(NOT BTSTACK_EXAMPLE_TYPE STREQUAL "all"))
|
|
message(FATAL_ERROR "Unknown BTSTACK_EXAMPLE_TYPE '${BTSTACK_EXAMPLE_TYPE}'; valid options are 'poll', 'background', 'freertos' or 'all'")
|
|
endif()
|
|
set(BTSTACK_EXAMPLE_TYPE "${BTSTACK_EXAMPLE_TYPE}" CACHE INTERNAL "BT stack example type (poll|background|freertos|all)")
|
|
|
|
# Add an poll example, pass btstack example name, target name, variant lib and extra libs
|
|
function(picow_bt_example_poll NAME TARGET_NAME VARIANT_LIB)
|
|
if ("${BTSTACK_EXAMPLE_TYPE}" STREQUAL "poll" OR "${BTSTACK_EXAMPLE_TYPE}" STREQUAL "all")
|
|
picow_bt_example_common(${NAME})
|
|
add_executable(${TARGET_NAME}_poll)
|
|
target_link_libraries(${TARGET_NAME}_poll PRIVATE
|
|
picow_bt_example_common_${NAME}
|
|
${VARIANT_LIB}
|
|
${ARGN} # extra libs
|
|
)
|
|
pico_add_extra_outputs(${TARGET_NAME}_poll)
|
|
example_auto_set_url(${TARGET_NAME}_poll)
|
|
endif()
|
|
endfunction()
|
|
|
|
# Add an background example, pass btstack example name, target name, variant lib and extra libs
|
|
function(picow_bt_example_background NAME TARGET_NAME VARIANT_LIB)
|
|
if ("${BTSTACK_EXAMPLE_TYPE}" STREQUAL "background" OR "${BTSTACK_EXAMPLE_TYPE}" STREQUAL "all")
|
|
picow_bt_example_common(${NAME})
|
|
add_executable(${TARGET_NAME}_background)
|
|
target_link_libraries(${TARGET_NAME}_background PRIVATE
|
|
picow_bt_example_common_${NAME}
|
|
${VARIANT_LIB}
|
|
${ARGN} # extra libs
|
|
)
|
|
pico_add_extra_outputs(${TARGET_NAME}_background)
|
|
example_auto_set_url(${TARGET_NAME}_background)
|
|
endif()
|
|
endfunction()
|
|
|
|
# Add a freertos example, pass btstack example name, target name, variant lib and extra libs
|
|
function(picow_bt_example_freertos NAME TARGET_NAME VARIANT_LIB)
|
|
if ("${BTSTACK_EXAMPLE_TYPE}" STREQUAL "freertos" OR "${BTSTACK_EXAMPLE_TYPE}" STREQUAL "all")
|
|
if (TARGET FreeRTOS-Kernel)
|
|
picow_bt_example_common(${NAME})
|
|
add_executable(${TARGET_NAME}_freertos)
|
|
target_link_libraries(${TARGET_NAME}_freertos PRIVATE
|
|
picow_bt_example_common_${NAME}
|
|
${VARIANT_LIB}
|
|
${ARGN} # extra libs
|
|
)
|
|
pico_add_extra_outputs(${TARGET_NAME}_freertos)
|
|
example_auto_set_url(${TARGET_NAME}_freertos)
|
|
endif()
|
|
endif()
|
|
endfunction()
|
|
|
|
# The default name of the bt example target
|
|
function(picow_bt_example_target_name NAME RET)
|
|
SET(${RET} "picow_bt_example_${NAME}" PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
# Make a btstack example, NAME should match source file in lib/btstack/example
|
|
# Extra parameters indicate extra libraries to link to
|
|
function(picow_bt_example NAME)
|
|
picow_bt_example_target_name(${NAME} TARGET_NAME)
|
|
picow_bt_example_poll(${NAME} ${TARGET_NAME} picow_bt_example_no_cyw43_lwip_poll ${ARGN})
|
|
picow_bt_example_background(${NAME} ${TARGET_NAME} picow_bt_example_no_cyw43_lwip_background ${ARGN})
|
|
picow_bt_example_freertos(${NAME} ${TARGET_NAME} picow_bt_example_no_cyw43_lwip_freertos ${ARGN})
|
|
endfunction()
|
|
|
|
# List of examples from btstack
|
|
include(${BTSTACK_ROOT}/example/CMakeLists.txt)
|
|
|
|
# Full list of bluetooth examples
|
|
set(BTSTACK_EXAMPLES
|
|
${EXAMPLES_GENERAL}
|
|
${EXAMPLES_CLASSIC_ONLY}
|
|
${EXAMPLES_LE_ONLY}
|
|
${EXAMPLES_DUAL_MODE}
|
|
pan_lwip_http_server
|
|
)
|
|
|
|
# These examples run wifi and bt at the same time
|
|
if (WIFI_SSID AND WIFI_PASSWORD)
|
|
list(APPEND BTSTACK_EXAMPLES
|
|
gatt_counter_with_wifi
|
|
gatt_streamer_server_with_wifi
|
|
#spp_streamer_with_wifi
|
|
)
|
|
endif()
|
|
|
|
# Extra examples that are not that interesting or a bit tricky to run
|
|
# They are not built unless BTSTACK_EXAMPLES_ALL=1
|
|
set(BTSTACK_EXAMPLES_ADDITIONAL
|
|
ancs_client_demo
|
|
att_delayed_response
|
|
avrcp_browsing_client
|
|
dut_mode_classic
|
|
gap_dedicated_bonding
|
|
gap_link_keys
|
|
le_credit_based_flow_control_mode_client
|
|
le_credit_based_flow_control_mode_server
|
|
le_mitm
|
|
led_counter
|
|
sdp_bnep_query
|
|
sdp_general_query
|
|
spp_flowcontrol
|
|
sdp_rfcomm_query
|
|
spp_and_gatt_counter
|
|
spp_and_gatt_streamer
|
|
hfp_ag_demo
|
|
hsp_ag_demo
|
|
hfp_hf_demo
|
|
hsp_hs_demo
|
|
mod_player
|
|
sine_player
|
|
ublox_spp_le_counter
|
|
nordic_spp_le_streamer
|
|
nordic_spp_le_counter
|
|
hog_boot_host_demo
|
|
gatt_battery_query
|
|
gatt_browser
|
|
gatt_device_information_query
|
|
le_streamer_client
|
|
)
|
|
|
|
# These examples will only be built if pico-extras exists
|
|
set(BTSTACK_EXAMPLES_NEED_EXTRAS
|
|
a2dp_sink_demo
|
|
hfp_hf_demo
|
|
hfp_ag_demo
|
|
hsp_ag_demo
|
|
hsp_hs_demo
|
|
mod_player
|
|
sine_player
|
|
)
|
|
|
|
# Add examples
|
|
set(BTSTACK_EXAMPLE_COUNT 0)
|
|
list(REMOVE_DUPLICATES BTSTACK_EXAMPLES)
|
|
foreach(NAME ${BTSTACK_EXAMPLES})
|
|
# Ignore if sub folder not found
|
|
if (NOT IS_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/${NAME})
|
|
continue()
|
|
endif()
|
|
# Ignore example if it needs pico-extras and pico-extras could not be found
|
|
if (NOT PICO_EXTRAS_PATH AND ${NAME} IN_LIST BTSTACK_EXAMPLES_NEED_EXTRAS)
|
|
continue()
|
|
endif()
|
|
# Ignore less interesting examples if BTSTACK_EXAMPLES_ALL=1 is not set
|
|
if (NOT BTSTACK_EXAMPLES_ALL AND ${NAME} IN_LIST BTSTACK_EXAMPLES_ADDITIONAL)
|
|
continue()
|
|
endif()
|
|
# add example
|
|
add_subdirectory(${NAME})
|
|
MATH(EXPR BTSTACK_EXAMPLE_COUNT "${BTSTACK_EXAMPLE_COUNT}+1")
|
|
endforeach()
|
|
message("Adding ${BTSTACK_EXAMPLE_COUNT} BTstack examples of type '${BTSTACK_EXAMPLE_TYPE}'")
|
|
|
|
suppress_btstack_warnings()
|