14e630824SMatthias Ringwald #include <stdint.h> 24e630824SMatthias Ringwald #include <stdio.h> 34e630824SMatthias Ringwald #include <stdlib.h> 44e630824SMatthias Ringwald #include <string.h> 54e630824SMatthias Ringwald #include <signal.h> 64e630824SMatthias Ringwald 74e630824SMatthias Ringwald #include "btstack_config.h" 84e630824SMatthias Ringwald 94e630824SMatthias Ringwald #include "btstack_debug.h" 104e630824SMatthias Ringwald #include "btstack_event.h" 114e630824SMatthias Ringwald #include "btstack_memory.h" 124e630824SMatthias Ringwald #include "btstack_run_loop.h" 134e630824SMatthias Ringwald #include "btstack_run_loop_windows.h" 144e630824SMatthias Ringwald #include "hci.h" 154e630824SMatthias Ringwald #include "hci_dump.h" 164e630824SMatthias Ringwald #include "hal_led.h" 17*422979b1SMatthias Ringwald #include "btstack_link_key_db_fs.h" 18*422979b1SMatthias Ringwald 194e630824SMatthias Ringwald // #include "stdin_support.h" 204e630824SMatthias Ringwald 21*422979b1SMatthias Ringwald #include "btstack_chipset_bcm.h" 22*422979b1SMatthias Ringwald #include "btstack_chipset_csr.h" 23*422979b1SMatthias Ringwald #include "btstack_chipset_cc256x.h" 24*422979b1SMatthias Ringwald #include "btstack_chipset_em9301.h" 25*422979b1SMatthias Ringwald #include "btstack_chipset_stlc2500d.h" 26*422979b1SMatthias Ringwald #include "btstack_chipset_tc3566x.h" 27*422979b1SMatthias Ringwald 2827ff675bSMatthias Ringwald int btstack_main(int argc, const char * argv[]); 2927ff675bSMatthias Ringwald 30*422979b1SMatthias Ringwald static hci_transport_config_uart_t config = { 31*422979b1SMatthias Ringwald HCI_TRANSPORT_CONFIG_UART, 32*422979b1SMatthias Ringwald 115200, 33*422979b1SMatthias Ringwald 0, // main baudrate 34*422979b1SMatthias Ringwald 1, // flow control 35*422979b1SMatthias Ringwald NULL, 36*422979b1SMatthias Ringwald }; 37*422979b1SMatthias Ringwald 38*422979b1SMatthias Ringwald int is_bcm; 39*422979b1SMatthias Ringwald 404e630824SMatthias Ringwald static int led_state = 0; 41*422979b1SMatthias Ringwald 424e630824SMatthias Ringwald void hal_led_toggle(void){ 434e630824SMatthias Ringwald led_state = 1 - led_state; 444e630824SMatthias Ringwald printf("LED State %u\n", led_state); 454e630824SMatthias Ringwald } 464e630824SMatthias Ringwald 4727ff675bSMatthias Ringwald static void sigint_handler(int param){ 4827ff675bSMatthias Ringwald 4927ff675bSMatthias Ringwald #ifndef _WIN32 5027ff675bSMatthias Ringwald // reset anyway 5127ff675bSMatthias Ringwald btstack_stdin_reset(); 5227ff675bSMatthias Ringwald #endif 5327ff675bSMatthias Ringwald log_info(" <= SIGINT received, shutting down..\n"); 5427ff675bSMatthias Ringwald // hci_power_control(HCI_POWER_OFF); 5527ff675bSMatthias Ringwald // hci_close(); 5627ff675bSMatthias Ringwald log_info("Good bye, see you.\n"); 5727ff675bSMatthias Ringwald exit(0); 5827ff675bSMatthias Ringwald } 5927ff675bSMatthias Ringwald 60*422979b1SMatthias Ringwald static btstack_packet_callback_registration_t hci_event_callback_registration; 61*422979b1SMatthias Ringwald 62*422979b1SMatthias Ringwald static void packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ 63*422979b1SMatthias Ringwald if (packet_type != HCI_EVENT_PACKET) return; 64*422979b1SMatthias Ringwald switch (hci_event_packet_get_type(packet)){ 65*422979b1SMatthias Ringwald case BTSTACK_EVENT_STATE: 66*422979b1SMatthias Ringwald if (btstack_event_state_get_state(packet) != HCI_STATE_WORKING) break; 67*422979b1SMatthias Ringwald printf("BTstack up and running.\n"); 68*422979b1SMatthias Ringwald break; 69*422979b1SMatthias Ringwald case HCI_EVENT_COMMAND_COMPLETE: 70*422979b1SMatthias Ringwald if (HCI_EVENT_IS_COMMAND_COMPLETE(packet, hci_read_local_name)){ 71*422979b1SMatthias Ringwald // terminate, name 248 chars 72*422979b1SMatthias Ringwald packet[6+248] = 0; 73*422979b1SMatthias Ringwald printf("Local name: %s\n", &packet[6]); 74*422979b1SMatthias Ringwald #if 0 75*422979b1SMatthias Ringwald if (is_bcm){ 76*422979b1SMatthias Ringwald btstack_chipset_bcm_set_device_name((const char *)&packet[6]); 77*422979b1SMatthias Ringwald } 78*422979b1SMatthias Ringwald #endif 79*422979b1SMatthias Ringwald } 80*422979b1SMatthias Ringwald break; 81*422979b1SMatthias Ringwald default: 82*422979b1SMatthias Ringwald break; 83*422979b1SMatthias Ringwald } 84*422979b1SMatthias Ringwald } 85*422979b1SMatthias Ringwald 86*422979b1SMatthias Ringwald static void use_fast_uart(void){ 87*422979b1SMatthias Ringwald printf("Using 921600 baud.\n"); 88*422979b1SMatthias Ringwald config.baudrate_main = 921600; 89*422979b1SMatthias Ringwald } 90*422979b1SMatthias Ringwald 91*422979b1SMatthias Ringwald static void local_version_information_callback(uint8_t * packet){ 92*422979b1SMatthias Ringwald printf("Local version information:\n"); 93*422979b1SMatthias Ringwald uint16_t hci_version = little_endian_read_16(packet, 4); 94*422979b1SMatthias Ringwald uint16_t hci_revision = little_endian_read_16(packet, 6); 95*422979b1SMatthias Ringwald uint16_t lmp_version = little_endian_read_16(packet, 8); 96*422979b1SMatthias Ringwald uint16_t manufacturer = little_endian_read_16(packet, 10); 97*422979b1SMatthias Ringwald uint16_t lmp_subversion = little_endian_read_16(packet, 12); 98*422979b1SMatthias Ringwald printf("- HCI Version 0x%04x\n", hci_version); 99*422979b1SMatthias Ringwald printf("- HCI Revision 0x%04x\n", hci_revision); 100*422979b1SMatthias Ringwald printf("- LMP Version 0x%04x\n", lmp_version); 101*422979b1SMatthias Ringwald printf("- LMP Revision 0x%04x\n", lmp_subversion); 102*422979b1SMatthias Ringwald printf("- Manufacturer 0x%04x\n", manufacturer); 103*422979b1SMatthias Ringwald switch (manufacturer){ 104*422979b1SMatthias Ringwald case COMPANY_ID_CAMBRIDGE_SILICON_RADIO: 105*422979b1SMatthias Ringwald printf("Cambridge Silicon Radio - CSR chipset.\n"); 106*422979b1SMatthias Ringwald use_fast_uart(); 107*422979b1SMatthias Ringwald hci_set_chipset(btstack_chipset_csr_instance()); 108*422979b1SMatthias Ringwald break; 109*422979b1SMatthias Ringwald case COMPANY_ID_TEXAS_INSTRUMENTS_INC: 110*422979b1SMatthias Ringwald printf("Texas Instruments - CC256x compatible chipset.\n"); 111*422979b1SMatthias Ringwald use_fast_uart(); 112*422979b1SMatthias Ringwald hci_set_chipset(btstack_chipset_cc256x_instance()); 113*422979b1SMatthias Ringwald #ifdef ENABLE_EHCILL 114*422979b1SMatthias Ringwald printf("eHCILL enabled.\n"); 115*422979b1SMatthias Ringwald #else 116*422979b1SMatthias Ringwald printf("eHCILL disable.\n"); 117*422979b1SMatthias Ringwald #endif 118*422979b1SMatthias Ringwald break; 119*422979b1SMatthias Ringwald case COMPANY_ID_BROADCOM_CORPORATION: 120*422979b1SMatthias Ringwald printf("Broadcom - not supported on Windows yet.\n"); 121*422979b1SMatthias Ringwald #if 0 122*422979b1SMatthias Ringwald printf("Broadcom - using BCM driver.\n"); 123*422979b1SMatthias Ringwald hci_set_chipset(btstack_chipset_bcm_instance()); 124*422979b1SMatthias Ringwald use_fast_uart(); 125*422979b1SMatthias Ringwald is_bcm = 1; 126*422979b1SMatthias Ringwald #else 127*422979b1SMatthias Ringwald #endif 128*422979b1SMatthias Ringwald break; 129*422979b1SMatthias Ringwald case COMPANY_ID_ST_MICROELECTRONICS: 130*422979b1SMatthias Ringwald printf("ST Microelectronics - using STLC2500d driver.\n"); 131*422979b1SMatthias Ringwald use_fast_uart(); 132*422979b1SMatthias Ringwald hci_set_chipset(btstack_chipset_stlc2500d_instance()); 133*422979b1SMatthias Ringwald break; 134*422979b1SMatthias Ringwald case COMPANY_ID_EM_MICROELECTRONICS_MARIN: 135*422979b1SMatthias Ringwald printf("EM Microelectronics - using EM9301 driver.\n"); 136*422979b1SMatthias Ringwald hci_set_chipset(btstack_chipset_em9301_instance()); 137*422979b1SMatthias Ringwald break; 138*422979b1SMatthias Ringwald case COMPANY_ID_NORDIC_SEMICONDUCTOR_ASA: 139*422979b1SMatthias Ringwald printf("Nordic Semiconductor nRF5 chipset.\n"); 140*422979b1SMatthias Ringwald break; 141*422979b1SMatthias Ringwald default: 142*422979b1SMatthias Ringwald printf("Unknown manufacturer / manufacturer not supported yet.\n"); 143*422979b1SMatthias Ringwald break; 144*422979b1SMatthias Ringwald } 145*422979b1SMatthias Ringwald } 146*422979b1SMatthias Ringwald 14727ff675bSMatthias Ringwald int main(int argc, const char * argv[]){ 1484e630824SMatthias Ringwald printf("BTstack on windows booting up\n"); 1494e630824SMatthias Ringwald 1504e630824SMatthias Ringwald /// GET STARTED with BTstack /// 1514e630824SMatthias Ringwald btstack_memory_init(); 1524e630824SMatthias Ringwald btstack_run_loop_init(btstack_run_loop_windows_get_instance()); 1534e630824SMatthias Ringwald 154*422979b1SMatthias Ringwald hci_dump_open(NULL, HCI_DUMP_STDOUT); 155*422979b1SMatthias Ringwald 156*422979b1SMatthias Ringwald // pick serial port 157*422979b1SMatthias Ringwald config.device_name = "\\\\.\\COM7"; 158*422979b1SMatthias Ringwald 159*422979b1SMatthias Ringwald // init HCI 160*422979b1SMatthias Ringwald const btstack_uart_block_t * uart_driver = btstack_uart_block_windows_instance(); 161*422979b1SMatthias Ringwald const hci_transport_t * transport = hci_transport_h4_instance(uart_driver); 162*422979b1SMatthias Ringwald const btstack_link_key_db_t * link_key_db = btstack_link_key_db_fs_instance(); 163*422979b1SMatthias Ringwald hci_init(transport, (void*) &config); 164*422979b1SMatthias Ringwald hci_set_link_key_db(link_key_db); 165*422979b1SMatthias Ringwald 166*422979b1SMatthias Ringwald // inform about BTstack state 167*422979b1SMatthias Ringwald hci_event_callback_registration.callback = &packet_handler; 168*422979b1SMatthias Ringwald hci_add_event_handler(&hci_event_callback_registration); 169*422979b1SMatthias Ringwald 170*422979b1SMatthias Ringwald // setup dynamic chipset driver setup 171*422979b1SMatthias Ringwald hci_set_local_version_information_callback(&local_version_information_callback); 172*422979b1SMatthias Ringwald 17327ff675bSMatthias Ringwald // handle CTRL-c 17427ff675bSMatthias Ringwald signal(SIGINT, sigint_handler); 17527ff675bSMatthias Ringwald 17627ff675bSMatthias Ringwald // setup app 17727ff675bSMatthias Ringwald btstack_main(argc, argv); 17827ff675bSMatthias Ringwald 17927ff675bSMatthias Ringwald // go 18027ff675bSMatthias Ringwald btstack_run_loop_execute(); 18127ff675bSMatthias Ringwald 1824e630824SMatthias Ringwald return 0; 1834e630824SMatthias Ringwald } 184