diff --git a/port/windows-h4/Makefile b/port/windows-h4/Makefile index 361803374..59a4f24ed 100644 --- a/port/windows-h4/Makefile +++ b/port/windows-h4/Makefile @@ -9,20 +9,47 @@ COMMON += \ btstack_uart_block_windows.c \ le_device_db_fs.c \ btstack_link_key_db_fs.c \ + bluetooth_init_cc2564B_1.4_BT_Spec_4.1.c \ + btstack_chipset_cc256x.c \ + btstack_chipset_csr.c \ + btstack_chipset_em9301.c \ + btstack_chipset_stlc2500d.c \ + btstack_chipset_tc3566x.c \ + # btstack_chipset_bcm.c \ +# examples include ${BTSTACK_ROOT}/example/Makefile.inc +# fetch and convert TI init scripts +include ${BTSTACK_ROOT}/chipset/cc256x/Makefile.inc + +# fetch Broadcom init scripts +# include ${BTSTACK_ROOT}/chipset/bcm/Makefile.inc + # CC = gcc-fsf-4.9 CFLAGS += -g -Wall -Wmissing-prototypes -Wstrict-prototypes -Wshadow -Werror # CFLAGS += -Werror CFLAGS += -I${BTSTACK_ROOT}/platform/posix \ - -I${BTSTACK_ROOT}/platform/embedded + -I${BTSTACK_ROOT}/platform/embedded \ + -I$(BTSTACK_ROOT)/chipset/bcm \ + -I$(BTSTACK_ROOT)/chipset/cc256x \ + -I$(BTSTACK_ROOT)/chipset/csr \ + -I$(BTSTACK_ROOT)/chipset/em9301 \ + -I$(BTSTACK_ROOT)/chipset/stlc2500d \ + -I$(BTSTACK_ROOT)/chipset/tc3566x \ VPATH += ${BTSTACK_ROOT}/platform/embedded VPATH += ${BTSTACK_ROOT}/platform/posix VPATH += ${BTSTACK_ROOT}/platform/libusb +VPATH += ${BTSTACK_ROOT}/chipset/bcm +VPATH += ${BTSTACK_ROOT}/chipset/cc256x +VPATH += ${BTSTACK_ROOT}/chipset/csr +VPATH += ${BTSTACK_ROOT}/chipset/em9301 +VPATH += ${BTSTACK_ROOT}/chipset/stlc2500d +VPATH += ${BTSTACK_ROOT}/chipset/tc3566x + # assume portaudio is installed in /usr/local # CFLAGS += -I/usr/local/include -DHAVE_PORTAUDIO # LDFLAGS += -L/sw/lib -lportaudio diff --git a/port/windows-h4/main.c b/port/windows-h4/main.c index 96283ef15..b4373c3c5 100644 --- a/port/windows-h4/main.c +++ b/port/windows-h4/main.c @@ -14,12 +14,31 @@ #include "hci.h" #include "hci_dump.h" #include "hal_led.h" -// #include "btstack_link_key_db_fs.h" +#include "btstack_link_key_db_fs.h" + // #include "stdin_support.h" +#include "btstack_chipset_bcm.h" +#include "btstack_chipset_csr.h" +#include "btstack_chipset_cc256x.h" +#include "btstack_chipset_em9301.h" +#include "btstack_chipset_stlc2500d.h" +#include "btstack_chipset_tc3566x.h" + int btstack_main(int argc, const char * argv[]); +static hci_transport_config_uart_t config = { + HCI_TRANSPORT_CONFIG_UART, + 115200, + 0, // main baudrate + 1, // flow control + NULL, +}; + +int is_bcm; + static int led_state = 0; + void hal_led_toggle(void){ led_state = 1 - led_state; printf("LED State %u\n", led_state); @@ -38,6 +57,93 @@ static void sigint_handler(int param){ exit(0); } +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){ + 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; + printf("BTstack up and running.\n"); + break; + case HCI_EVENT_COMMAND_COMPLETE: + if (HCI_EVENT_IS_COMMAND_COMPLETE(packet, hci_read_local_name)){ + // terminate, name 248 chars + packet[6+248] = 0; + printf("Local name: %s\n", &packet[6]); +#if 0 + if (is_bcm){ + btstack_chipset_bcm_set_device_name((const char *)&packet[6]); + } +#endif + } + break; + default: + break; + } +} + +static void use_fast_uart(void){ + printf("Using 921600 baud.\n"); + config.baudrate_main = 921600; +} + +static void local_version_information_callback(uint8_t * packet){ + printf("Local version information:\n"); + uint16_t hci_version = little_endian_read_16(packet, 4); + uint16_t hci_revision = little_endian_read_16(packet, 6); + uint16_t lmp_version = little_endian_read_16(packet, 8); + uint16_t manufacturer = little_endian_read_16(packet, 10); + uint16_t lmp_subversion = little_endian_read_16(packet, 12); + printf("- HCI Version 0x%04x\n", hci_version); + printf("- HCI Revision 0x%04x\n", hci_revision); + printf("- LMP Version 0x%04x\n", lmp_version); + printf("- LMP Revision 0x%04x\n", lmp_subversion); + printf("- Manufacturer 0x%04x\n", manufacturer); + switch (manufacturer){ + case COMPANY_ID_CAMBRIDGE_SILICON_RADIO: + printf("Cambridge Silicon Radio - CSR chipset.\n"); + use_fast_uart(); + hci_set_chipset(btstack_chipset_csr_instance()); + break; + case COMPANY_ID_TEXAS_INSTRUMENTS_INC: + printf("Texas Instruments - CC256x compatible chipset.\n"); + use_fast_uart(); + hci_set_chipset(btstack_chipset_cc256x_instance()); +#ifdef ENABLE_EHCILL + printf("eHCILL enabled.\n"); +#else + printf("eHCILL disable.\n"); +#endif + break; + case COMPANY_ID_BROADCOM_CORPORATION: + printf("Broadcom - not supported on Windows yet.\n"); +#if 0 + printf("Broadcom - using BCM driver.\n"); + hci_set_chipset(btstack_chipset_bcm_instance()); + use_fast_uart(); + is_bcm = 1; +#else +#endif + break; + case COMPANY_ID_ST_MICROELECTRONICS: + printf("ST Microelectronics - using STLC2500d driver.\n"); + use_fast_uart(); + hci_set_chipset(btstack_chipset_stlc2500d_instance()); + break; + case COMPANY_ID_EM_MICROELECTRONICS_MARIN: + printf("EM Microelectronics - using EM9301 driver.\n"); + hci_set_chipset(btstack_chipset_em9301_instance()); + break; + case COMPANY_ID_NORDIC_SEMICONDUCTOR_ASA: + printf("Nordic Semiconductor nRF5 chipset.\n"); + break; + default: + printf("Unknown manufacturer / manufacturer not supported yet.\n"); + break; + } +} + int main(int argc, const char * argv[]){ printf("BTstack on windows booting up\n"); @@ -45,6 +151,25 @@ int main(int argc, const char * argv[]){ btstack_memory_init(); btstack_run_loop_init(btstack_run_loop_windows_get_instance()); + hci_dump_open(NULL, HCI_DUMP_STDOUT); + + // pick serial port + config.device_name = "\\\\.\\COM7"; + + // init HCI + const btstack_uart_block_t * uart_driver = btstack_uart_block_windows_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); + + // setup dynamic chipset driver setup + hci_set_local_version_information_callback(&local_version_information_callback); + // handle CTRL-c signal(SIGINT, sigint_handler);