mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-04-24 06:02:43 +00:00
max32630-fthr: create project folder with Makefile for each example
This commit is contained in:
parent
49a45ad9fd
commit
c894dca1b7
@ -21,7 +21,7 @@ SUBDIRS = \
|
|||||||
posix-h4 \
|
posix-h4 \
|
||||||
posix-h5 \
|
posix-h5 \
|
||||||
stm32-f103rb-nucleo \
|
stm32-f103rb-nucleo \
|
||||||
max32630-fthr-cc2564b \
|
max32630-fthr \
|
||||||
|
|
||||||
EXCLUDED = \
|
EXCLUDED = \
|
||||||
pic32-harmony/app.X \
|
pic32-harmony/app.X \
|
||||||
|
@ -1,200 +1,10 @@
|
|||||||
################################################################################
|
.phony: examples
|
||||||
# Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
|
all: examples
|
||||||
# Ismail H. Kose <ismail.kose@maximintegrated.com>
|
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
|
||||||
# copy of this software and associated documentation files (the "Software"),
|
|
||||||
# to deal in the Software without restriction, including without limitation
|
|
||||||
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
# and/or sell copies of the Software, and to permit persons to whom the
|
|
||||||
# Software is furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
# The above copyright notice and this permission notice shall be included
|
|
||||||
# in all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
||||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
# IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
|
|
||||||
# OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
||||||
# OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
#
|
|
||||||
# Except as contained in this notice, the name of Maxim Integrated
|
|
||||||
# Products, Inc. shall not be used except as stated in the Maxim Integrated
|
|
||||||
# Products, Inc. Branding Policy.
|
|
||||||
#
|
|
||||||
# The mere transfer of this software does not imply any licenses
|
|
||||||
# of trade secrets, proprietary technology, copyrights, patents,
|
|
||||||
# trademarks, maskwork rights, or any other form of intellectual
|
|
||||||
# property whatsoever. Maxim Integrated Products, Inc. retains all
|
|
||||||
# ownership rights.
|
|
||||||
#
|
|
||||||
# $Date: 2016-03-23 13:28:53 -0700 (Wed, 23 Mar 2016) $
|
|
||||||
# $Revision: 22067 $
|
|
||||||
#
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
# Maxim ARM Toolchain and Libraries
|
examples:
|
||||||
# https://www.maximintegrated.com/en/products/digital/microcontrollers/MAX32630.html
|
scripts/create_examples.py
|
||||||
|
|
||||||
# This is the name of the build output file
|
clean:
|
||||||
PROJECT=max3263x
|
scripts/delete_examples.py
|
||||||
|
@echo "Deleting CC2564B Init Script in src folder"
|
||||||
# Specify the target processor
|
@rm -rf src/cc256x* bluetooth_init*
|
||||||
TARGET=MAX3263x
|
|
||||||
PROJ_CFLAGS+=-DRO_FREQ=96000000
|
|
||||||
|
|
||||||
# Create Target name variables
|
|
||||||
TARGET_UC:=$(shell echo $(TARGET) | tr a-z A-Z)
|
|
||||||
TARGET_LC:=$(shell echo $(TARGET) | tr A-Z a-z)
|
|
||||||
|
|
||||||
CC2564B = bluetooth_init_cc2564B_1.6_BT_Spec_4.1.o
|
|
||||||
|
|
||||||
# Select 'GCC' or 'IAR' compiler
|
|
||||||
COMPILER=GCC
|
|
||||||
|
|
||||||
ifeq "$(MAXIM_PATH)" ""
|
|
||||||
LIBS_DIR=/$(subst \,/,$(subst :,,$(HOME))/Maxim/Firmware/$(TARGET_UC)/Libraries)
|
|
||||||
$(warning "MAXIM_PATH need to be set. Please run setenv bash file in the Maxim Toolchain directory.")
|
|
||||||
else
|
|
||||||
LIBS_DIR=/$(subst \,/,$(subst :,,$(MAXIM_PATH))/Firmware/$(TARGET_UC)/Libraries)
|
|
||||||
endif
|
|
||||||
|
|
||||||
CMSIS_ROOT=$(LIBS_DIR)/CMSIS
|
|
||||||
|
|
||||||
# Where to find source files for this test
|
|
||||||
VPATH=.
|
|
||||||
|
|
||||||
# Where to find header files for this test
|
|
||||||
IPATH=.
|
|
||||||
|
|
||||||
BOARD_DIR=$(LIBS_DIR)/Boards
|
|
||||||
|
|
||||||
IPATH += board/
|
|
||||||
VPATH += board/
|
|
||||||
|
|
||||||
# Source files for this test (add path to VPATH below)
|
|
||||||
SRCS = main.c
|
|
||||||
SRCS += hal_tick.c
|
|
||||||
SRCS += btstack_port.c
|
|
||||||
SRCS += spp_and_le_streamer.c
|
|
||||||
SRCS += board.c
|
|
||||||
SRCS += stdio.c
|
|
||||||
SRCS += led.c
|
|
||||||
SRCS += pb.c
|
|
||||||
SRCS += max14690n.c
|
|
||||||
|
|
||||||
# Where to find BSP source files
|
|
||||||
VPATH += $(BOARD_DIR)/Source
|
|
||||||
|
|
||||||
# Where to find BSP header files
|
|
||||||
IPATH += $(BOARD_DIR)/Include
|
|
||||||
|
|
||||||
# Btstack
|
|
||||||
BTSTACK_ROOT = ../..
|
|
||||||
VPATH += $(BTSTACK_ROOT)/src
|
|
||||||
VPATH += $(BTSTACK_ROOT)/src/ble
|
|
||||||
VPATH += $(BTSTACK_ROOT)/src/classic
|
|
||||||
VPATH += $(BTSTACK_ROOT)/chipset/cc256x
|
|
||||||
VPATH += ${BTSTACK_ROOT}/platform/embedded
|
|
||||||
VPATH += ${BTSTACK_ROOT}/src/ble/gatt-service/
|
|
||||||
VPATH += $(BTSTACK_ROOT)/port/pegasus-max3263x
|
|
||||||
VPATH += $(BTSTACK_ROOT)/example
|
|
||||||
|
|
||||||
PROJ_CFLAGS += \
|
|
||||||
-I$(BTSTACK_ROOT)/src \
|
|
||||||
-I$(BTSTACK_ROOT)/src/ble \
|
|
||||||
-I$(BTSTACK_ROOT)/src/classic \
|
|
||||||
-I$(BTSTACK_ROOT)/chipset/cc256x \
|
|
||||||
-I$(BTSTACK_ROOT)/platform/embedded \
|
|
||||||
-I${BTSTACK_ROOT}/port/pegasus-max3263x \
|
|
||||||
-I${BTSTACK_ROOT}/src/ble/gatt-service/ \
|
|
||||||
-I${BTSTACK_ROOT}/example
|
|
||||||
|
|
||||||
CORE = \
|
|
||||||
ad_parser.o \
|
|
||||||
btstack_linked_list.o \
|
|
||||||
btstack_memory.o \
|
|
||||||
btstack_memory_pool.o \
|
|
||||||
btstack_run_loop.o \
|
|
||||||
btstack_util.o \
|
|
||||||
l2cap.o \
|
|
||||||
l2cap_signaling.o \
|
|
||||||
btstack_run_loop_embedded.o \
|
|
||||||
$(CC2564B) \
|
|
||||||
hci_transport_h4.o
|
|
||||||
|
|
||||||
COMMON = \
|
|
||||||
btstack_chipset_cc256x.o \
|
|
||||||
hci.o \
|
|
||||||
hci_cmd.o \
|
|
||||||
hci_dump.o \
|
|
||||||
btstack_uart_block_embedded.o
|
|
||||||
|
|
||||||
CLASSIC = \
|
|
||||||
btstack_link_key_db_memory.o \
|
|
||||||
rfcomm.o \
|
|
||||||
sdp_util.o \
|
|
||||||
spp_server.o \
|
|
||||||
sdp_server.o \
|
|
||||||
sdp_client.o \
|
|
||||||
sdp_client_rfcomm.o
|
|
||||||
|
|
||||||
BLE = \
|
|
||||||
att_db.o \
|
|
||||||
att_server.o \
|
|
||||||
le_device_db_memory.o \
|
|
||||||
att_dispatch.o \
|
|
||||||
sm.o
|
|
||||||
|
|
||||||
ADDITION =
|
|
||||||
|
|
||||||
CORE_OBJ = $(CORE:.c=.o)
|
|
||||||
COMMON_OBJ = $(COMMON:.c=.o)
|
|
||||||
BLE_OBJ = $(BLE:.c=.o)
|
|
||||||
CLASSIC_OBJ = $(CLASSIC:.c=.o)
|
|
||||||
|
|
||||||
SRCS += $(CORE_OBJ)
|
|
||||||
SRCS += $(COMMON_OBJ)
|
|
||||||
SRCS += $(BLE_OBJ)
|
|
||||||
SRCS += $(CLASSIC_OBJ)
|
|
||||||
|
|
||||||
# Enable assertion checking for development
|
|
||||||
PROJ_CFLAGS+=-DMXC_ASSERT_ENABLE
|
|
||||||
|
|
||||||
# Use this variables to specify and alternate tool path
|
|
||||||
#TOOL_DIR=/opt/gcc-arm-none-eabi-4_8-2013q4/bin
|
|
||||||
|
|
||||||
# Use these variables to add project specific tool options
|
|
||||||
#PROJ_CFLAGS+=--specs=nano.specs
|
|
||||||
#PROJ_LDFLAGS+=--specs=nano.specs
|
|
||||||
|
|
||||||
# Point this variable to a startup file to override the default file
|
|
||||||
#STARTUPFILE=start.S
|
|
||||||
|
|
||||||
# Point this variable to a linker file to override the default file
|
|
||||||
# LINKERFILE=$(CMSIS_ROOT)/Device/Maxim/$(TARGET_UC)/Source/GCC/$(TARGET_LC).ld
|
|
||||||
|
|
||||||
# Include the peripheral driver
|
|
||||||
PERIPH_DRIVER_DIR=$(LIBS_DIR)/$(TARGET_UC)PeriphDriver
|
|
||||||
include $(PERIPH_DRIVER_DIR)/periphdriver.mk
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
# Include the rules for building for this target. All other makefiles should be
|
|
||||||
# included before this one.
|
|
||||||
include $(CMSIS_ROOT)/Device/Maxim/$(TARGET_UC)/Source/$(COMPILER)/$(TARGET_LC).mk
|
|
||||||
|
|
||||||
# fetch and convert init scripts
|
|
||||||
# use bluetooth_init_cc2564B_1.6_BT_Spec_4.1.c
|
|
||||||
include ${BTSTACK_ROOT}/chipset/cc256x/Makefile.inc
|
|
||||||
|
|
||||||
#include ${BTSTACK_ROOT}/example/Makefile.inc
|
|
||||||
|
|
||||||
spp_and_le_streamer.h: spp_and_le_streamer.gatt
|
|
||||||
python ${BTSTACK_ROOT}/tool/compile_gatt.py $< $@
|
|
||||||
|
|
||||||
generate_header_file: spp_and_le_streamer.h
|
|
||||||
|
|
||||||
# The rule to clean out all the build products.
|
|
||||||
distclean: clean
|
|
||||||
$(MAKE) -C ${PERIPH_DRIVER_DIR} clean
|
|
||||||
|
205
port/max32630-fthr/Makefile.template
Normal file
205
port/max32630-fthr/Makefile.template
Normal file
@ -0,0 +1,205 @@
|
|||||||
|
################################################################################
|
||||||
|
# Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
|
||||||
|
# Ismail H. Kose <ismail.kose@maximintegrated.com>
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
# copy of this software and associated documentation files (the "Software"),
|
||||||
|
# to deal in the Software without restriction, including without limitation
|
||||||
|
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
# and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
# Software is furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be included
|
||||||
|
# in all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
# IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
|
||||||
|
# OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
# OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
#
|
||||||
|
# Except as contained in this notice, the name of Maxim Integrated
|
||||||
|
# Products, Inc. shall not be used except as stated in the Maxim Integrated
|
||||||
|
# Products, Inc. Branding Policy.
|
||||||
|
#
|
||||||
|
# The mere transfer of this software does not imply any licenses
|
||||||
|
# of trade secrets, proprietary technology, copyrights, patents,
|
||||||
|
# trademarks, maskwork rights, or any other form of intellectual
|
||||||
|
# property whatsoever. Maxim Integrated Products, Inc. retains all
|
||||||
|
# ownership rights.
|
||||||
|
#
|
||||||
|
# $Date: 2016-03-23 13:28:53 -0700 (Wed, 23 Mar 2016) $
|
||||||
|
# $Revision: 22067 $
|
||||||
|
#
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
# Maxim ARM Toolchain and Libraries
|
||||||
|
# https://www.maximintegrated.com/en/products/digital/microcontrollers/MAX32630.html
|
||||||
|
|
||||||
|
# This is the name of the build output file
|
||||||
|
PROJECT=spp_and_le_streamer
|
||||||
|
|
||||||
|
# Specify the target processor
|
||||||
|
TARGET=MAX3263x
|
||||||
|
PROJ_CFLAGS+=-DRO_FREQ=96000000
|
||||||
|
|
||||||
|
# Create Target name variables
|
||||||
|
TARGET_UC:=$(shell echo $(TARGET) | tr a-z A-Z)
|
||||||
|
TARGET_LC:=$(shell echo $(TARGET) | tr A-Z a-z)
|
||||||
|
|
||||||
|
CC2564B = bluetooth_init_cc2564B_1.6_BT_Spec_4.1.o
|
||||||
|
|
||||||
|
# Select 'GCC' or 'IAR' compiler
|
||||||
|
COMPILER=GCC
|
||||||
|
|
||||||
|
ifeq "$(MAXIM_PATH)" ""
|
||||||
|
LIBS_DIR=/$(subst \,/,$(subst :,,$(HOME))/Maxim/Firmware/$(TARGET_UC)/Libraries)
|
||||||
|
$(warning "MAXIM_PATH need to be set. Please run setenv bash file in the Maxim Toolchain directory.")
|
||||||
|
else
|
||||||
|
LIBS_DIR=/$(subst \,/,$(subst :,,$(MAXIM_PATH))/Firmware/$(TARGET_UC)/Libraries)
|
||||||
|
endif
|
||||||
|
|
||||||
|
CMSIS_ROOT=$(LIBS_DIR)/CMSIS
|
||||||
|
|
||||||
|
# Where to find source files for this test
|
||||||
|
VPATH= . ../src
|
||||||
|
|
||||||
|
# Where to find header files for this test
|
||||||
|
IPATH= . ../src
|
||||||
|
|
||||||
|
BOARD_DIR=$(LIBS_DIR)/Boards
|
||||||
|
|
||||||
|
IPATH += ../board/
|
||||||
|
VPATH += ../board/
|
||||||
|
|
||||||
|
# Source files for this test (add path to VPATH below)
|
||||||
|
SRCS = main.c
|
||||||
|
SRCS += hal_tick.c
|
||||||
|
SRCS += btstack_port.c
|
||||||
|
SRCS += ${PROJECT}.c
|
||||||
|
SRCS += board.c
|
||||||
|
SRCS += stdio.c
|
||||||
|
SRCS += led.c
|
||||||
|
SRCS += pb.c
|
||||||
|
SRCS += max14690n.c
|
||||||
|
|
||||||
|
# Where to find BSP source files
|
||||||
|
VPATH += $(BOARD_DIR)/Source
|
||||||
|
|
||||||
|
# Where to find BSP header files
|
||||||
|
IPATH += $(BOARD_DIR)/Include
|
||||||
|
|
||||||
|
# BTstack
|
||||||
|
BTSTACK_ROOT = ../../..
|
||||||
|
VPATH += $(BTSTACK_ROOT)/src
|
||||||
|
VPATH += $(BTSTACK_ROOT)/src/ble
|
||||||
|
VPATH += $(BTSTACK_ROOT)/src/classic
|
||||||
|
VPATH += $(BTSTACK_ROOT)/chipset/cc256x
|
||||||
|
VPATH += ${BTSTACK_ROOT}/platform/embedded
|
||||||
|
VPATH += ${BTSTACK_ROOT}/src/ble/gatt-service/
|
||||||
|
VPATH += $(BTSTACK_ROOT)/port/pegasus-max3263x
|
||||||
|
VPATH += $(BTSTACK_ROOT)/example
|
||||||
|
|
||||||
|
PROJ_CFLAGS += \
|
||||||
|
-I$(BTSTACK_ROOT)/src \
|
||||||
|
-I$(BTSTACK_ROOT)/src/ble \
|
||||||
|
-I$(BTSTACK_ROOT)/src/classic \
|
||||||
|
-I$(BTSTACK_ROOT)/chipset/cc256x \
|
||||||
|
-I$(BTSTACK_ROOT)/platform/embedded \
|
||||||
|
-I${BTSTACK_ROOT}/port/pegasus-max3263x \
|
||||||
|
-I${BTSTACK_ROOT}/src/ble/gatt-service/ \
|
||||||
|
-I${BTSTACK_ROOT}/example
|
||||||
|
|
||||||
|
CORE = \
|
||||||
|
ad_parser.o \
|
||||||
|
btstack_linked_list.o \
|
||||||
|
btstack_memory.o \
|
||||||
|
btstack_memory_pool.o \
|
||||||
|
btstack_run_loop.o \
|
||||||
|
btstack_util.o \
|
||||||
|
l2cap.o \
|
||||||
|
l2cap_signaling.o \
|
||||||
|
btstack_run_loop_embedded.o \
|
||||||
|
$(CC2564B) \
|
||||||
|
hci_transport_h4.o
|
||||||
|
|
||||||
|
COMMON = \
|
||||||
|
btstack_chipset_cc256x.o \
|
||||||
|
hci.o \
|
||||||
|
hci_cmd.o \
|
||||||
|
hci_dump.o \
|
||||||
|
btstack_uart_block_embedded.o
|
||||||
|
|
||||||
|
CLASSIC = \
|
||||||
|
btstack_link_key_db_memory.o \
|
||||||
|
rfcomm.o \
|
||||||
|
sdp_util.o \
|
||||||
|
spp_server.o \
|
||||||
|
sdp_server.o \
|
||||||
|
sdp_client.o \
|
||||||
|
sdp_client_rfcomm.o
|
||||||
|
|
||||||
|
BLE = \
|
||||||
|
att_db.o \
|
||||||
|
att_server.o \
|
||||||
|
le_device_db_memory.o \
|
||||||
|
att_dispatch.o \
|
||||||
|
sm.o
|
||||||
|
|
||||||
|
ADDITION =
|
||||||
|
|
||||||
|
CORE_OBJ = $(CORE:.c=.o)
|
||||||
|
COMMON_OBJ = $(COMMON:.c=.o)
|
||||||
|
BLE_OBJ = $(BLE:.c=.o)
|
||||||
|
CLASSIC_OBJ = $(CLASSIC:.c=.o)
|
||||||
|
|
||||||
|
SRCS += $(CORE_OBJ)
|
||||||
|
SRCS += $(COMMON_OBJ)
|
||||||
|
SRCS += $(BLE_OBJ)
|
||||||
|
SRCS += $(CLASSIC_OBJ)
|
||||||
|
|
||||||
|
# Enable assertion checking for development
|
||||||
|
PROJ_CFLAGS+=-DMXC_ASSERT_ENABLE
|
||||||
|
|
||||||
|
# Use this variables to specify and alternate tool path
|
||||||
|
#TOOL_DIR=/opt/gcc-arm-none-eabi-4_8-2013q4/bin
|
||||||
|
|
||||||
|
# Use these variables to add project specific tool options
|
||||||
|
#PROJ_CFLAGS+=--specs=nano.specs
|
||||||
|
#PROJ_LDFLAGS+=--specs=nano.specs
|
||||||
|
|
||||||
|
# Point this variable to a startup file to override the default file
|
||||||
|
#STARTUPFILE=start.S
|
||||||
|
|
||||||
|
# Point this variable to a linker file to override the default file
|
||||||
|
# LINKERFILE=$(CMSIS_ROOT)/Device/Maxim/$(TARGET_UC)/Source/GCC/$(TARGET_LC).ld
|
||||||
|
|
||||||
|
%.h: %.gatt
|
||||||
|
python ${BTSTACK_ROOT}/tool/compile_gatt.py $< $@
|
||||||
|
|
||||||
|
all: spp_and_le_streamer.h
|
||||||
|
|
||||||
|
# Include the peripheral driver
|
||||||
|
PERIPH_DRIVER_DIR=$(LIBS_DIR)/$(TARGET_UC)PeriphDriver
|
||||||
|
include $(PERIPH_DRIVER_DIR)/periphdriver.mk
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# Include the rules for building for this target. All other makefiles should be
|
||||||
|
# included before this one.
|
||||||
|
include $(CMSIS_ROOT)/Device/Maxim/$(TARGET_UC)/Source/$(COMPILER)/$(TARGET_LC).mk
|
||||||
|
|
||||||
|
# fetch and convert init scripts
|
||||||
|
# use bluetooth_init_cc2564B_1.6_BT_Spec_4.1.c
|
||||||
|
# include ${BTSTACK_ROOT}/chipset/cc256x/Makefile.inc
|
||||||
|
|
||||||
|
#include ${BTSTACK_ROOT}/example/Makefile.inc
|
||||||
|
|
||||||
|
rm-compiled-gatt-file:
|
||||||
|
rm -f spp_and_le_counter.h
|
||||||
|
|
||||||
|
clean: rm-compiled-gatt-file
|
||||||
|
|
||||||
|
# The rule to clean out all the build products.
|
||||||
|
distclean: clean
|
||||||
|
$(MAKE) -C ${PERIPH_DRIVER_DIR} clean
|
75
port/max32630-fthr/scripts/create_examples.py
Executable file
75
port/max32630-fthr/scripts/create_examples.py
Executable file
@ -0,0 +1,75 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
#
|
||||||
|
# Create project files for all BTstack embedded examples in WICED/apps/btstack
|
||||||
|
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# get script path
|
||||||
|
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 CC2564B
|
||||||
|
cc256x_init_script = 'bluetooth_init_cc2564B_1.6_BT_Spec_4.1.c'
|
||||||
|
|
||||||
|
subprocess.call("make -f ../Makefile -C src " + cc256x_init_script, shell=True)
|
||||||
|
|
||||||
|
# fetch init script
|
||||||
|
# print("Creating init script %s" % cc256x_init_script)
|
||||||
|
# make_template = 'make -f {BTSTACK_ROOT}chipset/cc256x/Makefile.inc -C {SCRIPT_PATH}src/ {INIT_SCRIPT} BTSTACK_ROOT={BTSTACK_ROOT}'
|
||||||
|
# make_command = make_template.format(BTSTACK_ROOT=btstack_root, SCRIPT_PATH=script_path, INIT_SCRIPT=cc256x_init_script)
|
||||||
|
# print(make_command)
|
||||||
|
# subprocess.call(make_command)
|
||||||
|
|
||||||
|
# path to examples
|
||||||
|
examples_embedded = btstack_root + 'example/'
|
||||||
|
|
||||||
|
# path to generated example projects
|
||||||
|
projects_path = script_path
|
||||||
|
|
||||||
|
# path to template
|
||||||
|
template_path = script_path + 'Makefile.template'
|
||||||
|
|
||||||
|
print("Creating example projects:")
|
||||||
|
|
||||||
|
# iterate over btstack examples
|
||||||
|
example_files = os.listdir(examples_embedded)
|
||||||
|
|
||||||
|
for file in example_files:
|
||||||
|
if not file.endswith(".c"):
|
||||||
|
continue
|
||||||
|
example = file[:-2]
|
||||||
|
|
||||||
|
# create folder
|
||||||
|
project_folder = projects_path + example + "/"
|
||||||
|
if not os.path.exists(project_folder):
|
||||||
|
os.makedirs(project_folder)
|
||||||
|
|
||||||
|
# check if .gatt file is present
|
||||||
|
gatt_path = examples_embedded + example + ".gatt"
|
||||||
|
gatt_h = ""
|
||||||
|
if os.path.exists(gatt_path):
|
||||||
|
gatt_h = example+'.h'
|
||||||
|
|
||||||
|
# create makefile
|
||||||
|
with open(project_folder + 'Makefile', 'wt') as fout:
|
||||||
|
with open(template_path, 'rt') as fin:
|
||||||
|
for line in fin:
|
||||||
|
if 'PROJECT=spp_and_le_streamer' in line:
|
||||||
|
fout.write('PROJECT=%s\n' % example)
|
||||||
|
continue
|
||||||
|
if 'all: spp_and_le_streamer.h' in line:
|
||||||
|
if len(gatt_h):
|
||||||
|
fout.write("all: %s\n" % gatt_h)
|
||||||
|
continue
|
||||||
|
fout.write(line)
|
||||||
|
|
||||||
|
print("- %s" % example)
|
||||||
|
|
||||||
|
print("Projects are ready for compile. See README for details.")
|
31
port/max32630-fthr/scripts/delete_examples.py
Executable file
31
port/max32630-fthr/scripts/delete_examples.py
Executable file
@ -0,0 +1,31 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
#
|
||||||
|
# Delete project files for all BTstack embedded examples in local port/esp32 folder
|
||||||
|
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
# get script path
|
||||||
|
script_path = os.path.abspath(os.path.dirname(sys.argv[0]))
|
||||||
|
|
||||||
|
# path to examples
|
||||||
|
examples_embedded = script_path + "/../../../example/"
|
||||||
|
|
||||||
|
# path to port/esp32
|
||||||
|
apps_btstack = ""
|
||||||
|
|
||||||
|
print("Deleting examples in local folder")
|
||||||
|
|
||||||
|
# iterate over btstack examples
|
||||||
|
for file in os.listdir(examples_embedded):
|
||||||
|
if not file.endswith(".c"):
|
||||||
|
continue
|
||||||
|
example = file[:-2]
|
||||||
|
apps_folder = apps_btstack + example + "/"
|
||||||
|
if os.path.exists(apps_folder):
|
||||||
|
shutil.rmtree(apps_folder)
|
||||||
|
print("- %s" % example)
|
||||||
|
|
@ -1,400 +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
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
// *****************************************************************************
|
|
||||||
/* EXAMPLE_START(spp_and_le_streamer): Dual mode example
|
|
||||||
*
|
|
||||||
* @text The SPP and LE Streamer example combines the Bluetooth Classic SPP Streamer
|
|
||||||
* and the Bluetooth LE Streamer 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)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @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 btstack_packet_callback_registration_t hci_event_callback_registration;
|
|
||||||
|
|
||||||
uint8_t adv_data_len = sizeof(adv_data);
|
|
||||||
|
|
||||||
static uint8_t test_data[NUM_ROWS * NUM_COLS];
|
|
||||||
|
|
||||||
// SPP
|
|
||||||
static uint8_t spp_service_buffer[150];
|
|
||||||
|
|
||||||
static uint16_t spp_test_data_len;
|
|
||||||
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;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @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){
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @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;
|
|
||||||
|
|
||||||
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);
|
|
||||||
gap_pin_code_response(event_addr, "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);
|
|
||||||
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 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);
|
|
||||||
|
|
||||||
spp_test_data_len = rfcomm_mtu;
|
|
||||||
if (spp_test_data_len > sizeof(test_data)){
|
|
||||||
spp_test_data_len = sizeof(test_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
test_reset();
|
|
||||||
rfcomm_request_can_send_now_event(rfcomm_cid);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RFCOMM_EVENT_CAN_SEND_NOW:
|
|
||||||
spp_send_packet();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RFCOMM_EVENT_CHANNEL_CLOSED:
|
|
||||||
printf("RFCOMM channel closed\n");
|
|
||||||
rfcomm_cid = 0;
|
|
||||||
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);
|
|
||||||
UNUSED(buffer_size);
|
|
||||||
|
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @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 SPP Streamer
|
|
||||||
gap_set_class_of_device(TEST_COD);
|
|
||||||
|
|
||||||
gap_discoverable_control(1);
|
|
||||||
|
|
||||||
// setup le device db
|
|
||||||
le_device_db_init();
|
|
||||||
|
|
||||||
// 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);
|
|
||||||
|
|
||||||
spp_create_test_data();
|
|
||||||
|
|
||||||
// turn on!
|
|
||||||
hci_power_control(HCI_POWER_ON);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/* LISTING_END */
|
|
||||||
/* EXAMPLE_END */
|
|
@ -1,12 +0,0 @@
|
|||||||
PRIMARY_SERVICE, GAP_SERVICE
|
|
||||||
CHARACTERISTIC, GAP_DEVICE_NAME, READ, "Max32630FTHR LE Streamer"
|
|
||||||
|
|
||||||
PRIMARY_SERVICE, GATT_SERVICE
|
|
||||||
CHARACTERISTIC, GATT_SERVICE_CHANGED, READ,
|
|
||||||
|
|
||||||
// Test Service
|
|
||||||
PRIMARY_SERVICE, 0000FF10-0000-1000-8000-00805F9B34FB
|
|
||||||
// Test Characteristic, only notify
|
|
||||||
CHARACTERISTIC, 0000FF11-0000-1000-8000-00805F9B34FB, NOTIFY,
|
|
||||||
// Test Characterisitic, only write_without_response
|
|
||||||
CHARACTERISTIC, 0000FF12-0000-1000-8000-00805F9B34FB, WRITE_WITHOUT_RESPONSE | DYNAMIC,
|
|
@ -1,63 +0,0 @@
|
|||||||
|
|
||||||
// spp_and_le_streamer.h generated from spp_and_le_streamer.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-'Max32630FTHR LE Streamer'
|
|
||||||
0x20, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2a, 0x4d, 0x61, 0x78, 0x33, 0x32, 0x36, 0x33, 0x30, 0x46, 0x54, 0x48, 0x52, 0x20, 0x4c, 0x45, 0x20, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 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,
|
|
||||||
// Test 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,
|
|
||||||
// Test Characteristic, only notify
|
|
||||||
// 0x0008 CHARACTERISTIC-0000FF11-0000-1000-8000-00805F9B34FB-NOTIFY
|
|
||||||
0x1b, 0x00, 0x02, 0x00, 0x08, 0x00, 0x03, 0x28, 0x10, 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-NOTIFY-''
|
|
||||||
0x16, 0x00, 0x10, 0x02, 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,
|
|
||||||
// Test Characterisitic, only write_without_response
|
|
||||||
// 0x000b CHARACTERISTIC-0000FF12-0000-1000-8000-00805F9B34FB-WRITE_WITHOUT_RESPONSE | DYNAMIC
|
|
||||||
0x1b, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x03, 0x28, 0x04, 0x0c, 0x00, 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x12, 0xff, 0x00, 0x00,
|
|
||||||
// 0x000c VALUE-0000FF12-0000-1000-8000-00805F9B34FB-WRITE_WITHOUT_RESPONSE | DYNAMIC-''
|
|
||||||
0x16, 0x00, 0x04, 0x03, 0x0c, 0x00, 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x12, 0xff, 0x00, 0x00,
|
|
||||||
|
|
||||||
// END
|
|
||||||
0x00, 0x00,
|
|
||||||
}; // total size 126 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 0x000c
|
|
||||||
|
|
||||||
//
|
|
||||||
// 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
|
|
||||||
#define ATT_CHARACTERISTIC_0000FF12_0000_1000_8000_00805F9B34FB_01_VALUE_HANDLE 0x000c
|
|
Loading…
x
Reference in New Issue
Block a user