From 6807484c546391a5d67e9d4e7e57af2376cdefcf Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Thu, 14 Sep 2017 14:30:31 +0200 Subject: [PATCH] New posix-h4-zephyr port based on posix-h4 as default baud rate is 1000000 --- port/posix-h4-zephyr/.gitignore | 56 ++++++++++ port/posix-h4-zephyr/Makefile | 32 ++++++ port/posix-h4-zephyr/README.md | 11 ++ port/posix-h4-zephyr/btstack_config.h | 34 ++++++ port/posix-h4-zephyr/main.c | 154 ++++++++++++++++++++++++++ 5 files changed, 287 insertions(+) create mode 100644 port/posix-h4-zephyr/.gitignore create mode 100644 port/posix-h4-zephyr/Makefile create mode 100644 port/posix-h4-zephyr/README.md create mode 100644 port/posix-h4-zephyr/btstack_config.h create mode 100644 port/posix-h4-zephyr/main.c diff --git a/port/posix-h4-zephyr/.gitignore b/port/posix-h4-zephyr/.gitignore new file mode 100644 index 000000000..18d487773 --- /dev/null +++ b/port/posix-h4-zephyr/.gitignore @@ -0,0 +1,56 @@ +ancs_client_demo +ancs_client_demo.h +ble_central_test +ble_peripheral +ble_peripheral_sm_minimal +ble_peripheral_test +bluetooth_init_cc2560_2.44.c +bluetooth_init_cc2560a_2.14.c +bluetooth_init_cc2560B_1.2_BT_Spec_4.0.c +bluetooth_init_cc2564_2.14.c +bluetooth_init_cc2564B_1.2_BT_Spec_4.0.c +bnep_test +classic_test +gap_dedicated_bonding +gap_inquiry +gap_inquiry_and_bond +gap_le_advertisements +gatt_battery_query +gatt_browser +hfp_ag_demo +hfp_hf_demo +hsp_ag_demo +hsp_ag_test +hsp_hs_demo +hsp_hs_test +l2cap_test +le_counter +le_counter.h +le_streamer +le_streamer.h +led_counter +profile.h +sco_input.wav +sdp_bnep_query +sdp_general_query +sdp_rfcomm_query +sm_pairing_peripheral.h +spp_and_le_counter +spp_and_le_counter.h +spp_counter +spp_streamer +TIInit_12.10.28.c +TIInit_12.8.32.c +BCM43430A1.hcd +a2dp_sink_demo +a2dp_source_demo +gatt_battery_query.h +gatt_browser.h +hid_keyboard_demo +le_streamer_client +pbap_client_demo +sm_pairing_central +sm_pairing_peripheral +spp_and_le_streamer +spp_and_le_streamer.h +spp_streamer_client diff --git a/port/posix-h4-zephyr/Makefile b/port/posix-h4-zephyr/Makefile new file mode 100644 index 000000000..78282a1bb --- /dev/null +++ b/port/posix-h4-zephyr/Makefile @@ -0,0 +1,32 @@ +# Makefile for posix-h4 based examples +BTSTACK_ROOT = ../.. + +CORE += \ + btstack_link_key_db_fs.c \ + btstack_run_loop_posix.c \ + btstack_uart_block_posix.c \ + hci_transport_h4.c \ + le_device_db_fs.c \ + main.c \ + btstack_stdin_posix.c \ + wav_util.c \ + +# examples +include ${BTSTACK_ROOT}/example/Makefile.inc + +CFLAGS += -g -Wall -Werror \ + -I$(BTSTACK_ROOT)/platform/embedded \ + -I$(BTSTACK_ROOT)/platform/posix \ + +VPATH += ${BTSTACK_ROOT}/platform/posix +VPATH += ${BTSTACK_ROOT}/platform/embedded + +# use pkg-config for portaudio +# CFLAGS += $(shell pkg-config portaudio-2.0 --cflags) -DHAVE_PORTAUDIO +# LDFLAGS += $(shell pkg-config portaudio-2.0 --libs) +# hard coded flags for portaudio in /usr/local/lib +# CFLAGS += -I/usr/local/include -DHAVE_PORTAUDIO +# LDFLAGS += -L/sw/lib -lportaudio -Wl,-framework,CoreAudio -Wl,-framework,AudioToolbox -Wl,-framework,AudioUnit -Wl,-framework,Carbon + +all: ${EXAMPLES} + diff --git a/port/posix-h4-zephyr/README.md b/port/posix-h4-zephyr/README.md new file mode 100644 index 000000000..312278128 --- /dev/null +++ b/port/posix-h4-zephyr/README.md @@ -0,0 +1,11 @@ +# BTstack port for POSIX System connected to Zephyr Controller with HCI UART Firmware + +# Prepare Zephyr Conroller + +# Compile Examples + + $ make + +## TODOs + +## Issues diff --git a/port/posix-h4-zephyr/btstack_config.h b/port/posix-h4-zephyr/btstack_config.h new file mode 100644 index 000000000..00b876d2e --- /dev/null +++ b/port/posix-h4-zephyr/btstack_config.h @@ -0,0 +1,34 @@ +// +// btstack_config.h for generic POSIX H4 port +// + +#ifndef __BTSTACK_CONFIG +#define __BTSTACK_CONFIG + +// Port related features +#define HAVE_MALLOC +#define HAVE_POSIX_FILE_IO +#define HAVE_BTSTACK_STDIN +#define HAVE_POSIX_TIME + +// BTstack features that can be enabled +#define ENABLE_BLE +#define ENABLE_CLASSIC +#define ENABLE_HFP_WIDE_BAND_SPEECH +#define ENABLE_LE_CENTRAL +#define ENABLE_LE_PERIPHERAL +#define ENABLE_LE_SECURE_CONNECTIONS +#define ENABLE_MICRO_ECC_FOR_LE_SECURE_CONNECTIONS +#define ENABLE_LE_DATA_LENGTH_EXTENSION +#define ENABLE_LOG_ERROR +#define ENABLE_LOG_INFO +#define ENABLE_SCO_OVER_HCI +#define ENABLE_SDP_DES_DUMP +// #define ENABLE_EHCILL + +// BTstack configuration. buffers, sizes, ... +#define HCI_INCOMING_PRE_BUFFER_SIZE 14 // sizeof benep heade, avoid memcpy +#define HCI_ACL_PAYLOAD_SIZE (1691 + 4) + +#endif + diff --git a/port/posix-h4-zephyr/main.c b/port/posix-h4-zephyr/main.c new file mode 100644 index 000000000..c6855ce81 --- /dev/null +++ b/port/posix-h4-zephyr/main.c @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2014 BlueKitchen GmbH + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * 4. Any redistribution, use, or modification is done solely for + * personal benefit and not for any commercial purpose or for + * monetary gain. + * + * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS + * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Please inquire about commercial licensing options at + * contact@bluekitchen-gmbh.com + * + */ + +#define __BTSTACK_FILE__ "main.c" + +// ***************************************************************************** +// +// minimal setup for HCI code +// +// ***************************************************************************** + +#include +#include +#include +#include +#include + +#include "btstack_config.h" + +#include "btstack_debug.h" +#include "btstack_event.h" +#include "btstack_link_key_db_fs.h" +#include "btstack_memory.h" +#include "btstack_run_loop.h" +#include "btstack_run_loop_posix.h" +#include "bluetooth_company_id.h" +#include "hci.h" +#include "hci_dump.h" +#include "btstack_stdin.h" + +int btstack_main(int argc, const char * argv[]); + +static hci_transport_config_uart_t config = { + HCI_TRANSPORT_CONFIG_UART, + 1000000, + 0, // main baudrate + 1, // flow control + NULL, +}; + +static btstack_packet_callback_registration_t hci_event_callback_registration; + +static void packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ + bd_addr_t addr; + if (packet_type != HCI_EVENT_PACKET) return; + switch (hci_event_packet_get_type(packet)){ + case BTSTACK_EVENT_STATE: + if (btstack_event_state_get_state(packet) != HCI_STATE_WORKING) break; + gap_local_bd_addr(addr); + printf("BTstack up and running at %s\n", bd_addr_to_str(addr)); + break; + default: + break; + } +} + +static void sigint_handler(int param){ + UNUSED(param); + + printf("CTRL-C - SIGINT received, shutting down..\n"); + log_info("sigint_handler: shutting down"); + + // reset anyway + btstack_stdin_reset(); + + // power down + hci_power_control(HCI_POWER_OFF); + hci_close(); + log_info("Good bye, see you.\n"); + exit(0); +} + +static int led_state = 0; +void hal_led_toggle(void){ + led_state = 1 - led_state; + printf("LED State %u\n", led_state); +} + +int main(int argc, const char * argv[]){ + + /// GET STARTED with BTstack /// + btstack_memory_init(); + btstack_run_loop_init(btstack_run_loop_posix_get_instance()); + + // use logger: format HCI_DUMP_PACKETLOGGER, HCI_DUMP_BLUEZ or HCI_DUMP_STDOUT + hci_dump_open("/tmp/hci_dump.pklg", HCI_DUMP_PACKETLOGGER); + + // pick serial port + config.device_name = "/dev/tty.usbmodem14514411"; // PCA10040 nRF52832 + + // accept path from command line + if (argc >= 3 && strcmp(argv[1], "-u") == 0){ + config.device_name = argv[2]; + argc -= 2; + memmove(&argv[0], &argv[2], argc * sizeof(char *)); + } + printf("H4 device: %s\n", config.device_name); + + // init HCI + const btstack_uart_block_t * uart_driver = btstack_uart_block_posix_instance(); + const hci_transport_t * transport = hci_transport_h4_instance(uart_driver); + const btstack_link_key_db_t * link_key_db = btstack_link_key_db_fs_instance(); + hci_init(transport, (void*) &config); + hci_set_link_key_db(link_key_db); + + // inform about BTstack state + hci_event_callback_registration.callback = &packet_handler; + hci_add_event_handler(&hci_event_callback_registration); + + // handle CTRL-c + signal(SIGINT, sigint_handler); + + // setup app + btstack_main(argc, argv); + + // go + btstack_run_loop_execute(); + + return 0; +}