#include <stdio.h>
#include <string.h>
+#include "esp_heap_caps_init.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "esp_attr.h"
#include "esp_phy_init.h"
#include "bt.h"
+#include "esp_err.h"
+#include "esp_log.h"
#if CONFIG_BT_ENABLED
+#define BTDM_LOG_TAG "BTDM_INIT"
+
#define BTDM_INIT_PERIOD (5000) /* ms */
/* Bluetooth system and controller config */
extern int btdm_controller_deinit(void);
extern int btdm_controller_enable(esp_bt_mode_t mode);
extern int btdm_controller_disable(esp_bt_mode_t mode);
+extern uint8_t btdm_controller_get_mode(void);
extern void btdm_rf_bb_init(void);
/* VHCI function interface */
return mask;
}
+static void btdm_controller_release_mem(void)
+{
+ uint32_t bt_mem_start, bt_mem_end;
+#if CONFIG_BT_DRAM_RELEASE
+ bt_mem_start = 0x3ffb0000; bt_mem_end = 0x3ffb3000; //Reserve BT data region
+ ESP_ERROR_CHECK( heap_caps_add_region((intptr_t)bt_mem_start, (intptr_t)bt_mem_end));
+ bt_mem_start = 0x3ffb8000; bt_mem_end = 0x3ffbbb28; //Reserve BT data region
+ ESP_ERROR_CHECK( heap_caps_add_region((intptr_t)bt_mem_start, (intptr_t)bt_mem_end));
+ bt_mem_start = 0x3ffbdb28; bt_mem_end = 0x3ffc0000; //Reserve BT data region
+ ESP_ERROR_CHECK( heap_caps_add_region((intptr_t)bt_mem_start, (intptr_t)bt_mem_end));
+#else
+ bt_mem_start = 0x3ffb0000; bt_mem_end = 0x3ffc0000; //Reserve BT hardware shared memory & BT data region
+ ESP_ERROR_CHECK( heap_caps_add_region((intptr_t)bt_mem_start, (intptr_t)bt_mem_end));
+#endif
+ bt_mem_start = 0x3ffae2a0; bt_mem_end = 0x3ffaff10; //Reserve ROM data region
+ ESP_ERROR_CHECK( heap_caps_add_region((intptr_t)bt_mem_start, (intptr_t)bt_mem_end));
+}
+
esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg)
{
BaseType_t ret;
return ESP_ERR_NO_MEM;
}
- btdm_controller_status = ESP_BT_CONTROLLER_STATUS_IDLE;
+ btdm_controller_release_mem();
+
+ btdm_controller_status = ESP_BT_CONTROLLER_STATUS_SHUTDOWN;
return ESP_OK;
}
if (btdm_controller_status != ESP_BT_CONTROLLER_STATUS_INITED) {
return ESP_ERR_INVALID_STATE;
}
-
- if (mode != ESP_BT_MODE_BTDM) {
+#if CONFIG_BT_DRAM_RELEASE
+ if (mode != ESP_BT_MODE_BLE) {
+#else
+ if (mode != ESP_BT_MODE_BLE
+ && mode != ESP_BT_MODE_CLASSIC_BT
+ && mode != ESP_BT_MODE_BTDM) {
+#endif
return ESP_ERR_INVALID_ARG;
}
return ESP_ERR_INVALID_STATE;
}
- if (mode != ESP_BT_MODE_BTDM) {
- return ESP_ERR_INVALID_ARG;
+ if (mode != btdm_controller_get_mode()) {
+ ESP_LOGW(BTDM_LOG_TAG, "The input mode should be equal %d, but ignore error, use %d instead of %d\n",
+ btdm_controller_get_mode(), btdm_controller_get_mode(), mode);
+ mode = btdm_controller_get_mode();
}
ret = btdm_controller_disable(mode);
return (esp_power_level_t)ble_txpwr_get(power_type);
}
-
-#endif
+#endif /* CONFIG_BT_ENABLED */
ESP_BT_CONTROLLER_STATUS_IDLE = 0,
ESP_BT_CONTROLLER_STATUS_INITED,
ESP_BT_CONTROLLER_STATUS_ENABLED,
+ ESP_BT_CONTROLLER_STATUS_SHUTDOWN,
ESP_BT_CONTROLLER_STATUS_NUM,
} esp_bt_controller_status_t;
*
* This function should be called only once, after any other BT functions are called.
* This function is not whole completed, esp_bt_controller_init cannot called after this function.
+ * After call this function, it will release all the .bss/.data and .etc memory to heap dynamically.
+ * The release memory about 64K bytes (if CONFIG_BT_DRAM_RELEASE=y, it's about 36K bytes)
* @return ESP_OK - success, other - failed
*/
esp_err_t esp_bt_controller_deinit(void);
/**
- * @brief Enable BT controller
+ * @brief Enable BT controller.
+ * By a knowned issue, if the function already set mode, it can not set another mode dynamically.
+ * If want to change mode type, should call esp_bt_controller_disable, then call esp_bt_controller_enable.
* @param mode : the mode(BLE/BT/BTDM) to enable.
- * Now only support BTDM.
+ * If CONFIG_BT_DRAM_RELEASE=y, the param mode should only be ESP_BT_MODE_BLE.
* @return ESP_OK - success, other - failed
*/
esp_err_t esp_bt_controller_enable(esp_bt_mode_t mode);
/**
* @brief Disable BT controller
* @param mode : the mode(BLE/BT/BTDM) to disable.
- * Now only support BTDM.
+ * the mode should be equal to which esp_bt_controller_enable set.
+ * If not, the function will give warning, then use the correct mode to do disable.
* @return ESP_OK - success, other - failed
*/
esp_err_t esp_bt_controller_disable(esp_bt_mode_t mode);