Merge branch 'develop' of https://github.com/bluekitchen/btstack into develop

This commit is contained in:
Milanka Ringwald 2018-04-24 15:53:58 +02:00
commit 72afcab0c3
44 changed files with 2108 additions and 1950 deletions

View File

@ -7,11 +7,13 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
## [Unreleased]
### Added
- Crypto: btstack_crypo.h provides cryptographic functions for random data generation, AES128, EEC, CBC-MAC (Mesh)
- SM: support pairing using Out-of-Band (OOB) data with LE Secure Connections
- Embedded: support btstack_stdin via SEGGER RTT
### Changed
- att_db_util: added security requirement arguments to characteristic creators
- SM: use btstack_crypto for cryptographpic functions
### Fixed
- HFP: fix answer call command

View File

@ -45,7 +45,7 @@ Build Status | Port | Platform
[<img src="http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-msp-exp430f5438-cc2564b-develop">](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-msp-exp430f5438-cc2564b-develop) | [msp-exp430f5438-cc2564b](https://github.com/bluekitchen/btstack/tree/develop/port/msp-exp430f5438-cc2564b) |[MSP430F5438 Experimenter Board for MSP430](http://www.ti.com/tool/msp-exp430f5438) with [Bluetooth CC2564 Module Evaluation Board](http://www.ti.com/tool/cc2564modnem)
[<img src="http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-msp430f5229lp-cc2564b-develop">](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-msp430f5229lp-cc2564b-develop) | [msp430f5529lp-cc2564b](https://github.com/bluekitchen/btstack/tree/develop/port/msp430f5229lp-cc2564b) | [MSP-EXP430F5529LP LaunchPad](http://www.ti.com/ww/en/launchpad/launchpads-msp430-msp-exp430f5529lp.html#tabs) with [Bluetooth CC2564 Module Evaluation Board](http://www.ti.com/tool/cc2564modnem) and [EM Adapter BoosterPack](http://www.ti.com/tool/boost-ccemadapter) with additional 32768Hz quartz oscillator
No build server | [max32630-fthr](https://github.com/bluekitchen/btstack/tree/develop/port/max32630-fthr) | [MAX32630FTHR ARM Cortex M4F Board](https://www.maximintegrated.com/en/products/digital/microcontrollers/MAX32630FTHR.html) with onboard [Panasonic PAN1326 module](https://na.industrial.panasonic.com/products/wireless-connectivity/bluetooth/multi-mode/series/pan13261316-series/CS467) containing [TI CC2564B Bluetooth controller](http://www.ti.com/product/cc2564)
No build server | [samv71-xplained-atwilc3000](https://github.com/bluekitchen/btstack/tree/develop/port/samv71-xplained-atwilc3000) | [SAMV71 Ultra Xplained Ultra](http://www.atmel.com/tools/atsamv71-xult.aspx) evaluation kit with [ATWILC3000 SHIELD](http://www.microchip.com/DevelopmentTools/ProductDetails.aspx?PartNO=ATWILC3000-SHLD)
[<img src="http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-samv71-xplained-atwilc3000-develop">](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-samv71-xplained-atwilc3000-develop) | [samv71-xplained-atwilc3000](https://github.com/bluekitchen/btstack/tree/develop/port/samv71-xplained-atwilc3000) | [SAMV71 Ultra Xplained Ultra](http://www.atmel.com/tools/atsamv71-xult.aspx) evaluation kit with [ATWILC3000 SHIELD](http://www.microchip.com/DevelopmentTools/ProductDetails.aspx?PartNO=ATWILC3000-SHLD)
[<img src="http://buildbot.bluekitchen-gmbh.com/btstack/badge.png?builder=port-stm32-f103rb-nucleo-develop">](https://buildbot.bluekitchen-gmbh.com/btstack/builders/port-stm32-f103rb-nucleo-develop) | [stm32-f103rb-nucleo](https://github.com/bluekitchen/btstack/tree/develop/port/stm32-f103rb-nucleo) | [STM32 Nucleo development board NUCLEO-F103RB](http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1847/PF259875) with [Bluetooth CC2564 Module Evaluation Board](http://www.ti.com/tool/cc2564modnem) and [EM Adapter BoosterPack](http://www.ti.com/tool/boost-ccemadapter) with additional 32768Hz quartz oscillator
No build Server | [stm32-f4discovery-cc2564b](https://github.com/bluekitchen/btstack/tree/develop/port/stm32-f4discovery-cc256x) | [STM32 F4 Discovery Board](http://www.st.com/en/evaluation-tools/stm32f4discovery.html) with [CC256xEM Bluetooth Adapter Kit for ST](https://store.ti.com/CC256XEM-STADAPT-CC256xEM-Bluetooth-Adapter-Kit-P45158.aspx) and [CC2564B Dual-mode Bluetooth® Controller Evaluation Module](https://store.ti.com/cc2564modnem.aspx)
No build Server | [stm32-l053rb-em9304](https://github.com/bluekitchen/btstack/tree/develop/port/stm32-l053rb-em9304) | EM9304 DVK: [STM32 Nucleo development board NUCELO-L053R](http://www.st.com/en/evaluation-tools/nucleo-l053r8.html) with [EM9304 Bluetooth Controller](http://www.emmicroelectronic.com/products/wireless-rf/standard-protocols/em9304)

View File

@ -36,6 +36,8 @@ COMMON += \
l2cap.c \
l2cap_signaling.c \
btstack_tlv.c \
btstack_crypto.c \
uECC.c \
CLASSIC += \
btstack_link_key_db_memory.c \
@ -74,9 +76,6 @@ MBEDTLS = \
memory_buffer_alloc.c \
platform.c \
MICROECC = \
uECC.c
# List of files for Bluedroid SBC codec
include ${BTSTACK_ROOT}/3rd-party/bluedroid/decoder/Makefile.inc
include ${BTSTACK_ROOT}/3rd-party/bluedroid/encoder/Makefile.inc
@ -167,7 +166,7 @@ EXAMPLES_USING_LE = \
CORE_OBJ = $(CORE:.c=.o)
COMMON_OBJ = $(COMMON:.c=.o)
CLASSIC_OBJ = $(CLASSIC:.c=.o)
SM_OBJ = $(SM:.c=.o) $(MICROECC:.c=.o)
SM_OBJ = $(SM:.c=.o)
ATT_OBJ = $(ATT:.c=.o)
GATT_CLIENT_OBJ = $(GATT_CLIENT:.c=.o)
GATT_SERVER_OBJ = $(GATT_SERVER:.c=.o)

View File

@ -85,7 +85,7 @@ static void gap_le_advertisements_setup(void){
*/
/* LISTING_START(GAPLEAdvDataTypesAndFlags): Advertising data types and flags */
static char * ad_types[] = {
static const char * ad_types[] = {
"",
"Flags",
"Incomplete List of 16-bit Service Class UUIDs",
@ -115,7 +115,7 @@ static char * ad_types[] = {
"Advertising Interval"
};
static char * flags[] = {
static const char * flags[] = {
"LE Limited Discoverable Mode",
"LE General Discoverable Mode",
"BR/EDR Not Supported",

View File

@ -105,35 +105,20 @@ VPATH += ${AM_SoftwareRoot}/third_party/btstack/src
VPATH += ${AM_SoftwareRoot}/third_party/btstack/src/ble
VPATH += ${AM_SoftwareRoot}/third_party/btstack/src/ble/gatt-service
SRC += ad_parser.c
SRC += ancs_client.c
SRC += att_db.c
SRC += att_dispatch.c
SRC += att_server.c
SRC += battery_service_server.c
SRC += btstack_em9304_spi_embedded.c
SRC += btstack_linked_list.c
SRC += btstack_memory.c
SRC += btstack_memory_pool.c
SRC += btstack_port.c
SRC += btstack_ring_buffer.c
SRC += btstack_run_loop.c
SRC += btstack_run_loop_embedded.c
SRC += btstack_tlv.c
SRC += btstack_uart_block_embedded.c
SRC += btstack_util.c
SRC += device_information_service_server.c
SRC += gatt_client.c
SRC += hci.c
SRC += hci_cmd.c
SRC += hci_dump.c
SRC += hci_transport_em9304_spi.c
SRC += l2cap.c
SRC += l2cap_signaling.c
SRC += le_device_db_memory.c
SRC += sm.c
SRC += uECC.c
-include ${AM_SoftwareRoot}/third_party/btstack/src/Makefile.inc
-include ${AM_SoftwareRoot}/third_party/btstack/src/ble/Makefile.inc
-include ${AM_SoftwareRoot}/third_party/btstack/src/ble/gatt-service/Makefile.inc
SRC += $(SRC_FILES)
SRC += $(filter-out att_db_util.c le_device_db_tlv.c,$(SRC_BLE_FILES))
SRC += $(SRC_BLE_GATT_SERVICE_FILES)
SRC += $(TARGET).c
SRC += am_util_delay.c

View File

@ -9,7 +9,7 @@ VERSION=`sed -n -e 's/^.*BTSTACK_VERSION \"\(.*\)\"/\1/p' ${BTSTACK_ROOT}/platfo
BTSTACK_PACKAGE=/tmp/btstack
ARCHIVE=btstack-arduino-${VERSION}.zip
SRC_FILES = btstack_memory.c btstack_linked_list.c btstack_memory_pool.c btstack_run_loop.c
SRC_FILES = btstack_memory.c btstack_linked_list.c btstack_memory_pool.c btstack_run_loop.c btstack_crypto.c
SRC_FILES += hci_dump.c hci.c hci_cmd.c btstack_util.c l2cap.c ad_parser.c hci_transport_h4.c
BLE_FILES = att_db.c att_server.c att_dispatch.c att_db_util.c le_device_db_memory.c gatt_client.c
BLE_FILES += sm.c ancs_client.h ancs_client.c

View File

@ -48,6 +48,7 @@ BTdaemon_SOURCES = \
att_dispatch.c \
att_server.c \
bnep.c \
btstack_crypto.c \
btstack_memory.c \
btstack_memory_pool.c \
btstack_tlv.c \

View File

@ -1,653 +0,0 @@
/*
* 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__ "spp_and_le_streamer.c"
// *****************************************************************************
/* EXAMPLE_START(spp_and_le_counter): Dual mode example
*
* @text The SPP and LE Counter example combines the Bluetooth Classic SPP Counter
* and the Bluetooth LE Counter into a single application.
*
* In this Section, we only point out the differences to the individual examples
* and how how the stack is configured.
*/
// *****************************************************************************
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include "btstack.h"
#include "spp_and_le_streamer.h"
int btstack_main(int argc, const char * argv[]);
#define RFCOMM_SERVER_CHANNEL 1
#define HEARTBEAT_PERIOD_MS 1000
#define TEST_COD 0x1234
#define NUM_ROWS 25
#define NUM_COLS 40
#define DATA_VOLUME (10 * 1000 * 1000)
// prototypes
static enum test_mode {
TEST_NONE,
TEST_SPP,
TEST_LE,
} test_mode = TEST_NONE;
typedef enum {
// SPP
W4_PEER_COD,
W4_SCAN_COMPLETE,
W4_SDP_RESULT,
W4_SDP_COMPLETE,
W4_RFCOMM_CHANNEL,
SENDING,
// LE
TC_W4_SCAN_RESULT,
TC_W4_CONNECT,
TC_W4_SERVICE_RESULT,
TC_W4_CHARACTERISTIC_RESULT,
TC_W4_TEST_DATA,
// Both
DONE
} state_t;
/*
* @section Advertisements
*
* @text The Flags attribute in the Advertisement Data indicates if a device is in dual-mode or not.
* Flag 0x06 indicates LE General Discoverable, BR/EDR not supported although we're actually using BR/EDR.
* In the past, there have been problems with Anrdoid devices when the flag was not set.
* Setting it should prevent the remote implementation to try to use GATT over LE/EDR, which is not
* implemented by BTstack. So, setting the flag seems like the safer choice (while it's technically incorrect).
*/
/* LISTING_START(advertisements): Advertisement data: Flag 0x06 indicates LE-only device */
const uint8_t adv_data[] = {
// Flags general discoverable, BR/EDR not supported
0x02, 0x01, 0x06,
// Name
0x0c, 0x09, 'L', 'E', ' ', 'S', 't', 'r', 'e', 'a', 'm', 'e', 'r',
};
static const uint8_t eir_data[] = {
// iAP2 UUID
0x11, 0x07, 0xff, 0xca, 0xca, 0xde, 0xaf, 0xde, 0xca, 0xde, 0xde, 0xfa, 0xca, 0xde, 0x00, 0x00, 0x00, 0x00,
// Local Name
0x13, 0x09, 'B','T','s','t','a','c','k',' ','M','F','i',' ','D','e','v','i','c','e',
// TX Power Level
0x02, 0x0a, 0x00
};
static btstack_packet_callback_registration_t hci_event_callback_registration;
uint8_t adv_data_len = sizeof(adv_data);
static bd_addr_t peer_addr;
static uint8_t test_data[NUM_ROWS * NUM_COLS];
static state_t state = W4_SDP_RESULT;
// SPP
static uint8_t spp_service_buffer[150];
static uint16_t spp_test_data_len = sizeof(test_data);
static uint16_t rfcomm_mtu;
static uint16_t rfcomm_cid = 0;
// static uint32_t data_to_send = DATA_VOLUME;
// LE
static uint16_t att_mtu;
static int counter = 'A';
static int le_notification_enabled;
static uint16_t le_test_data_len;
static hci_con_handle_t le_connection_handle;
// addr and type of device with correct name
static bd_addr_t le_streamer_addr;
static bd_addr_type_t le_streamer_addr_type;
static uint8_t le_streamer_service_uuid[16] = { 0x00, 0x00, 0xFF, 0x10, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
static uint8_t le_streamer_characteristic_uuid[16] = { 0x00, 0x00, 0xFF, 0x11, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
static gatt_client_service_t le_streamer_service;
static gatt_client_characteristic_t le_streamer_characteristic;
static gatt_client_notification_t notification_registration;
/**
* Find remote peer by COD
*/
#define INQUIRY_INTERVAL 5
static void start_scan(void){
printf("Starting inquiry scan..\n");
hci_send_cmd(&hci_inquiry, HCI_INQUIRY_LAP, INQUIRY_INTERVAL, 0);
state = W4_PEER_COD;
}
static void stop_scan(void){
printf("Stopping inquiry scan..\n");
hci_send_cmd(&hci_inquiry_cancel);
state = W4_SCAN_COMPLETE;
}
/*
* @section Track throughput
* @text We calculate the throughput by setting a start time and measuring the amount of
* data sent. After a configurable REPORT_INTERVAL_MS, we print the throughput in kB/s
* and reset the counter and start time.
*/
/* LISTING_START(tracking): Tracking throughput */
#define REPORT_INTERVAL_MS 3000
static uint32_t test_data_transferred;
static uint32_t test_data_start;
static void test_reset(void){
test_data_start = btstack_run_loop_get_time_ms();
test_data_transferred = 0;
}
static void test_track_transferred(int bytes_sent){
test_data_transferred += bytes_sent;
// evaluate
uint32_t now = btstack_run_loop_get_time_ms();
uint32_t time_passed = now - test_data_start;
if (time_passed < REPORT_INTERVAL_MS) return;
// print speed
int bytes_per_second = test_data_transferred * 1000 / time_passed;
printf("%u bytes -> %u.%03u kB/s\n", (int) test_data_transferred, (int) bytes_per_second / 1000, bytes_per_second % 1000);
// restart
test_data_start = now;
test_data_transferred = 0;
}
/* LISTING_END(tracking): Tracking throughput */
static void spp_create_test_data(void){
int x,y;
for (y=0;y<NUM_ROWS;y++){
for (x=0;x<NUM_COLS-2;x++){
test_data[y*NUM_COLS+x] = '0' + (x % 10);
}
test_data[y*NUM_COLS+NUM_COLS-2] = '\n';
test_data[y*NUM_COLS+NUM_COLS-1] = '\r';
}
}
static void spp_send_packet(void){
rfcomm_send(rfcomm_cid, (uint8_t*) test_data, spp_test_data_len);
test_track_transferred(spp_test_data_len);
#if 0
if (data_to_send <= spp_test_data_len){
state = DONE;
printf("SPP Streamer: enough data send, closing channel\n");
rfcomm_disconnect(rfcomm_cid);
rfcomm_cid = 0;
return;
}
data_to_send -= spp_test_data_len;
#endif
rfcomm_request_can_send_now_event(rfcomm_cid);
}
static void le_streamer(void){
// check if we can send
if (!le_notification_enabled) return;
// create test data
counter++;
if (counter > 'Z') counter = 'A';
memset(test_data, counter, sizeof(test_data));
// send
att_server_notify(le_connection_handle, ATT_CHARACTERISTIC_0000FF11_0000_1000_8000_00805F9B34FB_01_VALUE_HANDLE, (uint8_t*) test_data, le_test_data_len);
// track
test_track_transferred(le_test_data_len);
// request next send event
att_server_request_can_send_now_event(le_connection_handle);
}
// returns 1 if name is found in advertisement
static int advertisement_report_contains_name(const char * name, uint8_t * advertisement_report){
// get advertisement from report event
const uint8_t * adv_data = gap_event_advertising_report_get_data(advertisement_report);
uint16_t adv_len = gap_event_advertising_report_get_data_length(advertisement_report);
int name_len = strlen(name);
// iterate over advertisement data
ad_context_t context;
for (ad_iterator_init(&context, adv_len, adv_data) ; ad_iterator_has_more(&context) ; ad_iterator_next(&context)){
uint8_t data_type = ad_iterator_get_data_type(&context);
uint8_t data_size = ad_iterator_get_data_len(&context);
const uint8_t * data = ad_iterator_get_data(&context);
int i;
switch (data_type){
case BLUETOOTH_DATA_TYPE_SHORTENED_LOCAL_NAME:
case BLUETOOTH_DATA_TYPE_COMPLETE_LOCAL_NAME:
// compare common prefix
for (i=0; i<data_size && i<name_len;i++){
if (data[i] != name[i]) break;
}
// prefix match
return 1;
default:
break;
}
}
return 0;
}
static void handle_gatt_client_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
UNUSED(packet_type);
UNUSED(channel);
UNUSED(size);
switch(state){
case TC_W4_SERVICE_RESULT:
switch(hci_event_packet_get_type(packet)){
case GATT_EVENT_SERVICE_QUERY_RESULT:
// store service (we expect only one)
gatt_event_service_query_result_get_service(packet, &le_streamer_service);
break;
case GATT_EVENT_QUERY_COMPLETE:
if (packet[4] != 0){
printf("SERVICE_QUERY_RESULT - Error status %x.\n", packet[4]);
gap_disconnect(le_connection_handle);
break;
}
// service query complete, look for characteristic
state = TC_W4_CHARACTERISTIC_RESULT;
printf("Search for LE Streamer test characteristic.\n");
gatt_client_discover_characteristics_for_service_by_uuid128(handle_gatt_client_event, le_connection_handle, &le_streamer_service, le_streamer_characteristic_uuid);
break;
default:
break;
}
break;
case TC_W4_CHARACTERISTIC_RESULT:
switch(hci_event_packet_get_type(packet)){
case GATT_EVENT_CHARACTERISTIC_QUERY_RESULT:
gatt_event_characteristic_query_result_get_characteristic(packet, &le_streamer_characteristic);
break;
case GATT_EVENT_QUERY_COMPLETE:
if (packet[4] != 0){
printf("CHARACTERISTIC_QUERY_RESULT - Error status %x.\n", packet[4]);
gap_disconnect(le_connection_handle);
break;
}
// register handler for notifications
gatt_client_listen_for_characteristic_value_updates(&notification_registration, handle_gatt_client_event, le_connection_handle, &le_streamer_characteristic);
// enable notifications
test_reset();
state = TC_W4_TEST_DATA;
printf("Start streaming - enable notify on test characteristic.\n");
gatt_client_write_client_characteristic_configuration(handle_gatt_client_event, le_connection_handle, &le_streamer_characteristic, GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION);
break;
default:
break;
}
break;
case TC_W4_TEST_DATA:
switch(hci_event_packet_get_type(packet)){
case GATT_EVENT_NOTIFICATION:
// printf("Data: ");
// printf_hexdump( gatt_event_notification_get_value(packet), gatt_event_notification_get_value_length(packet));
// just track data
test_track_transferred(gatt_event_notification_get_value_length(packet));
break;
case GATT_EVENT_QUERY_COMPLETE:
break;
default:
printf("Unknown packet type %x\n", hci_event_packet_get_type(packet));
break;
}
break;
default:
printf("error\n");
break;
}
}
/*
* @section Packet Handler
*
* @text The packet handler of the combined example is just the combination of the individual packet handlers.
*/
static void packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
UNUSED(channel);
bd_addr_t event_addr;
uint8_t rfcomm_channel_nr;
int i;
int num_responses;
switch (packet_type) {
case HCI_EVENT_PACKET:
switch (hci_event_packet_get_type(packet)) {
case HCI_EVENT_PIN_CODE_REQUEST:
// inform about pin code request
printf("Pin code request - using '0000'\n");
hci_event_pin_code_request_get_bd_addr(packet, event_addr);
hci_send_cmd(&hci_pin_code_request_reply, &event_addr, 4, "0000");
break;
case HCI_EVENT_USER_CONFIRMATION_REQUEST:
// inform about user confirmation request
printf("SSP User Confirmation Request with numeric value '%06"PRIu32"'\n", little_endian_read_32(packet, 8));
printf("SSP User Confirmation Auto accept\n");
break;
case HCI_EVENT_DISCONNECTION_COMPLETE:
le_notification_enabled = 0;
break;
case HCI_EVENT_LE_META:
switch (hci_event_le_meta_get_subevent_code(packet)) {
case HCI_SUBEVENT_LE_CONNECTION_COMPLETE:
le_test_data_len = ATT_DEFAULT_MTU - 3;
le_connection_handle = hci_subevent_le_connection_complete_get_connection_handle(packet);
if (state != TC_W4_CONNECT) return;
printf("Change connection interval to minimum 7.5 ms\n");
gap_update_connection_parameters(le_connection_handle, 6, 6, 4, 1000);
// query primary services
printf("Search for LE Streamer service.\n");
state = TC_W4_SERVICE_RESULT;
gatt_client_discover_primary_services_by_uuid128(handle_gatt_client_event, le_connection_handle, le_streamer_service_uuid);
break;
}
break;
case ATT_EVENT_MTU_EXCHANGE_COMPLETE:
att_mtu = att_event_mtu_exchange_complete_get_MTU(packet);
printf("ATT MTU = %u\n", att_mtu);
le_test_data_len = att_mtu - 3;
if (le_test_data_len > sizeof(test_data)){
le_test_data_len = sizeof(test_data);
}
break;
case ATT_EVENT_CAN_SEND_NOW:
le_streamer();
break;
case GAP_EVENT_ADVERTISING_REPORT:
if (state != TC_W4_SCAN_RESULT) return;
// check name in advertisement
if (!advertisement_report_contains_name("LE Streamer", packet)) return;
// store address and type
gap_event_advertising_report_get_address(packet, le_streamer_addr);
le_streamer_addr_type = gap_event_advertising_report_get_address_type(packet);
// stop scanning, and connect to the device
state = TC_W4_CONNECT;
gap_stop_scan();
printf("Stop scan. Connect to device with addr %s.\n", bd_addr_to_str(le_streamer_addr));
gap_connect(le_streamer_addr,le_streamer_addr_type);
break;
case RFCOMM_EVENT_INCOMING_CONNECTION:
// data: event (8), len(8), address(48), channel (8), rfcomm_cid (16)
rfcomm_event_incoming_connection_get_bd_addr(packet, event_addr);
rfcomm_channel_nr = rfcomm_event_incoming_connection_get_server_channel(packet);
rfcomm_cid = rfcomm_event_incoming_connection_get_rfcomm_cid(packet);
printf("RFCOMM channel %u requested for %s\n", rfcomm_channel_nr, bd_addr_to_str(event_addr));
rfcomm_accept_connection(rfcomm_cid);
break;
case RFCOMM_EVENT_CHANNEL_OPENED:
// data: event(8), len(8), status (8), address (48), server channel(8), rfcomm_cid(16), max frame size(16)
if (rfcomm_event_channel_opened_get_status(packet)) {
printf("RFCOMM channel open failed, status %u\n", rfcomm_event_channel_opened_get_status(packet));
} else {
rfcomm_cid = rfcomm_event_channel_opened_get_rfcomm_cid(packet);
rfcomm_mtu = rfcomm_event_channel_opened_get_max_frame_size(packet);
printf("RFCOMM channel open succeeded. New RFCOMM Channel ID %u, max frame size %u\n", rfcomm_cid, rfcomm_mtu);
// initiator also sends data
test_reset();
if (test_mode == TEST_SPP){
rfcomm_request_can_send_now_event(rfcomm_cid);
}
}
break;
case RFCOMM_EVENT_CAN_SEND_NOW:
if (test_mode == TEST_SPP){
spp_send_packet();
}
break;
case RFCOMM_EVENT_CHANNEL_CLOSED:
printf("RFCOMM channel closed\n");
rfcomm_cid = 0;
break;
case BTSTACK_EVENT_STATE:
if (btstack_event_state_get_state(packet) != HCI_STATE_WORKING) return;
break;
case HCI_EVENT_EXTENDED_INQUIRY_RESPONSE:
num_responses = hci_event_inquiry_result_get_num_responses(packet);
for (i=0; i<num_responses;i++){
reverse_bd_addr(&packet[3 + i * 6], event_addr);
uint32_t class_of_device = little_endian_read_24(packet, 3 + num_responses*(6+1+1) + i*3);
if (class_of_device == TEST_COD){
memcpy(peer_addr, event_addr, 6);
printf("Peer found: %s\n", bd_addr_to_str(peer_addr));
stop_scan();
printf("Start to connect\n");
state = W4_RFCOMM_CHANNEL;
rfcomm_create_channel(packet_handler, peer_addr, RFCOMM_SERVER_CHANNEL, NULL);
} else {
printf("Device found: %s with COD: 0x%06x\n", bd_addr_to_str(event_addr), (int) class_of_device);
}
}
break;
case HCI_EVENT_INQUIRY_COMPLETE:
printf("Inquiry complete\n");
printf("Peer not found, starting scan again\n");
start_scan();
break;
default:
break;
}
break;
case RFCOMM_DATA_PACKET:
test_track_transferred(size);
#if 0
printf("RCV: '");
for (i=0;i<size;i++){
putchar(packet[i]);
}
printf("'\n");
#endif
break;
default:
break;
}
}
// ATT Client Read Callback for Dynamic Data
// - if buffer == NULL, don't copy data, just return size of value
// - if buffer != NULL, copy data and return number bytes copied
// @param offset defines start of attribute value
static uint16_t att_read_callback(hci_con_handle_t con_handle, uint16_t att_handle, uint16_t offset, uint8_t * buffer, uint16_t buffer_size){
UNUSED(con_handle);
UNUSED(att_handle);
UNUSED(offset);
UNUSED(buffer);
UNUSED(buffer_size);
return 0;
}
// write requests
static int att_write_callback(hci_con_handle_t con_handle, uint16_t att_handle, uint16_t transaction_mode, uint16_t offset, uint8_t *buffer, uint16_t buffer_size){
UNUSED(con_handle);
UNUSED(offset);
// printf("att_write_callback att_handle %04x, transaction mode %u\n", att_handle, transaction_mode);
if (transaction_mode != ATT_TRANSACTION_MODE_NONE) return 0;
switch(att_handle){
case ATT_CHARACTERISTIC_0000FF11_0000_1000_8000_00805F9B34FB_01_CLIENT_CONFIGURATION_HANDLE:
le_notification_enabled = little_endian_read_16(buffer, 0) == GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION;
printf("Notifications enabled %u\n", le_notification_enabled);
if (le_notification_enabled){
att_server_request_can_send_now_event(le_connection_handle);
}
test_reset();
break;
default:
break;
}
return 0;
}
#if 0
static void process_button(int button){
port_set_button_handler(NULL);
switch (button){
case 0:
test_mode = TEST_SPP;
printf("Test started: SPP client\n");
start_scan();
break;
case 1:
test_mode = TEST_LE;
printf("Test started: Central + GATT client\n");
state = TC_W4_SCAN_RESULT;
gap_set_scan_parameters(0,0x0030, 0x0030);
gap_start_scan();
break;
default:
break;
}
// disable other services
gap_connectable_control(0);
gap_discoverable_control(0);
gap_advertisements_enable(0);
}
#endif
/*
* @section Main Application Setup
*
* @text As with the packet and the heartbeat handlers, the combined app setup contains the code from the individual example setups.
*/
/* LISTING_START(MainConfiguration): Init L2CAP RFCOMM SDO SM ATT Server and start heartbeat timer */
int btstack_main(int argc, const char * argv[])
{
UNUSED(argc);
(void)argv;
// register for HCI events
hci_event_callback_registration.callback = &packet_handler;
hci_add_event_handler(&hci_event_callback_registration);
l2cap_init();
rfcomm_init();
rfcomm_register_service(packet_handler, RFCOMM_SERVER_CHANNEL, 0xffff);
// init SDP, create record for SPP and register with SDP
sdp_init();
memset(spp_service_buffer, 0, sizeof(spp_service_buffer));
spp_create_sdp_record(spp_service_buffer, 0x10001, RFCOMM_SERVER_CHANNEL, "SPP Streamer");
sdp_register_service(spp_service_buffer);
// printf("SDP service record size: %u\n", de_get_len(spp_service_buffer));
gap_ssp_set_io_capability(SSP_IO_CAPABILITY_DISPLAY_YES_NO);
// short-cut to find other ODIN module
gap_set_class_of_device(TEST_COD);
gap_discoverable_control(1);
// setup le device db
le_device_db_init();
// enabled EIR
hci_set_inquiry_mode(INQUIRY_MODE_RSSI_AND_EIR);
gap_set_extended_inquiry_response(eir_data);
// setup SM: Display only
sm_init();
// setup ATT server
att_server_init(profile_data, att_read_callback, att_write_callback);
att_server_register_packet_handler(packet_handler);
// setup advertisements
uint16_t adv_int_min = 0x0030;
uint16_t adv_int_max = 0x0030;
uint8_t adv_type = 0;
bd_addr_t null_addr;
memset(null_addr, 0, 6);
gap_advertisements_set_params(adv_int_min, adv_int_max, adv_type, 0, null_addr, 0x07, 0x00);
gap_advertisements_set_data(adv_data_len, (uint8_t*) adv_data);
gap_advertisements_enable(1);
gatt_client_init();
spp_create_test_data();
// turn on!
hci_power_control(HCI_POWER_ON);
return 0;
}
/* LISTING_END */
/* EXAMPLE_END */

View File

@ -1,57 +0,0 @@
// spp_and_le_counter.h generated from ../../example/spp_and_le_counter.gatt for BTstack
// binary representation
// attribute size in bytes (16), flags(16), handle (16), uuid (16/128), value(...)
#include <stdint.h>
const uint8_t profile_data[] =
{
// 0x0001 PRIMARY_SERVICE-GAP_SERVICE
0x0a, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28, 0x00, 0x18,
// 0x0002 CHARACTERISTIC-GAP_DEVICE_NAME-READ
0x0d, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28, 0x02, 0x03, 0x00, 0x00, 0x2a,
// 0x0003 VALUE-GAP_DEVICE_NAME-READ-'SPP+LE Counter'
0x16, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2a, 0x53, 0x50, 0x50, 0x2b, 0x4c, 0x45, 0x20, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72,
// 0x0004 PRIMARY_SERVICE-GATT_SERVICE
0x0a, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28, 0x01, 0x18,
// 0x0005 CHARACTERISTIC-GATT_SERVICE_CHANGED-READ
0x0d, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28, 0x02, 0x06, 0x00, 0x05, 0x2a,
// 0x0006 VALUE-GATT_SERVICE_CHANGED-READ-''
0x08, 0x00, 0x02, 0x00, 0x06, 0x00, 0x05, 0x2a,
// Counter Service
// 0x0007 PRIMARY_SERVICE-0000FF10-0000-1000-8000-00805F9B34FB
0x18, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x28, 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0xff, 0x00, 0x00,
// Counter Characteristic, with read, write, write_without_response and notify
// 0x0008 CHARACTERISTIC-0000FF11-0000-1000-8000-00805F9B34FB-READ | NOTIFY | WRITE | WRITE_WITHOUT_RESPONSE | DYNAMIC
0x1b, 0x00, 0x02, 0x00, 0x08, 0x00, 0x03, 0x28, 0x1e, 0x09, 0x00, 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x11, 0xff, 0x00, 0x00,
// 0x0009 VALUE-0000FF11-0000-1000-8000-00805F9B34FB-READ | NOTIFY | WRITE | WRITE_WITHOUT_RESPONSE | DYNAMIC-''
0x16, 0x00, 0x1e, 0x03, 0x09, 0x00, 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x11, 0xff, 0x00, 0x00,
// 0x000a CLIENT_CHARACTERISTIC_CONFIGURATION
0x0a, 0x00, 0x0a, 0x01, 0x0a, 0x00, 0x02, 0x29, 0x00, 0x00,
// END
0x00, 0x00,
}; // total size 99 bytes
//
// list service handle ranges
//
#define ATT_SERVICE_GAP_SERVICE_START_HANDLE 0x0001
#define ATT_SERVICE_GAP_SERVICE_END_HANDLE 0x0003
#define ATT_SERVICE_GATT_SERVICE_START_HANDLE 0x0004
#define ATT_SERVICE_GATT_SERVICE_END_HANDLE 0x0006
#define ATT_SERVICE_0000FF10_0000_1000_8000_00805F9B34FB_START_HANDLE 0x0007
#define ATT_SERVICE_0000FF10_0000_1000_8000_00805F9B34FB_END_HANDLE 0x000a
//
// list mapping between characteristics and handles
//
#define ATT_CHARACTERISTIC_GAP_DEVICE_NAME_01_VALUE_HANDLE 0x0003
#define ATT_CHARACTERISTIC_GATT_SERVICE_CHANGED_01_VALUE_HANDLE 0x0006
#define ATT_CHARACTERISTIC_0000FF11_0000_1000_8000_00805F9B34FB_01_VALUE_HANDLE 0x0009
#define ATT_CHARACTERISTIC_0000FF11_0000_1000_8000_00805F9B34FB_01_CLIENT_CONFIGURATION_HANDLE 0x000a

View File

@ -44,6 +44,7 @@ BTdaemon_OBJS = $(libBTstack_OBJS) \
btstack_link_key_db_memory.o \
btstack_memory.o \
btstack_memory_pool.o \
btstack_crypto.o \
daemon.o \
gatt_client.o \
hci.o \

View File

@ -1,5 +1,6 @@
obj-y += \
ad_parser.o \
btstack_crypto.o \
btstack_linked_list.o \
btstack_memory.o \
btstack_memory_pool.o \

View File

@ -45,17 +45,17 @@ OBJECTDIR=build/${CND_CONF}/${IMAGE_TYPE}
DISTDIR=dist/${CND_CONF}/${IMAGE_TYPE}
# Source Files Quoted if spaced
SOURCEFILES_QUOTED_IF_SPACED=../src/system_config/bt_audio_dk/system_init.c ../src/system_config/bt_audio_dk/system_tasks.c ../src/btstack_port.c ../src/app_debug.c ../src/app.c ../src/main.c ../../../example/spp_and_le_counter.c ../../../3rd-party/bluedroid/decoder/srce/alloc.c ../../../3rd-party/bluedroid/decoder/srce/bitalloc-sbc.c ../../../3rd-party/bluedroid/decoder/srce/bitalloc.c ../../../3rd-party/bluedroid/decoder/srce/bitstream-decode.c ../../../3rd-party/bluedroid/decoder/srce/decoder-oina.c ../../../3rd-party/bluedroid/decoder/srce/decoder-private.c ../../../3rd-party/bluedroid/decoder/srce/decoder-sbc.c ../../../3rd-party/bluedroid/decoder/srce/dequant.c ../../../3rd-party/bluedroid/decoder/srce/framing-sbc.c ../../../3rd-party/bluedroid/decoder/srce/framing.c ../../../3rd-party/bluedroid/decoder/srce/oi_codec_version.c ../../../3rd-party/bluedroid/decoder/srce/synthesis-8-generated.c ../../../3rd-party/bluedroid/decoder/srce/synthesis-dct8.c ../../../3rd-party/bluedroid/decoder/srce/synthesis-sbc.c ../../../3rd-party/bluedroid/encoder/srce/sbc_analysis.c ../../../3rd-party/bluedroid/encoder/srce/sbc_dct.c ../../../3rd-party/bluedroid/encoder/srce/sbc_dct_coeffs.c ../../../3rd-party/bluedroid/encoder/srce/sbc_enc_bit_alloc_mono.c ../../../3rd-party/bluedroid/encoder/srce/sbc_enc_bit_alloc_ste.c ../../../3rd-party/bluedroid/encoder/srce/sbc_enc_coeffs.c ../../../3rd-party/bluedroid/encoder/srce/sbc_encoder.c ../../../3rd-party/bluedroid/encoder/srce/sbc_packing.c ../../../3rd-party/hxcmod-player/mods/nao-deceased_by_disease.c ../../../3rd-party/hxcmod-player/hxcmod.c ../../../3rd-party/micro-ecc/uECC.c ../../../chipset/csr/btstack_chipset_csr.c ../../../platform/embedded/btstack_run_loop_embedded.c ../../../platform/embedded/btstack_uart_block_embedded.c ../../../src/ble/gatt-service/battery_service_server.c ../../../src/ble/gatt-service/device_information_service_server.c ../../../src/ble/gatt-service/hids_device.c ../../../src/ble/att_db.c ../../../src/ble/att_dispatch.c ../../../src/ble/att_server.c ../../../src/ble/le_device_db_memory.c ../../../src/ble/sm.c ../../../src/ble/ancs_client.c ../../../src/ble/gatt_client.c ../../../src/classic/btstack_link_key_db_memory.c ../../../src/classic/sdp_client.c ../../../src/classic/sdp_client_rfcomm.c ../../../src/classic/sdp_server.c ../../../src/classic/sdp_util.c ../../../src/classic/spp_server.c ../../../src/classic/a2dp_sink.c ../../../src/classic/a2dp_source.c ../../../src/classic/avdtp.c ../../../src/classic/avdtp_acceptor.c ../../../src/classic/avdtp_initiator.c ../../../src/classic/avdtp_sink.c ../../../src/classic/avdtp_source.c ../../../src/classic/avdtp_util.c ../../../src/classic/avrcp.c ../../../src/classic/avrcp_browsing_controller.c ../../../src/classic/avrcp_controller.c ../../../src/classic/avrcp_media_item_iterator.c ../../../src/classic/avrcp_target.c ../../../src/classic/bnep.c ../../../src/classic/btstack_cvsd_plc.c ../../../src/classic/btstack_sbc_decoder_bluedroid.c ../../../src/classic/btstack_sbc_encoder_bluedroid.c ../../../src/classic/btstack_sbc_plc.c ../../../src/classic/device_id_server.c ../../../src/classic/goep_client.c ../../../src/classic/hfp.c ../../../src/classic/hfp_ag.c ../../../src/classic/hfp_gsm_model.c ../../../src/classic/hfp_hf.c ../../../src/classic/hfp_msbc.c ../../../src/classic/hid_device.c ../../../src/classic/hsp_ag.c ../../../src/classic/hsp_hs.c ../../../src/classic/obex_iterator.c ../../../src/classic/pan.c ../../../src/classic/pbap_client.c ../../../src/btstack_memory.c ../../../src/hci.c ../../../src/hci_cmd.c ../../../src/hci_dump.c ../../../src/l2cap.c ../../../src/l2cap_signaling.c ../../../src/btstack_linked_list.c ../../../src/btstack_memory_pool.c ../../../src/classic/rfcomm.c ../../../src/btstack_run_loop.c ../../../src/btstack_util.c ../../../src/hci_transport_h4.c ../../../src/hci_transport_h5.c ../../../src/btstack_slip.c ../../../src/ad_parser.c ../../../src/btstack_tlv.c ../../../../driver/tmr/src/dynamic/drv_tmr.c ../../../../system/clk/src/sys_clk.c ../../../../system/clk/src/sys_clk_pic32mx.c ../../../../system/devcon/src/sys_devcon.c ../../../../system/devcon/src/sys_devcon_pic32mx.c ../../../../system/int/src/sys_int_pic32.c ../../../../system/ports/src/sys_ports.c
SOURCEFILES_QUOTED_IF_SPACED=../src/system_config/bt_audio_dk/system_init.c ../src/system_config/bt_audio_dk/system_tasks.c ../src/btstack_port.c ../src/app_debug.c ../src/app.c ../src/main.c ../../../example/spp_and_le_counter.c ../../../3rd-party/bluedroid/decoder/srce/alloc.c ../../../3rd-party/bluedroid/decoder/srce/bitalloc-sbc.c ../../../3rd-party/bluedroid/decoder/srce/bitalloc.c ../../../3rd-party/bluedroid/decoder/srce/bitstream-decode.c ../../../3rd-party/bluedroid/decoder/srce/decoder-oina.c ../../../3rd-party/bluedroid/decoder/srce/decoder-private.c ../../../3rd-party/bluedroid/decoder/srce/decoder-sbc.c ../../../3rd-party/bluedroid/decoder/srce/dequant.c ../../../3rd-party/bluedroid/decoder/srce/framing-sbc.c ../../../3rd-party/bluedroid/decoder/srce/framing.c ../../../3rd-party/bluedroid/decoder/srce/oi_codec_version.c ../../../3rd-party/bluedroid/decoder/srce/synthesis-8-generated.c ../../../3rd-party/bluedroid/decoder/srce/synthesis-dct8.c ../../../3rd-party/bluedroid/decoder/srce/synthesis-sbc.c ../../../3rd-party/bluedroid/encoder/srce/sbc_analysis.c ../../../3rd-party/bluedroid/encoder/srce/sbc_dct.c ../../../3rd-party/bluedroid/encoder/srce/sbc_dct_coeffs.c ../../../3rd-party/bluedroid/encoder/srce/sbc_enc_bit_alloc_mono.c ../../../3rd-party/bluedroid/encoder/srce/sbc_enc_bit_alloc_ste.c ../../../3rd-party/bluedroid/encoder/srce/sbc_enc_coeffs.c ../../../3rd-party/bluedroid/encoder/srce/sbc_encoder.c ../../../3rd-party/bluedroid/encoder/srce/sbc_packing.c ../../../3rd-party/hxcmod-player/mods/nao-deceased_by_disease.c ../../../3rd-party/hxcmod-player/hxcmod.c ../../../3rd-party/micro-ecc/uECC.c ../../../chipset/csr/btstack_chipset_csr.c ../../../platform/embedded/btstack_run_loop_embedded.c ../../../platform/embedded/btstack_uart_block_embedded.c ../../../src/ble/gatt-service/battery_service_server.c ../../../src/ble/gatt-service/device_information_service_server.c ../../../src/ble/gatt-service/hids_device.c ../../../src/ble/att_db.c ../../../src/ble/att_dispatch.c ../../../src/ble/att_server.c ../../../src/ble/le_device_db_memory.c ../../../src/ble/sm.c ../../../src/ble/ancs_client.c ../../../src/ble/gatt_client.c ../../../src/classic/btstack_link_key_db_memory.c ../../../src/classic/sdp_client.c ../../../src/classic/sdp_client_rfcomm.c ../../../src/classic/sdp_server.c ../../../src/classic/sdp_util.c ../../../src/classic/spp_server.c ../../../src/classic/a2dp_sink.c ../../../src/classic/a2dp_source.c ../../../src/classic/avdtp.c ../../../src/classic/avdtp_acceptor.c ../../../src/classic/avdtp_initiator.c ../../../src/classic/avdtp_sink.c ../../../src/classic/avdtp_source.c ../../../src/classic/avdtp_util.c ../../../src/classic/avrcp.c ../../../src/classic/avrcp_browsing_controller.c ../../../src/classic/avrcp_controller.c ../../../src/classic/avrcp_media_item_iterator.c ../../../src/classic/avrcp_target.c ../../../src/classic/bnep.c ../../../src/classic/btstack_cvsd_plc.c ../../../src/classic/btstack_sbc_decoder_bluedroid.c ../../../src/classic/btstack_sbc_encoder_bluedroid.c ../../../src/classic/btstack_sbc_plc.c ../../../src/classic/device_id_server.c ../../../src/classic/goep_client.c ../../../src/classic/hfp.c ../../../src/classic/hfp_ag.c ../../../src/classic/hfp_gsm_model.c ../../../src/classic/hfp_hf.c ../../../src/classic/hfp_msbc.c ../../../src/classic/hid_device.c ../../../src/classic/hsp_ag.c ../../../src/classic/hsp_hs.c ../../../src/classic/obex_iterator.c ../../../src/classic/pan.c ../../../src/classic/pbap_client.c ../../../src/btstack_memory.c ../../../src/hci.c ../../../src/hci_cmd.c ../../../src/hci_dump.c ../../../src/l2cap.c ../../../src/l2cap_signaling.c ../../../src/btstack_linked_list.c ../../../src/btstack_memory_pool.c ../../../src/classic/rfcomm.c ../../../src/btstack_run_loop.c ../../../src/btstack_util.c ../../../src/hci_transport_h4.c ../../../src/hci_transport_h5.c ../../../src/btstack_slip.c ../../../src/ad_parser.c ../../../src/btstack_tlv.c ../../../../driver/tmr/src/dynamic/drv_tmr.c ../../../../system/clk/src/sys_clk.c ../../../../system/clk/src/sys_clk_pic32mx.c ../../../../system/devcon/src/sys_devcon.c ../../../../system/devcon/src/sys_devcon_pic32mx.c ../../../../system/int/src/sys_int_pic32.c ../../../../system/ports/src/sys_ports.c ../../../src/btstack_crypto.c
# Object Files Quoted if spaced
OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/_ext/101891878/system_init.o ${OBJECTDIR}/_ext/101891878/system_tasks.o ${OBJECTDIR}/_ext/1360937237/btstack_port.o ${OBJECTDIR}/_ext/1360937237/app_debug.o ${OBJECTDIR}/_ext/1360937237/app.o ${OBJECTDIR}/_ext/1360937237/main.o ${OBJECTDIR}/_ext/97075643/spp_and_le_counter.o ${OBJECTDIR}/_ext/770672057/alloc.o ${OBJECTDIR}/_ext/770672057/bitalloc-sbc.o ${OBJECTDIR}/_ext/770672057/bitalloc.o ${OBJECTDIR}/_ext/770672057/bitstream-decode.o ${OBJECTDIR}/_ext/770672057/decoder-oina.o ${OBJECTDIR}/_ext/770672057/decoder-private.o ${OBJECTDIR}/_ext/770672057/decoder-sbc.o ${OBJECTDIR}/_ext/770672057/dequant.o ${OBJECTDIR}/_ext/770672057/framing-sbc.o ${OBJECTDIR}/_ext/770672057/framing.o ${OBJECTDIR}/_ext/770672057/oi_codec_version.o ${OBJECTDIR}/_ext/770672057/synthesis-8-generated.o ${OBJECTDIR}/_ext/770672057/synthesis-dct8.o ${OBJECTDIR}/_ext/770672057/synthesis-sbc.o ${OBJECTDIR}/_ext/1907061729/sbc_analysis.o ${OBJECTDIR}/_ext/1907061729/sbc_dct.o ${OBJECTDIR}/_ext/1907061729/sbc_dct_coeffs.o ${OBJECTDIR}/_ext/1907061729/sbc_enc_bit_alloc_mono.o ${OBJECTDIR}/_ext/1907061729/sbc_enc_bit_alloc_ste.o ${OBJECTDIR}/_ext/1907061729/sbc_enc_coeffs.o ${OBJECTDIR}/_ext/1907061729/sbc_encoder.o ${OBJECTDIR}/_ext/1907061729/sbc_packing.o ${OBJECTDIR}/_ext/968912543/nao-deceased_by_disease.o ${OBJECTDIR}/_ext/835724193/hxcmod.o ${OBJECTDIR}/_ext/34712644/uECC.o ${OBJECTDIR}/_ext/1768064806/btstack_chipset_csr.o ${OBJECTDIR}/_ext/993942601/btstack_run_loop_embedded.o ${OBJECTDIR}/_ext/993942601/btstack_uart_block_embedded.o ${OBJECTDIR}/_ext/524132624/battery_service_server.o ${OBJECTDIR}/_ext/524132624/device_information_service_server.o ${OBJECTDIR}/_ext/524132624/hids_device.o ${OBJECTDIR}/_ext/534563071/att_db.o ${OBJECTDIR}/_ext/534563071/att_dispatch.o ${OBJECTDIR}/_ext/534563071/att_server.o ${OBJECTDIR}/_ext/534563071/le_device_db_memory.o ${OBJECTDIR}/_ext/534563071/sm.o ${OBJECTDIR}/_ext/534563071/ancs_client.o ${OBJECTDIR}/_ext/534563071/gatt_client.o ${OBJECTDIR}/_ext/1386327864/btstack_link_key_db_memory.o ${OBJECTDIR}/_ext/1386327864/sdp_client.o ${OBJECTDIR}/_ext/1386327864/sdp_client_rfcomm.o ${OBJECTDIR}/_ext/1386327864/sdp_server.o ${OBJECTDIR}/_ext/1386327864/sdp_util.o ${OBJECTDIR}/_ext/1386327864/spp_server.o ${OBJECTDIR}/_ext/1386327864/a2dp_sink.o ${OBJECTDIR}/_ext/1386327864/a2dp_source.o ${OBJECTDIR}/_ext/1386327864/avdtp.o ${OBJECTDIR}/_ext/1386327864/avdtp_acceptor.o ${OBJECTDIR}/_ext/1386327864/avdtp_initiator.o ${OBJECTDIR}/_ext/1386327864/avdtp_sink.o ${OBJECTDIR}/_ext/1386327864/avdtp_source.o ${OBJECTDIR}/_ext/1386327864/avdtp_util.o ${OBJECTDIR}/_ext/1386327864/avrcp.o ${OBJECTDIR}/_ext/1386327864/avrcp_browsing_controller.o ${OBJECTDIR}/_ext/1386327864/avrcp_controller.o ${OBJECTDIR}/_ext/1386327864/avrcp_media_item_iterator.o ${OBJECTDIR}/_ext/1386327864/avrcp_target.o ${OBJECTDIR}/_ext/1386327864/bnep.o ${OBJECTDIR}/_ext/1386327864/btstack_cvsd_plc.o ${OBJECTDIR}/_ext/1386327864/btstack_sbc_decoder_bluedroid.o ${OBJECTDIR}/_ext/1386327864/btstack_sbc_encoder_bluedroid.o ${OBJECTDIR}/_ext/1386327864/btstack_sbc_plc.o ${OBJECTDIR}/_ext/1386327864/device_id_server.o ${OBJECTDIR}/_ext/1386327864/goep_client.o ${OBJECTDIR}/_ext/1386327864/hfp.o ${OBJECTDIR}/_ext/1386327864/hfp_ag.o ${OBJECTDIR}/_ext/1386327864/hfp_gsm_model.o ${OBJECTDIR}/_ext/1386327864/hfp_hf.o ${OBJECTDIR}/_ext/1386327864/hfp_msbc.o ${OBJECTDIR}/_ext/1386327864/hid_device.o ${OBJECTDIR}/_ext/1386327864/hsp_ag.o ${OBJECTDIR}/_ext/1386327864/hsp_hs.o ${OBJECTDIR}/_ext/1386327864/obex_iterator.o ${OBJECTDIR}/_ext/1386327864/pan.o ${OBJECTDIR}/_ext/1386327864/pbap_client.o ${OBJECTDIR}/_ext/1386528437/btstack_memory.o ${OBJECTDIR}/_ext/1386528437/hci.o ${OBJECTDIR}/_ext/1386528437/hci_cmd.o ${OBJECTDIR}/_ext/1386528437/hci_dump.o ${OBJECTDIR}/_ext/1386528437/l2cap.o ${OBJECTDIR}/_ext/1386528437/l2cap_signaling.o ${OBJECTDIR}/_ext/1386528437/btstack_linked_list.o ${OBJECTDIR}/_ext/1386528437/btstack_memory_pool.o ${OBJECTDIR}/_ext/1386327864/rfcomm.o ${OBJECTDIR}/_ext/1386528437/btstack_run_loop.o ${OBJECTDIR}/_ext/1386528437/btstack_util.o ${OBJECTDIR}/_ext/1386528437/hci_transport_h4.o ${OBJECTDIR}/_ext/1386528437/hci_transport_h5.o ${OBJECTDIR}/_ext/1386528437/btstack_slip.o ${OBJECTDIR}/_ext/1386528437/ad_parser.o ${OBJECTDIR}/_ext/1386528437/btstack_tlv.o ${OBJECTDIR}/_ext/1880736137/drv_tmr.o ${OBJECTDIR}/_ext/1112166103/sys_clk.o ${OBJECTDIR}/_ext/1112166103/sys_clk_pic32mx.o ${OBJECTDIR}/_ext/1510368962/sys_devcon.o ${OBJECTDIR}/_ext/1510368962/sys_devcon_pic32mx.o ${OBJECTDIR}/_ext/2087176412/sys_int_pic32.o ${OBJECTDIR}/_ext/2147153351/sys_ports.o
POSSIBLE_DEPFILES=${OBJECTDIR}/_ext/101891878/system_init.o.d ${OBJECTDIR}/_ext/101891878/system_tasks.o.d ${OBJECTDIR}/_ext/1360937237/btstack_port.o.d ${OBJECTDIR}/_ext/1360937237/app_debug.o.d ${OBJECTDIR}/_ext/1360937237/app.o.d ${OBJECTDIR}/_ext/1360937237/main.o.d ${OBJECTDIR}/_ext/97075643/spp_and_le_counter.o.d ${OBJECTDIR}/_ext/770672057/alloc.o.d ${OBJECTDIR}/_ext/770672057/bitalloc-sbc.o.d ${OBJECTDIR}/_ext/770672057/bitalloc.o.d ${OBJECTDIR}/_ext/770672057/bitstream-decode.o.d ${OBJECTDIR}/_ext/770672057/decoder-oina.o.d ${OBJECTDIR}/_ext/770672057/decoder-private.o.d ${OBJECTDIR}/_ext/770672057/decoder-sbc.o.d ${OBJECTDIR}/_ext/770672057/dequant.o.d ${OBJECTDIR}/_ext/770672057/framing-sbc.o.d ${OBJECTDIR}/_ext/770672057/framing.o.d ${OBJECTDIR}/_ext/770672057/oi_codec_version.o.d ${OBJECTDIR}/_ext/770672057/synthesis-8-generated.o.d ${OBJECTDIR}/_ext/770672057/synthesis-dct8.o.d ${OBJECTDIR}/_ext/770672057/synthesis-sbc.o.d ${OBJECTDIR}/_ext/1907061729/sbc_analysis.o.d ${OBJECTDIR}/_ext/1907061729/sbc_dct.o.d ${OBJECTDIR}/_ext/1907061729/sbc_dct_coeffs.o.d ${OBJECTDIR}/_ext/1907061729/sbc_enc_bit_alloc_mono.o.d ${OBJECTDIR}/_ext/1907061729/sbc_enc_bit_alloc_ste.o.d ${OBJECTDIR}/_ext/1907061729/sbc_enc_coeffs.o.d ${OBJECTDIR}/_ext/1907061729/sbc_encoder.o.d ${OBJECTDIR}/_ext/1907061729/sbc_packing.o.d ${OBJECTDIR}/_ext/968912543/nao-deceased_by_disease.o.d ${OBJECTDIR}/_ext/835724193/hxcmod.o.d ${OBJECTDIR}/_ext/34712644/uECC.o.d ${OBJECTDIR}/_ext/1768064806/btstack_chipset_csr.o.d ${OBJECTDIR}/_ext/993942601/btstack_run_loop_embedded.o.d ${OBJECTDIR}/_ext/993942601/btstack_uart_block_embedded.o.d ${OBJECTDIR}/_ext/524132624/battery_service_server.o.d ${OBJECTDIR}/_ext/524132624/device_information_service_server.o.d ${OBJECTDIR}/_ext/524132624/hids_device.o.d ${OBJECTDIR}/_ext/534563071/att_db.o.d ${OBJECTDIR}/_ext/534563071/att_dispatch.o.d ${OBJECTDIR}/_ext/534563071/att_server.o.d ${OBJECTDIR}/_ext/534563071/le_device_db_memory.o.d ${OBJECTDIR}/_ext/534563071/sm.o.d ${OBJECTDIR}/_ext/534563071/ancs_client.o.d ${OBJECTDIR}/_ext/534563071/gatt_client.o.d ${OBJECTDIR}/_ext/1386327864/btstack_link_key_db_memory.o.d ${OBJECTDIR}/_ext/1386327864/sdp_client.o.d ${OBJECTDIR}/_ext/1386327864/sdp_client_rfcomm.o.d ${OBJECTDIR}/_ext/1386327864/sdp_server.o.d ${OBJECTDIR}/_ext/1386327864/sdp_util.o.d ${OBJECTDIR}/_ext/1386327864/spp_server.o.d ${OBJECTDIR}/_ext/1386327864/a2dp_sink.o.d ${OBJECTDIR}/_ext/1386327864/a2dp_source.o.d ${OBJECTDIR}/_ext/1386327864/avdtp.o.d ${OBJECTDIR}/_ext/1386327864/avdtp_acceptor.o.d ${OBJECTDIR}/_ext/1386327864/avdtp_initiator.o.d ${OBJECTDIR}/_ext/1386327864/avdtp_sink.o.d ${OBJECTDIR}/_ext/1386327864/avdtp_source.o.d ${OBJECTDIR}/_ext/1386327864/avdtp_util.o.d ${OBJECTDIR}/_ext/1386327864/avrcp.o.d ${OBJECTDIR}/_ext/1386327864/avrcp_browsing_controller.o.d ${OBJECTDIR}/_ext/1386327864/avrcp_controller.o.d ${OBJECTDIR}/_ext/1386327864/avrcp_media_item_iterator.o.d ${OBJECTDIR}/_ext/1386327864/avrcp_target.o.d ${OBJECTDIR}/_ext/1386327864/bnep.o.d ${OBJECTDIR}/_ext/1386327864/btstack_cvsd_plc.o.d ${OBJECTDIR}/_ext/1386327864/btstack_sbc_decoder_bluedroid.o.d ${OBJECTDIR}/_ext/1386327864/btstack_sbc_encoder_bluedroid.o.d ${OBJECTDIR}/_ext/1386327864/btstack_sbc_plc.o.d ${OBJECTDIR}/_ext/1386327864/device_id_server.o.d ${OBJECTDIR}/_ext/1386327864/goep_client.o.d ${OBJECTDIR}/_ext/1386327864/hfp.o.d ${OBJECTDIR}/_ext/1386327864/hfp_ag.o.d ${OBJECTDIR}/_ext/1386327864/hfp_gsm_model.o.d ${OBJECTDIR}/_ext/1386327864/hfp_hf.o.d ${OBJECTDIR}/_ext/1386327864/hfp_msbc.o.d ${OBJECTDIR}/_ext/1386327864/hid_device.o.d ${OBJECTDIR}/_ext/1386327864/hsp_ag.o.d ${OBJECTDIR}/_ext/1386327864/hsp_hs.o.d ${OBJECTDIR}/_ext/1386327864/obex_iterator.o.d ${OBJECTDIR}/_ext/1386327864/pan.o.d ${OBJECTDIR}/_ext/1386327864/pbap_client.o.d ${OBJECTDIR}/_ext/1386528437/btstack_memory.o.d ${OBJECTDIR}/_ext/1386528437/hci.o.d ${OBJECTDIR}/_ext/1386528437/hci_cmd.o.d ${OBJECTDIR}/_ext/1386528437/hci_dump.o.d ${OBJECTDIR}/_ext/1386528437/l2cap.o.d ${OBJECTDIR}/_ext/1386528437/l2cap_signaling.o.d ${OBJECTDIR}/_ext/1386528437/btstack_linked_list.o.d ${OBJECTDIR}/_ext/1386528437/btstack_memory_pool.o.d ${OBJECTDIR}/_ext/1386327864/rfcomm.o.d ${OBJECTDIR}/_ext/1386528437/btstack_run_loop.o.d ${OBJECTDIR}/_ext/1386528437/btstack_util.o.d ${OBJECTDIR}/_ext/1386528437/hci_transport_h4.o.d ${OBJECTDIR}/_ext/1386528437/hci_transport_h5.o.d ${OBJECTDIR}/_ext/1386528437/btstack_slip.o.d ${OBJECTDIR}/_ext/1386528437/ad_parser.o.d ${OBJECTDIR}/_ext/1386528437/btstack_tlv.o.d ${OBJECTDIR}/_ext/1880736137/drv_tmr.o.d ${OBJECTDIR}/_ext/1112166103/sys_clk.o.d ${OBJECTDIR}/_ext/1112166103/sys_clk_pic32mx.o.d ${OBJECTDIR}/_ext/1510368962/sys_devcon.o.d ${OBJECTDIR}/_ext/1510368962/sys_devcon_pic32mx.o.d ${OBJECTDIR}/_ext/2087176412/sys_int_pic32.o.d ${OBJECTDIR}/_ext/2147153351/sys_ports.o.d
OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/_ext/101891878/system_init.o ${OBJECTDIR}/_ext/101891878/system_tasks.o ${OBJECTDIR}/_ext/1360937237/btstack_port.o ${OBJECTDIR}/_ext/1360937237/app_debug.o ${OBJECTDIR}/_ext/1360937237/app.o ${OBJECTDIR}/_ext/1360937237/main.o ${OBJECTDIR}/_ext/97075643/spp_and_le_counter.o ${OBJECTDIR}/_ext/770672057/alloc.o ${OBJECTDIR}/_ext/770672057/bitalloc-sbc.o ${OBJECTDIR}/_ext/770672057/bitalloc.o ${OBJECTDIR}/_ext/770672057/bitstream-decode.o ${OBJECTDIR}/_ext/770672057/decoder-oina.o ${OBJECTDIR}/_ext/770672057/decoder-private.o ${OBJECTDIR}/_ext/770672057/decoder-sbc.o ${OBJECTDIR}/_ext/770672057/dequant.o ${OBJECTDIR}/_ext/770672057/framing-sbc.o ${OBJECTDIR}/_ext/770672057/framing.o ${OBJECTDIR}/_ext/770672057/oi_codec_version.o ${OBJECTDIR}/_ext/770672057/synthesis-8-generated.o ${OBJECTDIR}/_ext/770672057/synthesis-dct8.o ${OBJECTDIR}/_ext/770672057/synthesis-sbc.o ${OBJECTDIR}/_ext/1907061729/sbc_analysis.o ${OBJECTDIR}/_ext/1907061729/sbc_dct.o ${OBJECTDIR}/_ext/1907061729/sbc_dct_coeffs.o ${OBJECTDIR}/_ext/1907061729/sbc_enc_bit_alloc_mono.o ${OBJECTDIR}/_ext/1907061729/sbc_enc_bit_alloc_ste.o ${OBJECTDIR}/_ext/1907061729/sbc_enc_coeffs.o ${OBJECTDIR}/_ext/1907061729/sbc_encoder.o ${OBJECTDIR}/_ext/1907061729/sbc_packing.o ${OBJECTDIR}/_ext/968912543/nao-deceased_by_disease.o ${OBJECTDIR}/_ext/835724193/hxcmod.o ${OBJECTDIR}/_ext/34712644/uECC.o ${OBJECTDIR}/_ext/1768064806/btstack_chipset_csr.o ${OBJECTDIR}/_ext/993942601/btstack_run_loop_embedded.o ${OBJECTDIR}/_ext/993942601/btstack_uart_block_embedded.o ${OBJECTDIR}/_ext/524132624/battery_service_server.o ${OBJECTDIR}/_ext/524132624/device_information_service_server.o ${OBJECTDIR}/_ext/524132624/hids_device.o ${OBJECTDIR}/_ext/534563071/att_db.o ${OBJECTDIR}/_ext/534563071/att_dispatch.o ${OBJECTDIR}/_ext/534563071/att_server.o ${OBJECTDIR}/_ext/534563071/le_device_db_memory.o ${OBJECTDIR}/_ext/534563071/sm.o ${OBJECTDIR}/_ext/534563071/ancs_client.o ${OBJECTDIR}/_ext/534563071/gatt_client.o ${OBJECTDIR}/_ext/1386327864/btstack_link_key_db_memory.o ${OBJECTDIR}/_ext/1386327864/sdp_client.o ${OBJECTDIR}/_ext/1386327864/sdp_client_rfcomm.o ${OBJECTDIR}/_ext/1386327864/sdp_server.o ${OBJECTDIR}/_ext/1386327864/sdp_util.o ${OBJECTDIR}/_ext/1386327864/spp_server.o ${OBJECTDIR}/_ext/1386327864/a2dp_sink.o ${OBJECTDIR}/_ext/1386327864/a2dp_source.o ${OBJECTDIR}/_ext/1386327864/avdtp.o ${OBJECTDIR}/_ext/1386327864/avdtp_acceptor.o ${OBJECTDIR}/_ext/1386327864/avdtp_initiator.o ${OBJECTDIR}/_ext/1386327864/avdtp_sink.o ${OBJECTDIR}/_ext/1386327864/avdtp_source.o ${OBJECTDIR}/_ext/1386327864/avdtp_util.o ${OBJECTDIR}/_ext/1386327864/avrcp.o ${OBJECTDIR}/_ext/1386327864/avrcp_browsing_controller.o ${OBJECTDIR}/_ext/1386327864/avrcp_controller.o ${OBJECTDIR}/_ext/1386327864/avrcp_media_item_iterator.o ${OBJECTDIR}/_ext/1386327864/avrcp_target.o ${OBJECTDIR}/_ext/1386327864/bnep.o ${OBJECTDIR}/_ext/1386327864/btstack_cvsd_plc.o ${OBJECTDIR}/_ext/1386327864/btstack_sbc_decoder_bluedroid.o ${OBJECTDIR}/_ext/1386327864/btstack_sbc_encoder_bluedroid.o ${OBJECTDIR}/_ext/1386327864/btstack_sbc_plc.o ${OBJECTDIR}/_ext/1386327864/device_id_server.o ${OBJECTDIR}/_ext/1386327864/goep_client.o ${OBJECTDIR}/_ext/1386327864/hfp.o ${OBJECTDIR}/_ext/1386327864/hfp_ag.o ${OBJECTDIR}/_ext/1386327864/hfp_gsm_model.o ${OBJECTDIR}/_ext/1386327864/hfp_hf.o ${OBJECTDIR}/_ext/1386327864/hfp_msbc.o ${OBJECTDIR}/_ext/1386327864/hid_device.o ${OBJECTDIR}/_ext/1386327864/hsp_ag.o ${OBJECTDIR}/_ext/1386327864/hsp_hs.o ${OBJECTDIR}/_ext/1386327864/obex_iterator.o ${OBJECTDIR}/_ext/1386327864/pan.o ${OBJECTDIR}/_ext/1386327864/pbap_client.o ${OBJECTDIR}/_ext/1386528437/btstack_memory.o ${OBJECTDIR}/_ext/1386528437/hci.o ${OBJECTDIR}/_ext/1386528437/hci_cmd.o ${OBJECTDIR}/_ext/1386528437/hci_dump.o ${OBJECTDIR}/_ext/1386528437/l2cap.o ${OBJECTDIR}/_ext/1386528437/l2cap_signaling.o ${OBJECTDIR}/_ext/1386528437/btstack_linked_list.o ${OBJECTDIR}/_ext/1386528437/btstack_memory_pool.o ${OBJECTDIR}/_ext/1386327864/rfcomm.o ${OBJECTDIR}/_ext/1386528437/btstack_run_loop.o ${OBJECTDIR}/_ext/1386528437/btstack_util.o ${OBJECTDIR}/_ext/1386528437/hci_transport_h4.o ${OBJECTDIR}/_ext/1386528437/hci_transport_h5.o ${OBJECTDIR}/_ext/1386528437/btstack_slip.o ${OBJECTDIR}/_ext/1386528437/ad_parser.o ${OBJECTDIR}/_ext/1386528437/btstack_tlv.o ${OBJECTDIR}/_ext/1880736137/drv_tmr.o ${OBJECTDIR}/_ext/1112166103/sys_clk.o ${OBJECTDIR}/_ext/1112166103/sys_clk_pic32mx.o ${OBJECTDIR}/_ext/1510368962/sys_devcon.o ${OBJECTDIR}/_ext/1510368962/sys_devcon_pic32mx.o ${OBJECTDIR}/_ext/2087176412/sys_int_pic32.o ${OBJECTDIR}/_ext/2147153351/sys_ports.o ${OBJECTDIR}/_ext/1386528437/btstack_crypto.o
POSSIBLE_DEPFILES=${OBJECTDIR}/_ext/101891878/system_init.o.d ${OBJECTDIR}/_ext/101891878/system_tasks.o.d ${OBJECTDIR}/_ext/1360937237/btstack_port.o.d ${OBJECTDIR}/_ext/1360937237/app_debug.o.d ${OBJECTDIR}/_ext/1360937237/app.o.d ${OBJECTDIR}/_ext/1360937237/main.o.d ${OBJECTDIR}/_ext/97075643/spp_and_le_counter.o.d ${OBJECTDIR}/_ext/770672057/alloc.o.d ${OBJECTDIR}/_ext/770672057/bitalloc-sbc.o.d ${OBJECTDIR}/_ext/770672057/bitalloc.o.d ${OBJECTDIR}/_ext/770672057/bitstream-decode.o.d ${OBJECTDIR}/_ext/770672057/decoder-oina.o.d ${OBJECTDIR}/_ext/770672057/decoder-private.o.d ${OBJECTDIR}/_ext/770672057/decoder-sbc.o.d ${OBJECTDIR}/_ext/770672057/dequant.o.d ${OBJECTDIR}/_ext/770672057/framing-sbc.o.d ${OBJECTDIR}/_ext/770672057/framing.o.d ${OBJECTDIR}/_ext/770672057/oi_codec_version.o.d ${OBJECTDIR}/_ext/770672057/synthesis-8-generated.o.d ${OBJECTDIR}/_ext/770672057/synthesis-dct8.o.d ${OBJECTDIR}/_ext/770672057/synthesis-sbc.o.d ${OBJECTDIR}/_ext/1907061729/sbc_analysis.o.d ${OBJECTDIR}/_ext/1907061729/sbc_dct.o.d ${OBJECTDIR}/_ext/1907061729/sbc_dct_coeffs.o.d ${OBJECTDIR}/_ext/1907061729/sbc_enc_bit_alloc_mono.o.d ${OBJECTDIR}/_ext/1907061729/sbc_enc_bit_alloc_ste.o.d ${OBJECTDIR}/_ext/1907061729/sbc_enc_coeffs.o.d ${OBJECTDIR}/_ext/1907061729/sbc_encoder.o.d ${OBJECTDIR}/_ext/1907061729/sbc_packing.o.d ${OBJECTDIR}/_ext/968912543/nao-deceased_by_disease.o.d ${OBJECTDIR}/_ext/835724193/hxcmod.o.d ${OBJECTDIR}/_ext/34712644/uECC.o.d ${OBJECTDIR}/_ext/1768064806/btstack_chipset_csr.o.d ${OBJECTDIR}/_ext/993942601/btstack_run_loop_embedded.o.d ${OBJECTDIR}/_ext/993942601/btstack_uart_block_embedded.o.d ${OBJECTDIR}/_ext/524132624/battery_service_server.o.d ${OBJECTDIR}/_ext/524132624/device_information_service_server.o.d ${OBJECTDIR}/_ext/524132624/hids_device.o.d ${OBJECTDIR}/_ext/534563071/att_db.o.d ${OBJECTDIR}/_ext/534563071/att_dispatch.o.d ${OBJECTDIR}/_ext/534563071/att_server.o.d ${OBJECTDIR}/_ext/534563071/le_device_db_memory.o.d ${OBJECTDIR}/_ext/534563071/sm.o.d ${OBJECTDIR}/_ext/534563071/ancs_client.o.d ${OBJECTDIR}/_ext/534563071/gatt_client.o.d ${OBJECTDIR}/_ext/1386327864/btstack_link_key_db_memory.o.d ${OBJECTDIR}/_ext/1386327864/sdp_client.o.d ${OBJECTDIR}/_ext/1386327864/sdp_client_rfcomm.o.d ${OBJECTDIR}/_ext/1386327864/sdp_server.o.d ${OBJECTDIR}/_ext/1386327864/sdp_util.o.d ${OBJECTDIR}/_ext/1386327864/spp_server.o.d ${OBJECTDIR}/_ext/1386327864/a2dp_sink.o.d ${OBJECTDIR}/_ext/1386327864/a2dp_source.o.d ${OBJECTDIR}/_ext/1386327864/avdtp.o.d ${OBJECTDIR}/_ext/1386327864/avdtp_acceptor.o.d ${OBJECTDIR}/_ext/1386327864/avdtp_initiator.o.d ${OBJECTDIR}/_ext/1386327864/avdtp_sink.o.d ${OBJECTDIR}/_ext/1386327864/avdtp_source.o.d ${OBJECTDIR}/_ext/1386327864/avdtp_util.o.d ${OBJECTDIR}/_ext/1386327864/avrcp.o.d ${OBJECTDIR}/_ext/1386327864/avrcp_browsing_controller.o.d ${OBJECTDIR}/_ext/1386327864/avrcp_controller.o.d ${OBJECTDIR}/_ext/1386327864/avrcp_media_item_iterator.o.d ${OBJECTDIR}/_ext/1386327864/avrcp_target.o.d ${OBJECTDIR}/_ext/1386327864/bnep.o.d ${OBJECTDIR}/_ext/1386327864/btstack_cvsd_plc.o.d ${OBJECTDIR}/_ext/1386327864/btstack_sbc_decoder_bluedroid.o.d ${OBJECTDIR}/_ext/1386327864/btstack_sbc_encoder_bluedroid.o.d ${OBJECTDIR}/_ext/1386327864/btstack_sbc_plc.o.d ${OBJECTDIR}/_ext/1386327864/device_id_server.o.d ${OBJECTDIR}/_ext/1386327864/goep_client.o.d ${OBJECTDIR}/_ext/1386327864/hfp.o.d ${OBJECTDIR}/_ext/1386327864/hfp_ag.o.d ${OBJECTDIR}/_ext/1386327864/hfp_gsm_model.o.d ${OBJECTDIR}/_ext/1386327864/hfp_hf.o.d ${OBJECTDIR}/_ext/1386327864/hfp_msbc.o.d ${OBJECTDIR}/_ext/1386327864/hid_device.o.d ${OBJECTDIR}/_ext/1386327864/hsp_ag.o.d ${OBJECTDIR}/_ext/1386327864/hsp_hs.o.d ${OBJECTDIR}/_ext/1386327864/obex_iterator.o.d ${OBJECTDIR}/_ext/1386327864/pan.o.d ${OBJECTDIR}/_ext/1386327864/pbap_client.o.d ${OBJECTDIR}/_ext/1386528437/btstack_memory.o.d ${OBJECTDIR}/_ext/1386528437/hci.o.d ${OBJECTDIR}/_ext/1386528437/hci_cmd.o.d ${OBJECTDIR}/_ext/1386528437/hci_dump.o.d ${OBJECTDIR}/_ext/1386528437/l2cap.o.d ${OBJECTDIR}/_ext/1386528437/l2cap_signaling.o.d ${OBJECTDIR}/_ext/1386528437/btstack_linked_list.o.d ${OBJECTDIR}/_ext/1386528437/btstack_memory_pool.o.d ${OBJECTDIR}/_ext/1386327864/rfcomm.o.d ${OBJECTDIR}/_ext/1386528437/btstack_run_loop.o.d ${OBJECTDIR}/_ext/1386528437/btstack_util.o.d ${OBJECTDIR}/_ext/1386528437/hci_transport_h4.o.d ${OBJECTDIR}/_ext/1386528437/hci_transport_h5.o.d ${OBJECTDIR}/_ext/1386528437/btstack_slip.o.d ${OBJECTDIR}/_ext/1386528437/ad_parser.o.d ${OBJECTDIR}/_ext/1386528437/btstack_tlv.o.d ${OBJECTDIR}/_ext/1880736137/drv_tmr.o.d ${OBJECTDIR}/_ext/1112166103/sys_clk.o.d ${OBJECTDIR}/_ext/1112166103/sys_clk_pic32mx.o.d ${OBJECTDIR}/_ext/1510368962/sys_devcon.o.d ${OBJECTDIR}/_ext/1510368962/sys_devcon_pic32mx.o.d ${OBJECTDIR}/_ext/2087176412/sys_int_pic32.o.d ${OBJECTDIR}/_ext/2147153351/sys_ports.o.d ${OBJECTDIR}/_ext/1386528437/btstack_crypto.o.d
# Object Files
OBJECTFILES=${OBJECTDIR}/_ext/101891878/system_init.o ${OBJECTDIR}/_ext/101891878/system_tasks.o ${OBJECTDIR}/_ext/1360937237/btstack_port.o ${OBJECTDIR}/_ext/1360937237/app_debug.o ${OBJECTDIR}/_ext/1360937237/app.o ${OBJECTDIR}/_ext/1360937237/main.o ${OBJECTDIR}/_ext/97075643/spp_and_le_counter.o ${OBJECTDIR}/_ext/770672057/alloc.o ${OBJECTDIR}/_ext/770672057/bitalloc-sbc.o ${OBJECTDIR}/_ext/770672057/bitalloc.o ${OBJECTDIR}/_ext/770672057/bitstream-decode.o ${OBJECTDIR}/_ext/770672057/decoder-oina.o ${OBJECTDIR}/_ext/770672057/decoder-private.o ${OBJECTDIR}/_ext/770672057/decoder-sbc.o ${OBJECTDIR}/_ext/770672057/dequant.o ${OBJECTDIR}/_ext/770672057/framing-sbc.o ${OBJECTDIR}/_ext/770672057/framing.o ${OBJECTDIR}/_ext/770672057/oi_codec_version.o ${OBJECTDIR}/_ext/770672057/synthesis-8-generated.o ${OBJECTDIR}/_ext/770672057/synthesis-dct8.o ${OBJECTDIR}/_ext/770672057/synthesis-sbc.o ${OBJECTDIR}/_ext/1907061729/sbc_analysis.o ${OBJECTDIR}/_ext/1907061729/sbc_dct.o ${OBJECTDIR}/_ext/1907061729/sbc_dct_coeffs.o ${OBJECTDIR}/_ext/1907061729/sbc_enc_bit_alloc_mono.o ${OBJECTDIR}/_ext/1907061729/sbc_enc_bit_alloc_ste.o ${OBJECTDIR}/_ext/1907061729/sbc_enc_coeffs.o ${OBJECTDIR}/_ext/1907061729/sbc_encoder.o ${OBJECTDIR}/_ext/1907061729/sbc_packing.o ${OBJECTDIR}/_ext/968912543/nao-deceased_by_disease.o ${OBJECTDIR}/_ext/835724193/hxcmod.o ${OBJECTDIR}/_ext/34712644/uECC.o ${OBJECTDIR}/_ext/1768064806/btstack_chipset_csr.o ${OBJECTDIR}/_ext/993942601/btstack_run_loop_embedded.o ${OBJECTDIR}/_ext/993942601/btstack_uart_block_embedded.o ${OBJECTDIR}/_ext/524132624/battery_service_server.o ${OBJECTDIR}/_ext/524132624/device_information_service_server.o ${OBJECTDIR}/_ext/524132624/hids_device.o ${OBJECTDIR}/_ext/534563071/att_db.o ${OBJECTDIR}/_ext/534563071/att_dispatch.o ${OBJECTDIR}/_ext/534563071/att_server.o ${OBJECTDIR}/_ext/534563071/le_device_db_memory.o ${OBJECTDIR}/_ext/534563071/sm.o ${OBJECTDIR}/_ext/534563071/ancs_client.o ${OBJECTDIR}/_ext/534563071/gatt_client.o ${OBJECTDIR}/_ext/1386327864/btstack_link_key_db_memory.o ${OBJECTDIR}/_ext/1386327864/sdp_client.o ${OBJECTDIR}/_ext/1386327864/sdp_client_rfcomm.o ${OBJECTDIR}/_ext/1386327864/sdp_server.o ${OBJECTDIR}/_ext/1386327864/sdp_util.o ${OBJECTDIR}/_ext/1386327864/spp_server.o ${OBJECTDIR}/_ext/1386327864/a2dp_sink.o ${OBJECTDIR}/_ext/1386327864/a2dp_source.o ${OBJECTDIR}/_ext/1386327864/avdtp.o ${OBJECTDIR}/_ext/1386327864/avdtp_acceptor.o ${OBJECTDIR}/_ext/1386327864/avdtp_initiator.o ${OBJECTDIR}/_ext/1386327864/avdtp_sink.o ${OBJECTDIR}/_ext/1386327864/avdtp_source.o ${OBJECTDIR}/_ext/1386327864/avdtp_util.o ${OBJECTDIR}/_ext/1386327864/avrcp.o ${OBJECTDIR}/_ext/1386327864/avrcp_browsing_controller.o ${OBJECTDIR}/_ext/1386327864/avrcp_controller.o ${OBJECTDIR}/_ext/1386327864/avrcp_media_item_iterator.o ${OBJECTDIR}/_ext/1386327864/avrcp_target.o ${OBJECTDIR}/_ext/1386327864/bnep.o ${OBJECTDIR}/_ext/1386327864/btstack_cvsd_plc.o ${OBJECTDIR}/_ext/1386327864/btstack_sbc_decoder_bluedroid.o ${OBJECTDIR}/_ext/1386327864/btstack_sbc_encoder_bluedroid.o ${OBJECTDIR}/_ext/1386327864/btstack_sbc_plc.o ${OBJECTDIR}/_ext/1386327864/device_id_server.o ${OBJECTDIR}/_ext/1386327864/goep_client.o ${OBJECTDIR}/_ext/1386327864/hfp.o ${OBJECTDIR}/_ext/1386327864/hfp_ag.o ${OBJECTDIR}/_ext/1386327864/hfp_gsm_model.o ${OBJECTDIR}/_ext/1386327864/hfp_hf.o ${OBJECTDIR}/_ext/1386327864/hfp_msbc.o ${OBJECTDIR}/_ext/1386327864/hid_device.o ${OBJECTDIR}/_ext/1386327864/hsp_ag.o ${OBJECTDIR}/_ext/1386327864/hsp_hs.o ${OBJECTDIR}/_ext/1386327864/obex_iterator.o ${OBJECTDIR}/_ext/1386327864/pan.o ${OBJECTDIR}/_ext/1386327864/pbap_client.o ${OBJECTDIR}/_ext/1386528437/btstack_memory.o ${OBJECTDIR}/_ext/1386528437/hci.o ${OBJECTDIR}/_ext/1386528437/hci_cmd.o ${OBJECTDIR}/_ext/1386528437/hci_dump.o ${OBJECTDIR}/_ext/1386528437/l2cap.o ${OBJECTDIR}/_ext/1386528437/l2cap_signaling.o ${OBJECTDIR}/_ext/1386528437/btstack_linked_list.o ${OBJECTDIR}/_ext/1386528437/btstack_memory_pool.o ${OBJECTDIR}/_ext/1386327864/rfcomm.o ${OBJECTDIR}/_ext/1386528437/btstack_run_loop.o ${OBJECTDIR}/_ext/1386528437/btstack_util.o ${OBJECTDIR}/_ext/1386528437/hci_transport_h4.o ${OBJECTDIR}/_ext/1386528437/hci_transport_h5.o ${OBJECTDIR}/_ext/1386528437/btstack_slip.o ${OBJECTDIR}/_ext/1386528437/ad_parser.o ${OBJECTDIR}/_ext/1386528437/btstack_tlv.o ${OBJECTDIR}/_ext/1880736137/drv_tmr.o ${OBJECTDIR}/_ext/1112166103/sys_clk.o ${OBJECTDIR}/_ext/1112166103/sys_clk_pic32mx.o ${OBJECTDIR}/_ext/1510368962/sys_devcon.o ${OBJECTDIR}/_ext/1510368962/sys_devcon_pic32mx.o ${OBJECTDIR}/_ext/2087176412/sys_int_pic32.o ${OBJECTDIR}/_ext/2147153351/sys_ports.o
OBJECTFILES=${OBJECTDIR}/_ext/101891878/system_init.o ${OBJECTDIR}/_ext/101891878/system_tasks.o ${OBJECTDIR}/_ext/1360937237/btstack_port.o ${OBJECTDIR}/_ext/1360937237/app_debug.o ${OBJECTDIR}/_ext/1360937237/app.o ${OBJECTDIR}/_ext/1360937237/main.o ${OBJECTDIR}/_ext/97075643/spp_and_le_counter.o ${OBJECTDIR}/_ext/770672057/alloc.o ${OBJECTDIR}/_ext/770672057/bitalloc-sbc.o ${OBJECTDIR}/_ext/770672057/bitalloc.o ${OBJECTDIR}/_ext/770672057/bitstream-decode.o ${OBJECTDIR}/_ext/770672057/decoder-oina.o ${OBJECTDIR}/_ext/770672057/decoder-private.o ${OBJECTDIR}/_ext/770672057/decoder-sbc.o ${OBJECTDIR}/_ext/770672057/dequant.o ${OBJECTDIR}/_ext/770672057/framing-sbc.o ${OBJECTDIR}/_ext/770672057/framing.o ${OBJECTDIR}/_ext/770672057/oi_codec_version.o ${OBJECTDIR}/_ext/770672057/synthesis-8-generated.o ${OBJECTDIR}/_ext/770672057/synthesis-dct8.o ${OBJECTDIR}/_ext/770672057/synthesis-sbc.o ${OBJECTDIR}/_ext/1907061729/sbc_analysis.o ${OBJECTDIR}/_ext/1907061729/sbc_dct.o ${OBJECTDIR}/_ext/1907061729/sbc_dct_coeffs.o ${OBJECTDIR}/_ext/1907061729/sbc_enc_bit_alloc_mono.o ${OBJECTDIR}/_ext/1907061729/sbc_enc_bit_alloc_ste.o ${OBJECTDIR}/_ext/1907061729/sbc_enc_coeffs.o ${OBJECTDIR}/_ext/1907061729/sbc_encoder.o ${OBJECTDIR}/_ext/1907061729/sbc_packing.o ${OBJECTDIR}/_ext/968912543/nao-deceased_by_disease.o ${OBJECTDIR}/_ext/835724193/hxcmod.o ${OBJECTDIR}/_ext/34712644/uECC.o ${OBJECTDIR}/_ext/1768064806/btstack_chipset_csr.o ${OBJECTDIR}/_ext/993942601/btstack_run_loop_embedded.o ${OBJECTDIR}/_ext/993942601/btstack_uart_block_embedded.o ${OBJECTDIR}/_ext/524132624/battery_service_server.o ${OBJECTDIR}/_ext/524132624/device_information_service_server.o ${OBJECTDIR}/_ext/524132624/hids_device.o ${OBJECTDIR}/_ext/534563071/att_db.o ${OBJECTDIR}/_ext/534563071/att_dispatch.o ${OBJECTDIR}/_ext/534563071/att_server.o ${OBJECTDIR}/_ext/534563071/le_device_db_memory.o ${OBJECTDIR}/_ext/534563071/sm.o ${OBJECTDIR}/_ext/534563071/ancs_client.o ${OBJECTDIR}/_ext/534563071/gatt_client.o ${OBJECTDIR}/_ext/1386327864/btstack_link_key_db_memory.o ${OBJECTDIR}/_ext/1386327864/sdp_client.o ${OBJECTDIR}/_ext/1386327864/sdp_client_rfcomm.o ${OBJECTDIR}/_ext/1386327864/sdp_server.o ${OBJECTDIR}/_ext/1386327864/sdp_util.o ${OBJECTDIR}/_ext/1386327864/spp_server.o ${OBJECTDIR}/_ext/1386327864/a2dp_sink.o ${OBJECTDIR}/_ext/1386327864/a2dp_source.o ${OBJECTDIR}/_ext/1386327864/avdtp.o ${OBJECTDIR}/_ext/1386327864/avdtp_acceptor.o ${OBJECTDIR}/_ext/1386327864/avdtp_initiator.o ${OBJECTDIR}/_ext/1386327864/avdtp_sink.o ${OBJECTDIR}/_ext/1386327864/avdtp_source.o ${OBJECTDIR}/_ext/1386327864/avdtp_util.o ${OBJECTDIR}/_ext/1386327864/avrcp.o ${OBJECTDIR}/_ext/1386327864/avrcp_browsing_controller.o ${OBJECTDIR}/_ext/1386327864/avrcp_controller.o ${OBJECTDIR}/_ext/1386327864/avrcp_media_item_iterator.o ${OBJECTDIR}/_ext/1386327864/avrcp_target.o ${OBJECTDIR}/_ext/1386327864/bnep.o ${OBJECTDIR}/_ext/1386327864/btstack_cvsd_plc.o ${OBJECTDIR}/_ext/1386327864/btstack_sbc_decoder_bluedroid.o ${OBJECTDIR}/_ext/1386327864/btstack_sbc_encoder_bluedroid.o ${OBJECTDIR}/_ext/1386327864/btstack_sbc_plc.o ${OBJECTDIR}/_ext/1386327864/device_id_server.o ${OBJECTDIR}/_ext/1386327864/goep_client.o ${OBJECTDIR}/_ext/1386327864/hfp.o ${OBJECTDIR}/_ext/1386327864/hfp_ag.o ${OBJECTDIR}/_ext/1386327864/hfp_gsm_model.o ${OBJECTDIR}/_ext/1386327864/hfp_hf.o ${OBJECTDIR}/_ext/1386327864/hfp_msbc.o ${OBJECTDIR}/_ext/1386327864/hid_device.o ${OBJECTDIR}/_ext/1386327864/hsp_ag.o ${OBJECTDIR}/_ext/1386327864/hsp_hs.o ${OBJECTDIR}/_ext/1386327864/obex_iterator.o ${OBJECTDIR}/_ext/1386327864/pan.o ${OBJECTDIR}/_ext/1386327864/pbap_client.o ${OBJECTDIR}/_ext/1386528437/btstack_memory.o ${OBJECTDIR}/_ext/1386528437/hci.o ${OBJECTDIR}/_ext/1386528437/hci_cmd.o ${OBJECTDIR}/_ext/1386528437/hci_dump.o ${OBJECTDIR}/_ext/1386528437/l2cap.o ${OBJECTDIR}/_ext/1386528437/l2cap_signaling.o ${OBJECTDIR}/_ext/1386528437/btstack_linked_list.o ${OBJECTDIR}/_ext/1386528437/btstack_memory_pool.o ${OBJECTDIR}/_ext/1386327864/rfcomm.o ${OBJECTDIR}/_ext/1386528437/btstack_run_loop.o ${OBJECTDIR}/_ext/1386528437/btstack_util.o ${OBJECTDIR}/_ext/1386528437/hci_transport_h4.o ${OBJECTDIR}/_ext/1386528437/hci_transport_h5.o ${OBJECTDIR}/_ext/1386528437/btstack_slip.o ${OBJECTDIR}/_ext/1386528437/ad_parser.o ${OBJECTDIR}/_ext/1386528437/btstack_tlv.o ${OBJECTDIR}/_ext/1880736137/drv_tmr.o ${OBJECTDIR}/_ext/1112166103/sys_clk.o ${OBJECTDIR}/_ext/1112166103/sys_clk_pic32mx.o ${OBJECTDIR}/_ext/1510368962/sys_devcon.o ${OBJECTDIR}/_ext/1510368962/sys_devcon_pic32mx.o ${OBJECTDIR}/_ext/2087176412/sys_int_pic32.o ${OBJECTDIR}/_ext/2147153351/sys_ports.o ${OBJECTDIR}/_ext/1386528437/btstack_crypto.o
# Source Files
SOURCEFILES=../src/system_config/bt_audio_dk/system_init.c ../src/system_config/bt_audio_dk/system_tasks.c ../src/btstack_port.c ../src/app_debug.c ../src/app.c ../src/main.c ../../../example/spp_and_le_counter.c ../../../3rd-party/bluedroid/decoder/srce/alloc.c ../../../3rd-party/bluedroid/decoder/srce/bitalloc-sbc.c ../../../3rd-party/bluedroid/decoder/srce/bitalloc.c ../../../3rd-party/bluedroid/decoder/srce/bitstream-decode.c ../../../3rd-party/bluedroid/decoder/srce/decoder-oina.c ../../../3rd-party/bluedroid/decoder/srce/decoder-private.c ../../../3rd-party/bluedroid/decoder/srce/decoder-sbc.c ../../../3rd-party/bluedroid/decoder/srce/dequant.c ../../../3rd-party/bluedroid/decoder/srce/framing-sbc.c ../../../3rd-party/bluedroid/decoder/srce/framing.c ../../../3rd-party/bluedroid/decoder/srce/oi_codec_version.c ../../../3rd-party/bluedroid/decoder/srce/synthesis-8-generated.c ../../../3rd-party/bluedroid/decoder/srce/synthesis-dct8.c ../../../3rd-party/bluedroid/decoder/srce/synthesis-sbc.c ../../../3rd-party/bluedroid/encoder/srce/sbc_analysis.c ../../../3rd-party/bluedroid/encoder/srce/sbc_dct.c ../../../3rd-party/bluedroid/encoder/srce/sbc_dct_coeffs.c ../../../3rd-party/bluedroid/encoder/srce/sbc_enc_bit_alloc_mono.c ../../../3rd-party/bluedroid/encoder/srce/sbc_enc_bit_alloc_ste.c ../../../3rd-party/bluedroid/encoder/srce/sbc_enc_coeffs.c ../../../3rd-party/bluedroid/encoder/srce/sbc_encoder.c ../../../3rd-party/bluedroid/encoder/srce/sbc_packing.c ../../../3rd-party/hxcmod-player/mods/nao-deceased_by_disease.c ../../../3rd-party/hxcmod-player/hxcmod.c ../../../3rd-party/micro-ecc/uECC.c ../../../chipset/csr/btstack_chipset_csr.c ../../../platform/embedded/btstack_run_loop_embedded.c ../../../platform/embedded/btstack_uart_block_embedded.c ../../../src/ble/gatt-service/battery_service_server.c ../../../src/ble/gatt-service/device_information_service_server.c ../../../src/ble/gatt-service/hids_device.c ../../../src/ble/att_db.c ../../../src/ble/att_dispatch.c ../../../src/ble/att_server.c ../../../src/ble/le_device_db_memory.c ../../../src/ble/sm.c ../../../src/ble/ancs_client.c ../../../src/ble/gatt_client.c ../../../src/classic/btstack_link_key_db_memory.c ../../../src/classic/sdp_client.c ../../../src/classic/sdp_client_rfcomm.c ../../../src/classic/sdp_server.c ../../../src/classic/sdp_util.c ../../../src/classic/spp_server.c ../../../src/classic/a2dp_sink.c ../../../src/classic/a2dp_source.c ../../../src/classic/avdtp.c ../../../src/classic/avdtp_acceptor.c ../../../src/classic/avdtp_initiator.c ../../../src/classic/avdtp_sink.c ../../../src/classic/avdtp_source.c ../../../src/classic/avdtp_util.c ../../../src/classic/avrcp.c ../../../src/classic/avrcp_browsing_controller.c ../../../src/classic/avrcp_controller.c ../../../src/classic/avrcp_media_item_iterator.c ../../../src/classic/avrcp_target.c ../../../src/classic/bnep.c ../../../src/classic/btstack_cvsd_plc.c ../../../src/classic/btstack_sbc_decoder_bluedroid.c ../../../src/classic/btstack_sbc_encoder_bluedroid.c ../../../src/classic/btstack_sbc_plc.c ../../../src/classic/device_id_server.c ../../../src/classic/goep_client.c ../../../src/classic/hfp.c ../../../src/classic/hfp_ag.c ../../../src/classic/hfp_gsm_model.c ../../../src/classic/hfp_hf.c ../../../src/classic/hfp_msbc.c ../../../src/classic/hid_device.c ../../../src/classic/hsp_ag.c ../../../src/classic/hsp_hs.c ../../../src/classic/obex_iterator.c ../../../src/classic/pan.c ../../../src/classic/pbap_client.c ../../../src/btstack_memory.c ../../../src/hci.c ../../../src/hci_cmd.c ../../../src/hci_dump.c ../../../src/l2cap.c ../../../src/l2cap_signaling.c ../../../src/btstack_linked_list.c ../../../src/btstack_memory_pool.c ../../../src/classic/rfcomm.c ../../../src/btstack_run_loop.c ../../../src/btstack_util.c ../../../src/hci_transport_h4.c ../../../src/hci_transport_h5.c ../../../src/btstack_slip.c ../../../src/ad_parser.c ../../../src/btstack_tlv.c ../../../../driver/tmr/src/dynamic/drv_tmr.c ../../../../system/clk/src/sys_clk.c ../../../../system/clk/src/sys_clk_pic32mx.c ../../../../system/devcon/src/sys_devcon.c ../../../../system/devcon/src/sys_devcon_pic32mx.c ../../../../system/int/src/sys_int_pic32.c ../../../../system/ports/src/sys_ports.c
SOURCEFILES=../src/system_config/bt_audio_dk/system_init.c ../src/system_config/bt_audio_dk/system_tasks.c ../src/btstack_port.c ../src/app_debug.c ../src/app.c ../src/main.c ../../../example/spp_and_le_counter.c ../../../3rd-party/bluedroid/decoder/srce/alloc.c ../../../3rd-party/bluedroid/decoder/srce/bitalloc-sbc.c ../../../3rd-party/bluedroid/decoder/srce/bitalloc.c ../../../3rd-party/bluedroid/decoder/srce/bitstream-decode.c ../../../3rd-party/bluedroid/decoder/srce/decoder-oina.c ../../../3rd-party/bluedroid/decoder/srce/decoder-private.c ../../../3rd-party/bluedroid/decoder/srce/decoder-sbc.c ../../../3rd-party/bluedroid/decoder/srce/dequant.c ../../../3rd-party/bluedroid/decoder/srce/framing-sbc.c ../../../3rd-party/bluedroid/decoder/srce/framing.c ../../../3rd-party/bluedroid/decoder/srce/oi_codec_version.c ../../../3rd-party/bluedroid/decoder/srce/synthesis-8-generated.c ../../../3rd-party/bluedroid/decoder/srce/synthesis-dct8.c ../../../3rd-party/bluedroid/decoder/srce/synthesis-sbc.c ../../../3rd-party/bluedroid/encoder/srce/sbc_analysis.c ../../../3rd-party/bluedroid/encoder/srce/sbc_dct.c ../../../3rd-party/bluedroid/encoder/srce/sbc_dct_coeffs.c ../../../3rd-party/bluedroid/encoder/srce/sbc_enc_bit_alloc_mono.c ../../../3rd-party/bluedroid/encoder/srce/sbc_enc_bit_alloc_ste.c ../../../3rd-party/bluedroid/encoder/srce/sbc_enc_coeffs.c ../../../3rd-party/bluedroid/encoder/srce/sbc_encoder.c ../../../3rd-party/bluedroid/encoder/srce/sbc_packing.c ../../../3rd-party/hxcmod-player/mods/nao-deceased_by_disease.c ../../../3rd-party/hxcmod-player/hxcmod.c ../../../3rd-party/micro-ecc/uECC.c ../../../chipset/csr/btstack_chipset_csr.c ../../../platform/embedded/btstack_run_loop_embedded.c ../../../platform/embedded/btstack_uart_block_embedded.c ../../../src/ble/gatt-service/battery_service_server.c ../../../src/ble/gatt-service/device_information_service_server.c ../../../src/ble/gatt-service/hids_device.c ../../../src/ble/att_db.c ../../../src/ble/att_dispatch.c ../../../src/ble/att_server.c ../../../src/ble/le_device_db_memory.c ../../../src/ble/sm.c ../../../src/ble/ancs_client.c ../../../src/ble/gatt_client.c ../../../src/classic/btstack_link_key_db_memory.c ../../../src/classic/sdp_client.c ../../../src/classic/sdp_client_rfcomm.c ../../../src/classic/sdp_server.c ../../../src/classic/sdp_util.c ../../../src/classic/spp_server.c ../../../src/classic/a2dp_sink.c ../../../src/classic/a2dp_source.c ../../../src/classic/avdtp.c ../../../src/classic/avdtp_acceptor.c ../../../src/classic/avdtp_initiator.c ../../../src/classic/avdtp_sink.c ../../../src/classic/avdtp_source.c ../../../src/classic/avdtp_util.c ../../../src/classic/avrcp.c ../../../src/classic/avrcp_browsing_controller.c ../../../src/classic/avrcp_controller.c ../../../src/classic/avrcp_media_item_iterator.c ../../../src/classic/avrcp_target.c ../../../src/classic/bnep.c ../../../src/classic/btstack_cvsd_plc.c ../../../src/classic/btstack_sbc_decoder_bluedroid.c ../../../src/classic/btstack_sbc_encoder_bluedroid.c ../../../src/classic/btstack_sbc_plc.c ../../../src/classic/device_id_server.c ../../../src/classic/goep_client.c ../../../src/classic/hfp.c ../../../src/classic/hfp_ag.c ../../../src/classic/hfp_gsm_model.c ../../../src/classic/hfp_hf.c ../../../src/classic/hfp_msbc.c ../../../src/classic/hid_device.c ../../../src/classic/hsp_ag.c ../../../src/classic/hsp_hs.c ../../../src/classic/obex_iterator.c ../../../src/classic/pan.c ../../../src/classic/pbap_client.c ../../../src/btstack_memory.c ../../../src/hci.c ../../../src/hci_cmd.c ../../../src/hci_dump.c ../../../src/l2cap.c ../../../src/l2cap_signaling.c ../../../src/btstack_linked_list.c ../../../src/btstack_memory_pool.c ../../../src/classic/rfcomm.c ../../../src/btstack_run_loop.c ../../../src/btstack_util.c ../../../src/hci_transport_h4.c ../../../src/hci_transport_h5.c ../../../src/btstack_slip.c ../../../src/ad_parser.c ../../../src/btstack_tlv.c ../../../../driver/tmr/src/dynamic/drv_tmr.c ../../../../system/clk/src/sys_clk.c ../../../../system/clk/src/sys_clk_pic32mx.c ../../../../system/devcon/src/sys_devcon.c ../../../../system/devcon/src/sys_devcon_pic32mx.c ../../../../system/int/src/sys_int_pic32.c ../../../../system/ports/src/sys_ports.c ../../../src/btstack_crypto.c
CFLAGS=
@ -724,6 +724,12 @@ ${OBJECTDIR}/_ext/2147153351/sys_ports.o: ../../../../system/ports/src/sys_ports
@${RM} ${OBJECTDIR}/_ext/2147153351/sys_ports.o
@${FIXDEPS} "${OBJECTDIR}/_ext/2147153351/sys_ports.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -Os -I"." -I"../../../.." -I"../src" -I"../src/system_config/bt_audio_dk" -I"../../../src" -I"../../../chipset/csr" -I"../../../platform/embedded" -I"../../../3rd-party/micro-ecc" -I"../../../3rd-party/bluedroid/decoder/include" -I"../../../3rd-party/bluedroid/encoder/include" -I"../../../3rd-party/hxcmod-player" -I"../../../3rd-party/hxcmod-player/mods" -MMD -MF "${OBJECTDIR}/_ext/2147153351/sys_ports.o.d" -o ${OBJECTDIR}/_ext/2147153351/sys_ports.o ../../../../system/ports/src/sys_ports.c
${OBJECTDIR}/_ext/1386528437/btstack_crypto.o: ../../../src/btstack_crypto.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} "${OBJECTDIR}/_ext/1386528437"
@${RM} ${OBJECTDIR}/_ext/1386528437/btstack_crypto.o.d
@${RM} ${OBJECTDIR}/_ext/1386528437/btstack_crypto.o
@${FIXDEPS} "${OBJECTDIR}/_ext/1386528437/btstack_crypto.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -Os -I"." -I"../../../.." -I"../src" -I"../src/system_config/bt_audio_dk" -I"../../../src" -I"../../../chipset/csr" -I"../../../platform/embedded" -I"../../../3rd-party/micro-ecc" -I"../../../3rd-party/bluedroid/decoder/include" -I"../../../3rd-party/bluedroid/encoder/include" -I"../../../3rd-party/hxcmod-player" -I"../../../3rd-party/hxcmod-player/mods" -MMD -MF "${OBJECTDIR}/_ext/1386528437/btstack_crypto.o.d" -o ${OBJECTDIR}/_ext/1386528437/btstack_crypto.o ../../../src/btstack_crypto.c
else
${OBJECTDIR}/_ext/101891878/system_init.o: ../src/system_config/bt_audio_dk/system_init.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} "${OBJECTDIR}/_ext/101891878"
@ -1355,6 +1361,12 @@ ${OBJECTDIR}/_ext/2147153351/sys_ports.o: ../../../../system/ports/src/sys_ports
@${RM} ${OBJECTDIR}/_ext/2147153351/sys_ports.o
@${FIXDEPS} "${OBJECTDIR}/_ext/2147153351/sys_ports.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -Os -I"." -I"../../../.." -I"../src" -I"../src/system_config/bt_audio_dk" -I"../../../src" -I"../../../chipset/csr" -I"../../../platform/embedded" -I"../../../3rd-party/micro-ecc" -I"../../../3rd-party/bluedroid/decoder/include" -I"../../../3rd-party/bluedroid/encoder/include" -I"../../../3rd-party/hxcmod-player" -I"../../../3rd-party/hxcmod-player/mods" -MMD -MF "${OBJECTDIR}/_ext/2147153351/sys_ports.o.d" -o ${OBJECTDIR}/_ext/2147153351/sys_ports.o ../../../../system/ports/src/sys_ports.c
${OBJECTDIR}/_ext/1386528437/btstack_crypto.o: ../../../src/btstack_crypto.c nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} "${OBJECTDIR}/_ext/1386528437"
@${RM} ${OBJECTDIR}/_ext/1386528437/btstack_crypto.o.d
@${RM} ${OBJECTDIR}/_ext/1386528437/btstack_crypto.o
@${FIXDEPS} "${OBJECTDIR}/_ext/1386528437/btstack_crypto.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ -c ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -Os -I"." -I"../../../.." -I"../src" -I"../src/system_config/bt_audio_dk" -I"../../../src" -I"../../../chipset/csr" -I"../../../platform/embedded" -I"../../../3rd-party/micro-ecc" -I"../../../3rd-party/bluedroid/decoder/include" -I"../../../3rd-party/bluedroid/encoder/include" -I"../../../3rd-party/hxcmod-player" -I"../../../3rd-party/hxcmod-player/mods" -MMD -MF "${OBJECTDIR}/_ext/1386528437/btstack_crypto.o.d" -o ${OBJECTDIR}/_ext/1386528437/btstack_crypto.o ../../../src/btstack_crypto.c
endif
# ------------------------------------------------------------------------------------

View File

@ -1,8 +1,8 @@
#
#Thu Jan 04 21:28:37 CET 2018
#Thu Apr 19 18:03:49 CEST 2018
default.com-microchip-mplab-nbide-toolchainXC32-XC32LanguageToolchain.md5=53fb2ac0203ca7bc347fa1cfc029d2dd
default.languagetoolchain.dir=/Applications/microchip/xc32/v1.40/bin
configurations-xml=25097ed7341cdf4c143caed1fef177a7
configurations-xml=4970a40505480e7bdf05bd86df8f6611
com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=4b47e815d50912689a67d0b162f47a58
default.languagetoolchain.version=1.40
host.platform=mac

View File

@ -278,6 +278,7 @@
<itemPath>../../../src/btstack_slip.c</itemPath>
<itemPath>../../../src/ad_parser.c</itemPath>
<itemPath>../../../src/btstack_tlv.c</itemPath>
<itemPath>../../../src/btstack_crypto.c</itemPath>
</logicalFolder>
</logicalFolder>
<logicalFolder name="f2" displayName="framework" projectFiles="true">

View File

@ -3,6 +3,11 @@
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/1"/>
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
<group/>
<group>
<file>file:/Users/mringwal/microchip/harmony/v1_07/framework/btstack/platform/embedded/btstack_uart_block_embedded.c</file>
<file>file:/Users/mringwal/microchip/harmony/v1_07/framework/btstack/port/pic32-harmony/src/btstack_config.h</file>
<file>file:/Users/mringwal/microchip/harmony/v1_07/framework/btstack/src/ble/sm.h</file>
<file>file:/Users/mringwal/microchip/harmony/v1_07/framework/btstack/src/ble/sm.c</file>
</group>
</open-files>
</project-private>

View File

@ -1,9 +1,11 @@
.phony: examples
all: examples
examples:
examples:
scripts/create_examples.py
clean:
scripts/delete_examples.py
@rm -rf example/Makefile
-include ../../chipset/atwilc3000/Makefile.inc

View File

@ -138,9 +138,11 @@ CSRCS += \
${BTSTACK_ROOT_CONFIG}/src/ble/att_server.c \
${BTSTACK_ROOT_CONFIG}/src/ble/gatt-service/battery_service_server.c \
${BTSTACK_ROOT_CONFIG}/src/ble/gatt-service/device_information_service_server.c \
${BTSTACK_ROOT_CONFIG}/src/ble/gatt-service/hids_device.c \
${BTSTACK_ROOT_CONFIG}/src/ble/gatt_client.c \
${BTSTACK_ROOT_CONFIG}/src/ble/le_device_db_memory.c \
${BTSTACK_ROOT_CONFIG}/src/ble/sm.c \
${BTSTACK_ROOT_CONFIG}/src/btstack_crypto.c \
${BTSTACK_ROOT_CONFIG}/src/btstack_linked_list.c \
${BTSTACK_ROOT_CONFIG}/src/btstack_memory.c \
${BTSTACK_ROOT_CONFIG}/src/btstack_memory_pool.c \

View File

@ -48,11 +48,6 @@ script_path = os.path.abspath(os.path.dirname(sys.argv[0])) + '/../'
# get btstack root
btstack_root = script_path + '../../'
## pick correct init script based on your hardware
# - init script for ATWILC300 SHIELD
subprocess.call("make -C ../../chipset/atwilc3000", shell=True)
# path to examples
examples_embedded = btstack_root + 'example/'
@ -111,7 +106,7 @@ for file in example_files:
if len(gatt_h):
fout.write("all: %s.h wilc3000_ble_firmware.h\n" % example)
else:
fout.write("all: le_counter.h wilc3000_ble_firmware.h\n")
fout.write("all: wilc3000_ble_firmware.h\n")
continue
fout.write(line)

View File

@ -31,6 +31,7 @@ COMMON = \
rfcomm.c \
sdp_client_rfcomm.c \
btstack_util.c \
btstack_crypto.c \
btstack_tlv.c \
hci.c \
hci_cmd.c \

View File

@ -89,6 +89,7 @@ Src/stm32l0xx_it.c \
att_server.c \
battery_service_server.c \
btstack_chipset_em9301.c \
btstack_crypto.c \
btstack_linked_list.c \
btstack_memory.c \
btstack_memory_pool.c \
@ -211,11 +212,13 @@ LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BU
# default action: build all
# ancs_client_demo \
# gatt_battery_query \
# gatt_battery_query.gatt \
# gatt_browser \
# gatt_browser.gatt \
LE_EXAMPLES = \
gap_le_advertisements \
gatt_battery_query \
gatt_browser \
le_counter \
le_streamer \
le_streamer_client \
@ -226,8 +229,6 @@ GATT_FILES = \
ancs_client_demo.gatt \
le_counter.gatt \
le_streamer.gatt \
gatt_browser.gatt \
gatt_battery_query.gatt \
sm_pairing_peripheral.gatt \
sm_pairing_central.gatt \

View File

@ -43,6 +43,7 @@ $(NAME)_SOURCES += \
../../src/classic/sdp_client_rfcomm.c \
../../src/classic/sdp_util.c \
../../src/classic/spp_server.c \
../../src/btstack_crypto.c \
../../src/btstack_linked_list.c \
../../src/btstack_memory.c \
../../src/btstack_memory_pool.c \

View File

@ -43,6 +43,7 @@ $(NAME)_SOURCES += \
../../src/classic/sdp_client_rfcomm.c \
../../src/classic/sdp_util.c \
../../src/classic/spp_server.c \
../../src/btstack_crypto.c \
../../src/btstack_linked_list.c \
../../src/btstack_memory.c \
../../src/btstack_memory_pool.c \

23
src/Makefile.inc Normal file
View File

@ -0,0 +1,23 @@
# Makefile to collect all C source files of src
SRC_FILES = \
btstack_ring_buffer.c \
btstack_hid_parser.c \
ad_parser.c \
hci_transport_h4.c \
l2cap.c \
btstack_memory.c \
btstack_util.c \
hci_dump.c \
btstack_memory_pool.c \
btstack_run_loop.c \
hci_cmd.c \
btstack_linked_list.c \
l2cap_signaling.c \
hci_transport_em9304_spi.c \
hci.c \
btstack_slip.c \
hci_transport_h5.c \
btstack_tlv.c \
btstack_crypto.c \

13
src/ble/Makefile.inc Normal file
View File

@ -0,0 +1,13 @@
# Makefile to collect all C source files of src/ble
SRC_BLE_FILES = \
att_server.c \
ancs_client.c \
att_dispatch.c \
sm.c \
att_db_util.c \
le_device_db_memory.c \
le_device_db_tlv.c \
att_db.c \
gatt_client.c \

View File

@ -65,6 +65,9 @@
#include "hci_dump.h"
#include "l2cap.h"
#include "btstack_tlv.h"
#ifdef ENABLE_LE_SIGNED_WRITE
#include "ble/sm.h"
#endif
#ifndef NVN_NUM_GATT_SERVER_CCC
#define NVN_NUM_GATT_SERVER_CCC 20

View File

@ -0,0 +1,7 @@
# Makefile to collect all C source files of src/ble/gatt-service
SRC_BLE_GATT-SERVICE_FILES = \
battery_service_server.c \
hids_device.c \
device_information_service_server.c \

View File

@ -756,19 +756,19 @@ static void trigger_next_query(gatt_client_t * peripheral, uint16_t last_result_
peripheral->gatt_client_state = next_query_state;
}
static inline void trigger_next_included_service_query(gatt_client_t * peripheral, uint16_t last_result_handle){
static void trigger_next_included_service_query(gatt_client_t * peripheral, uint16_t last_result_handle){
trigger_next_query(peripheral, last_result_handle, P_W2_SEND_INCLUDED_SERVICE_QUERY);
}
static inline void trigger_next_service_query(gatt_client_t * peripheral, uint16_t last_result_handle){
static void trigger_next_service_query(gatt_client_t * peripheral, uint16_t last_result_handle){
trigger_next_query(peripheral, last_result_handle, P_W2_SEND_SERVICE_QUERY);
}
static inline void trigger_next_service_by_uuid_query(gatt_client_t * peripheral, uint16_t last_result_handle){
static void trigger_next_service_by_uuid_query(gatt_client_t * peripheral, uint16_t last_result_handle){
trigger_next_query(peripheral, last_result_handle, P_W2_SEND_SERVICE_WITH_UUID_QUERY);
}
static inline void trigger_next_characteristic_query(gatt_client_t * peripheral, uint16_t last_result_handle){
static void trigger_next_characteristic_query(gatt_client_t * peripheral, uint16_t last_result_handle){
if (is_query_done(peripheral, last_result_handle)){
// report last characteristic
characteristic_end_found(peripheral, peripheral->end_group_handle);
@ -776,15 +776,15 @@ static inline void trigger_next_characteristic_query(gatt_client_t * peripheral,
trigger_next_query(peripheral, last_result_handle, P_W2_SEND_ALL_CHARACTERISTICS_OF_SERVICE_QUERY);
}
static inline void trigger_next_characteristic_descriptor_query(gatt_client_t * peripheral, uint16_t last_result_handle){
static void trigger_next_characteristic_descriptor_query(gatt_client_t * peripheral, uint16_t last_result_handle){
trigger_next_query(peripheral, last_result_handle, P_W2_SEND_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY);
}
static inline void trigger_next_read_by_type_query(gatt_client_t * peripheral, uint16_t last_result_handle){
static void trigger_next_read_by_type_query(gatt_client_t * peripheral, uint16_t last_result_handle){
trigger_next_query(peripheral, last_result_handle, P_W2_SEND_READ_BY_TYPE_REQUEST);
}
static inline void trigger_next_prepare_write_query(gatt_client_t * peripheral, gatt_client_state_t next_query_state, gatt_client_state_t done_state){
static void trigger_next_prepare_write_query(gatt_client_t * peripheral, gatt_client_state_t next_query_state, gatt_client_state_t done_state){
peripheral->attribute_offset += write_blob_length(peripheral);
uint16_t next_blob_length = write_blob_length(peripheral);
@ -795,7 +795,7 @@ static inline void trigger_next_prepare_write_query(gatt_client_t * peripheral,
peripheral->gatt_client_state = next_query_state;
}
static inline void trigger_next_blob_query(gatt_client_t * peripheral, gatt_client_state_t next_query_state, uint16_t received_blob_length){
static void trigger_next_blob_query(gatt_client_t * peripheral, gatt_client_state_t next_query_state, uint16_t received_blob_length){
uint16_t max_blob_length = peripheral_mtu(peripheral) - 1;
if (received_blob_length < max_blob_length){

File diff suppressed because it is too large Load Diff

View File

@ -170,22 +170,11 @@ void sm_authorization_decline(hci_con_handle_t con_handle);
*/
void sm_authorization_grant(hci_con_handle_t con_handle);
/**
* @brief Check if CMAC AES engine is ready
* @return ready
* @brief Support for signed writes, used by att_server.
* @returns ready
*/
int sm_cmac_ready(void);
/*
* @brief Generic CMAC AES
* @param key
* @param message_len
* @param get_byte_callback
* @param done_callback
* @note hash is 16 bytes in big endian
*/
void sm_cmac_general_start(const sm_key_t key, uint16_t message_len, uint8_t (*get_byte_callback)(uint16_t offset), void (*done_callback)(uint8_t * hash));
int sm_cmac_ready(void);
/**
* @brief Support for signed writes, used by att_server.
@ -215,15 +204,6 @@ int sm_address_resolution_lookup(uint8_t addr_type, bd_addr_t addr);
*/
int sm_le_device_index(hci_con_handle_t con_handle );
/**
* @brief Set Elliptic Key Public/Private Keypair
* @note Using the same key for more than one device is not recommended.
* @param qx 32 bytes
* @param qy 32 bytes
* @param d 32 bytes
*/
void sm_use_fixed_ec_keypair(uint8_t * qx, uint8_t * qy, uint8_t * d);
/**
* @brief Use fixec passkey for Legacy and SC instead of generating a random number
* @note Can be used to improve security over Just Works if no keyboard or displary are present and
@ -264,7 +244,6 @@ void sm_register_sc_oob_data_callback( int (*get_sc_oob_data_callback)(uint8_t a
// PTS testing
void sm_test_set_irk(sm_key_t irk);
void sm_test_use_fixed_local_csrk(void);
void sm_test_use_fixed_ec_keypair(void);
#ifdef ENABLE_TESTING_SUPPORT
void sm_test_set_pairing_failure(int reason);

1007
src/btstack_crypto.c Normal file

File diff suppressed because it is too large Load Diff

258
src/btstack_crypto.h Normal file
View File

@ -0,0 +1,258 @@
/*
* Copyright (C) 2017 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
*
*/
/*
* btstack_crypto.h
*
* Central place for all crypto-related functions with completion callbacks to allow
* using of MCU crypto peripherals or the Bluetooth controller
*/
#ifndef __BTSTACK_CTRYPTO_H
#define __BTSTACK_CTRYPTO_H
#include "btstack_defines.h"
#if defined __cplusplus
extern "C" {
#endif
#define CMAC_TEMP_API
typedef enum {
BTSTACK_CRYPTO_RANDOM,
BTSTACK_CRYPTO_AES128,
BTSTACK_CRYPTO_CMAC_GENERATOR,
BTSTACK_CRYPTO_CMAC_MESSAGE,
BTSTACK_CRYPTO_ECC_P256_GENERATE_KEY,
BTSTACK_CRYPTO_ECC_P256_CALCULATE_DHKEY,
BTSTACK_CRYPTO_CCM_ENCRYPT_BLOCK,
BTSTACK_CRYPTO_CCM_DECRYPT_BLOCK,
} btstack_crypto_operation_t;
typedef struct {
btstack_context_callback_registration_t context_callback;
btstack_crypto_operation_t operation;
} btstack_crypto_t;
typedef struct {
btstack_crypto_t btstack_crypto;
uint8_t * buffer;
uint16_t size;
} btstack_crypto_random_t;
typedef struct {
btstack_crypto_t btstack_crypto;
const uint8_t * key;
const uint8_t * plaintext;
uint8_t * ciphertext;
} btstack_crypto_aes128_t;
typedef struct {
btstack_crypto_t btstack_crypto;
const uint8_t * key;
uint16_t size;
union {
uint8_t (*get_byte_callback)(uint16_t pos);
const uint8_t * message;
};
uint8_t * hash;
} btstack_crypto_aes128_cmac_t;
typedef struct {
btstack_crypto_t btstack_crypto;
uint8_t * public_key;
uint8_t * dhkey;
} btstack_crypto_ecc_p256_t;
typedef enum {
CCM_CALCULATE_X1,
CCM_W4_X1,
CCM_CALCULATE_XN,
CCM_W4_XN,
CCM_CALCULATE_S0,
CCM_W4_S0,
CCM_CALCULATE_SN,
CCM_W4_SN,
} btstack_crypto_ccm_state_t;
typedef struct {
btstack_crypto_t btstack_crypto;
btstack_crypto_ccm_state_t state;
const uint8_t * key;
const uint8_t * nonce;
const uint8_t * input;
uint8_t * output;
uint8_t x_i[16];
uint16_t message_len;
uint16_t block_len;
uint16_t counter;
} btstack_crypto_ccm_t;
/**
* Initialize crypto functions
*/
void btstack_crypto_init(void);
/**
* Generate random data
* @param request
* @param buffer for output
* @param size of requested random data
* @param callback
* @param callback_arg
* @note request needs to stay avaliable until callback (i.e. not provided on stack)
*/
void btstack_crypto_random_generate(btstack_crypto_random_t * request, uint8_t * buffer, uint16_t size, void (* callback)(void * arg), void * callback_arg);
/**
* Encrypt plaintext using AES128
* @param request
* @param key (16 bytes)
* @param plaintext (16 bytes)
* @param ciphertext (16 bytes)
* @param callback
* @param callback_arg
* @note request needs to stay avaliable until callback (i.e. not provided on stack)
*/
void btstack_crypto_aes128_encrypt(btstack_crypto_aes128_t * request, const uint8_t * key, const uint8_t * plaintext, uint8_t * ciphertext, void (* callback)(void * arg), void * callback_arg);
/**
* Calculate Cipher-based Message Authentication Code (CMAC) using AES128 and a generator function to provide data
* @param request
* @param key (16 bytes)
* @param size of message
* @param generator provides byte at requested position
* @param callback
* @param callback_arg
*/
void btstack_crypto_aes128_cmac_generator(btstack_crypto_aes128_cmac_t * request, const uint8_t * key, uint16_t size, uint8_t (*get_byte_callback)(uint16_t pos), uint8_t * hash, void (* callback)(void * arg), void * callback_arg);
/**
* Calculate Cipher-based Message Authentication Code (CMAC) using AES128 and complete message
* @param request
* @param key (16 bytes)
* @param len of message
* @param message
* @param hash result
* @param callback
* @param callback_arg
*/
void btstack_crypto_aes128_cmac_message(btstack_crypto_aes128_cmac_t * request, const uint8_t * key, uint16_t len, const uint8_t * message, uint8_t * hash, void (* callback)(void * arg), void * callback_arg);
/**
* Calculate AES128-CMAC with key ZERO and complete message
* @param request
* @param len of message
* @param message
* @param hash
* @param callback
* @param callback_arg
*/
void btstack_crypto_aes128_cmac_zero(btstack_crypto_aes128_cmac_t * request, uint16_t len, const uint8_t * message, uint8_t * hash, void (* callback)(void * arg), void * callback_arg);
/**
* Generate Elliptic Curve Public/Private Key Pair (FIPS P-256)
* @note BTstack uses a single ECC key pair per reset.
* @note If LE Controller is used for ECC, private key cannot be read or managed
* @param request
* @param public_key (64 bytes)
* @param callback
* @param callback_arg
*/
void btstack_crypto_ecc_p256_generate_key(btstack_crypto_ecc_p256_t * request, uint8_t * public_key, void (* callback)(void * arg), void * callback_arg);
/**
* Calculate Diffie-Hellman Key based on local private key and remote public key
* @param request
* @param public_key (64 bytes)
* @param dhkey (32 bytes)
* @param callback
* @param callback_arg
*/
void btstack_crypto_ecc_p256_calculate_dhkey(btstack_crypto_ecc_p256_t * request, const uint8_t * public_key, uint8_t * dhkey, void (* callback)(void * arg), void * callback_arg);
/*
* Validate public key (not implemented for LE Controller ECC)
* @param public_key (64 bytes)
* @result 0 == valid
*/
int btstack_crypto_ecc_p256_validate_public_key(const uint8_t * public_key);
/**
* Initialize Counter with CBC-MAC for Bluetooth Mesh (L=2,M=8)
* @param request
* @param nonce
* @param key
* @param message_len
*/
void btstack_crypo_ccm_init(btstack_crypto_ccm_t * request, const uint8_t * key, const uint8_t * nonce, uint16_t message_len);
/**
* Get authentication value (M=8) after encrypt or decrypt operation
* @param request
* @param authentication_value
*/
void btstack_crypo_ccm_get_authentication_value(btstack_crypto_ccm_t * request, uint8_t * authentication_value);
/**
* Encrypt block - can be called multiple times. len must be a multiply of 16 for all but the last call
* @param request
* @param len (16 bytes for all but the last block)
* @param plaintext (16 bytes)
* @param ciphertext (16 bytes)
* @param callback
* @param callback_arg
*/
void btstack_crypto_ccm_encrypt_block(btstack_crypto_ccm_t * request, uint16_t len, const uint8_t * plaintext, uint8_t * ciphertext, void (* callback)(void * arg), void * callback_arg);
/**
* Decrypt block - can be called multiple times. len must be a multiply of 16 for all but the last call
* @param request
* @param len (16 for all but last block)
* @param ciphertext (16 bytes)
* @param plaintext (16 bytes)
* @param callback
* @param callback_arg
*/
void btstack_crypto_ccm_decrypt_block(btstack_crypto_ccm_t * request, uint16_t len, const uint8_t * ciphertext, uint8_t * plaintext, void (* callback)(void * arg), void * callback_arg);
#if defined __cplusplus
}
#endif
#endif /* __BTSTACK_CTRYPTO_H */

44
src/classic/Makefile.inc Normal file
View File

@ -0,0 +1,44 @@
# Makefile to collect all C source files of src/classic
SRC_CLASSIC_FILES = \
sdp_util.c \
hfp_msbc.c \
avrcp.c \
btstack_sbc_plc.c \
avrcp_target.c \
rfcomm.c \
sdp_client_rfcomm.c \
pbap_client.c \
avrcp_media_item_iterator.c \
hsp_ag.c \
avrcp_controller.c \
hsp_hs.c \
avdtp_acceptor.c \
avdtp.c \
sdp_client.c \
avdtp_sink.c \
btstack_sbc_decoder_bluedroid.c \
goep_client.c \
btstack_cvsd_plc.c \
avrcp_browsing_controller.c \
btstack_sbc_encoder_bluedroid.c \
hid_device.c \
avdtp_source.c \
hfp.c \
avdtp_util.c \
btstack_link_key_db_static.c \
hfp_gsm_model.c \
obex_iterator.c \
avdtp_initiator.c \
bnep.c \
btstack_link_key_db_memory.c \
sdp_server.c \
hfp_ag.c \
btstack_link_key_db_tlv.c \
pan.c \
hfp_hf.c \
spp_server.c \
device_id_server.c \
a2dp_sink.c \
a2dp_source.c \

View File

@ -305,48 +305,54 @@ static void avrcp_parser_process_byte(uint8_t byte, avrcp_connection_t * connect
uint32_t attribute_id;
switch(connection->parser_state){
case AVRCP_PARSER_GET_ATTRIBUTE_HEADER:
if (connection->parser_attribute_header_pos < AVRCP_ATTRIBUTE_HEADER_LEN) {
connection->parser_attribute_header[connection->parser_attribute_header_pos++] = byte;
connection->list_offset++;
return;
}
connection->parser_attribute_header[connection->parser_attribute_header_pos++] = byte;
connection->list_offset++;
if (connection->parser_attribute_header_pos < AVRCP_ATTRIBUTE_HEADER_LEN) return;
attribute_total_value_len = big_endian_read_16(connection->parser_attribute_header, 6);
connection->attribute_value_len = btstack_min(attribute_total_value_len, AVRCP_MAX_ATTRIBUTTE_SIZE);
if (connection->attribute_value_len == 0){
// emit attribute although len == 0
attribute_id = big_endian_read_32(connection->parser_attribute_header, 0);
avrcp_controller_emit_now_playing_info_event(avrcp_controller_context.avrcp_callback, connection->avrcp_cid, ctype, attribute_id, connection->attribute_value, connection->attribute_value_len);
break;
}
connection->parser_state = AVRCP_PARSER_GET_ATTRIBUTE_VALUE;
return;
case AVRCP_PARSER_GET_ATTRIBUTE_VALUE:
if (connection->attribute_value_offset < connection->attribute_value_len){
connection->attribute_value[connection->attribute_value_offset++] = byte;
connection->list_offset++;
if (connection->attribute_value_len > 0){
// get ready for attribute value
connection->parser_state = AVRCP_PARSER_GET_ATTRIBUTE_VALUE;
return;
}
// emit empty attribute
attribute_id = big_endian_read_32(connection->parser_attribute_header, 0);
avrcp_controller_emit_now_playing_info_event(avrcp_controller_context.avrcp_callback, connection->avrcp_cid, ctype, attribute_id, connection->attribute_value, connection->attribute_value_len);
// done, see below
break;
case AVRCP_PARSER_GET_ATTRIBUTE_VALUE:
connection->attribute_value[connection->attribute_value_offset++] = byte;
connection->list_offset++;
if (connection->attribute_value_offset < connection->attribute_value_len) return;
// emit (potentially partial) attribute
attribute_id = big_endian_read_32(connection->parser_attribute_header, 0);
avrcp_controller_emit_now_playing_info_event(avrcp_controller_context.avrcp_callback, connection->avrcp_cid, ctype, attribute_id, connection->attribute_value, connection->attribute_value_len);
// ignore rest of attribute
attribute_total_value_len = big_endian_read_16(connection->parser_attribute_header, 6);
if (connection->attribute_value_offset < attribute_total_value_len){
// ignore rest of attribute
connection->parser_state = AVRCP_PARSER_IGNORE_REST_OF_ATTRIBUTE_VALUE;
return;
}
// done, see below
break;
case AVRCP_PARSER_IGNORE_REST_OF_ATTRIBUTE_VALUE:
connection->attribute_value_offset++;
connection->list_offset++;
attribute_total_value_len = big_endian_read_16(connection->parser_attribute_header, 6);
if (connection->attribute_value_offset < attribute_total_value_len){
connection->list_offset++;
connection->attribute_value_offset++;
return;
}
if (connection->attribute_value_offset < attribute_total_value_len) return;
// done, see below
break;
default:
@ -355,7 +361,7 @@ static void avrcp_parser_process_byte(uint8_t byte, avrcp_connection_t * connect
// attribute fully read, check if more to come
if (connection->list_offset < connection->list_size){
// more to come
// more to come, reset parser
connection->parser_state = AVRCP_PARSER_GET_ATTRIBUTE_HEADER;
connection->parser_attribute_header_pos = 0;
} else {

View File

@ -109,8 +109,6 @@ static btstack_packet_handler_t hfp_ag_rfcomm_packet_handler;
static void (*hfp_hf_run_for_context)(hfp_connection_t * hfp_connection);
static btstack_packet_callback_registration_t hci_event_callback_registration;
static hfp_connection_t * sco_establishment_active;
const char * hfp_hf_feature(int index){
@ -564,15 +562,15 @@ static void hfp_handle_failed_sco_connection(uint8_t status){
}
void hfp_handle_hci_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size, hfp_role_t local_role){
void hfp_handle_hci_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
UNUSED(channel); // ok: no channel
bd_addr_t event_addr;
uint16_t rfcomm_cid, handle;
hci_con_handle_t handle;
hfp_connection_t * hfp_connection = NULL;
uint8_t status;
log_debug("HFP packet_handler type %u, event type %x, size %u", packet_type, hci_event_packet_get_type(packet), size);
log_debug("HFP HCI event handler type %u, event type %x, size %u", packet_type, hci_event_packet_get_type(packet), size);
switch (hci_event_packet_get_type(packet)) {
@ -593,60 +591,6 @@ void hfp_handle_hci_event(uint8_t packet_type, uint16_t channel, uint8_t *packet
}
break;
case RFCOMM_EVENT_INCOMING_CONNECTION:
// data: event (8), len(8), address(48), channel (8), rfcomm_cid (16)
rfcomm_event_incoming_connection_get_bd_addr(packet, event_addr);
hfp_connection = provide_hfp_connection_context_for_bd_addr(event_addr, local_role);
if (!hfp_connection){
log_info("hfp: no memory to accept incoming connection - decline");
rfcomm_decline_connection(rfcomm_event_incoming_connection_get_rfcomm_cid(packet));
return;
}
if (hfp_connection->state != HFP_IDLE) {
log_error("hfp: incoming connection but state != HFP_IDLE");
return;
}
hfp_connection->rfcomm_cid = rfcomm_event_incoming_connection_get_rfcomm_cid(packet);
hfp_connection->state = HFP_W4_RFCOMM_CONNECTED;
// printf("RFCOMM channel %u requested for %s\n", hfp_connection->rfcomm_cid, bd_addr_to_str(hfp_connection->remote_addr));
rfcomm_accept_connection(hfp_connection->rfcomm_cid);
break;
case RFCOMM_EVENT_CHANNEL_OPENED:
// data: event(8), len(8), status (8), address (48), handle(16), server channel(8), rfcomm_cid(16), max frame size(16)
rfcomm_event_channel_opened_get_bd_addr(packet, event_addr);
status = rfcomm_event_channel_opened_get_status(packet);
hfp_connection = get_hfp_connection_context_for_bd_addr(event_addr);
if (!hfp_connection || hfp_connection->state != HFP_W4_RFCOMM_CONNECTED) return;
if (status) {
hfp_emit_slc_connection_event(hfp_connection, status, rfcomm_event_channel_opened_get_con_handle(packet), event_addr);
remove_hfp_connection_context(hfp_connection);
} else {
hfp_connection->acl_handle = rfcomm_event_channel_opened_get_con_handle(packet);
hfp_connection->rfcomm_cid = rfcomm_event_channel_opened_get_rfcomm_cid(packet);
bd_addr_copy(hfp_connection->remote_addr, event_addr);
// uint16_t mtu = rfcomm_event_channel_opened_get_max_frame_size(packet);
// printf("RFCOMM channel open succeeded. hfp_connection %p, RFCOMM Channel ID 0x%02x, max frame size %u\n", hfp_connection, hfp_connection->rfcomm_cid, mtu);
switch (hfp_connection->state){
case HFP_W4_RFCOMM_CONNECTED:
hfp_connection->state = HFP_EXCHANGE_SUPPORTED_FEATURES;
break;
case HFP_W4_CONNECTION_ESTABLISHED_TO_SHUTDOWN:
hfp_connection->state = HFP_W2_DISCONNECT_RFCOMM;
// printf("Shutting down RFCOMM.\n");
break;
default:
break;
}
rfcomm_request_can_send_now_event(hfp_connection->rfcomm_cid);
}
break;
case HCI_EVENT_COMMAND_STATUS:
if (hci_event_command_status_get_command_opcode(packet) == hci_setup_synchronous_connection.opcode) {
status = hci_event_command_status_get_status(packet);
@ -717,23 +661,6 @@ void hfp_handle_hci_event(uint8_t packet_type, uint16_t channel, uint8_t *packet
break;
}
case RFCOMM_EVENT_CHANNEL_CLOSED:
if (local_role > 1){
log_error("hfp_handle_hci_event role %x", local_role);
}
rfcomm_cid = little_endian_read_16(packet,2);
hfp_connection = get_hfp_connection_context_for_rfcomm_cid(rfcomm_cid);
if (!hfp_connection) break;
if (hfp_connection->state == HFP_W4_RFCOMM_DISCONNECTED_AND_RESTART){
hfp_connection->state = HFP_IDLE;
hfp_establish_service_level_connection(hfp_connection->remote_addr, hfp_connection->service_uuid, local_role);
break;
}
hfp_emit_event(hfp_connection, HFP_SUBEVENT_SERVICE_LEVEL_CONNECTION_RELEASED, 0);
remove_hfp_connection_context(hfp_connection);
break;
case HCI_EVENT_DISCONNECTION_COMPLETE:
handle = little_endian_read_16(packet,3);
hfp_connection = get_hfp_connection_context_for_sco_handle(handle);
@ -760,6 +687,90 @@ void hfp_handle_hci_event(uint8_t packet_type, uint16_t channel, uint8_t *packet
}
}
void hfp_handle_rfcomm_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size, hfp_role_t local_role){
UNUSED(channel); // ok: no channel
bd_addr_t event_addr;
uint16_t rfcomm_cid;
hfp_connection_t * hfp_connection = NULL;
uint8_t status;
log_debug("HFP packet_handler type %u, event type %x, size %u", packet_type, hci_event_packet_get_type(packet), size);
switch (hci_event_packet_get_type(packet)) {
case RFCOMM_EVENT_INCOMING_CONNECTION:
// data: event (8), len(8), address(48), channel (8), rfcomm_cid (16)
rfcomm_event_incoming_connection_get_bd_addr(packet, event_addr);
hfp_connection = provide_hfp_connection_context_for_bd_addr(event_addr, local_role);
if (!hfp_connection){
log_info("hfp: no memory to accept incoming connection - decline");
rfcomm_decline_connection(rfcomm_event_incoming_connection_get_rfcomm_cid(packet));
return;
}
if (hfp_connection->state != HFP_IDLE) {
log_error("hfp: incoming connection but state != HFP_IDLE");
return;
}
hfp_connection->rfcomm_cid = rfcomm_event_incoming_connection_get_rfcomm_cid(packet);
hfp_connection->state = HFP_W4_RFCOMM_CONNECTED;
// printf("RFCOMM channel %u requested for %s\n", hfp_connection->rfcomm_cid, bd_addr_to_str(hfp_connection->remote_addr));
rfcomm_accept_connection(hfp_connection->rfcomm_cid);
break;
case RFCOMM_EVENT_CHANNEL_OPENED:
// data: event(8), len(8), status (8), address (48), handle(16), server channel(8), rfcomm_cid(16), max frame size(16)
rfcomm_event_channel_opened_get_bd_addr(packet, event_addr);
status = rfcomm_event_channel_opened_get_status(packet);
hfp_connection = get_hfp_connection_context_for_bd_addr(event_addr);
if (!hfp_connection || hfp_connection->state != HFP_W4_RFCOMM_CONNECTED) return;
if (status) {
hfp_emit_slc_connection_event(hfp_connection, status, rfcomm_event_channel_opened_get_con_handle(packet), event_addr);
remove_hfp_connection_context(hfp_connection);
} else {
hfp_connection->acl_handle = rfcomm_event_channel_opened_get_con_handle(packet);
hfp_connection->rfcomm_cid = rfcomm_event_channel_opened_get_rfcomm_cid(packet);
bd_addr_copy(hfp_connection->remote_addr, event_addr);
// uint16_t mtu = rfcomm_event_channel_opened_get_max_frame_size(packet);
// printf("RFCOMM channel open succeeded. hfp_connection %p, RFCOMM Channel ID 0x%02x, max frame size %u\n", hfp_connection, hfp_connection->rfcomm_cid, mtu);
switch (hfp_connection->state){
case HFP_W4_RFCOMM_CONNECTED:
hfp_connection->state = HFP_EXCHANGE_SUPPORTED_FEATURES;
break;
case HFP_W4_CONNECTION_ESTABLISHED_TO_SHUTDOWN:
hfp_connection->state = HFP_W2_DISCONNECT_RFCOMM;
// printf("Shutting down RFCOMM.\n");
break;
default:
break;
}
rfcomm_request_can_send_now_event(hfp_connection->rfcomm_cid);
}
break;
case RFCOMM_EVENT_CHANNEL_CLOSED:
rfcomm_cid = little_endian_read_16(packet,2);
hfp_connection = get_hfp_connection_context_for_rfcomm_cid(rfcomm_cid);
if (!hfp_connection) break;
if (hfp_connection->state == HFP_W4_RFCOMM_DISCONNECTED_AND_RESTART){
hfp_connection->state = HFP_IDLE;
hfp_establish_service_level_connection(hfp_connection->remote_addr, hfp_connection->service_uuid, local_role);
break;
}
hfp_emit_event(hfp_connection, HFP_SUBEVENT_SERVICE_LEVEL_CONNECTION_RELEASED, 0);
remove_hfp_connection_context(hfp_connection);
break;
default:
break;
}
}
// translates command string into hfp_command_t CMD
static hfp_command_t parse_command(const char * line_buffer, int isHandsFree){
int offset = isHandsFree ? 0 : 2;
@ -1505,11 +1516,5 @@ void hfp_set_hf_run_for_context(void (*callback)(hfp_connection_t * hfp_connecti
hfp_hf_run_for_context = callback;
}
static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
hfp_handle_hci_event(packet_type, channel, packet, size, HFP_ROLE_INVALID);
}
void hfp_init(void){
hci_event_callback_registration.callback = &packet_handler;
hci_add_event_handler(&hci_event_callback_registration);
}

View File

@ -652,7 +652,8 @@ void hfp_set_hf_run_for_context(void (*callbcack)(hfp_connection_t * hfp_connect
void hfp_init(void);
void hfp_create_sdp_record(uint8_t * service, uint32_t service_record_handle, uint16_t service_uuid, int rfcomm_channel_nr, const char * name);
void hfp_handle_hci_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size, hfp_role_t local_role);
void hfp_handle_hci_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
void hfp_handle_rfcomm_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size, hfp_role_t local_role);
void hfp_emit_event(hfp_connection_t * hfp_connection, uint8_t event_subtype, uint8_t value);
void hfp_emit_simple_event(hfp_connection_t * hfp_connection, uint8_t event_subtype);
void hfp_emit_string_event(hfp_connection_t * hfp_connection, uint8_t event_subtype, const char * value);

View File

@ -81,6 +81,8 @@ void set_hfp_ag_indicators(hfp_ag_indicator_t * indicators, int indicator_nr);
int get_hfp_ag_indicators_nr(hfp_connection_t * context);
hfp_ag_indicator_t * get_hfp_ag_indicators(hfp_connection_t * context);
static btstack_packet_callback_registration_t hci_event_callback_registration;
// gobals
static const char default_hfp_ag_service_name[] = "Voice gateway";
@ -2032,7 +2034,7 @@ static void rfcomm_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t
hfp_run_for_context(get_hfp_connection_context_for_rfcomm_cid(rfcomm_cid));
return;
}
hfp_handle_hci_event(packet_type, channel, packet, size, HFP_ROLE_AG);
hfp_handle_rfcomm_event(packet_type, channel, packet, size, HFP_ROLE_AG);
break;
default:
break;
@ -2075,9 +2077,15 @@ void hfp_ag_init_call_hold_services(int call_hold_services_nr, const char * call
void hfp_ag_init(uint16_t rfcomm_channel_nr){
hfp_init();
hci_event_callback_registration.callback = &hfp_handle_hci_event;
hci_add_event_handler(&hci_event_callback_registration);
rfcomm_register_service(&rfcomm_packet_handler, rfcomm_channel_nr, 0xffff);
// used to set packet handler for outgoing rfcomm connections - could be handled by emitting an event to us
hfp_set_ag_rfcomm_packet_handler(&rfcomm_packet_handler);
hfp_ag_response_and_hold_active = 0;

View File

@ -66,6 +66,8 @@
#include "hci_dump.h"
#include "l2cap.h"
static btstack_packet_callback_registration_t hci_event_callback_registration;
static const char default_hfp_hf_service_name[] = "Hands-Free unit";
static uint16_t hfp_supported_features = HFP_DEFAULT_HF_SUPPORTED_FEATURES;
static uint8_t hfp_codecs_nr = 0;
@ -1099,7 +1101,7 @@ static void rfcomm_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t
hfp_run_for_context(get_hfp_connection_context_for_rfcomm_cid(rfcomm_cid));
return;
}
hfp_handle_hci_event(packet_type, channel, packet, size, HFP_ROLE_HF);
hfp_handle_rfcomm_event(packet_type, channel, packet, size, HFP_ROLE_HF);
break;
default:
break;
@ -1110,8 +1112,14 @@ static void rfcomm_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t
void hfp_hf_init(uint16_t rfcomm_channel_nr){
hfp_init();
hci_event_callback_registration.callback = &hfp_handle_hci_event;
hci_add_event_handler(&hci_event_callback_registration);
rfcomm_register_service(rfcomm_packet_handler, rfcomm_channel_nr, 0xffff);
// used to set packet handler for outgoing rfcomm connections - could be handled by emitting an event to us
hfp_set_hf_rfcomm_packet_handler(&rfcomm_packet_handler);
hfp_set_hf_run_for_context(hfp_run_for_context);
hfp_supported_features = HFP_DEFAULT_HF_SUPPORTED_FEATURES;

View File

@ -233,7 +233,6 @@ typedef enum {
typedef enum {
// general states
// state = 0
SM_GENERAL_IDLE,
SM_GENERAL_SEND_PAIRING_FAILED,
SM_GENERAL_TIMEOUT, // no other security messages are exchanged
@ -254,23 +253,17 @@ typedef enum {
SM_PH2_C1_W4_RANDOM_B,
// calculate confirm value for local side
// state = 10
SM_PH2_C1_GET_ENC_A,
SM_PH2_C1_W4_ENC_A,
SM_PH2_C1_GET_ENC_B,
SM_PH2_C1_W4_ENC_B,
// calculate confirm value for remote side
SM_PH2_C1_GET_ENC_C,
SM_PH2_C1_W4_ENC_C,
SM_PH2_C1_GET_ENC_D,
SM_PH2_C1_W4_ENC_D,
SM_PH2_C1_SEND_PAIRING_CONFIRM,
SM_PH2_SEND_PAIRING_RANDOM,
// calc STK
// state = 20
SM_PH2_CALC_STK,
SM_PH2_W4_STK,
@ -278,24 +271,15 @@ typedef enum {
// Phase 3: Transport Specific Key Distribution
// calculate DHK, Y, EDIV, and LTK
SM_PH3_GET_RANDOM,
SM_PH3_W4_RANDOM,
SM_PH3_GET_DIV,
SM_PH3_W4_DIV,
SM_PH3_Y_GET_ENC,
SM_PH3_Y_W4_ENC,
SM_PH3_LTK_GET_ENC,
// state = 30
SM_PH3_LTK_W4_ENC,
SM_PH3_CSRK_GET_ENC,
SM_PH3_CSRK_W4_ENC,
// exchange keys
SM_PH3_DISTRIBUTE_KEYS,
SM_PH3_RECEIVE_KEYS,
// RESPONDER ROLE
// state = 35
SM_RESPONDER_IDLE,
SM_RESPONDER_SEND_SECURITY_REQUEST,
SM_RESPONDER_PH0_RECEIVED_LTK_REQUEST,
@ -310,15 +294,11 @@ typedef enum {
SM_RESPONDER_PH2_SEND_LTK_REPLY,
// Phase 4: re-establish previously distributed LTK
// state == 46
SM_RESPONDER_PH4_Y_GET_ENC,
SM_RESPONDER_PH4_Y_W4_ENC,
SM_RESPONDER_PH4_LTK_GET_ENC,
SM_RESPONDER_PH4_LTK_W4_ENC,
SM_RESPONDER_PH4_SEND_LTK_REPLY,
// INITITIATOR ROLE
// state = 51
SM_INITIATOR_CONNECTED,
SM_INITIATOR_PH0_HAS_LTK,
SM_INITIATOR_PH0_SEND_START_ENCRYPTION,

View File

@ -69,6 +69,7 @@ static uint8_t rfcomm_reserved_buffer[1000];
hfp_connection_t * hfp_context;
void (*registered_hci_packet_handler)(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
void (*registered_rfcomm_packet_handler)(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
void (*registered_sdp_app_callback)(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
@ -129,6 +130,7 @@ void print_without_newlines(uint8_t *data, uint16_t len){
extern "C" void l2cap_init(void){}
extern "C" void hci_add_event_handler(btstack_packet_callback_registration_t * callback_handler){
registered_hci_packet_handler = callback_handler->callback;
}
int rfcomm_send(uint16_t rfcomm_cid, uint8_t *data, uint16_t len){
@ -201,7 +203,7 @@ static void hci_event_sco_complete(void){
little_endian_store_16(event, pos, 0); pos += 2; // tx_packet_length
event[pos++] = 0; // air_mode
(*registered_rfcomm_packet_handler)(HCI_EVENT_PACKET, 0, event, sizeof(event));
(*registered_hci_packet_handler)(HCI_EVENT_PACKET, 0, event, sizeof(event));
}
int hci_send_cmd(const hci_cmd_t *cmd, ...){
@ -327,7 +329,7 @@ void hci_emit_disconnection_complete(uint16_t handle, uint8_t reason){
event[2] = 0; // status = OK
little_endian_store_16(event, 3, handle);
event[5] = reason;
(*registered_rfcomm_packet_handler)(HCI_EVENT_PACKET, 0, event, sizeof(event));
(*registered_hci_packet_handler)(HCI_EVENT_PACKET, 0, event, sizeof(event));
}
uint8_t gap_disconnect(hci_con_handle_t handle){

View File

@ -17,6 +17,7 @@ VPATH += ${BTSTACK_ROOT}/platform/posix
VPATH += ${BTSTACK_ROOT}/3rd-party/micro-ecc
COMMON = \
btstack_crypto.c \
btstack_linked_list.c \
btstack_memory.c \
btstack_memory_pool.c \
@ -69,4 +70,4 @@ clean:
rm -f security_manager aestest ecc_micro_ecc aes_cmac_test
rm -f *.o
rm -rf *.dSYM

View File

@ -8,10 +8,9 @@
#include "hci_dump.h"
#include "l2cap.h"
#include "rijndael.h"
#include "btstack_linked_list.h"
static btstack_packet_handler_t le_data_handler;
static btstack_packet_handler_t event_packet_handler;
static uint8_t packet_buffer[256];
static uint16_t packet_buffer_len = 0;
@ -20,6 +19,7 @@ static uint8_t aes128_cyphertext[16];
static hci_connection_t the_connection;
static btstack_linked_list_t connections;
static btstack_linked_list_t event_packet_handlers;
void mock_init(void){
the_connection.item.next = NULL;
@ -58,9 +58,12 @@ void aes128_calc_cyphertext(uint8_t key[16], uint8_t plaintext[16], uint8_t cyph
void mock_simulate_hci_event(uint8_t * packet, uint16_t size){
hci_dump_packet(HCI_EVENT_PACKET, 1, packet, size);
if (event_packet_handler){
event_packet_handler(HCI_EVENT_PACKET, 0, packet, size);
}
btstack_linked_list_iterator_t it;
btstack_linked_list_iterator_init(&it ,&event_packet_handlers);
while (btstack_linked_list_iterator_has_next(&it)){
btstack_packet_callback_registration_t * item = (btstack_packet_callback_registration_t *) btstack_linked_list_iterator_next(&it);
item->callback(HCI_EVENT_PACKET, 0, packet, size);
}
if (le_data_handler){
le_data_handler(HCI_EVENT_PACKET, 0, packet, size);
}
@ -207,7 +210,7 @@ void l2cap_register_fixed_channel(btstack_packet_handler_t packet_handler, uint1
}
void hci_add_event_handler(btstack_packet_callback_registration_t * callback_handler){
event_packet_handler = callback_handler->callback;
btstack_linked_list_add(&event_packet_handlers, (btstack_linked_item_t *) callback_handler);
}
int l2cap_reserve_packet_buffer(void){
@ -256,4 +259,4 @@ void l2cap_run(void){
HCI_STATE hci_get_state(void){
return HCI_STATE_WORKING;
}
}

View File

@ -209,6 +209,9 @@ static void cmac_done(uint8_t * hash){
}
static uint8_t m[128];
#if 0
// CMAC calculation has been moved to btstack_crypto
static uint8_t get_byte(uint16_t offset){
// printf ("get byte %02u -> %02x\n", offset, m[offset]);
return m[offset];
@ -235,6 +238,7 @@ static void validate_message(const char * name, const char * message_string, con
}
CHECK_EQUAL_ARRAY(cmac, cmac_hash, 16);
}
#endif
#define VALIDATE_MESSAGE(NAME) validate_message(#NAME, NAME##_string, cmac_##NAME##_string)
@ -244,15 +248,17 @@ TEST_GROUP(SecurityManager){
if (first){
first = 0;
btstack_memory_init();
btstack_run_loop_init(btstack_run_loop_posix_get_instance());
btstack_run_loop_init(btstack_run_loop_posix_get_instance());
}
sm_init();
sm_set_io_capabilities(IO_CAPABILITY_NO_INPUT_NO_OUTPUT);
sm_set_authentication_requirements( SM_AUTHREQ_BONDING );
sm_event_callback_registration.callback = &app_packet_handler;
sm_add_event_handler(&sm_event_callback_registration); }
sm_add_event_handler(&sm_event_callback_registration);
}
};
#if 0
TEST(SecurityManager, CMACTest){
mock_init();
@ -288,6 +294,7 @@ TEST(SecurityManager, CMACTest){
VALIDATE_MESSAGE(m40);
VALIDATE_MESSAGE(m64);
}
#endif
TEST(SecurityManager, MainTest){
@ -296,7 +303,6 @@ TEST(SecurityManager, MainTest){
// expect le encrypt commmand
CHECK_HCI_COMMAND(test_command_packet_01);
aes128_report_result();
// expect le encrypt commmand
@ -440,6 +446,6 @@ TEST(SecurityManager, MainTest){
}
int main (int argc, const char * argv[]){
// hci_dump_open("hci_dump.pklg", HCI_DUMP_PACKETLOGGER);
// hci_dump_open("hci_dump.pklg", HCI_DUMP_STDOUT); // HCI_DUMP_PACKETLOGGER
return CommandLineTestRunner::RunAllTests(argc, argv);
}

50
tool/create_makefile_inc.py Executable file
View File

@ -0,0 +1,50 @@
#!/usr/bin/env python
#
# Create Makefile.inc file for all source folders
# Copyright 2017 BlueKitchen GmbH
import sys
import os
makefile_inc_header = '''# Makefile to collect all C source files of {folder}
{var_name} = \\
'''
folders = [
'src',
'src/ble',
'src/ble/gatt-service',
'src/classic',
]
# get btstack root
btstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/..')
def create_makefile_inc(path):
global btstack_root
folder_path = btstack_root + '/' + path + '/'
# write makefile based on header and list
with open(folder_path + "Makefile.inc", "wt") as fout:
var_name = path.upper().replace('/','_')+'_FILES'
fout.write(makefile_inc_header.format(var_name=var_name,folder=path))
# get all .c files in folder
for file in os.listdir(folder_path):
if not file.endswith(".c"):
continue
fout.write(' %s \\\n' % file)
fout.write('\n')
# create all makefile.inc
if (len(sys.argv) > 1):
path = sys.argv[1]
print('Creating Makefile.inc for %s' % path)
create_makefile_inc(path)
else:
for path in folders:
print('Creating Makefile.inc for %s' % path)
create_makefile_inc(path)