blufi_init.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. /*
  2. * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Unlicense OR CC0-1.0
  5. */
  6. #include <stdio.h>
  7. #include "esp_err.h"
  8. #include "esp_blufi_api.h"
  9. #include "esp_log.h"
  10. #include "esp_blufi.h"
  11. #include "blufi_example.h"
  12. #include "esp_bt.h"
  13. #ifdef CONFIG_BT_BLUEDROID_ENABLED
  14. #include "esp_bt_main.h"
  15. #include "esp_bt_device.h"
  16. #endif
  17. #ifdef CONFIG_BT_NIMBLE_ENABLED
  18. #include "nimble/nimble_port.h"
  19. #include "nimble/nimble_port_freertos.h"
  20. #include "host/ble_hs.h"
  21. #include "host/util/util.h"
  22. #include "services/gap/ble_svc_gap.h"
  23. #include "services/gatt/ble_svc_gatt.h"
  24. #include "console/console.h"
  25. #endif
  26. #ifdef CONFIG_BT_BLUEDROID_ENABLED
  27. esp_err_t esp_blufi_host_init(void)
  28. {
  29. int ret;
  30. esp_bluedroid_config_t bluedroid_cfg = BT_BLUEDROID_INIT_CONFIG_DEFAULT();
  31. ret = esp_bluedroid_init_with_cfg(&bluedroid_cfg);
  32. if (ret) {
  33. BLUFI_ERROR("%s init bluedroid failed: %s\n", __func__, esp_err_to_name(ret));
  34. return ESP_FAIL;
  35. }
  36. ret = esp_bluedroid_enable();
  37. if (ret) {
  38. BLUFI_ERROR("%s init bluedroid failed: %s\n", __func__, esp_err_to_name(ret));
  39. return ESP_FAIL;
  40. }
  41. BLUFI_INFO("BD ADDR: "ESP_BD_ADDR_STR"\n", ESP_BD_ADDR_HEX(esp_bt_dev_get_address()));
  42. return ESP_OK;
  43. }
  44. esp_err_t esp_blufi_host_deinit(void)
  45. {
  46. int ret;
  47. ret = esp_blufi_profile_deinit();
  48. if(ret != ESP_OK) {
  49. return ret;
  50. }
  51. ret = esp_bluedroid_disable();
  52. if (ret) {
  53. BLUFI_ERROR("%s deinit bluedroid failed: %s\n", __func__, esp_err_to_name(ret));
  54. return ESP_FAIL;
  55. }
  56. ret = esp_bluedroid_deinit();
  57. if (ret) {
  58. BLUFI_ERROR("%s deinit bluedroid failed: %s\n", __func__, esp_err_to_name(ret));
  59. return ESP_FAIL;
  60. }
  61. return ESP_OK;
  62. }
  63. esp_err_t esp_blufi_gap_register_callback(void)
  64. {
  65. int rc;
  66. rc = esp_ble_gap_register_callback(esp_blufi_gap_event_handler);
  67. if(rc){
  68. return rc;
  69. }
  70. return esp_blufi_profile_init();
  71. }
  72. esp_err_t esp_blufi_host_and_cb_init(esp_blufi_callbacks_t *example_callbacks)
  73. {
  74. esp_err_t ret = ESP_OK;
  75. ret = esp_blufi_host_init();
  76. if (ret) {
  77. BLUFI_ERROR("%s initialise host failed: %s\n", __func__, esp_err_to_name(ret));
  78. return ret;
  79. }
  80. ret = esp_blufi_register_callbacks(example_callbacks);
  81. if(ret){
  82. BLUFI_ERROR("%s blufi register failed, error code = %x\n", __func__, ret);
  83. return ret;
  84. }
  85. ret = esp_blufi_gap_register_callback();
  86. if(ret){
  87. BLUFI_ERROR("%s gap register failed, error code = %x\n", __func__, ret);
  88. return ret;
  89. }
  90. return ESP_OK;
  91. }
  92. #endif /* CONFIG_BT_BLUEDROID_ENABLED */
  93. esp_err_t esp_blufi_controller_init() {
  94. esp_err_t ret = ESP_OK;
  95. #if CONFIG_IDF_TARGET_ESP32
  96. ESP_ERROR_CHECK(esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT));
  97. #endif
  98. esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
  99. ret = esp_bt_controller_init(&bt_cfg);
  100. if (ret) {
  101. BLUFI_ERROR("%s initialize bt controller failed: %s\n", __func__, esp_err_to_name(ret));
  102. return ret;
  103. }
  104. ret = esp_bt_controller_enable(ESP_BT_MODE_BLE);
  105. if (ret) {
  106. BLUFI_ERROR("%s enable bt controller failed: %s\n", __func__, esp_err_to_name(ret));
  107. return ret;
  108. }
  109. return ret;
  110. }
  111. esp_err_t esp_blufi_controller_deinit() {
  112. esp_err_t ret = ESP_OK;
  113. ret = esp_bt_controller_disable();
  114. if (ret) {
  115. BLUFI_ERROR("%s disable bt controller failed: %s\n", __func__, esp_err_to_name(ret));
  116. return ret;
  117. }
  118. ret = esp_bt_controller_deinit();
  119. if (ret) {
  120. BLUFI_ERROR("%s deinit bt controller failed: %s\n", __func__, esp_err_to_name(ret));
  121. return ret;
  122. }
  123. return ret;
  124. }
  125. #ifdef CONFIG_BT_NIMBLE_ENABLED
  126. void ble_store_config_init(void);
  127. static void blufi_on_reset(int reason)
  128. {
  129. MODLOG_DFLT(ERROR, "Resetting state; reason=%d\n", reason);
  130. }
  131. static void
  132. blufi_on_sync(void)
  133. {
  134. esp_blufi_profile_init();
  135. }
  136. void bleprph_host_task(void *param)
  137. {
  138. ESP_LOGI("BLUFI_EXAMPLE", "BLE Host Task Started");
  139. /* This function will return only when nimble_port_stop() is executed */
  140. nimble_port_run();
  141. nimble_port_freertos_deinit();
  142. }
  143. esp_err_t esp_blufi_host_init(void)
  144. {
  145. esp_err_t err;
  146. err = esp_nimble_init();
  147. if (err) {
  148. BLUFI_ERROR("%s failed: %s\n", __func__, esp_err_to_name(err));
  149. return ESP_FAIL;
  150. }
  151. /* Initialize the NimBLE host configuration. */
  152. ble_hs_cfg.reset_cb = blufi_on_reset;
  153. ble_hs_cfg.sync_cb = blufi_on_sync;
  154. ble_hs_cfg.gatts_register_cb = esp_blufi_gatt_svr_register_cb;
  155. ble_hs_cfg.store_status_cb = ble_store_util_status_rr;
  156. ble_hs_cfg.sm_io_cap = 4;
  157. #ifdef CONFIG_EXAMPLE_BONDING
  158. ble_hs_cfg.sm_bonding = 1;
  159. #endif
  160. #ifdef CONFIG_EXAMPLE_MITM
  161. ble_hs_cfg.sm_mitm = 1;
  162. #endif
  163. #ifdef CONFIG_EXAMPLE_USE_SC
  164. ble_hs_cfg.sm_sc = 1;
  165. #else
  166. ble_hs_cfg.sm_sc = 0;
  167. #ifdef CONFIG_EXAMPLE_BONDING
  168. ble_hs_cfg.sm_our_key_dist = 1;
  169. ble_hs_cfg.sm_their_key_dist = 1;
  170. #endif
  171. #endif
  172. int rc;
  173. rc = esp_blufi_gatt_svr_init();
  174. assert(rc == 0);
  175. /* Set the default device name. */
  176. rc = ble_svc_gap_device_name_set(BLUFI_DEVICE_NAME);
  177. assert(rc == 0);
  178. /* XXX Need to have template for store */
  179. ble_store_config_init();
  180. esp_blufi_btc_init();
  181. err = esp_nimble_enable(bleprph_host_task);
  182. if (err) {
  183. BLUFI_ERROR("%s failed: %s\n", __func__, esp_err_to_name(err));
  184. return ESP_FAIL;
  185. }
  186. return ESP_OK;
  187. }
  188. esp_err_t esp_blufi_host_deinit(void)
  189. {
  190. esp_err_t ret = ESP_OK;
  191. ret = esp_blufi_profile_deinit();
  192. if(ret != ESP_OK) {
  193. return ret;
  194. }
  195. esp_blufi_btc_deinit();
  196. ret = nimble_port_stop();
  197. if (ret == 0) {
  198. esp_nimble_deinit();
  199. }
  200. return ret;
  201. }
  202. esp_err_t esp_blufi_gap_register_callback(void)
  203. {
  204. return ESP_OK;
  205. }
  206. esp_err_t esp_blufi_host_and_cb_init(esp_blufi_callbacks_t *example_callbacks)
  207. {
  208. esp_err_t ret = ESP_OK;
  209. ret = esp_blufi_register_callbacks(example_callbacks);
  210. if(ret){
  211. BLUFI_ERROR("%s blufi register failed, error code = %x\n", __func__, ret);
  212. return ret;
  213. }
  214. ret = esp_blufi_gap_register_callback();
  215. if(ret){
  216. BLUFI_ERROR("%s gap register failed, error code = %x\n", __func__, ret);
  217. return ret;
  218. }
  219. ret = esp_blufi_host_init();
  220. if (ret) {
  221. BLUFI_ERROR("%s initialise host failed: %s\n", __func__, esp_err_to_name(ret));
  222. return ret;
  223. }
  224. return ret;
  225. }
  226. #endif /* CONFIG_BT_NIMBLE_ENABLED */