1*3c214e8aSMatthias Ringwald /* 2*3c214e8aSMatthias Ringwald * Copyright (C) 2014 BlueKitchen GmbH 3*3c214e8aSMatthias Ringwald * 4*3c214e8aSMatthias Ringwald * Redistribution and use in source and binary forms, with or without 5*3c214e8aSMatthias Ringwald * modification, are permitted provided that the following conditions 6*3c214e8aSMatthias Ringwald * are met: 7*3c214e8aSMatthias Ringwald * 8*3c214e8aSMatthias Ringwald * 1. Redistributions of source code must retain the above copyright 9*3c214e8aSMatthias Ringwald * notice, this list of conditions and the following disclaimer. 10*3c214e8aSMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright 11*3c214e8aSMatthias Ringwald * notice, this list of conditions and the following disclaimer in the 12*3c214e8aSMatthias Ringwald * documentation and/or other materials provided with the distribution. 13*3c214e8aSMatthias Ringwald * 3. Neither the name of the copyright holders nor the names of 14*3c214e8aSMatthias Ringwald * contributors may be used to endorse or promote products derived 15*3c214e8aSMatthias Ringwald * from this software without specific prior written permission. 16*3c214e8aSMatthias Ringwald * 4. Any redistribution, use, or modification is done solely for 17*3c214e8aSMatthias Ringwald * personal benefit and not for any commercial purpose or for 18*3c214e8aSMatthias Ringwald * monetary gain. 19*3c214e8aSMatthias Ringwald * 20*3c214e8aSMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 21*3c214e8aSMatthias Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22*3c214e8aSMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23*3c214e8aSMatthias Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS 24*3c214e8aSMatthias Ringwald * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25*3c214e8aSMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26*3c214e8aSMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 27*3c214e8aSMatthias Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 28*3c214e8aSMatthias Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29*3c214e8aSMatthias Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 30*3c214e8aSMatthias Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31*3c214e8aSMatthias Ringwald * SUCH DAMAGE. 32*3c214e8aSMatthias Ringwald * 33*3c214e8aSMatthias Ringwald * Please inquire about commercial licensing options at 34*3c214e8aSMatthias Ringwald * [email protected] 35*3c214e8aSMatthias Ringwald * 36*3c214e8aSMatthias Ringwald */ 37*3c214e8aSMatthias Ringwald 38*3c214e8aSMatthias Ringwald #define __BTSTACK_FILE__ "main.c" 39*3c214e8aSMatthias Ringwald 40*3c214e8aSMatthias Ringwald // ***************************************************************************** 41*3c214e8aSMatthias Ringwald // 42*3c214e8aSMatthias Ringwald // minimal setup for HCI code 43*3c214e8aSMatthias Ringwald // 44*3c214e8aSMatthias Ringwald // ***************************************************************************** 45*3c214e8aSMatthias Ringwald 46*3c214e8aSMatthias Ringwald #include <stdint.h> 47*3c214e8aSMatthias Ringwald #include <stdio.h> 48*3c214e8aSMatthias Ringwald #include <stdlib.h> 49*3c214e8aSMatthias Ringwald #include <string.h> 50*3c214e8aSMatthias Ringwald #include <signal.h> 51*3c214e8aSMatthias Ringwald 52*3c214e8aSMatthias Ringwald #include "btstack_config.h" 53*3c214e8aSMatthias Ringwald 54*3c214e8aSMatthias Ringwald #include "btstack_debug.h" 55*3c214e8aSMatthias Ringwald #include "btstack_event.h" 56*3c214e8aSMatthias Ringwald #include "btstack_memory.h" 57*3c214e8aSMatthias Ringwald #include "btstack_run_loop.h" 58*3c214e8aSMatthias Ringwald #include "btstack_run_loop_windows.h" 59*3c214e8aSMatthias Ringwald #include "ble/le_device_db_tlv.h" 60*3c214e8aSMatthias Ringwald #include "hci.h" 61*3c214e8aSMatthias Ringwald #include "hci_dump.h" 62*3c214e8aSMatthias Ringwald #include "btstack_stdin.h" 63*3c214e8aSMatthias Ringwald #include "btstack_tlv_posix.h" 64*3c214e8aSMatthias Ringwald #include "hal_led.h" 65*3c214e8aSMatthias Ringwald #include "btstack_chipset_da14581.h" 66*3c214e8aSMatthias Ringwald #include "hci_585.h" 67*3c214e8aSMatthias Ringwald 68*3c214e8aSMatthias Ringwald static int main_argc; 69*3c214e8aSMatthias Ringwald static const char ** main_argv; 70*3c214e8aSMatthias Ringwald static const btstack_uart_block_t * uart_driver; 71*3c214e8aSMatthias Ringwald static btstack_uart_config_t uart_config; 72*3c214e8aSMatthias Ringwald 73*3c214e8aSMatthias Ringwald #define TLV_DB_PATH_PREFIX "btstack_" 74*3c214e8aSMatthias Ringwald #define TLV_DB_PATH_POSTFIX ".tlv" 75*3c214e8aSMatthias Ringwald static char tlv_db_path[100]; 76*3c214e8aSMatthias Ringwald static const btstack_tlv_t * tlv_impl; 77*3c214e8aSMatthias Ringwald static btstack_tlv_posix_t tlv_context; 78*3c214e8aSMatthias Ringwald 79*3c214e8aSMatthias Ringwald int btstack_main(int argc, const char * argv[]); 80*3c214e8aSMatthias Ringwald 81*3c214e8aSMatthias Ringwald static hci_transport_config_uart_t transport_config = { 82*3c214e8aSMatthias Ringwald HCI_TRANSPORT_CONFIG_UART, 83*3c214e8aSMatthias Ringwald 115200, 84*3c214e8aSMatthias Ringwald 0, // main baudrate 85*3c214e8aSMatthias Ringwald 1, // flow control 86*3c214e8aSMatthias Ringwald NULL, 87*3c214e8aSMatthias Ringwald }; 88*3c214e8aSMatthias Ringwald 89*3c214e8aSMatthias Ringwald static btstack_packet_callback_registration_t hci_event_callback_registration; 90*3c214e8aSMatthias Ringwald 91*3c214e8aSMatthias Ringwald static void packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ 92*3c214e8aSMatthias Ringwald bd_addr_t addr; 93*3c214e8aSMatthias Ringwald if (packet_type != HCI_EVENT_PACKET) return; 94*3c214e8aSMatthias Ringwald switch (hci_event_packet_get_type(packet)){ 95*3c214e8aSMatthias Ringwald case BTSTACK_EVENT_STATE: 96*3c214e8aSMatthias Ringwald if (btstack_event_state_get_state(packet) != HCI_STATE_WORKING) break; 97*3c214e8aSMatthias Ringwald gap_local_bd_addr(addr); 98*3c214e8aSMatthias Ringwald printf("BTstack up and running at %s\n", bd_addr_to_str(addr)); 99*3c214e8aSMatthias Ringwald // setup TLV 100*3c214e8aSMatthias Ringwald strcpy(tlv_db_path, TLV_DB_PATH_PREFIX); 101*3c214e8aSMatthias Ringwald strcat(tlv_db_path, bd_addr_to_str(addr)); 102*3c214e8aSMatthias Ringwald strcat(tlv_db_path, TLV_DB_PATH_POSTFIX); 103*3c214e8aSMatthias Ringwald tlv_impl = btstack_tlv_posix_init_instance(&tlv_context, tlv_db_path); 104*3c214e8aSMatthias Ringwald btstack_tlv_set_instance(tlv_impl, &tlv_context); 105*3c214e8aSMatthias Ringwald le_device_db_tlv_configure(tlv_impl, &tlv_context); 106*3c214e8aSMatthias Ringwald break; 107*3c214e8aSMatthias Ringwald default: 108*3c214e8aSMatthias Ringwald break; 109*3c214e8aSMatthias Ringwald } 110*3c214e8aSMatthias Ringwald } 111*3c214e8aSMatthias Ringwald 112*3c214e8aSMatthias Ringwald static void sigint_handler(int param){ 113*3c214e8aSMatthias Ringwald UNUSED(param); 114*3c214e8aSMatthias Ringwald 115*3c214e8aSMatthias Ringwald printf("CTRL-C - SIGINT received, shutting down..\n"); 116*3c214e8aSMatthias Ringwald log_info("sigint_handler: shutting down"); 117*3c214e8aSMatthias Ringwald 118*3c214e8aSMatthias Ringwald // reset anyway 119*3c214e8aSMatthias Ringwald btstack_stdin_reset(); 120*3c214e8aSMatthias Ringwald 121*3c214e8aSMatthias Ringwald // power down 122*3c214e8aSMatthias Ringwald hci_power_control(HCI_POWER_OFF); 123*3c214e8aSMatthias Ringwald hci_close(); 124*3c214e8aSMatthias Ringwald log_info("Good bye, see you.\n"); 125*3c214e8aSMatthias Ringwald exit(0); 126*3c214e8aSMatthias Ringwald } 127*3c214e8aSMatthias Ringwald 128*3c214e8aSMatthias Ringwald static int led_state = 0; 129*3c214e8aSMatthias Ringwald void hal_led_toggle(void){ 130*3c214e8aSMatthias Ringwald led_state = 1 - led_state; 131*3c214e8aSMatthias Ringwald printf("LED State %u\n", led_state); 132*3c214e8aSMatthias Ringwald } 133*3c214e8aSMatthias Ringwald 134*3c214e8aSMatthias Ringwald static void phase2(int status){ 135*3c214e8aSMatthias Ringwald 136*3c214e8aSMatthias Ringwald if (status){ 137*3c214e8aSMatthias Ringwald printf("Download firmware failed\n"); 138*3c214e8aSMatthias Ringwald return; 139*3c214e8aSMatthias Ringwald } 140*3c214e8aSMatthias Ringwald 141*3c214e8aSMatthias Ringwald printf("Phase 2: Main app\n"); 142*3c214e8aSMatthias Ringwald 143*3c214e8aSMatthias Ringwald // init HCI 144*3c214e8aSMatthias Ringwald const hci_transport_t * transport = hci_transport_h4_instance(uart_driver); 145*3c214e8aSMatthias Ringwald hci_init(transport, (void*) &transport_config); 146*3c214e8aSMatthias Ringwald 147*3c214e8aSMatthias Ringwald // inform about BTstack state 148*3c214e8aSMatthias Ringwald hci_event_callback_registration.callback = &packet_handler; 149*3c214e8aSMatthias Ringwald hci_add_event_handler(&hci_event_callback_registration); 150*3c214e8aSMatthias Ringwald 151*3c214e8aSMatthias Ringwald // handle CTRL-c 152*3c214e8aSMatthias Ringwald signal(SIGINT, sigint_handler); 153*3c214e8aSMatthias Ringwald 154*3c214e8aSMatthias Ringwald // setup app 155*3c214e8aSMatthias Ringwald btstack_main(main_argc, main_argv); 156*3c214e8aSMatthias Ringwald } 157*3c214e8aSMatthias Ringwald 158*3c214e8aSMatthias Ringwald 159*3c214e8aSMatthias Ringwald int main(int argc, const char * argv[]){ 160*3c214e8aSMatthias Ringwald 161*3c214e8aSMatthias Ringwald /// GET STARTED with BTstack /// 162*3c214e8aSMatthias Ringwald btstack_memory_init(); 163*3c214e8aSMatthias Ringwald btstack_run_loop_init(btstack_run_loop_windows_get_instance()); 164*3c214e8aSMatthias Ringwald 165*3c214e8aSMatthias Ringwald // use logger: format HCI_DUMP_PACKETLOGGER, HCI_DUMP_BLUEZ or HCI_DUMP_STDOUT 166*3c214e8aSMatthias Ringwald const char * pklg_path = "hci_dump.pklg"; 167*3c214e8aSMatthias Ringwald hci_dump_open(pklg_path, HCI_DUMP_PACKETLOGGER); 168*3c214e8aSMatthias Ringwald printf("Packet Log: %s\n", pklg_path); 169*3c214e8aSMatthias Ringwald 170*3c214e8aSMatthias Ringwald // pick serial port and configure uart block driver 171*3c214e8aSMatthias Ringwald transport_config.device_name = "\\\\.\\COM19"; 172*3c214e8aSMatthias Ringwald uart_driver = btstack_uart_block_windows_instance(); 173*3c214e8aSMatthias Ringwald 174*3c214e8aSMatthias Ringwald // extract UART config from transport config, but overide initial uart speed 175*3c214e8aSMatthias Ringwald uart_config.baudrate = 57600; 176*3c214e8aSMatthias Ringwald uart_config.flowcontrol = transport_config.flowcontrol; 177*3c214e8aSMatthias Ringwald uart_config.device_name = transport_config.device_name; 178*3c214e8aSMatthias Ringwald uart_driver->init(&uart_config); 179*3c214e8aSMatthias Ringwald 180*3c214e8aSMatthias Ringwald main_argc = argc; 181*3c214e8aSMatthias Ringwald main_argv = argv; 182*3c214e8aSMatthias Ringwald 183*3c214e8aSMatthias Ringwald // phase #1 download firmware 184*3c214e8aSMatthias Ringwald printf("Phase 1: Download firmware\n"); 185*3c214e8aSMatthias Ringwald 186*3c214e8aSMatthias Ringwald // phase #2 start main app 187*3c214e8aSMatthias Ringwald btstack_chipset_da14581_download_firmware(uart_driver, da14581_fw_data, da14581_fw_size, &phase2); 188*3c214e8aSMatthias Ringwald 189*3c214e8aSMatthias Ringwald // go 190*3c214e8aSMatthias Ringwald btstack_run_loop_execute(); 191*3c214e8aSMatthias Ringwald return 0; 192*3c214e8aSMatthias Ringwald } 193