xref: /btstack/port/windows-winusb-intel/main.c (revision f61339ea81eeccfafe4eeece09018b94ef761419)
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