1 /*
2  * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <stddef.h>
8 #include <stdlib.h>
9 #include <stdio.h>
10 #include <string.h>
11 
12 #include "esp_random.h"
13 #include "esp_heap_caps.h"
14 #include "esp_heap_caps_init.h"
15 #include <esp_mac.h>
16 
17 #include "sdkconfig.h"
18 
19 #if CONFIG_BT_NIMBLE_ENABLED
20 #include "nimble/nimble_port.h"
21 #endif // CONFIG_BT_NIMBLE_ENABLED
22 
23 #include "nimble/nimble_port_freertos.h"
24 
25 #ifdef ESP_PLATFORM
26 #include "esp_log.h"
27 #endif
28 
29 #if CONFIG_SW_COEXIST_ENABLE
30 #include "private/esp_coexist_internal.h"
31 #endif
32 
33 #include "nimble/nimble_npl_os.h"
34 #include "esp_hci_transport.h"
35 #include "os/endian.h"
36 
37 #include "esp_bt.h"
38 #include "esp_intr_alloc.h"
39 #include "esp_sleep.h"
40 #include "esp_pm.h"
41 #include "esp_phy_init.h"
42 #include "soc/syscon_reg.h"
43 #include "soc/modem_clkrst_reg.h"
44 #include "esp_private/periph_ctrl.h"
45 #include "bt_osi_mem.h"
46 
47 #if CONFIG_FREERTOS_USE_TICKLESS_IDLE
48 #include "esp_private/sleep_modem.h"
49 #endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE
50 #include "esp_private/esp_modem_clock.h"
51 
52 #include "freertos/FreeRTOS.h"
53 #include "freertos/task.h"
54 
55 #include "esp_private/periph_ctrl.h"
56 #include "esp_private/esp_clk.h"
57 #include "esp_sleep.h"
58 
59 #include "soc/syscon_reg.h"
60 #include "soc/dport_access.h"
61 
62 #include "hal/efuse_ll.h"
63 #include "soc/rtc.h"
64 
65 /* Macro definition
66  ************************************************************************
67  */
68 
69 #define NIMBLE_PORT_LOG_TAG          "BLE_INIT"
70 #define OSI_COEX_VERSION              0x00010006
71 #define OSI_COEX_MAGIC_VALUE          0xFADEBEAD
72 
73 #define EXT_FUNC_VERSION             0x20221122
74 #define EXT_FUNC_MAGIC_VALUE         0xA5A5A5A5
75 
76 #define BT_ASSERT_PRINT              ets_printf
77 /* Types definition
78  ************************************************************************
79  */
80 struct osi_coex_funcs_t {
81     uint32_t _magic;
82     uint32_t _version;
83     void (* _coex_wifi_sleep_set)(bool sleep);
84     int (* _coex_core_ble_conn_dyn_prio_get)(bool *low, bool *high);
85     void (* _coex_schm_status_bit_set)(uint32_t type, uint32_t status);
86     void (* _coex_schm_status_bit_clear)(uint32_t type, uint32_t status);
87 };
88 
89 struct ext_funcs_t {
90     uint32_t ext_version;
91     int (*_esp_intr_alloc)(int source, int flags, intr_handler_t handler, void *arg, void **ret_handle);
92     int (*_esp_intr_free)(void **ret_handle);
93     void *(* _malloc)(size_t size);
94     void (*_free)(void *p);
95     void (*_rsv1)(int);
96     int (*_rsv2)(int, int (*)(void *arg), int (*)(void *arg, uint8_t byte), int (*)(void *arg, uint8_t byte), void *);
97     int (*_rsv3)(int, int32_t, uint8_t, uint8_t, int, int);
98     int (*_rsv4)(int);
99     void (*_rsv5)(int, uint8_t);
100     int (*_rsv6)(int, void *);
101     int (* _task_create)(void *task_func, const char *name, uint32_t stack_depth, void *param, uint32_t prio, void *task_handle, uint32_t core_id);
102     void (* _task_delete)(void *task_handle);
103     void (*_osi_assert)(const uint32_t ln, const char *fn, uint32_t param1, uint32_t param2);
104     uint32_t (* _os_random)(void);
105     int (* _ecc_gen_key_pair)(uint8_t *public, uint8_t *priv);
106     int (* _ecc_gen_dh_key)(const uint8_t *remote_pub_key_x, const uint8_t *remote_pub_key_y, const uint8_t *local_priv_key, uint8_t *dhkey);
107     void (* _esp_reset_rpa_moudle)(void);
108     void (* _esp_bt_track_pll_cap)(void);
109     uint32_t magic;
110 };
111 
112 #if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
113 typedef void (*interface_func_t) (uint32_t len, const uint8_t*addr, bool end);
114 #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
115 
116 /* External functions or variables
117  ************************************************************************
118  */
119 extern int ble_osi_coex_funcs_register(struct osi_coex_funcs_t *coex_funcs);
120 extern int ble_controller_init(esp_bt_controller_config_t *cfg);
121 #if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
122 extern int ble_log_init_async(interface_func_t bt_controller_log_interface, bool task_create, uint8_t buffers, uint32_t *bufs_size);
123 extern int ble_log_deinit_async(void);
124 extern void ble_log_async_output_dump_all(bool output);
125 extern void esp_panic_handler_reconfigure_wdts(uint32_t timeout_ms);
126 #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
127 extern int ble_controller_deinit(void);
128 extern int ble_controller_enable(uint8_t mode);
129 extern int ble_controller_disable(void);
130 extern int esp_register_ext_funcs (struct ext_funcs_t *);
131 extern void esp_unregister_ext_funcs (void);
132 extern int esp_ble_ll_set_public_addr(const uint8_t *addr);
133 extern int esp_register_npl_funcs (struct npl_funcs_t *p_npl_func);
134 extern void esp_unregister_npl_funcs (void);
135 extern void npl_freertos_mempool_deinit(void);
136 extern void bt_bb_v2_init_cmplx(uint8_t i);
137 extern int os_msys_buf_alloc(void);
138 extern uint32_t r_os_cputime_get32(void);
139 extern uint32_t r_os_cputime_ticks_to_usecs(uint32_t ticks);
140 extern void r_ble_lll_rfmgmt_set_sleep_cb(void *s_cb, void *w_cb, void *s_arg, void *w_arg, uint32_t us_to_enabled);
141 extern void r_ble_rtc_wake_up_state_clr(void);
142 #if CONFIG_FREERTOS_USE_TICKLESS_IDLE
143 extern void esp_ble_set_wakeup_overhead(uint32_t overhead);
144 #endif /* CONFIG_FREERTOS_USE_TICKLESS_IDLE */
145 extern int os_msys_init(void);
146 extern void os_msys_buf_free(void);
147 extern int ble_sm_alg_gen_dhkey(const uint8_t *peer_pub_key_x,
148                                 const uint8_t *peer_pub_key_y,
149                                 const uint8_t *our_priv_key, uint8_t *out_dhkey);
150 extern int ble_sm_alg_gen_key_pair(uint8_t *pub, uint8_t *priv);
151 extern int ble_txpwr_set(esp_ble_enhanced_power_type_t power_type, uint16_t handle, int power_level);
152 extern int ble_txpwr_get(esp_ble_enhanced_power_type_t power_type, uint16_t handle);
153 extern int ble_get_npl_element_info(esp_bt_controller_config_t *cfg, ble_npl_count_info_t * npl_info);
154 extern void bt_track_pll_cap(void);
155 extern char *ble_controller_get_compile_version(void);
156 extern const char *r_ble_controller_get_rom_compile_version(void);
157 #if CONFIG_BT_CTRL_RUN_IN_FLASH_ONLY
158 extern void ble_ll_supported_features_init(void);
159 #endif //CONFIG_BT_CTRL_RUN_IN_FLASH_ONLY
160 
161 #if CONFIG_BT_RELEASE_IRAM
162 extern uint32_t _iram_bt_text_start;
163 extern uint32_t _bss_bt_end;
164 #endif
165 
166 extern uint32_t _bt_bss_start;
167 extern uint32_t _bt_bss_end;
168 extern uint32_t _bt_controller_bss_start;
169 extern uint32_t _bt_controller_bss_end;
170 extern uint32_t _bt_data_start;
171 extern uint32_t _bt_data_end;
172 extern uint32_t _bt_controller_data_start;
173 extern uint32_t _bt_controller_data_end;
174 
175 /* Local Function Declaration
176  *********************************************************************
177  */
178 static void coex_schm_status_bit_set_wrapper(uint32_t type, uint32_t status);
179 static void coex_schm_status_bit_clear_wrapper(uint32_t type, uint32_t status);
180 static int task_create_wrapper(void *task_func, const char *name, uint32_t stack_depth, void *param, uint32_t prio, void *task_handle, uint32_t core_id);
181 static void task_delete_wrapper(void *task_handle);
182 static int esp_intr_alloc_wrapper(int source, int flags, intr_handler_t handler,
183                                   void *arg, void **ret_handle_in);
184 static int esp_intr_free_wrapper(void **ret_handle);
185 static void osi_assert_wrapper(const uint32_t ln, const char *fn, uint32_t param1, uint32_t param2);
186 static uint32_t osi_random_wrapper(void);
187 static void esp_reset_rpa_moudle(void);
188 static int esp_ecc_gen_key_pair(uint8_t *pub, uint8_t *priv);
189 static int esp_ecc_gen_dh_key(const uint8_t *peer_pub_key_x, const uint8_t *peer_pub_key_y,
190                               const uint8_t *our_priv_key, uint8_t *out_dhkey);
191 #if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
192 static void esp_bt_controller_log_interface(uint32_t len, const uint8_t *addr, bool end);
193 #if CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
194 static void esp_bt_ctrl_log_partition_get_and_erase_first_block(void);
195 #endif // #if CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
196 #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
197 /* Local variable definition
198  ***************************************************************************
199  */
200 #if (CONFIG_ESP32C2_REV_MIN_FULL < 200) && (!CONFIG_BT_CTRL_RUN_IN_FLASH_ONLY)
201 void *g_ble_lll_rfmgmt_env_p;
202 #endif
203 /* Static variable declare */
204 static DRAM_ATTR esp_bt_controller_status_t ble_controller_status = ESP_BT_CONTROLLER_STATUS_IDLE;
205 #if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
206 const static uint32_t log_bufs_size[] = {CONFIG_BT_LE_LOG_CTRL_BUF1_SIZE, CONFIG_BT_LE_LOG_HCI_BUF_SIZE, CONFIG_BT_LE_LOG_CTRL_BUF2_SIZE};
207 enum log_out_mode {
208     LOG_DUMP_MEMORY,
209     LOG_ASYNC_OUT,
210     LOG_STORAGE_TO_FLASH,
211 };
212 
213 bool log_is_inited = false;
214 #if CONFIG_BT_LE_CONTROLLER_LOG_DUMP_ONLY
215 uint8_t log_output_mode = LOG_DUMP_MEMORY;
216 #else
217 #if CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
218 uint8_t log_output_mode = LOG_STORAGE_TO_FLASH;
219 #else
220 uint8_t log_output_mode = LOG_ASYNC_OUT;
221 #endif // CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
222 #endif // CONFIG_BT_LE_CONTROLLER_LOG_DUMP_ONLY
223 
esp_bt_log_output_mode_set(uint8_t output_mode)224 void esp_bt_log_output_mode_set(uint8_t output_mode)
225 {
226     log_output_mode = output_mode;
227 }
228 
esp_bt_log_output_mode_get(void)229 uint8_t esp_bt_log_output_mode_get(void)
230 {
231     return log_output_mode;
232 }
233 
esp_bt_controller_log_init(uint8_t log_output_mode)234 esp_err_t esp_bt_controller_log_init(uint8_t log_output_mode)
235 {
236     esp_err_t ret = ESP_OK;
237     interface_func_t bt_controller_log_interface;
238     bt_controller_log_interface = esp_bt_controller_log_interface;
239     bool task_create;
240     uint8_t buffers = 0;
241 
242     if (log_is_inited) {
243         return ret;
244     }
245 
246 #if CONFIG_BT_LE_CONTROLLER_LOG_CTRL_ENABLED
247     buffers |= ESP_BLE_LOG_BUF_CONTROLLER;
248 #endif // CONFIG_BT_LE_CONTROLLER_LOG_CTRL_ENABLED
249 #if CONFIG_BT_LE_CONTROLLER_LOG_HCI_ENABLED
250     buffers |= ESP_BLE_LOG_BUF_HCI;
251 #endif // CONFIG_BT_LE_CONTROLLER_LOG_HCI_ENABLED
252 
253     switch (log_output_mode) {
254         case LOG_DUMP_MEMORY:
255             task_create = false;
256             break;
257         case LOG_ASYNC_OUT:
258         case LOG_STORAGE_TO_FLASH:
259             task_create = true;
260 #if CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
261             if (log_output_mode == LOG_STORAGE_TO_FLASH) {
262                 esp_bt_ctrl_log_partition_get_and_erase_first_block();
263             }
264 #endif // CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
265             break;
266         default:
267             assert(0);
268     }
269 
270     ret = ble_log_init_async(bt_controller_log_interface, task_create, buffers, (uint32_t *)log_bufs_size);
271     if (ret == ESP_OK) {
272         log_is_inited = true;
273     }
274 
275     return ret;
276 }
277 
esp_bt_ontroller_log_deinit(void)278 void esp_bt_ontroller_log_deinit(void)
279 {
280     ble_log_deinit_async();
281     log_is_inited = false;
282 }
283 
284 #if CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
285 #include "esp_partition.h"
286 #include "hal/wdt_hal.h"
287 
288 #define MAX_STORAGE_SIZE          (CONFIG_BT_LE_CONTROLLER_LOG_PARTITION_SIZE)
289 #define BLOCK_SIZE                (4096)
290 #define THRESHOLD                 (3072)
291 #define PARTITION_NAME            "bt_ctrl_log"
292 
293 static const esp_partition_t *log_partition;
294 static uint32_t write_index = 0;
295 static uint32_t next_erase_index = BLOCK_SIZE;
296 static bool block_erased = false;
297 static bool stop_write = false;
298 static bool is_filled = false;
299 
esp_bt_ctrl_log_partition_get_and_erase_first_block(void)300 static void esp_bt_ctrl_log_partition_get_and_erase_first_block(void)
301 {
302     log_partition = NULL;
303     assert(MAX_STORAGE_SIZE % BLOCK_SIZE == 0);
304     // Find the partition map in the partition table
305     log_partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, PARTITION_NAME);
306     assert(log_partition != NULL);
307     // Prepare data to be read later using the mapped address
308     ESP_ERROR_CHECK(esp_partition_erase_range(log_partition, 0, BLOCK_SIZE));
309     write_index = 0;
310     next_erase_index = BLOCK_SIZE;
311     block_erased = false;
312     is_filled = false;
313     stop_write = false;
314 }
315 
esp_bt_controller_log_storage(uint32_t len,const uint8_t * addr,bool end)316 static int esp_bt_controller_log_storage(uint32_t len, const uint8_t *addr, bool end)
317 {
318     if (len > MAX_STORAGE_SIZE) {
319         return -1;
320     }
321 
322     if (stop_write) {
323         return 0;
324     }
325 
326     assert(log_partition != NULL);
327     if (((write_index) % BLOCK_SIZE) >= THRESHOLD && !block_erased) {
328         // esp_rom_printf("Ers nxt: %d,%d\n", next_erase_index, write_index);
329         esp_partition_erase_range(log_partition, next_erase_index, BLOCK_SIZE);
330         next_erase_index = (next_erase_index + BLOCK_SIZE) % MAX_STORAGE_SIZE;
331         block_erased = true;
332     }
333 
334     if (((write_index + len) / BLOCK_SIZE) >  (write_index / BLOCK_SIZE)) {
335         block_erased = false;
336     }
337 
338     if (write_index + len <= MAX_STORAGE_SIZE) {
339         esp_partition_write(log_partition, write_index, addr, len);
340         write_index = (write_index + len) % MAX_STORAGE_SIZE;
341     } else {
342         uint32_t first_part_len = MAX_STORAGE_SIZE - write_index;
343         esp_partition_write(log_partition, write_index, addr, first_part_len);
344         esp_partition_write(log_partition, 0, addr + first_part_len, len - first_part_len);
345         write_index = len - first_part_len;
346         is_filled = true;
347         // esp_rom_printf("old idx: %d,%d\n",next_erase_index, write_index);
348     }
349 
350     return 0;
351 }
352 
esp_bt_read_ctrl_log_from_flash(bool output)353 void esp_bt_read_ctrl_log_from_flash(bool output)
354 {
355     esp_partition_mmap_handle_t mmap_handle;
356     uint32_t read_index;
357     const void *mapped_ptr;
358     const uint8_t *buffer;
359     uint32_t print_len;
360     uint32_t max_print_len;
361     esp_err_t err;
362 
363     print_len = 0;
364     max_print_len = 4096;
365     err = esp_partition_mmap(log_partition, 0, MAX_STORAGE_SIZE, ESP_PARTITION_MMAP_DATA, &mapped_ptr, &mmap_handle);
366     if (err != ESP_OK) {
367         ESP_LOGE("FLASH", "Mmap failed: %s", esp_err_to_name(err));
368         return;
369     }
370 
371     portMUX_TYPE spinlock = portMUX_INITIALIZER_UNLOCKED;
372     portENTER_CRITICAL_SAFE(&spinlock);
373     esp_panic_handler_reconfigure_wdts(5000);
374     ble_log_async_output_dump_all(true);
375     stop_write = true;
376     esp_bt_ontroller_log_deinit();
377     portEXIT_CRITICAL_SAFE(&spinlock);
378 
379     buffer = (const uint8_t *)mapped_ptr;
380     if (is_filled) {
381         read_index = next_erase_index;
382     } else {
383         read_index = 0;
384     }
385 
386     esp_rom_printf("\r\nREAD_CHECK:%ld,%ld,%d\r\n",read_index, write_index, is_filled);
387     esp_rom_printf("\r\n[DUMP_START:");
388     while (read_index != write_index) {
389         esp_rom_printf("%02x ", buffer[read_index]);
390         if (print_len > max_print_len) {
391             vTaskDelay(2);
392             print_len = 0;
393         }
394 
395         print_len++;
396         read_index = (read_index + 1) % MAX_STORAGE_SIZE;
397     }
398     esp_rom_printf(":DUMP_END]\r\n");
399     esp_partition_munmap(mmap_handle);
400     err = esp_bt_controller_log_init(log_output_mode);
401     assert(err == ESP_OK);
402 
403 }
404 #endif // CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
esp_bt_controller_log_interface(uint32_t len,const uint8_t * addr,bool end)405 static void esp_bt_controller_log_interface(uint32_t len, const uint8_t *addr, bool end)
406 {
407     if (log_output_mode == LOG_STORAGE_TO_FLASH) {
408 #if CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
409         esp_bt_controller_log_storage(len, addr, end);
410 #endif //CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
411     } else {
412         for (int i = 0; i < len; i++) {
413             esp_rom_printf("%02x ", addr[i]);
414         }
415 
416         if (end) {
417             esp_rom_printf("\n");
418         }
419     }
420 }
421 
esp_ble_controller_log_dump_all(bool output)422 void esp_ble_controller_log_dump_all(bool output)
423 {
424    if (log_output_mode == LOG_STORAGE_TO_FLASH) {
425 #if CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
426         esp_bt_read_ctrl_log_from_flash(output);
427 #endif // CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
428     } else {
429         portMUX_TYPE spinlock = portMUX_INITIALIZER_UNLOCKED;
430         portENTER_CRITICAL_SAFE(&spinlock);
431         esp_panic_handler_reconfigure_wdts(5000);
432         BT_ASSERT_PRINT("\r\n[DUMP_START:");
433         ble_log_async_output_dump_all(output);
434         BT_ASSERT_PRINT(":DUMP_END]\r\n");
435         portEXIT_CRITICAL_SAFE(&spinlock);
436     }
437 }
438 #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
439 
440 /* This variable tells if BLE is running */
441 static bool s_ble_active = false;
442 #ifdef CONFIG_PM_ENABLE
443 static DRAM_ATTR esp_pm_lock_handle_t s_pm_lock = NULL;
444 #define BTDM_MIN_TIMER_UNCERTAINTY_US      (200)
445 #endif // CONFIG_PM_ENABLE
446 static DRAM_ATTR modem_clock_lpclk_src_t s_bt_lpclk_src = MODEM_CLOCK_LPCLK_SRC_INVALID;
447 
448 #define BLE_RTC_DELAY_US                    (1800)
449 
450 #define BLE_CONTROLLER_MALLOC_CAPS          (MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT|MALLOC_CAP_DMA)
malloc_ble_controller_mem(size_t size)451 void *malloc_ble_controller_mem(size_t size)
452 {
453     return heap_caps_malloc(size, BLE_CONTROLLER_MALLOC_CAPS);
454 }
455 
get_ble_controller_free_heap_size(void)456 uint32_t get_ble_controller_free_heap_size(void)
457 {
458     return heap_caps_get_free_size(BLE_CONTROLLER_MALLOC_CAPS);
459 }
460 
461 static const struct osi_coex_funcs_t s_osi_coex_funcs_ro = {
462     ._magic = OSI_COEX_MAGIC_VALUE,
463     ._version = OSI_COEX_VERSION,
464     ._coex_wifi_sleep_set = NULL,
465     ._coex_core_ble_conn_dyn_prio_get = NULL,
466     ._coex_schm_status_bit_set = coex_schm_status_bit_set_wrapper,
467     ._coex_schm_status_bit_clear = coex_schm_status_bit_clear_wrapper,
468 };
469 
470 struct ext_funcs_t ext_funcs_ro = {
471     .ext_version = EXT_FUNC_VERSION,
472     ._esp_intr_alloc = esp_intr_alloc_wrapper,
473     ._esp_intr_free = esp_intr_free_wrapper,
474     ._malloc = bt_osi_mem_malloc_internal,
475     ._free = bt_osi_mem_free,
476     ._task_create = task_create_wrapper,
477     ._task_delete = task_delete_wrapper,
478     ._osi_assert = osi_assert_wrapper,
479     ._os_random = osi_random_wrapper,
480     ._ecc_gen_key_pair = esp_ecc_gen_key_pair,
481     ._ecc_gen_dh_key = esp_ecc_gen_dh_key,
482     ._esp_reset_rpa_moudle = esp_reset_rpa_moudle,
483     ._esp_bt_track_pll_cap = NULL,
484     .magic = EXT_FUNC_MAGIC_VALUE,
485 };
486 
esp_reset_rpa_moudle(void)487 static void IRAM_ATTR esp_reset_rpa_moudle(void)
488 {
489     DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, BLE_RPA_REST_BIT);
490     DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, BLE_RPA_REST_BIT);
491 }
492 
osi_assert_wrapper(const uint32_t ln,const char * fn,uint32_t param1,uint32_t param2)493 static void IRAM_ATTR osi_assert_wrapper(const uint32_t ln, const char *fn,
494                                          uint32_t param1, uint32_t param2)
495 {
496     BT_ASSERT_PRINT("BLE assert: line %d in function %s, param: 0x%x, 0x%x", ln, fn, param1, param2);
497 #if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
498     esp_ble_controller_log_dump_all(true);
499 #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
500     assert(0);
501 }
502 
osi_random_wrapper(void)503 static uint32_t IRAM_ATTR osi_random_wrapper(void)
504 {
505     return esp_random();
506 }
507 
coex_schm_status_bit_set_wrapper(uint32_t type,uint32_t status)508 static void coex_schm_status_bit_set_wrapper(uint32_t type, uint32_t status)
509 {
510 #if CONFIG_SW_COEXIST_ENABLE
511     coex_schm_status_bit_set(type, status);
512 #endif // CONFIG_SW_COEXIST_ENABLE
513 }
514 
coex_schm_status_bit_clear_wrapper(uint32_t type,uint32_t status)515 static void coex_schm_status_bit_clear_wrapper(uint32_t type, uint32_t status)
516 {
517 #if CONFIG_SW_COEXIST_ENABLE
518     coex_schm_status_bit_clear(type, status);
519 #endif // CONFIG_SW_COEXIST_ENABLE
520 }
521 
task_create_wrapper(void * task_func,const char * name,uint32_t stack_depth,void * param,uint32_t prio,void * task_handle,uint32_t core_id)522 static int task_create_wrapper(void *task_func, const char *name, uint32_t stack_depth, void *param, uint32_t prio, void *task_handle, uint32_t core_id)
523 {
524     return (uint32_t)xTaskCreatePinnedToCore(task_func, name, stack_depth, param, prio, task_handle, (core_id < portNUM_PROCESSORS ? core_id : tskNO_AFFINITY));
525 }
526 
task_delete_wrapper(void * task_handle)527 static void task_delete_wrapper(void *task_handle)
528 {
529     vTaskDelete(task_handle);
530 }
531 
esp_ecc_gen_key_pair(uint8_t * pub,uint8_t * priv)532 static int esp_ecc_gen_key_pair(uint8_t *pub, uint8_t *priv)
533 {
534     int rc = -1;
535 #if CONFIG_BT_LE_SM_LEGACY || CONFIG_BT_LE_SM_SC
536     rc = ble_sm_alg_gen_key_pair(pub, priv);
537 #endif // CONFIG_BT_LE_SM_LEGACY || CONFIG_BT_LE_SM_SC
538     return rc;
539 }
540 
esp_ecc_gen_dh_key(const uint8_t * peer_pub_key_x,const uint8_t * peer_pub_key_y,const uint8_t * our_priv_key,uint8_t * out_dhkey)541 static int esp_ecc_gen_dh_key(const uint8_t *peer_pub_key_x, const uint8_t *peer_pub_key_y,
542                               const uint8_t *our_priv_key, uint8_t *out_dhkey)
543 {
544     int rc = -1;
545 #if CONFIG_BT_LE_SM_LEGACY || CONFIG_BT_LE_SM_SC
546     rc = ble_sm_alg_gen_dhkey(peer_pub_key_x, peer_pub_key_y, our_priv_key, out_dhkey);
547 #endif // CONFIG_BT_LE_SM_LEGACY || CONFIG_BT_LE_SM_SC
548     return rc;
549 }
550 
esp_intr_alloc_wrapper(int source,int flags,intr_handler_t handler,void * arg,void ** ret_handle_in)551 static int esp_intr_alloc_wrapper(int source, int flags, intr_handler_t handler, void *arg, void **ret_handle_in)
552 {
553 #if CONFIG_BT_CTRL_RUN_IN_FLASH_ONLY
554     int rc = esp_intr_alloc(source, flags, handler, arg, (intr_handle_t *)ret_handle_in);
555 #else
556     int rc = esp_intr_alloc(source, flags | ESP_INTR_FLAG_IRAM, handler, arg, (intr_handle_t *)ret_handle_in);
557 #endif
558 
559     return rc;
560 }
561 
esp_intr_free_wrapper(void ** ret_handle)562 static int esp_intr_free_wrapper(void **ret_handle)
563 {
564     int rc = 0;
565     rc = esp_intr_free((intr_handle_t) * ret_handle);
566     *ret_handle = NULL;
567     return rc;
568 }
569 
570 #if CONFIG_FREERTOS_USE_TICKLESS_IDLE
sleep_modem_light_sleep_overhead_set(uint32_t overhead)571 void sleep_modem_light_sleep_overhead_set(uint32_t overhead)
572 {
573     esp_ble_set_wakeup_overhead(overhead);
574 }
575 #endif /* CONFIG_FREERTOS_USE_TICKLESS_IDLE */
576 
esp_bt_get_lpclk_src(void)577 modem_clock_lpclk_src_t esp_bt_get_lpclk_src(void)
578 {
579     return s_bt_lpclk_src;
580 }
581 
esp_bt_set_lpclk_src(modem_clock_lpclk_src_t clk_src)582 void esp_bt_set_lpclk_src(modem_clock_lpclk_src_t clk_src)
583 {
584     if (clk_src >= MODEM_CLOCK_LPCLK_SRC_MAX) {
585         return;
586     }
587 
588     s_bt_lpclk_src = clk_src;
589 }
590 
controller_sleep_cb(uint32_t enable_tick,void * arg)591 IRAM_ATTR void controller_sleep_cb(uint32_t enable_tick, void *arg)
592 {
593     if (!s_ble_active) {
594         return;
595     }
596 #ifdef CONFIG_PM_ENABLE
597     r_ble_rtc_wake_up_state_clr();
598     esp_pm_lock_release(s_pm_lock);
599 #endif // CONFIG_PM_ENABLE
600     esp_phy_disable(PHY_MODEM_BT);
601     s_ble_active = false;
602 }
603 
controller_wakeup_cb(void * arg)604 IRAM_ATTR void controller_wakeup_cb(void *arg)
605 {
606     if (s_ble_active) {
607         return;
608     }
609     esp_phy_enable(PHY_MODEM_BT);
610     // need to check if need to call pm lock here
611 #ifdef CONFIG_PM_ENABLE
612     esp_pm_lock_acquire(s_pm_lock);
613 #endif //CONFIG_PM_ENABLE
614     s_ble_active = true;
615 }
616 
controller_sleep_init(modem_clock_lpclk_src_t slow_clk_src)617 esp_err_t controller_sleep_init(modem_clock_lpclk_src_t slow_clk_src)
618 {
619     esp_err_t rc = 0;
620 #ifdef CONFIG_BT_LE_SLEEP_ENABLE
621     ESP_LOGW(NIMBLE_PORT_LOG_TAG, "BLE modem sleep is enabled\n");
622     r_ble_lll_rfmgmt_set_sleep_cb(controller_sleep_cb, controller_wakeup_cb, 0, 0, 500 + BLE_RTC_DELAY_US);
623 
624 #ifdef CONFIG_PM_ENABLE
625     if (slow_clk_src == MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL) {
626         esp_sleep_pd_config(ESP_PD_DOMAIN_XTAL, ESP_PD_OPTION_ON);
627     } else {
628         esp_sleep_pd_config(ESP_PD_DOMAIN_XTAL, ESP_PD_OPTION_AUTO);
629     }
630 #endif // CONFIG_PM_ENABLE
631 
632 #endif // CONFIG_BT_LE_SLEEP_ENABLE
633 
634     // enable light sleep
635 #ifdef CONFIG_PM_ENABLE
636     rc = esp_pm_lock_create(ESP_PM_CPU_FREQ_MAX, 0, "bt", &s_pm_lock);
637     if (rc != ESP_OK) {
638         goto error;
639     }
640 #if CONFIG_FREERTOS_USE_TICKLESS_IDLE
641     esp_sleep_enable_bt_wakeup();
642     ESP_LOGW(NIMBLE_PORT_LOG_TAG, "Enable light sleep, the wake up source is BLE timer");
643 
644     rc = esp_pm_register_inform_out_light_sleep_overhead_callback(sleep_modem_light_sleep_overhead_set);
645     if (rc != ESP_OK) {
646         goto error;
647     }
648 #endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE
649     return rc;
650 
651 error:
652 #if CONFIG_FREERTOS_USE_TICKLESS_IDLE
653     esp_sleep_disable_bt_wakeup();
654     esp_pm_unregister_inform_out_light_sleep_overhead_callback(sleep_modem_light_sleep_overhead_set);
655 #endif /* CONFIG_FREERTOS_USE_TICKLESS_IDLE */
656     /*lock should release first and then delete*/
657     if (s_pm_lock != NULL) {
658         esp_pm_lock_delete(s_pm_lock);
659         s_pm_lock = NULL;
660     }
661 #endif //CONFIG_PM_ENABLE
662     return rc;
663 }
664 
controller_sleep_deinit(void)665 void controller_sleep_deinit(void)
666 {
667 #ifdef CONFIG_FREERTOS_USE_TICKLESS_IDLE
668     r_ble_rtc_wake_up_state_clr();
669     esp_sleep_disable_bt_wakeup();
670     esp_sleep_pd_config(ESP_PD_DOMAIN_XTAL, ESP_PD_OPTION_AUTO);
671     esp_pm_unregister_inform_out_light_sleep_overhead_callback(sleep_modem_light_sleep_overhead_set);
672 #endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE
673 #ifdef CONFIG_PM_ENABLE
674     /*lock should release first and then delete*/
675     esp_pm_lock_delete(s_pm_lock);
676     s_pm_lock = NULL;
677 #endif //CONFIG_PM_ENABLE
678 }
679 
esp_bt_rtc_slow_clk_select(modem_clock_lpclk_src_t slow_clk_src)680 static void esp_bt_rtc_slow_clk_select(modem_clock_lpclk_src_t slow_clk_src)
681 {
682     /* Select slow clock source for BT momdule */
683     switch (slow_clk_src) {
684         case MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL:
685             ESP_LOGI(NIMBLE_PORT_LOG_TAG, "Using main XTAL as clock source");
686             SET_PERI_REG_BITS(MODEM_CLKRST_MODEM_LP_TIMER_CONF_REG, 1, 0, MODEM_CLKRST_LP_TIMER_SEL_XTAL32K_S);
687             SET_PERI_REG_BITS(MODEM_CLKRST_MODEM_LP_TIMER_CONF_REG, 1, 1, MODEM_CLKRST_LP_TIMER_SEL_XTAL_S);
688             SET_PERI_REG_BITS(MODEM_CLKRST_MODEM_LP_TIMER_CONF_REG, 1, 0, MODEM_CLKRST_LP_TIMER_SEL_8M_S);
689             SET_PERI_REG_BITS(MODEM_CLKRST_MODEM_LP_TIMER_CONF_REG, 1, 0, MODEM_CLKRST_LP_TIMER_SEL_RTC_SLOW_S);
690 #ifdef CONFIG_XTAL_FREQ_26
691             SET_PERI_REG_BITS(MODEM_CLKRST_MODEM_LP_TIMER_CONF_REG, MODEM_CLKRST_LP_TIMER_CLK_DIV_NUM, 129, MODEM_CLKRST_LP_TIMER_CLK_DIV_NUM_S);
692 #else
693             SET_PERI_REG_BITS(MODEM_CLKRST_MODEM_LP_TIMER_CONF_REG, MODEM_CLKRST_LP_TIMER_CLK_DIV_NUM, 249, MODEM_CLKRST_LP_TIMER_CLK_DIV_NUM_S);
694 #endif // CONFIG_XTAL_FREQ_26
695             break;
696         case MODEM_CLOCK_LPCLK_SRC_EXT32K:
697             ESP_LOGI(NIMBLE_PORT_LOG_TAG, "Using external 32.768 kHz XTAL as clock source");
698             SET_PERI_REG_BITS(MODEM_CLKRST_MODEM_LP_TIMER_CONF_REG, 1, 1, MODEM_CLKRST_LP_TIMER_SEL_XTAL32K_S);
699             SET_PERI_REG_BITS(MODEM_CLKRST_MODEM_LP_TIMER_CONF_REG, 1, 0, MODEM_CLKRST_LP_TIMER_SEL_XTAL_S);
700             SET_PERI_REG_BITS(MODEM_CLKRST_MODEM_LP_TIMER_CONF_REG, 1, 0, MODEM_CLKRST_LP_TIMER_SEL_8M_S);
701             SET_PERI_REG_BITS(MODEM_CLKRST_MODEM_LP_TIMER_CONF_REG, 1, 0, MODEM_CLKRST_LP_TIMER_SEL_RTC_SLOW_S);
702             SET_PERI_REG_BITS(MODEM_CLKRST_MODEM_LP_TIMER_CONF_REG, MODEM_CLKRST_LP_TIMER_CLK_DIV_NUM, 0, MODEM_CLKRST_LP_TIMER_CLK_DIV_NUM_S);
703             break;
704         default:
705             ESP_LOGE(NIMBLE_PORT_LOG_TAG, "Unsupported slow clock");
706             assert(0);
707             break;
708     }
709     SET_PERI_REG_BITS(MODEM_CLKRST_ETM_CLK_CONF_REG, 1, 1, MODEM_CLKRST_ETM_CLK_ACTIVE_S);
710     SET_PERI_REG_BITS(MODEM_CLKRST_ETM_CLK_CONF_REG, 1, 0, MODEM_CLKRST_ETM_CLK_SEL_S);
711 }
712 
ble_rtc_clk_init(esp_bt_controller_config_t * cfg)713 static modem_clock_lpclk_src_t ble_rtc_clk_init(esp_bt_controller_config_t *cfg)
714 {
715     if (s_bt_lpclk_src == MODEM_CLOCK_LPCLK_SRC_INVALID) {
716 #if CONFIG_BT_LE_LP_CLK_SRC_MAIN_XTAL
717         s_bt_lpclk_src = MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL;
718 #else
719         if (rtc_clk_slow_src_get() == SOC_RTC_SLOW_CLK_SRC_OSC_SLOW) {
720             s_bt_lpclk_src = MODEM_CLOCK_LPCLK_SRC_EXT32K;
721         } else {
722             ESP_LOGW(NIMBLE_PORT_LOG_TAG, "32.768kHz XTAL not detected, fall back to main XTAL as Bluetooth sleep clock");
723             s_bt_lpclk_src = MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL;
724         }
725 #endif // CONFIG_BT_LE_LP_CLK_SRC_MAIN_XTAL
726     }
727 
728     if (s_bt_lpclk_src == MODEM_CLOCK_LPCLK_SRC_EXT32K) {
729         cfg->rtc_freq = 32768;
730     } else if (s_bt_lpclk_src == MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL) {
731 #ifdef CONFIG_XTAL_FREQ_26
732         cfg->rtc_freq = 40000;
733 #else
734         cfg->rtc_freq = 32000;
735 #endif // CONFIG_XTAL_FREQ_26
736     }
737     esp_bt_rtc_slow_clk_select(s_bt_lpclk_src);
738     return s_bt_lpclk_src;
739 }
740 
esp_bt_controller_init(esp_bt_controller_config_t * cfg)741 esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg)
742 {
743     esp_err_t ret = ESP_OK;
744     ble_npl_count_info_t npl_info;
745     modem_clock_lpclk_src_t rtc_clk_src;
746     uint8_t hci_transport_mode;
747 
748     memset(&npl_info, 0, sizeof(ble_npl_count_info_t));
749     if (ble_controller_status != ESP_BT_CONTROLLER_STATUS_IDLE) {
750         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "invalid controller state");
751         return ESP_ERR_INVALID_STATE;
752     }
753 
754     if (!cfg) {
755         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "cfg is NULL");
756         return ESP_ERR_INVALID_ARG;
757     }
758 
759     rtc_clk_src = ble_rtc_clk_init(cfg);
760 
761     ret = esp_register_ext_funcs(&ext_funcs_ro);
762     if (ret != ESP_OK) {
763         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "register extend functions failed");
764         return ret;
765     }
766 
767     /* If we place the ble code into flash, don't need to initialize ROM. */
768 #if !CONFIG_BT_CTRL_RUN_IN_FLASH_ONLY
769 #if DEFAULT_BT_LE_50_FEATURE_SUPPORT || DEFAULT_BT_LE_ROLE_CENTROL || DEFAULT_BT_LE_ROLE_OBSERVER
770     extern int esp_ble_rom_func_ptr_init_all(void);
771     esp_ble_rom_func_ptr_init_all();
772 #else
773     ESP_LOGI(NIMBLE_PORT_LOG_TAG, "Init only legacy adv and slave function");
774     extern int esp_ble_rom_func_ptr_init_legacy_adv_and_slave(void);
775     esp_ble_rom_func_ptr_init_legacy_adv_and_slave();
776 #endif
777 #endif //!CONFIG_BT_CTRL_RUN_IN_FLASH_ONLY
778 
779     /* Initialize the function pointers for OS porting */
780     npl_freertos_funcs_init();
781     struct npl_funcs_t *p_npl_funcs = npl_freertos_funcs_get();
782     if (!p_npl_funcs) {
783         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "npl functions get failed");
784         return ESP_ERR_INVALID_ARG;
785     }
786 
787     ret = esp_register_npl_funcs(p_npl_funcs);
788     if (ret != ESP_OK) {
789         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "npl functions register failed");
790         goto free_mem;
791     }
792 
793     ble_get_npl_element_info(cfg, &npl_info);
794     npl_freertos_set_controller_npl_info(&npl_info);
795     if (npl_freertos_mempool_init() != 0) {
796         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "npl mempool init failed");
797         ret = ESP_ERR_INVALID_ARG;
798         goto free_mem;
799     }
800 
801     /* Initialize the global memory pool */
802     ret = os_msys_buf_alloc();
803     if (ret != ESP_OK) {
804         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "os msys alloc failed");
805         goto free_mem;
806     }
807 
808     os_msys_init();
809 #if CONFIG_BT_NIMBLE_ENABLED
810     // ble_npl_eventq_init() need to use npl function in rom and must be called after esp_bt_controller_init()
811     /* Initialize default event queue */
812     ble_npl_eventq_init(nimble_port_get_dflt_eventq());
813 #endif
814     esp_phy_modem_init();
815     periph_module_enable(PERIPH_BT_MODULE);
816     periph_module_reset(PERIPH_BT_MODULE);
817 
818     if (ble_osi_coex_funcs_register((struct osi_coex_funcs_t *)&s_osi_coex_funcs_ro) != 0) {
819         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "osi coex funcs reg failed");
820         ret = ESP_ERR_INVALID_ARG;
821         goto modem_deint;
822     }
823 
824 #if CONFIG_SW_COEXIST_ENABLE
825     coex_init();
826 #endif
827 
828 #if CONFIG_BT_CTRL_RUN_IN_FLASH_ONLY
829     ble_ll_supported_features_init();
830 #endif //CONFIG_BT_CTRL_RUN_IN_FLASH_ONLY
831 
832     ret = ble_controller_init(cfg);
833     if (ret != ESP_OK) {
834         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "ble_controller_init failed %d", ret);
835         goto modem_deint;
836     }
837 
838     ESP_LOGI(NIMBLE_PORT_LOG_TAG, "ble controller commit:[%s]", ble_controller_get_compile_version());
839     ESP_LOGI(NIMBLE_PORT_LOG_TAG, "ble rom commit:[%s]", r_ble_controller_get_rom_compile_version());
840 
841 #if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
842     ret = esp_bt_controller_log_init(log_output_mode);
843     if (ret != ESP_OK) {
844         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "ble_controller_log_init failed %d", ret);
845         goto controller_init_err;
846     }
847 #endif // CONFIG_BT_CONTROLLER_LOG_ENABLED
848 
849     ret = controller_sleep_init(rtc_clk_src);
850     if (ret != ESP_OK) {
851         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "controller_sleep_init failed %d", ret);
852         goto free_controller;
853     }
854 
855     uint8_t mac[6];
856     ESP_ERROR_CHECK(esp_read_mac((uint8_t *)mac, ESP_MAC_BT));
857 
858     ESP_LOGI(NIMBLE_PORT_LOG_TAG, "Bluetooth MAC: %02x:%02x:%02x:%02x:%02x:%02x",
859              mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
860 
861     swap_in_place(mac, 6);
862 
863     esp_ble_ll_set_public_addr(mac);
864 
865     ble_controller_status = ESP_BT_CONTROLLER_STATUS_INITED;
866 
867 #if CONFIG_BT_LE_HCI_INTERFACE_USE_RAM
868     hci_transport_mode = HCI_TRANSPORT_VHCI;
869 #elif CONFIG_BT_LE_HCI_INTERFACE_USE_UART
870     hci_transport_mode = HCI_TRANSPORT_UART_NO_DMA;
871 #endif // CONFIG_BT_LE_HCI_INTERFACE_USE_RAM
872     ret = hci_transport_init(hci_transport_mode);
873     if (ret) {
874         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "hci transport init failed %d", ret);
875         goto free_controller;
876     }
877     return ESP_OK;
878 free_controller:
879     hci_transport_deinit();
880     controller_sleep_deinit();
881 #if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
882 controller_init_err:
883     esp_bt_ontroller_log_deinit();
884 #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
885     ble_controller_deinit();
886 modem_deint:
887     esp_phy_modem_deinit();
888     periph_module_disable(PERIPH_BT_MODULE);
889 #if CONFIG_BT_NIMBLE_ENABLED
890     ble_npl_eventq_deinit(nimble_port_get_dflt_eventq());
891 #endif // CONFIG_BT_NIMBLE_ENABLED
892 free_mem:
893     os_msys_buf_free();
894     npl_freertos_mempool_deinit();
895     esp_unregister_npl_funcs();
896     npl_freertos_funcs_deinit();
897     esp_unregister_ext_funcs();
898     return ret;
899 }
900 
esp_bt_controller_deinit(void)901 esp_err_t esp_bt_controller_deinit(void)
902 {
903     if ((ble_controller_status < ESP_BT_CONTROLLER_STATUS_INITED) || (ble_controller_status >= ESP_BT_CONTROLLER_STATUS_ENABLED)) {
904         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "invalid controller state");
905         return ESP_FAIL;
906     }
907 
908     hci_transport_deinit();
909     controller_sleep_deinit();
910 
911 #if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
912     esp_bt_ontroller_log_deinit();
913 #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
914     ble_controller_deinit();
915 
916     periph_module_disable(PERIPH_BT_MODULE);
917 
918 #if CONFIG_BT_NIMBLE_ENABLED
919     /* De-initialize default event queue */
920     ble_npl_eventq_deinit(nimble_port_get_dflt_eventq());
921 #endif
922     os_msys_buf_free();
923 
924     esp_unregister_npl_funcs();
925 
926     esp_unregister_ext_funcs();
927 
928     /* De-initialize npl functions */
929     npl_freertos_funcs_deinit();
930 
931     npl_freertos_mempool_deinit();
932 
933     esp_phy_modem_deinit();
934 
935     ble_controller_status = ESP_BT_CONTROLLER_STATUS_IDLE;
936 
937     return ESP_OK;
938 }
939 
esp_bt_controller_enable(esp_bt_mode_t mode)940 esp_err_t esp_bt_controller_enable(esp_bt_mode_t mode)
941 {
942     esp_err_t ret = ESP_OK;
943 
944     if (mode != ESP_BT_MODE_BLE) {
945         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "invalid controller mode");
946         return ESP_FAIL;
947     }
948     if (ble_controller_status != ESP_BT_CONTROLLER_STATUS_INITED) {
949         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "invalid controller state");
950         return ESP_FAIL;
951     }
952     if (!s_ble_active) {
953 #if CONFIG_PM_ENABLE
954         esp_pm_lock_acquire(s_pm_lock);
955 #endif  // CONFIG_PM_ENABLE
956         // init phy
957         esp_phy_enable(PHY_MODEM_BT);
958         s_ble_active = true;
959     }
960     // init bb
961     bt_bb_v2_init_cmplx(1);
962 
963 #if CONFIG_SW_COEXIST_ENABLE
964     coex_enable();
965 #endif
966     if (ble_controller_enable(mode) != 0) {
967         ret = ESP_FAIL;
968         goto error;
969     }
970 
971     ble_controller_status = ESP_BT_CONTROLLER_STATUS_ENABLED;
972     return ESP_OK;
973 
974 error:
975 #if CONFIG_SW_COEXIST_ENABLE
976     coex_disable();
977 #endif
978     if (s_ble_active) {
979         esp_phy_disable(PHY_MODEM_BT);
980 #if CONFIG_PM_ENABLE
981         esp_pm_lock_release(s_pm_lock);
982 #endif  // CONFIG_PM_ENABLE
983         s_ble_active = false;
984     }
985     return ret;
986 }
987 
esp_bt_controller_disable(void)988 esp_err_t esp_bt_controller_disable(void)
989 {
990     if (ble_controller_status < ESP_BT_CONTROLLER_STATUS_ENABLED) {
991         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "invalid controller state");
992         return ESP_FAIL;
993     }
994     if (ble_controller_disable() != 0) {
995         return ESP_FAIL;
996     }
997 
998     if (s_ble_active) {
999         esp_phy_disable(PHY_MODEM_BT);
1000 #if CONFIG_PM_ENABLE
1001         esp_pm_lock_release(s_pm_lock);
1002 #endif  // CONFIG_PM_ENABLE
1003         s_ble_active = false;
1004     }
1005 #if CONFIG_SW_COEXIST_ENABLE
1006     coex_disable();
1007 #endif
1008     ble_controller_status = ESP_BT_CONTROLLER_STATUS_INITED;
1009     return ESP_OK;
1010 }
1011 
esp_bt_controller_mem_release(esp_bt_mode_t mode)1012 esp_err_t esp_bt_controller_mem_release(esp_bt_mode_t mode)
1013 {
1014     ESP_LOGD(NIMBLE_PORT_LOG_TAG, "%s not implemented, return OK", __func__);
1015     return ESP_OK;
1016 }
1017 
try_heap_caps_add_region(intptr_t start,intptr_t end)1018 static esp_err_t try_heap_caps_add_region(intptr_t start, intptr_t end)
1019 {
1020     int ret = heap_caps_add_region(start, end);
1021     /* heap_caps_add_region() returns ESP_ERR_INVALID_SIZE if the memory region is
1022      * is too small to fit a heap. This cannot be termed as a fatal error and hence
1023      * we replace it by ESP_OK
1024      */
1025     if (ret == ESP_ERR_INVALID_SIZE) {
1026         return ESP_OK;
1027     }
1028     return ret;
1029 }
1030 
1031 typedef struct {
1032     intptr_t start;
1033     intptr_t end;
1034     const char* name;
1035 } bt_area_t;
1036 
esp_bt_mem_release_area(const bt_area_t * area)1037 static esp_err_t esp_bt_mem_release_area(const bt_area_t *area)
1038 {
1039     esp_err_t ret = ESP_OK;
1040     intptr_t mem_start = area->start;
1041     intptr_t mem_end = area->end;
1042     if (mem_start != mem_end) {
1043         ESP_LOGD(NIMBLE_PORT_LOG_TAG, "Release %s [0x%08x] - [0x%08x], len %d", area->name, mem_start, mem_end, mem_end - mem_start);
1044         ret = try_heap_caps_add_region(mem_start, mem_end);
1045     }
1046     return ret;
1047 }
1048 
1049 #ifndef CONFIG_BT_RELEASE_IRAM
esp_bt_mem_release_areas(const bt_area_t * area1,const bt_area_t * area2)1050 static esp_err_t esp_bt_mem_release_areas(const bt_area_t *area1, const bt_area_t *area2)
1051 {
1052     esp_err_t ret = ESP_OK;
1053 
1054     if(area1->end == area2->start) {
1055         bt_area_t merged_area = {
1056             .start = area1->start,
1057             .end = area2->end,
1058             .name = area1->name
1059         };
1060         ret = esp_bt_mem_release_area(&merged_area);
1061     } else {
1062         esp_bt_mem_release_area(area1);
1063         ret = esp_bt_mem_release_area(area2);
1064     }
1065 
1066     return ret;
1067 }
1068 #endif
1069 
esp_bt_mem_release(esp_bt_mode_t mode)1070 esp_err_t esp_bt_mem_release(esp_bt_mode_t mode)
1071 {
1072     esp_err_t ret = ESP_OK;
1073 
1074 #if CONFIG_BT_RELEASE_IRAM && CONFIG_ESP_SYSTEM_PMP_IDRAM_SPLIT
1075     /* Release Bluetooth text section and merge Bluetooth data, bss & text into a large free heap
1076      * region when esp_bt_mem_release is called, total saving ~21kB or more of IRAM. ESP32-C2 has
1077      * only 3 configurable PMP entries available, rest of them are hard-coded. We cannot split the
1078      * memory into 3 different regions (IRAM, BLE-IRAM, DRAM). So `ESP_SYSTEM_PMP_IDRAM_SPLIT` needs
1079      * to be disabled.
1080      */
1081     #error "ESP_SYSTEM_PMP_IDRAM_SPLIT should be disabled to allow BT to be released"
1082 #endif // CONFIG_BT_RELEASE_IRAM && CONFIG_ESP_SYSTEM_PMP_IDRAM_SPLIT
1083 
1084     if (ble_controller_status != ESP_BT_CONTROLLER_STATUS_IDLE) {
1085         return ESP_ERR_INVALID_STATE;
1086     }
1087 
1088     if ((mode & ESP_BT_MODE_BLE) == 0) {
1089         return ret;
1090     }
1091 
1092 #if CONFIG_BT_RELEASE_IRAM
1093     bt_area_t merged_region = {
1094         .start = (intptr_t)MAP_IRAM_TO_DRAM((intptr_t)&_iram_bt_text_start),
1095         .end = (intptr_t)&_bss_bt_end,
1096         .name = "BT Text, BSS and Data"
1097     };
1098     ret = esp_bt_mem_release_area(&merged_region);
1099 #else
1100     bt_area_t bss = {
1101         .start = (intptr_t)&_bt_bss_start,
1102         .end   = (intptr_t)&_bt_bss_end,
1103         .name  = "BT BSS",
1104     };
1105     bt_area_t cont_bss = {
1106         .start = (intptr_t)&_bt_controller_bss_start,
1107         .end   = (intptr_t)&_bt_controller_bss_end,
1108         .name  = "BT Controller BSS",
1109     };
1110     bt_area_t data = {
1111         .start = (intptr_t)&_bt_data_start,
1112         .end   = (intptr_t)&_bt_data_end,
1113         .name  = "BT Data",
1114     };
1115     bt_area_t cont_data = {
1116         .start = (intptr_t)&_bt_controller_data_start,
1117         .end   = (intptr_t)&_bt_controller_data_end,
1118         .name  = "BT Controller Data"
1119     };
1120 
1121     /* Start by freeing Bluetooth BSS section */
1122     if (ret == ESP_OK) {
1123         ret = esp_bt_mem_release_areas(&bss, &cont_bss);
1124     }
1125 
1126     /* Do the same thing with the Bluetooth data section */
1127     if (ret == ESP_OK) {
1128         ret = esp_bt_mem_release_areas(&data, &cont_data);
1129     }
1130 #endif
1131 
1132     return ret;
1133 }
1134 
1135 
esp_bt_controller_get_status(void)1136 esp_bt_controller_status_t esp_bt_controller_get_status(void)
1137 {
1138     return ble_controller_status;
1139 }
1140 
1141 /* extra functions */
esp_ble_tx_power_set(esp_ble_power_type_t power_type,esp_power_level_t power_level)1142 esp_err_t esp_ble_tx_power_set(esp_ble_power_type_t power_type, esp_power_level_t power_level)
1143 {
1144     esp_err_t stat = ESP_FAIL;
1145 
1146     switch (power_type) {
1147     case ESP_BLE_PWR_TYPE_DEFAULT:
1148     case ESP_BLE_PWR_TYPE_ADV:
1149     case ESP_BLE_PWR_TYPE_SCAN:
1150         if (ble_txpwr_set(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0, power_level) == 0) {
1151             stat = ESP_OK;
1152         }
1153         break;
1154     case ESP_BLE_PWR_TYPE_CONN_HDL0:
1155     case ESP_BLE_PWR_TYPE_CONN_HDL1:
1156     case ESP_BLE_PWR_TYPE_CONN_HDL2:
1157     case ESP_BLE_PWR_TYPE_CONN_HDL3:
1158     case ESP_BLE_PWR_TYPE_CONN_HDL4:
1159     case ESP_BLE_PWR_TYPE_CONN_HDL5:
1160     case ESP_BLE_PWR_TYPE_CONN_HDL6:
1161     case ESP_BLE_PWR_TYPE_CONN_HDL7:
1162     case ESP_BLE_PWR_TYPE_CONN_HDL8:
1163         if (ble_txpwr_set(ESP_BLE_ENHANCED_PWR_TYPE_CONN, power_type, power_level) == 0) {
1164             stat = ESP_OK;
1165         }
1166         break;
1167     default:
1168         stat = ESP_ERR_NOT_SUPPORTED;
1169         break;
1170     }
1171 
1172     return stat;
1173 }
1174 
esp_ble_tx_power_set_enhanced(esp_ble_enhanced_power_type_t power_type,uint16_t handle,esp_power_level_t power_level)1175 esp_err_t esp_ble_tx_power_set_enhanced(esp_ble_enhanced_power_type_t power_type, uint16_t handle, esp_power_level_t power_level)
1176 {
1177     esp_err_t stat = ESP_FAIL;
1178     switch (power_type) {
1179     case ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT:
1180     case ESP_BLE_ENHANCED_PWR_TYPE_SCAN:
1181     case ESP_BLE_ENHANCED_PWR_TYPE_INIT:
1182         if (ble_txpwr_set(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0, power_level) == 0) {
1183             stat = ESP_OK;
1184         }
1185         break;
1186     case ESP_BLE_ENHANCED_PWR_TYPE_ADV:
1187     case ESP_BLE_ENHANCED_PWR_TYPE_CONN:
1188         if (ble_txpwr_set(power_type, handle, power_level) == 0) {
1189             stat = ESP_OK;
1190         }
1191         break;
1192     default:
1193         stat = ESP_ERR_NOT_SUPPORTED;
1194         break;
1195     }
1196 
1197     return stat;
1198 }
1199 
esp_ble_tx_power_get(esp_ble_power_type_t power_type)1200 esp_power_level_t esp_ble_tx_power_get(esp_ble_power_type_t power_type)
1201 {
1202     int tx_level = 0;
1203 
1204     switch (power_type) {
1205     case ESP_BLE_PWR_TYPE_ADV:
1206     case ESP_BLE_PWR_TYPE_SCAN:
1207     case ESP_BLE_PWR_TYPE_DEFAULT:
1208         tx_level = ble_txpwr_get(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0);
1209         break;
1210     case ESP_BLE_PWR_TYPE_CONN_HDL0:
1211     case ESP_BLE_PWR_TYPE_CONN_HDL1:
1212     case ESP_BLE_PWR_TYPE_CONN_HDL2:
1213     case ESP_BLE_PWR_TYPE_CONN_HDL3:
1214     case ESP_BLE_PWR_TYPE_CONN_HDL4:
1215     case ESP_BLE_PWR_TYPE_CONN_HDL5:
1216     case ESP_BLE_PWR_TYPE_CONN_HDL6:
1217     case ESP_BLE_PWR_TYPE_CONN_HDL7:
1218     case ESP_BLE_PWR_TYPE_CONN_HDL8:
1219         tx_level = ble_txpwr_get(ESP_BLE_ENHANCED_PWR_TYPE_CONN, power_type);
1220         break;
1221     default:
1222         return ESP_PWR_LVL_INVALID;
1223     }
1224 
1225     if (tx_level < 0) {
1226         return ESP_PWR_LVL_INVALID;
1227     }
1228 
1229     return (esp_power_level_t)tx_level;
1230 }
1231 
esp_ble_tx_power_get_enhanced(esp_ble_enhanced_power_type_t power_type,uint16_t handle)1232 esp_power_level_t esp_ble_tx_power_get_enhanced(esp_ble_enhanced_power_type_t power_type, uint16_t handle)
1233 {
1234     int tx_level = 0;
1235 
1236     switch (power_type) {
1237     case ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT:
1238     case ESP_BLE_ENHANCED_PWR_TYPE_SCAN:
1239     case ESP_BLE_ENHANCED_PWR_TYPE_INIT:
1240         tx_level = ble_txpwr_get(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0);
1241         break;
1242     case ESP_BLE_ENHANCED_PWR_TYPE_ADV:
1243     case ESP_BLE_ENHANCED_PWR_TYPE_CONN:
1244         tx_level = ble_txpwr_get(power_type, handle);
1245         break;
1246     default:
1247         return ESP_PWR_LVL_INVALID;
1248     }
1249 
1250     if (tx_level < 0) {
1251        return ESP_PWR_LVL_INVALID;
1252     }
1253 
1254     return (esp_power_level_t)tx_level;
1255 }
1256 
esp_ble_get_chip_rev_version(void)1257 uint8_t esp_ble_get_chip_rev_version(void)
1258 {
1259     return efuse_ll_get_chip_wafer_version_minor();
1260 }
1261 
1262 #if (!CONFIG_BT_NIMBLE_ENABLED) && (CONFIG_BT_CONTROLLER_ENABLED)
1263 #if CONFIG_BT_LE_SM_LEGACY || CONFIG_BT_LE_SM_SC
1264 #define BLE_SM_KEY_ERR 0x17
1265 #if CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS
1266 #include "mbedtls/aes.h"
1267 #if CONFIG_BT_LE_SM_SC
1268 #include "mbedtls/cipher.h"
1269 #include "mbedtls/entropy.h"
1270 #include "mbedtls/ctr_drbg.h"
1271 #include "mbedtls/cmac.h"
1272 #include "mbedtls/ecdh.h"
1273 #include "mbedtls/ecp.h"
1274 
1275 static mbedtls_ecp_keypair keypair;
1276 #endif // CONFIG_BT_LE_SM_SC
1277 
1278 #else
1279 #include "tinycrypt/aes.h"
1280 #include "tinycrypt/constants.h"
1281 #include "tinycrypt/utils.h"
1282 
1283 #if CONFIG_BT_LE_SM_SC
1284 #include "tinycrypt/cmac_mode.h"
1285 #include "tinycrypt/ecc_dh.h"
1286 #endif // CONFIG_BT_LE_SM_SC
1287 #endif // CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS
1288 
1289 /* Based on Core Specification 4.2 Vol 3. Part H 2.3.5.6.1 */
1290 static const uint8_t ble_sm_alg_dbg_priv_key[32] = {
1291     0x3f, 0x49, 0xf6, 0xd4, 0xa3, 0xc5, 0x5f, 0x38, 0x74, 0xc9, 0xb3, 0xe3,
1292     0xd2, 0x10, 0x3f, 0x50, 0x4a, 0xff, 0x60, 0x7b, 0xeb, 0x40, 0xb7, 0x99,
1293     0x58, 0x99, 0xb8, 0xa6, 0xcd, 0x3c, 0x1a, 0xbd
1294 };
1295 
ble_sm_alg_gen_dhkey(const uint8_t * peer_pub_key_x,const uint8_t * peer_pub_key_y,const uint8_t * our_priv_key,uint8_t * out_dhkey)1296 int ble_sm_alg_gen_dhkey(const uint8_t *peer_pub_key_x, const uint8_t *peer_pub_key_y,
1297                          const uint8_t *our_priv_key, uint8_t *out_dhkey)
1298 {
1299     uint8_t dh[32];
1300     uint8_t pk[64];
1301     uint8_t priv[32];
1302     int rc = BLE_SM_KEY_ERR;
1303 
1304     swap_buf(pk, peer_pub_key_x, 32);
1305     swap_buf(&pk[32], peer_pub_key_y, 32);
1306     swap_buf(priv, our_priv_key, 32);
1307 
1308 #if CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS
1309     struct mbedtls_ecp_point pt = {0}, Q = {0};
1310     mbedtls_mpi z = {0}, d = {0};
1311     mbedtls_ctr_drbg_context ctr_drbg = {0};
1312     mbedtls_entropy_context entropy = {0};
1313 
1314     uint8_t pub[65] = {0};
1315     /* Hardcoded first byte of pub key for MBEDTLS_ECP_PF_UNCOMPRESSED */
1316     pub[0] = 0x04;
1317     memcpy(&pub[1], pk, 64);
1318 
1319     /* Initialize the required structures here */
1320     mbedtls_ecp_point_init(&pt);
1321     mbedtls_ecp_point_init(&Q);
1322     mbedtls_ctr_drbg_init(&ctr_drbg);
1323     mbedtls_entropy_init(&entropy);
1324     mbedtls_mpi_init(&d);
1325     mbedtls_mpi_init(&z);
1326 
1327     /* Below 3 steps are to validate public key on curve secp256r1 */
1328     if (mbedtls_ecp_group_load(&keypair.MBEDTLS_PRIVATE(grp), MBEDTLS_ECP_DP_SECP256R1) != 0) {
1329         goto exit;
1330     }
1331 
1332     if (mbedtls_ecp_point_read_binary(&keypair.MBEDTLS_PRIVATE(grp), &pt, pub, 65) != 0) {
1333         goto exit;
1334     }
1335 
1336     if (mbedtls_ecp_check_pubkey(&keypair.MBEDTLS_PRIVATE(grp), &pt) != 0) {
1337         goto exit;
1338     }
1339 
1340     /* Set PRNG */
1341     if ((rc = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, NULL, 0)) != 0) {
1342         goto exit;
1343     }
1344 
1345     /* Prepare point Q from pub key */
1346     if (mbedtls_ecp_point_read_binary(&keypair.MBEDTLS_PRIVATE(grp), &Q, pub, 65) != 0) {
1347         goto exit;
1348     }
1349 
1350     if (mbedtls_mpi_read_binary(&d, priv, 32) != 0) {
1351         goto exit;
1352     }
1353 
1354     rc = mbedtls_ecdh_compute_shared(&keypair.MBEDTLS_PRIVATE(grp), &z, &Q, &d,
1355                                      mbedtls_ctr_drbg_random, &ctr_drbg);
1356     if (rc != 0) {
1357         goto exit;
1358     }
1359 
1360     rc = mbedtls_mpi_write_binary(&z, dh, 32);
1361     if (rc != 0) {
1362         goto exit;
1363     }
1364 
1365 exit:
1366     mbedtls_ecp_point_free(&pt);
1367     mbedtls_mpi_free(&z);
1368     mbedtls_mpi_free(&d);
1369     mbedtls_ecp_point_free(&Q);
1370     mbedtls_entropy_free(&entropy);
1371     mbedtls_ctr_drbg_free(&ctr_drbg);
1372     if (rc != 0) {
1373         return BLE_SM_KEY_ERR;
1374     }
1375 
1376 #else
1377     if (uECC_valid_public_key(pk, &curve_secp256r1) < 0) {
1378         return BLE_SM_KEY_ERR;
1379     }
1380 
1381     rc = uECC_shared_secret(pk, priv, dh, &curve_secp256r1);
1382     if (rc == TC_CRYPTO_FAIL) {
1383         return BLE_SM_KEY_ERR;
1384     }
1385 #endif // CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS
1386 
1387     swap_buf(out_dhkey, dh, 32);
1388     return 0;
1389 }
1390 
1391 #if CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS
mbedtls_gen_keypair(uint8_t * public_key,uint8_t * private_key)1392 static int mbedtls_gen_keypair(uint8_t *public_key, uint8_t *private_key)
1393 {
1394     int rc = BLE_SM_KEY_ERR;
1395     mbedtls_entropy_context entropy = {0};
1396     mbedtls_ctr_drbg_context ctr_drbg = {0};
1397 
1398     mbedtls_entropy_init(&entropy);
1399     mbedtls_ctr_drbg_init(&ctr_drbg);
1400     mbedtls_ecp_keypair_init(&keypair);
1401 
1402     if ((rc = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy,
1403                                     NULL, 0)) != 0) {
1404         goto exit;
1405     }
1406 
1407     if ((rc = mbedtls_ecp_gen_key(MBEDTLS_ECP_DP_SECP256R1, &keypair,
1408                                   mbedtls_ctr_drbg_random, &ctr_drbg)) != 0) {
1409         goto exit;
1410     }
1411 
1412     if ((rc = mbedtls_mpi_write_binary(&keypair.MBEDTLS_PRIVATE(d), private_key, 32)) != 0) {
1413         goto exit;
1414     }
1415 
1416     size_t olen = 0;
1417     uint8_t pub[65] = {0};
1418 
1419     if ((rc = mbedtls_ecp_point_write_binary(&keypair.MBEDTLS_PRIVATE(grp), &keypair.MBEDTLS_PRIVATE(Q), MBEDTLS_ECP_PF_UNCOMPRESSED,
1420               &olen, pub, 65)) != 0) {
1421         goto exit;
1422     }
1423 
1424     memcpy(public_key, &pub[1], 64);
1425 
1426 exit:
1427     mbedtls_ctr_drbg_free(&ctr_drbg);
1428     mbedtls_entropy_free(&entropy);
1429     if (rc != 0) {
1430         mbedtls_ecp_keypair_free(&keypair);
1431         return BLE_SM_KEY_ERR;
1432     }
1433 
1434     return 0;
1435 }
1436 #endif  // CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS
1437 
1438 /**
1439  * pub: 64 bytes
1440  * priv: 32 bytes
1441  */
ble_sm_alg_gen_key_pair(uint8_t * pub,uint8_t * priv)1442 int ble_sm_alg_gen_key_pair(uint8_t *pub, uint8_t *priv)
1443 {
1444 #if CONFIG_BT_LE_SM_SC_DEBUG_KEYS
1445     swap_buf(pub, ble_sm_alg_dbg_pub_key, 32);
1446     swap_buf(&pub[32], &ble_sm_alg_dbg_pub_key[32], 32);
1447     swap_buf(priv, ble_sm_alg_dbg_priv_key, 32);
1448 #else
1449     uint8_t pk[64];
1450 
1451     do {
1452 #if CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS
1453         if (mbedtls_gen_keypair(pk, priv) != 0) {
1454             return BLE_SM_KEY_ERR;
1455         }
1456 #else
1457         if (uECC_make_key(pk, priv, &curve_secp256r1) != TC_CRYPTO_SUCCESS) {
1458             return BLE_SM_KEY_ERR;
1459         }
1460 #endif  // CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS
1461         /* Make sure generated key isn't debug key. */
1462     } while (memcmp(priv, ble_sm_alg_dbg_priv_key, 32) == 0);
1463 
1464     swap_buf(pub, pk, 32);
1465     swap_buf(&pub[32], &pk[32], 32);
1466     swap_in_place(priv, 32);
1467 #endif // CONFIG_BT_LE_SM_SC_DEBUG_KEYS
1468     return 0;
1469 }
1470 
1471 #endif // CONFIG_BT_LE_SM_LEGACY || CONFIG_BT_LE_SM_SC
1472 #endif // (!CONFIG_BT_NIMBLE_ENABLED) && (CONFIG_BT_CONTROLLER_ENABLED)
1473