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