123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 |
- /*
- * SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD
- *
- * SPDX-License-Identifier: Unlicense OR CC0-1.0
- */
- #include <stdio.h>
- #include "esp_err.h"
- #include "esp_blufi_api.h"
- #include "esp_log.h"
- #include "esp_blufi.h"
- #include "blufi.h"
- #if CONFIG_BT_CONTROLLER_ENABLED || !CONFIG_BT_NIMBLE_ENABLED
- #include "esp_bt.h"
- #endif
- #ifdef CONFIG_BT_BLUEDROID_ENABLED
- #include "esp_bt_main.h"
- #include "esp_bt_device.h"
- #endif
- #ifdef CONFIG_BT_NIMBLE_ENABLED
- #include "nimble/nimble_port.h"
- #include "nimble/nimble_port_freertos.h"
- #include "host/ble_hs.h"
- #include "host/util/util.h"
- #include "services/gap/ble_svc_gap.h"
- #include "services/gatt/ble_svc_gatt.h"
- #include "console/console.h"
- #endif
- #ifdef CONFIG_BT_BLUEDROID_ENABLED
- esp_err_t esp_blufi_host_init(void)
- {
- int ret;
- ret = esp_bluedroid_init();
- if (ret) {
- BLUFI_ERROR("%s init bluedroid failed: %s\n", __func__, esp_err_to_name(ret));
- return ESP_FAIL;
- }
- ret = esp_bluedroid_enable();
- if (ret) {
- BLUFI_ERROR("%s init bluedroid failed: %s\n", __func__, esp_err_to_name(ret));
- return ESP_FAIL;
- }
- BLUFI_INFO("BD ADDR: "ESP_BD_ADDR_STR"\n", ESP_BD_ADDR_HEX(esp_bt_dev_get_address()));
- return ESP_OK;
- }
- esp_err_t esp_blufi_host_deinit(void)
- {
- int ret;
- ret = esp_blufi_profile_deinit();
- if(ret != ESP_OK) {
- return ret;
- }
- ret = esp_bluedroid_disable();
- if (ret) {
- BLUFI_ERROR("%s deinit bluedroid failed: %s\n", __func__, esp_err_to_name(ret));
- return ESP_FAIL;
- }
- ret = esp_bluedroid_deinit();
- if (ret) {
- BLUFI_ERROR("%s deinit bluedroid failed: %s\n", __func__, esp_err_to_name(ret));
- return ESP_FAIL;
- }
- return ESP_OK;
- }
- esp_err_t esp_blufi_gap_register_callback(void)
- {
- int rc;
- rc = esp_ble_gap_register_callback(esp_blufi_gap_event_handler);
- if(rc){
- return rc;
- }
- return esp_blufi_profile_init();
- }
- esp_err_t esp_blufi_host_and_cb_init(esp_blufi_callbacks_t *example_callbacks)
- {
- esp_err_t ret = ESP_OK;
- ret = esp_blufi_host_init();
- if (ret) {
- BLUFI_ERROR("%s initialise host failed: %s\n", __func__, esp_err_to_name(ret));
- return ret;
- }
- ret = esp_blufi_register_callbacks(example_callbacks);
- if(ret){
- BLUFI_ERROR("%s blufi register failed, error code = %x\n", __func__, ret);
- return ret;
- }
- ret = esp_blufi_gap_register_callback();
- if(ret){
- BLUFI_ERROR("%s gap register failed, error code = %x\n", __func__, ret);
- return ret;
- }
- return ESP_OK;
- }
- #endif /* CONFIG_BT_BLUEDROID_ENABLED */
- #if CONFIG_BT_CONTROLLER_ENABLED || !CONFIG_BT_NIMBLE_ENABLED
- esp_err_t esp_blufi_controller_init() {
- esp_err_t ret = ESP_OK;
- #if CONFIG_IDF_TARGET_ESP32
- ESP_ERROR_CHECK(esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT));
- #endif
- esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
- ret = esp_bt_controller_init(&bt_cfg);
- if (ret) {
- BLUFI_ERROR("%s initialize bt controller failed: %s\n", __func__, esp_err_to_name(ret));
- return ret;
- }
- ret = esp_bt_controller_enable(ESP_BT_MODE_BLE);
- if (ret) {
- BLUFI_ERROR("%s enable bt controller failed: %s\n", __func__, esp_err_to_name(ret));
- return ret;
- }
- return ret;
- }
- #endif
- #if CONFIG_BT_CONTROLLER_ENABLED || !CONFIG_BT_NIMBLE_ENABLED
- esp_err_t esp_blufi_controller_deinit() {
- esp_err_t ret = ESP_OK;
- ret = esp_bt_controller_disable();
- if (ret) {
- BLUFI_ERROR("%s disable bt controller failed: %s\n", __func__, esp_err_to_name(ret));
- return ret;
- }
- ret = esp_bt_controller_deinit();
- if (ret) {
- BLUFI_ERROR("%s deinit bt controller failed: %s\n", __func__, esp_err_to_name(ret));
- return ret;
- }
- return ret;
- }
- #endif
- #ifdef CONFIG_BT_NIMBLE_ENABLED
- void ble_store_config_init(void);
- static void blufi_on_reset(int reason)
- {
- MODLOG_DFLT(ERROR, "Resetting state; reason=%d\n", reason);
- }
- static void
- blufi_on_sync(void)
- {
- esp_blufi_profile_init();
- }
- void bleprph_host_task(void *param)
- {
- ESP_LOGI("BLUFI_EXAMPLE", "BLE Host Task Started");
- /* This function will return only when nimble_port_stop() is executed */
- nimble_port_run();
- nimble_port_freertos_deinit();
- }
- esp_err_t esp_blufi_host_init(void)
- {
- esp_err_t err;
- err = esp_nimble_init();
- if (err) {
- BLUFI_ERROR("%s failed: %s\n", __func__, esp_err_to_name(err));
- return ESP_FAIL;
- }
- /* Initialize the NimBLE host configuration. */
- ble_hs_cfg.reset_cb = blufi_on_reset;
- ble_hs_cfg.sync_cb = blufi_on_sync;
- ble_hs_cfg.gatts_register_cb = esp_blufi_gatt_svr_register_cb;
- ble_hs_cfg.store_status_cb = ble_store_util_status_rr;
- ble_hs_cfg.sm_io_cap = 4;
- #ifdef CONFIG_EXAMPLE_BONDING
- ble_hs_cfg.sm_bonding = 1;
- #endif
- #ifdef CONFIG_EXAMPLE_MITM
- ble_hs_cfg.sm_mitm = 1;
- #endif
- #ifdef CONFIG_EXAMPLE_USE_SC
- ble_hs_cfg.sm_sc = 1;
- #else
- ble_hs_cfg.sm_sc = 0;
- #ifdef CONFIG_EXAMPLE_BONDING
- ble_hs_cfg.sm_our_key_dist = 1;
- ble_hs_cfg.sm_their_key_dist = 1;
- #endif
- #endif
- int rc;
- rc = esp_blufi_gatt_svr_init();
- assert(rc == 0);
- /* Set the default device name. */
- rc = ble_svc_gap_device_name_set(BLUFI_DEVICE_NAME);
- assert(rc == 0);
- /* XXX Need to have template for store */
- ble_store_config_init();
- esp_blufi_btc_init();
- err = esp_nimble_enable(bleprph_host_task);
- if (err) {
- BLUFI_ERROR("%s failed: %s\n", __func__, esp_err_to_name(err));
- return ESP_FAIL;
- }
- return ESP_OK;
- }
- esp_err_t esp_blufi_host_deinit(void)
- {
- esp_err_t ret = ESP_OK;
- esp_blufi_gatt_svr_deinit();
- ret = nimble_port_stop();
- if (ret != ESP_OK) {
- return ret;
- }
- if (ret == 0) {
- esp_nimble_deinit();
- }
- ret = esp_blufi_profile_deinit();
- if (ret != ESP_OK) {
- return ret;
- }
- esp_blufi_btc_deinit();
- return ret;
- }
- esp_err_t esp_blufi_gap_register_callback(void)
- {
- return ESP_OK;
- }
- esp_err_t esp_blufi_host_and_cb_init(esp_blufi_callbacks_t *example_callbacks)
- {
- esp_err_t ret = ESP_OK;
- ret = esp_blufi_register_callbacks(example_callbacks);
- if(ret){
- BLUFI_ERROR("%s blufi register failed, error code = %x\n", __func__, ret);
- return ret;
- }
- ret = esp_blufi_gap_register_callback();
- if(ret){
- BLUFI_ERROR("%s gap register failed, error code = %x\n", __func__, ret);
- return ret;
- }
- ret = esp_blufi_host_init();
- if (ret) {
- BLUFI_ERROR("%s initialise host failed: %s\n", __func__, esp_err_to_name(ret));
- return ret;
- }
- return ret;
- }
- #endif /* CONFIG_BT_NIMBLE_ENABLED */
|