From 9d35f201dd8943d949b1a6099e45fdaa45615a89 Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Mon, 31 Aug 2020 14:10:47 +0200 Subject: [PATCH] test/auto-pts: make LE-only --- test/auto-pts/CMakeLists.txt | 38 ++--- test/auto-pts/btpclient.c | 21 ++- test/auto-pts/btstack_config.h | 10 +- test/auto-pts/main.c | 245 +++++++++++++++++++++++++++++++++ 4 files changed, 285 insertions(+), 29 deletions(-) create mode 100644 test/auto-pts/main.c diff --git a/test/auto-pts/CMakeLists.txt b/test/auto-pts/CMakeLists.txt index b86001867..68166f144 100644 --- a/test/auto-pts/CMakeLists.txt +++ b/test/auto-pts/CMakeLists.txt @@ -11,12 +11,12 @@ link_libraries( usb-1.0 ) # add all directories include_directories(../../3rd-party/micro-ecc) -include_directories(../../3rd-party/bluedroid/decoder/include) -include_directories(../../3rd-party/bluedroid/encoder/include) -include_directories(../../3rd-party/md5) -include_directories(../../3rd-party/hxcmod-player) -include_directories(../../3rd-party/hxcmod-player/mod) -include_directories(../../3rd-party/yxml) +# include_directories(../../3rd-party/bluedroid/decoder/include) +# include_directories(../../3rd-party/bluedroid/encoder/include) +# include_directories(../../3rd-party/md5) +# include_directories(../../3rd-party/hxcmod-player) +# include_directories(../../3rd-party/hxcmod-player/mod) +# include_directories(../../3rd-party/yxml) include_directories(../../3rd-party/tinydir) include_directories(../../chipset/zephyr) include_directories(../../src) @@ -31,14 +31,14 @@ include_directories(..) file(GLOB SOURCES_SRC "../../src/*.c" "../../example/sco_demo_util.c") file(GLOB SOURCES_BLE "../../src/ble/*.c") file(GLOB SOURCES_GATT "../../src/ble/gatt-service/*.c") -file(GLOB SOURCES_CLASSIC "../../src/classic/*.c") -file(GLOB SOURCES_BLUEDROID "../../3rd-party/bluedroid/encoder/srce/*.c" "../../3rd-party/bluedroid/decoder/srce/*.c") -file(GLOB SOURCES_MD5 "../../3rd-party/md5/md5.c") -file(GLOB SOURCES_UECC "../../3rd-party/micro-ecc/uECC.c") -file(GLOB SOURCES_YXML "../../3rd-party/yxml/yxml.c") -file(GLOB SOURCES_HXCMOD "../../3rd-party/hxcmod-player/*.c" "../../3rd-party/hxcmod-player/mods/*.c") +# file(GLOB SOURCES_CLASSIC "../../src/classic/*.c") +# file(GLOB SOURCES_BLUEDROID "../../3rd-party/bluedroid/encoder/srce/*.c" "../../3rd-party/bluedroid/decoder/srce/*.c") +# file(GLOB SOURCES_MD5 "../../3rd-party/md5/md5.c") +# file(GLOB SOURCES_UECC "../../3rd-party/micro-ecc/uECC.c") +# file(GLOB SOURCES_YXML "../../3rd-party/yxml/yxml.c") +# file(GLOB SOURCES_HXCMOD "../../3rd-party/hxcmod-player/*.c" "../../3rd-party/hxcmod-player/mods/*.c") file(GLOB SOURCES_POSIX "../../platform/posix/*.c") -file(GLOB SOURCES_LIBUSB "../../port/libusb/*.c" "../../platform/libusb/*.c") +file(GLOB SOURCES_LIBUSB "../../platform/libusb/*.c") file(GLOB SOURCES_ZEPHYR "../../chipset/zephyr/*.c") # remove some @@ -48,17 +48,17 @@ file(GLOB SOURCES_POSIX_OFF "../../platform/posix/le_device_db_fs.c") list(REMOVE_ITEM SOURCES_POSIX ${SOURCES_POSIX_OFF}) set(SOURCES - ${SOURCES_MD5} - ${SOURCES_YXML} - ${SOURCES_BLUEDROID} +# ${SOURCES_MD5} +# ${SOURCES_YXML} +# ${SOURCES_BLUEDROID} ${SOURCES_POSIX} ${SOURCES_LIBUSB} ${SOURCES_SRC} ${SOURCES_BLE} ${SOURCES_GATT} - ${SOURCES_CLASSIC} +# ${SOURCES_CLASSIC} ${SOURCES_UECC} - ${SOURCES_HXCMOD} +# ${SOURCES_HXCMOD} ${SOURCES_ZEPHYR} ) @@ -73,7 +73,7 @@ add_library(btstack STATIC ${SOURCES}) set (EXAMPLE btpclient) # create targets -set (SOURCE_FILES ${EXAMPLE}.c btp_socket.c) +set (SOURCE_FILES ${EXAMPLE}.c main.c btp_socket.c) add_executable(${EXAMPLE} ${SOURCE_FILES} ) target_link_libraries(${EXAMPLE} btstack) diff --git a/test/auto-pts/btpclient.c b/test/auto-pts/btpclient.c index 784b332a3..c228cd9cb 100644 --- a/test/auto-pts/btpclient.c +++ b/test/auto-pts/btpclient.c @@ -245,7 +245,9 @@ static void btstack_packet_handler (uint8_t packet_type, uint16_t channel, uint8 if (gap_delete_bonding){ MESSAGE("Delete all bonding information"); gap_delete_bonding = false; +#ifdef ENABLE_CLASSIC gap_delete_all_link_keys(); +#endif le_device_delete_all(); } @@ -809,9 +811,9 @@ static void btp_gap_handler(uint8_t opcode, uint8_t controller_index, uint16_t l MESSAGE("BTP_GAP_OP_SET_DISCOVERABLE"); if (controller_index == 0){ uint8_t discoverable = data[0]; - // Classic +#ifdef ENABLE_CLASSIC // Classic gap_discoverable_control(discoverable > 0); - +#endif switch (discoverable) { case BTP_GAP_DISCOVERABLE_NON: ad_flags &= ~(BT_LE_AD_GENERAL | BT_LE_AD_LIMITED); @@ -992,7 +994,9 @@ static void btp_gap_handler(uint8_t opcode, uint8_t controller_index, uint16_t l } if (flags & BTP_GAP_DISCOVERY_FLAG_BREDR){ gap_inquriy_scan_active = 1; +#ifdef ENABLE_CLASSIC gap_inquiry_start(15); +#endif } btp_send(BTP_SERVICE_ID_GAP, opcode, controller_index, 0, NULL); } @@ -1003,7 +1007,9 @@ static void btp_gap_handler(uint8_t opcode, uint8_t controller_index, uint16_t l gap_stop_scan(); if (gap_inquriy_scan_active){ gap_inquriy_scan_active = 0; +#ifdef ENABLE_CLASSIC gap_inquiry_stop(); +#endif } btp_send(BTP_SERVICE_ID_GAP, opcode, controller_index, 0, NULL); } @@ -1040,7 +1046,9 @@ static void btp_gap_handler(uint8_t opcode, uint8_t controller_index, uint16_t l MESSAGE("BTP_GAP_OP_SET_IO_CAPA"); if (controller_index == 0){ uint8_t io_capabilities = data[0]; +#ifdef ENABLE_CLASSIC gap_ssp_set_io_capability(io_capabilities); +#endif sm_set_io_capabilities( (io_capability_t) io_capabilities); btp_send(BTP_SERVICE_ID_GAP, opcode, controller_index, 0, NULL); } @@ -1059,7 +1067,9 @@ static void btp_gap_handler(uint8_t opcode, uint8_t controller_index, uint16_t l // uint8_t command_addr_type = data[0]; bd_addr_t command_addr; reverse_bd_addr(&data[1], command_addr); +#ifdef ENABLE_CLASSIC gap_drop_link_key_for_bd_addr(command_addr); +#endif le_device_delete_all(); btp_send(BTP_SERVICE_ID_GAP, opcode, controller_index, 0, NULL); } @@ -1864,8 +1874,10 @@ int btstack_main(int argc, const char * argv[]) (void)argv; l2cap_init(); +#ifdef ENABLE_CLASSIC rfcomm_init(); sdp_init(); +#endif le_device_db_init(); sm_init(); @@ -1885,7 +1897,9 @@ int btstack_main(int argc, const char * argv[]) sm_add_event_handler(&sm_event_callback_registration); // configure GAP +#ifdef ENABLE_CLASSIC gap_ssp_set_io_capability(SSP_IO_CAPABILITY_DISPLAY_YES_NO); +#endif strcpy(gap_name, "iut 00:00:00:00:00:00"); gap_set_local_name(gap_name); @@ -1893,8 +1907,9 @@ int btstack_main(int argc, const char * argv[]) strcpy(gap_short_name, "iut"); gap_cod = 0x007a020c; // smartphone +#ifdef ENABLE_CLASSIC gap_set_class_of_device(gap_cod); - +#endif // delete all bonding information on start gap_delete_bonding = true; diff --git a/test/auto-pts/btstack_config.h b/test/auto-pts/btstack_config.h index 300ec4236..2b8d133db 100644 --- a/test/auto-pts/btstack_config.h +++ b/test/auto-pts/btstack_config.h @@ -7,6 +7,7 @@ // Port related features #define HAVE_MALLOC +#define HAVE_ASSERT #define HAVE_POSIX_TIME #define HAVE_POSIX_FILE_IO #define HAVE_BTSTACK_STDIN @@ -15,19 +16,14 @@ // BTstack features that can be enabled #define ENABLE_BLE -#define ENABLE_CLASSIC // #define ENABLE_LOG_DEBUG -// #define ENABLE_GATT_CLIENT_PAIRING +#define ENABLE_GATT_CLIENT_PAIRING #define ENABLE_LOG_ERROR #define ENABLE_LOG_INFO -#define ENABLE_SDP_DES_DUMP -#define ENABLE_SDP_EXTRA_QUERIES -// #define ENABLE_LE_SECURE_CONNECTIONS +#define ENABLE_LE_SECURE_CONNECTIONS #define ENABLE_LE_SIGNED_WRITE #define ENABLE_LE_PERIPHERAL #define ENABLE_LE_CENTRAL -#define ENABLE_SDP_EXTRA_QUERIES -#define ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE #define ENABLE_BTP // BTstack configuration. buffers, sizes, ... diff --git a/test/auto-pts/main.c b/test/auto-pts/main.c new file mode 100644 index 000000000..237faaf5c --- /dev/null +++ b/test/auto-pts/main.c @@ -0,0 +1,245 @@ +/* + * Copyright (C) 2014 BlueKitchen GmbH + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * 4. Any redistribution, use, or modification is done solely for + * personal benefit and not for any commercial purpose or for + * monetary gain. + * + * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS + * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Please inquire about commercial licensing options at + * contact@bluekitchen-gmbh.com + * + */ + +#define __BTSTACK_FILE__ "main.c" + +// ***************************************************************************** +// +// minimal setup for HCI code +// +// ***************************************************************************** + +#include +#include +#include +#include +#include + +#include "btstack_config.h" + +#include "bluetooth_company_id.h" +#include "btstack_debug.h" +#include "btstack_event.h" +#include "ble/le_device_db_tlv.h" +#include "classic/btstack_link_key_db_tlv.h" +#include "btstack_memory.h" +#include "btstack_run_loop.h" +#include "btstack_run_loop_posix.h" +#include "hal_led.h" +#include "hci.h" +#include "hci_dump.h" +#include "btstack_stdin.h" +#include "btstack_audio.h" +#include "btstack_tlv_posix.h" +#include "btstack_chipset_zephyr.h" + +#define TLV_DB_PATH_PREFIX "/tmp/btstack_" +#define TLV_DB_PATH_POSTFIX ".tlv" +static char tlv_db_path[100]; +static const btstack_tlv_t * tlv_impl; +static btstack_tlv_posix_t tlv_context; +static bd_addr_t local_addr; + +int btstack_main(int argc, const char * argv[]); + +static const uint8_t read_static_address_command_complete_prefix[] = { 0x0e, 0x1b, 0x01, 0x09, 0xfc }; + +static bd_addr_t static_address; +static int using_static_address; + +static btstack_packet_callback_registration_t hci_event_callback_registration; + +static void local_version_information_handler(uint8_t * packet){ + printf("Local version information:\n"); + uint16_t hci_version = packet[6]; + uint16_t hci_revision = little_endian_read_16(packet, 7); + uint16_t lmp_version = packet[9]; + uint16_t manufacturer = little_endian_read_16(packet, 10); + uint16_t lmp_subversion = little_endian_read_16(packet, 12); + printf("- HCI Version 0x%04x\n", hci_version); + printf("- HCI Revision 0x%04x\n", hci_revision); + printf("- LMP Version 0x%04x\n", lmp_version); + printf("- LMP Subversion 0x%04x\n", lmp_subversion); + printf("- Manufacturer 0x%04x\n", manufacturer); + switch (manufacturer){ + case BLUETOOTH_COMPANY_ID_THE_LINUX_FOUNDATION: + printf("Linux Foundation - assume Zephyr hci_usb example running on nRF52xx\n"); + hci_set_chipset(btstack_chipset_zephyr_instance()); + break; + default: + break; + } +} + +static void packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ + UNUSED(channel); + UNUSED(size); + if (packet_type != HCI_EVENT_PACKET) return; + switch (hci_event_packet_get_type(packet)){ + case BTSTACK_EVENT_STATE: + switch (btstack_event_state_get_state(packet)){ + case HCI_STATE_WORKING: + gap_local_bd_addr(local_addr); + if (using_static_address){ + memcpy(local_addr, static_address, 6); + } + printf("BTstack up and running on %s.\n", bd_addr_to_str(local_addr)); + strcpy(tlv_db_path, TLV_DB_PATH_PREFIX); + strcat(tlv_db_path, bd_addr_to_str(local_addr)); + strcat(tlv_db_path, TLV_DB_PATH_POSTFIX); + tlv_impl = btstack_tlv_posix_init_instance(&tlv_context, tlv_db_path); + btstack_tlv_set_instance(tlv_impl, &tlv_context); +#ifdef ENABLE_CLASSIC + hci_set_link_key_db(btstack_link_key_db_tlv_get_instance(tlv_impl, &tlv_context)); +#endif +#ifdef ENABLE_BLE + le_device_db_tlv_configure(tlv_impl, &tlv_context); +#endif + break; + case HCI_STATE_OFF: + btstack_tlv_posix_deinit(&tlv_context); + break; + default: + break; + } + if (btstack_event_state_get_state(packet) != HCI_STATE_WORKING) return; + break; + case HCI_EVENT_COMMAND_COMPLETE: + if (HCI_EVENT_IS_COMMAND_COMPLETE(packet, hci_read_local_version_information)){ + local_version_information_handler(packet); + } + if (memcmp(packet, read_static_address_command_complete_prefix, sizeof(read_static_address_command_complete_prefix)) == 0){ + reverse_48(&packet[7], static_address); + gap_random_address_set(static_address); + using_static_address = 1; + } + break; + default: + break; + } +} + +static void sigint_handler(int param){ + UNUSED(param); + + printf("CTRL-C - SIGINT received, shutting down..\n"); + log_info("sigint_handler: shutting down"); + + // reset anyway + btstack_stdin_reset(); + + // power down + hci_power_control(HCI_POWER_OFF); + hci_close(); + log_info("Good bye, see you.\n"); + exit(0); +} + +static int led_state = 0; +void hal_led_toggle(void){ + led_state = 1 - led_state; + printf("LED State %u\n", led_state); +} + +#define USB_MAX_PATH_LEN 7 +int main(int argc, const char * argv[]){ + + uint8_t usb_path[USB_MAX_PATH_LEN]; + int usb_path_len = 0; + const char * usb_path_string = NULL; + if (argc >= 3 && strcmp(argv[1], "-u") == 0){ + // parse command line options for "-u 11:22:33" + usb_path_string = argv[2]; + printf("Specified USB Path: "); + while (1){ + char * delimiter; + int port = strtol(usb_path_string, &delimiter, 16); + usb_path[usb_path_len] = port; + usb_path_len++; + printf("%02x ", port); + if (!delimiter) break; + if (*delimiter != ':' && *delimiter != '-') break; + usb_path_string = delimiter+1; + } + printf("\n"); + argc -= 2; + memmove(&argv[1], &argv[3], (argc-1) * sizeof(char *)); + } + + /// GET STARTED with BTstack /// + btstack_memory_init(); + btstack_run_loop_init(btstack_run_loop_posix_get_instance()); + + if (usb_path_len){ + hci_transport_usb_set_path(usb_path_len, usb_path); + } + + // use logger: format HCI_DUMP_PACKETLOGGER, HCI_DUMP_BLUEZ or HCI_DUMP_STDOUT + + char pklg_path[100]; + strcpy(pklg_path, "/tmp/hci_dump"); + if (usb_path_len){ + strcat(pklg_path, "_"); + strcat(pklg_path, usb_path_string); + } + strcat(pklg_path, ".pklg"); + printf("Packet Log: %s\n", pklg_path); + hci_dump_open(pklg_path, HCI_DUMP_PACKETLOGGER); + + // init HCI + hci_init(hci_transport_usb_instance(), NULL); + +#ifdef HAVE_PORTAUDIO + btstack_audio_sink_set_instance(btstack_audio_portaudio_sink_get_instance()); + btstack_audio_source_set_instance(btstack_audio_portaudio_source_get_instance()); +#endif + + // inform about BTstack state + hci_event_callback_registration.callback = &packet_handler; + hci_add_event_handler(&hci_event_callback_registration); + + // handle CTRL-c + signal(SIGINT, sigint_handler); + + // setup app + btstack_main(argc, argv); + + // go + btstack_run_loop_execute(); + + return 0; +}