mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-03-14 01:27:41 +00:00
Merge branch 'develop' of https://github.com/bluekitchen/btstack into develop
This commit is contained in:
commit
72afcab0c3
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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",
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 \
|
||||
|
@ -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(¬ification_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 */
|
@ -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
|
@ -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 \
|
||||
|
@ -1,5 +1,6 @@
|
||||
obj-y += \
|
||||
ad_parser.o \
|
||||
btstack_crypto.o \
|
||||
btstack_linked_list.o \
|
||||
btstack_memory.o \
|
||||
btstack_memory_pool.o \
|
||||
|
@ -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
|
||||
|
||||
# ------------------------------------------------------------------------------------
|
||||
|
@ -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
|
||||
|
@ -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">
|
||||
|
@ -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>
|
||||
|
BIN
port/samv71-xplained-atwilc3000/ASF/thirdparty/CMSIS/Lib/GCC/libarm_cortexM7lfsp_math_softfp.a
vendored
Normal file
BIN
port/samv71-xplained-atwilc3000/ASF/thirdparty/CMSIS/Lib/GCC/libarm_cortexM7lfsp_math_softfp.a
vendored
Normal file
Binary file not shown.
@ -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
|
||||
|
@ -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 \
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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 \
|
||||
|
@ -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 \
|
||||
|
||||
|
@ -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 \
|
||||
|
@ -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
23
src/Makefile.inc
Normal 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
13
src/ble/Makefile.inc
Normal 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 \
|
||||
|
@ -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
|
||||
|
7
src/ble/gatt-service/Makefile.inc
Normal file
7
src/ble/gatt-service/Makefile.inc
Normal 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 \
|
||||
|
@ -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){
|
||||
|
1482
src/ble/sm.c
1482
src/ble/sm.c
File diff suppressed because it is too large
Load Diff
27
src/ble/sm.h
27
src/ble/sm.h
@ -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
1007
src/btstack_crypto.c
Normal file
File diff suppressed because it is too large
Load Diff
258
src/btstack_crypto.h
Normal file
258
src/btstack_crypto.h
Normal 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
44
src/classic/Makefile.inc
Normal 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 \
|
||||
|
@ -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 {
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
20
src/hci.h
20
src/hci.h
@ -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,
|
||||
|
@ -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){
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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
50
tool/create_makefile_inc.py
Executable 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)
|
Loading…
x
Reference in New Issue
Block a user