1 /*
2  * Copyright (c) 2023 Raspberry Pi (Trading) Ltd.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include "ble/le_device_db_tlv.h"
8 #include "classic/btstack_link_key_db_tlv.h"
9 #include "btstack_tlv.h"
10 #include "btstack_tlv_flash_bank.h"
11 #include "btstack_memory.h"
12 #include "hci.h"
13 
14 #if WANT_HCI_DUMP
15 #include "hci_dump.h"
16 #ifdef ENABLE_SEGGER_RTT
17 #include "hci_dump_segger_rtt_stdout.h"
18 #else
19 #include "hci_dump_embedded_stdout.h"
20 #endif
21 #endif
22 
23 #include "pico/btstack_hci_transport_cyw43.h"
24 #include "pico/btstack_run_loop_async_context.h"
25 #include "pico/btstack_flash_bank.h"
26 #include "pico/btstack_cyw43.h"
27 
setup_tlv(void)28 static void setup_tlv(void) {
29     static btstack_tlv_flash_bank_t btstack_tlv_flash_bank_context;
30     const hal_flash_bank_t *hal_flash_bank_impl = pico_flash_bank_instance();
31 
32     const btstack_tlv_t *btstack_tlv_impl = btstack_tlv_flash_bank_init_instance(
33             &btstack_tlv_flash_bank_context,
34             hal_flash_bank_impl,
35             NULL);
36 
37     // setup global TLV
38     btstack_tlv_set_instance(btstack_tlv_impl, &btstack_tlv_flash_bank_context);
39 #ifdef ENABLE_CLASSIC
40     const btstack_link_key_db_t *btstack_link_key_db = btstack_link_key_db_tlv_get_instance(btstack_tlv_impl, &btstack_tlv_flash_bank_context);
41     hci_set_link_key_db(btstack_link_key_db);
42 #endif
43 #ifdef ENABLE_BLE
44     // configure LE Device DB for TLV
45     le_device_db_tlv_configure(btstack_tlv_impl, &btstack_tlv_flash_bank_context);
46 #endif
47 }
48 
btstack_cyw43_init(async_context_t * context)49 bool btstack_cyw43_init(async_context_t *context) {
50     // Initialise bluetooth
51     btstack_memory_init();
52     btstack_run_loop_init(btstack_run_loop_async_context_get_instance(context));
53 
54 #if WANT_HCI_DUMP
55 #ifdef ENABLE_SEGGER_RTT
56     hci_dump_init(hci_dump_segger_rtt_stdout_get_instance());
57 #else
58     hci_dump_init(hci_dump_embedded_stdout_get_instance());
59 #endif
60 #endif
61 
62     hci_init(hci_transport_cyw43_instance(), NULL);
63 
64     // setup TLV storage
65     setup_tlv();
66     return true;
67 }
68 
btstack_cyw43_deinit(__unused async_context_t * context)69 void btstack_cyw43_deinit(__unused async_context_t *context) {
70     hci_power_control(HCI_POWER_OFF);
71     hci_close();
72     btstack_run_loop_deinit();
73     btstack_memory_deinit();
74 }