Merge branch 'feat/support_run_time_alloc_for_esp_ip_test_v5.3' into 'release/v5.3'

Support Mempool Run Time Allocation for ESP IP Chips (v5.3)

See merge request espressif/esp-idf!46821
This commit is contained in:
Island
2026-03-30 19:18:45 +08:00
21 changed files with 1326 additions and 463 deletions
+4 -5
View File
@@ -107,10 +107,8 @@ if(CONFIG_BT_ENABLED)
elseif(CONFIG_IDF_TARGET_ESP32C2)
list(APPEND srcs "controller/esp32c2/bt.c"
"controller/esp32c2/ble.c")
if(CONFIG_BT_CTRL_RUN_IN_FLASH_ONLY)
list(APPEND srcs "controller/esp32c2/dummy.c")
endif()
"controller/esp32c2/ble.c"
"controller/esp32c2/dummy.c")
set(ldscripts "linker_esp32c2.lf")
elseif(CONFIG_IDF_TARGET_ESP32C6)
@@ -697,6 +695,7 @@ if(CONFIG_BT_ENABLED)
list(APPEND srcs
"porting/npl/freertos/src/npl_os_freertos.c"
"porting/mem/os_msys_init.c"
"porting/mem/os_mempool.c"
"porting/transport/src/hci_transport.c"
)
@@ -908,7 +907,7 @@ if(CONFIG_BT_ENABLED)
if(NOT CONFIG_BT_LE_CONTROLLER_NPL_OS_PORTING_SUPPORT)
list(APPEND srcs
"host/nimble/nimble/porting/nimble/src/endian.c"
"host/nimble/nimble/porting/nimble/src/os_mempool.c"
"porting/mem/os_mempool.c"
"host/nimble/nimble/porting/nimble/src/mem.c"
"host/nimble/nimble/porting/nimble/src/os_mbuf.c"
"host/nimble/nimble/porting/nimble/src/os_msys_init.c"
+2
View File
@@ -48,7 +48,9 @@ void ble_stack_enableVsEvents(bool en)
#if DEFAULT_BT_LE_ROLE_BROADCASTER
adv_stack_enableScanReqRxdVsEvent(en);
#endif // DEFAULT_BT_LE_ROLE_BROADCASTER
#if DEFAULT_BT_LE_ROLE_CENTROL || DEFAULT_BT_LE_ROLE_PERIPHERAL
conn_stack_enableChanMapUpdCompVsEvent(en);
#endif // DEFAULT_BT_LE_ROLE_CENTROL || DEFAULT_BT_LE_ROLE_PERIPHERAL
#if CONFIG_BT_LE_SLEEP_ENABLE
sleep_stack_enableWakeupVsEvent(en);
#endif // CONFIG_BT_LE_SLEEP_ENABLE
@@ -1,312 +0,0 @@
/*
* SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef _BLE_DUMMY_H_
#define _BLE_DUMMY_H_
#include "esp_attr.h"
/* BLE LL ADV */
#if !DEFAULT_BT_LE_ROLE_BROADCASTER
int r_ble_ll_adv_env_init(void){return 0;}
int r_ble_ll_adv_env_init_eco4(void){return 0;}
void r_ble_ll_adv_scan_req_rxd(void){}
void r_ble_ll_adv_scan_req_rxd_eco4(void){}
void r_ble_ll_adv_status_check(void){}
void r_ble_ll_adv_status_check_eco4(void){}
void r_ble_ll_adv_set_adv_params(void){}
void r_ble_ll_adv_set_adv_params_eco4(void){}
void r_ble_ll_adv_set_enable(void){}
void r_ble_ll_adv_set_enable_eco4(void){}
void r_ble_ll_adv_sm_init(void){}
void r_ble_ll_adv_sm_init_eco4(void){}
void r_ble_ll_hci_set_adv_data(void){}
void r_ble_ll_hci_set_adv_data_eco4(void){}
void r_ble_ll_hci_set_scan_rsp_data(void){}
void r_ble_ll_hci_set_scan_rsp_data_eco4(void){}
void r_ble_ll_adv_scan_rsp_length_chk(void){}
void r_ble_ll_adv_scan_rsp_length_chk_eco4(void){}
void r_ble_ll_adv_data_length_chk(void){}
void r_ble_ll_adv_data_length_chk_eco4(void){}
/* Cut */
int r_ble_ll_adv_init(void){return 0;}
int r_ble_ll_adv_init_eco4(void){return 0;}
void r_ble_ll_adv_deinit(void){}
void r_ble_ll_adv_deinit_eco4(void){}
void r_ble_ll_adv_reset(void){}
void r_ble_ll_adv_reset_eco4(void){}
void r_ble_ll_adv_enabled(void){}
void r_ble_ll_adv_enabled_eco4(void){}
void r_ble_ll_adv_set_random_addr(void){}
void r_ble_ll_adv_set_random_addr_eco4(void){}
void r_ble_ll_adv_rpa_timeout(void){}
void r_ble_ll_adv_rpa_timeout_eco4(void){}
void r_ble_ll_adv_can_chg_whitelist(void){}
void r_ble_ll_adv_can_chg_whitelist_eco4(void){}
void r_ble_ll_adv_delay_get(void){}
void r_ble_ll_adv_delay_get_eco4(void){}
void r_ble_lll_adv_update_rsp_offset(void){}
void r_ble_lll_adv_update_rsp_offset_eco4(void){}
#endif // !DEFAULT_BT_LE_ROLE_BROADCASTER
#if !DEFAULT_BT_LE_EXT_ADV
void r_ble_ll_adv_ext_set_param(void){}
void r_ble_ll_adv_ext_set_param_eco4(void){}
void r_ble_ll_adv_ext_set_adv_data(void){}
void r_ble_ll_adv_ext_set_adv_data_eco4(void){}
void r_ble_ll_adv_ext_set_scan_rsp(void){}
void r_ble_ll_adv_ext_set_scan_rsp_eco4(void){}
void r_ble_ll_adv_ext_estimate_data_itvl(void){}
void r_ble_ll_adv_ext_estimate_data_itvl_eco4(void){}
void r_ble_ll_adv_ext_check_data_itvl(void){}
void r_ble_ll_adv_ext_check_data_itvl_eco4(void){}
void r_ble_ll_hci_send_ext_adv_report(void){}
void r_ble_ll_hci_send_ext_adv_report_eco4(void){}
void r_ble_ll_hci_send_legacy_ext_adv_report(void){}
void r_ble_ll_hci_send_legacy_ext_adv_report_eco4(void){}
#endif //!DEFAULT_BT_LE_EXT_ADV
#if !DEFAULT_BT_LE_ROLE_OBSERVER
int r_ble_ll_scan_env_init(void){return 0;}
int r_ble_ll_scan_env_init_eco4(void){return 0;}
void r_ble_ll_scan_dup_update_legacy(void){}
void r_ble_ll_scan_dup_update_legacy_eco4(void){}
void r_ble_ll_scan_get_next_adv_prim_chan(void){}
void r_ble_ll_scan_get_next_adv_prim_chan_eco4(void){}
void r_ble_ll_scan_move_window_to(void){}
void r_ble_ll_scan_move_window_to_eco4(void){}
void r_ble_ll_scan_send_adv_report(void){}
void r_ble_ll_scan_send_adv_report_eco4(void){}
void r_ble_ll_scan_send_adv_lost_report(void){}
void r_ble_ll_scan_send_adv_lost_report_eco4(void){}
void r_ble_ll_scan_common_init(void){}
void r_ble_ll_scan_common_init_eco4(void){}
void r_ble_ll_scan_pre_process(void){}
void r_ble_ll_scan_pre_process_eco4(void){}
void r_ble_ll_scan_env_deinit(void){}
void r_ble_ll_scan_env_deinit_eco4(void){}
void r_ble_ll_check_scan_params(void){}
void r_ble_ll_check_scan_params_eco4(void){}
void r_ble_ll_scan_hci_specify_scan_chan(void){}
void r_ble_ll_scan_hci_specify_scan_chan_eco4(void){}
void r_ble_lll_scan_coex_event_cb(void){}
void r_ble_lll_scan_coex_event_cb_eco4(void){}
void r_ble_lll_scan_req_backoff(void){}
void r_ble_lll_scan_req_backoff_eco4(void){}
void r_ble_lll_scan_common_init(void){}
void r_ble_lll_scan_common_init_eco4(void){}
IRAM_ATTR void r_ble_lll_scan_restart(void){}
IRAM_ATTR void r_ble_lll_scan_restart_eco4(void){}
IRAM_ATTR void r_ble_lll_scan_rx_pkt_isr(void){}
IRAM_ATTR void r_ble_lll_scan_rx_pkt_isr_eco4(void){}
void r_ble_lll_scan_start(void){}
void r_ble_lll_scan_start_eco4(void){}
IRAM_ATTR void r_ble_lll_scan_start_rx(void){}
IRAM_ATTR void r_ble_lll_scan_start_rx_eco4(void){}
void r_ble_lll_scan_stop(void){}
void r_ble_lll_scan_stop_eco4(void){}
void r_ble_lll_scan_event_proc(void){}
void r_ble_lll_scan_event_proc_eco4(void){}
void r_ble_ll_get_chan_to_scan(void){}
void r_ble_ll_get_chan_to_scan_eco4(void){}
IRAM_ATTR void r_ble_phy_set_scan_mode(void){}
IRAM_ATTR void r_ble_phy_set_scan_mode_eco4(void){}
/* Module cut */
void r_ble_ll_scan_init(void){}
void r_ble_ll_scan_init_eco4(void){}
void r_ble_ll_scan_deinit(void){}
void r_ble_ll_scan_deinit_eco4(void){}
void r_ble_ll_scan_reset(void){}
void r_ble_ll_scan_reset_eco4(void){}
void r_ble_ll_scan_can_chg_whitelist(void){}
void r_ble_ll_scan_can_chg_whitelist_eco4(void){}
void r_ble_ll_scan_enabled(void){}
void r_ble_ll_scan_enabled_eco4(void){}
void r_ble_ll_scan_continue_status_get_eco4(void){}
void r_ble_ll_scan_continue_status_get_eco4_eco4(void){}
void r_ble_ll_scan_rxed(void){}
void r_ble_ll_scan_rxed_eco4(void){}
void r_ble_ll_scan_set_perfer_addr(void){}
void r_ble_ll_scan_set_perfer_addr_eco4(void){}
IRAM_ATTR void r_ble_lll_scan_chk_resume(void){}
IRAM_ATTR void r_ble_lll_scan_chk_resume_eco4(void){}
int r_ble_ll_scan_status_check(void){return 0;}
int r_ble_ll_scan_status_check_eco4(void){return 0;}
#endif // !DEFAULT_BT_LE_ROLE_OBSERVER
#if !DEFAULT_BT_LE_EXT_SCAN
void r_ble_ll_scan_rx_pkt_in_on_aux(void){}
void r_ble_ll_scan_rx_pkt_in_on_aux_eco4(void){}
IRAM_ATTR void r_ble_lll_aux_scan_cb(void){}
IRAM_ATTR void r_ble_lll_aux_scan_cb_eco4(void){}
#endif //!DEFAULT_BT_LE_EXT_SCAN
#if !DEFAULT_BT_LE_ROLE_CENTROL
void r_ble_ll_conn_ext_master_init(void){}
void r_ble_ll_conn_ext_master_init_eco4(void){}
void r_ble_ll_conn_master_init(void){}
void r_ble_ll_conn_master_init_eco4(void){}
IRAM_ATTR void r_ble_lll_init_rx_pkt_isr(void){}
IRAM_ATTR void r_ble_lll_init_rx_pkt_isr_eco4(void){}
void r_ble_ll_ctrl_rx_conn_param_rsp(void){}
void r_ble_ll_ctrl_rx_conn_param_rsp_eco4(void){}
#endif // !DEFAULT_BT_LE_ROLE_CENTROL
#if !DEFAULT_BT_LE_ROLE_PERIPHERAL
void r_ble_ll_conn_slave_start(void){}
void r_ble_ll_conn_slave_start_eco4(void){}
void r_ble_ll_ctrl_rx_conn_update(void){}
void r_ble_ll_ctrl_rx_conn_update_eco4(void){}
void r_ble_lll_conn_event_delete_and_reschedule(void){}
void r_ble_lll_conn_event_delete_and_reschedule_eco4(void){}
void r_ble_ll_utils_verify_aa(void){}
void r_ble_ll_utils_verify_aa_eco4(void){}
#endif // !DEFAULT_BT_LE_ROLE_PERIPHERAL
#if !DEFAULT_BT_LE_ROLE_CENTROL && !DEFAULT_BT_LE_ROLE_PERIPHERAL
void r_ble_ll_conn_rx_data_pdu(void){}
void r_ble_ll_conn_rx_data_pdu_eco4(void){}
int r_ble_ll_conn_callout_env_init(void){return 0;}
int r_ble_ll_conn_callout_env_init_eco4(void){return 0;}
void r_ble_ll_conn_callout_env_deinit(void){}
void r_ble_ll_conn_callout_env_deinit_eco4(void){}
void r_ble_ll_conn_hci_set_data_len(void){}
void r_ble_ll_conn_hci_set_data_len_eco4(void){}
void r_ble_ll_conn_module_deinit(void){}
void r_ble_ll_conn_module_deinit_eco4(void){}
void r_ble_ll_conn_module_init(void){}
void r_ble_ll_conn_module_init_eco4(void){}
void r_ble_ll_conn_next_event(void){}
void r_ble_ll_conn_next_event_eco4(void){}
void r_ble_ll_conn_set_txpwr_by_handle(void){}
void r_ble_ll_conn_set_txpwr_by_handle_eco4(void){}
void r_ble_ll_conn_sm_new(void){}
void r_ble_ll_conn_sm_new_eco4(void){}
void r_ble_ll_ctrl_rx_chanmap_req(void){}
void r_ble_ll_ctrl_rx_chanmap_req_eco4(void){}
void r_ble_ll_ctrl_conn_param_pdu_make(void){}
void r_ble_ll_ctrl_conn_param_pdu_make_eco4(void){}
void r_ble_ll_ctrl_rx_pdu(void){}
void r_ble_ll_ctrl_rx_pdu_eco4(void){}
void r_ble_ll_ctrl_stop_rsp_timer(void){}
void r_ble_ll_ctrl_stop_rsp_timer_eco4(void){}
void r_ble_ll_conn_update_new_conn_param(void){}
void r_ble_ll_conn_update_new_conn_param_eco4(void){}
void r_ble_ll_conn_update_new_phy(void){}
void r_ble_ll_conn_update_new_phy_eco4(void){}
void r_ble_ll_conn_update_new_chan_map(void){}
void r_ble_ll_conn_update_new_chan_map_eco4(void){}
void r_ble_lll_conn_module_init(void){}
void r_ble_lll_conn_module_init_eco4(void){}
void r_ble_lll_conn_pre_process(void){}
void r_ble_lll_conn_pre_process_eco4(void){}
void r_ble_lll_conn_create_scheduled(void){}
void r_ble_lll_conn_create_scheduled_eco4(void){}
IRAM_ATTR void r_ble_phy_set_conn_mode(void){}
IRAM_ATTR void r_ble_phy_set_conn_mode_eco4(void){}
IRAM_ATTR void r_ble_phy_sequence_update_conn_ind_params(void){}
IRAM_ATTR void r_ble_phy_sequence_update_conn_ind_params_eco4(void){}
void r_ble_phy_update_conn_sequence(void){}
void r_ble_phy_update_conn_sequence_eco4(void){}
void r_ble_lll_conn_event_end_timer_cb(void){}
void r_ble_lll_conn_event_end_timer_cb_eco4(void){}
void r_ble_lll_conn_rx_pkt_isr(void){}
void r_ble_lll_conn_rx_pkt_isr_eco4(void){}
/* Can't cut */
// int r_ble_ll_conn_env_init(void){return 0;}
// int_eco4 r_ble_ll_conn_env_init(void){return 0;}
#endif // !DEFAULT_BT_LE_ROLE_CENTROL && !DEFAULT_BT_LE_ROLE_PERIPHERAL
// #if !DEFAULT_BT_LE_2M_PHY && !DEFAULT_BT_LE_CODED_PHY
// void r_ble_ll_ctrl_rx_phy_update_ind(void){}
// uint8_t r_ble_ll_ctrl_rx_phy_update_ind_eco4(void){return 0x07;}
// #endif // !DEFAULT_BT_LE_2M_PHY && !DEFAULT_BT_LE_CODED_PHY
#if !DEFAULT_BT_LE_50_FEATURE_SUPPORT
#endif // !DEFAULT_BT_LE_50_FEATURE_SUPPORT
#if !DEFAULT_BT_LE_PERIODIC_SYNC
void r_ble_ll_sync_parse_ext_hdr(void){}
void r_ble_ll_sync_parse_ext_hdr_eco4(void){}
#endif // !DEFAULT_BT_LE_PERIODIC_ADV
#if !CONFIG_BT_LE_SLEEP_ENABLE
void r_ble_lll_rfmgmt_controller_sleep_en(void){};
void r_ble_lll_rfmgmt_controller_sleep_en_eco4(void){};
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){}
void r_ble_lll_rfmgmt_set_sleep_cb_eco4(void *s_cb, void *w_cb, void *s_arg, void *w_arg, uint32_t us_to_enabled){}
void r_ble_lll_rfmgmt_disable(void){}
void r_ble_lll_rfmgmt_disable_eco4(void){}
IRAM_ATTR void r_ble_lll_rfmgmt_timer_exp(void){}
IRAM_ATTR void r_ble_lll_rfmgmt_timer_exp_eco4(void){}
IRAM_ATTR void r_ble_lll_rfmgmt_timer_reschedule(void){}
IRAM_ATTR void r_ble_lll_rfmgmt_timer_reschedule_eco4(void){}
void r_ble_lll_rfmgmt_enable(void){}
void r_ble_lll_rfmgmt_enable_eco4(void){}
void r_ble_lll_rfmgmt_enable_now(void){}
void r_ble_lll_rfmgmt_enable_now_eco4(void){}
void r_ble_lll_rfmgmt_is_enabled(void){}
void r_ble_lll_rfmgmt_is_enabled_eco4(void){}
void r_ble_lll_rfmgmt_reset(void){}
void r_ble_lll_rfmgmt_reset_eco4(void){}
int r_ble_lll_rfmgmt_env_init(void){return 0;}
int r_ble_lll_rfmgmt_env_init_eco4(void){return 0;}
void r_ble_lll_rfmgmt_should_skip_light_sleep_check(void){}
void r_ble_lll_rfmgmt_should_skip_light_sleep_check_eco4(void){}
void r_ble_lll_rfmgmt_wake_up_overhead_set(void){}
void r_ble_lll_rfmgmt_wake_up_overhead_set_eco4(void){}
void r_ble_lll_rfmgmt_get_wakeup_delta(void){}
void r_ble_lll_rfmgmt_get_wakeup_delta_eco4(void){}
#endif // CONFIG_BT_LE_SLEEP_ENABLE
#if !CONFIG_BT_LE_DTM_ENABLED
void r_ble_lll_dtm_rx_create_ctx(void){}
void r_ble_lll_dtm_rx_create_ctx_eco4(void){}
void r_ble_lll_dtm_rx_pkt_in(void){}
void r_ble_lll_dtm_rx_pkt_in_eco4(void){}
void r_ble_lll_dtm_tx_create_ctx(void){}
void r_ble_lll_dtm_tx_create_ctx_eco4(void){}
void r_ble_lll_dtm_rx_resi_get(void){}
void r_ble_lll_dtm_rx_resi_get_eco4(void){}
#endif // !CONFIG_BT_LE_DTM_ENABLED
#if !DEFAULT_BT_LE_TX_CCA_ENABLED
void r_ble_lll_sched_offset_update(void){}
void r_ble_lll_sched_offset_update_eco4(void){}
#endif // !DEFAULT_BT_LE_TX_CCA_ENABLED
#if !DEFAULT_BT_LE_ROLE_OBSERVER && !DEFAULT_BT_LE_ROLE_CENTROL && !DEFAULT_BT_LE_ROLE_PERIPHERAL
void r_ble_phy_set_rxwin1(void){}
void r_ble_phy_set_rxwin1_eco4(void){}
#endif // !DEFAULT_BT_LE_ROLE_CENTROL && !DEFAULT_BT_LE_ROLE_PERIPHERAL
#if !DEFAULT_BT_LE_PERIODIC_SYNC && !DEFAULT_BT_LE_ROLE_PERIPHERAL
void r_ble_ll_customize_peer_sca_set(void){}
void r_ble_ll_customize_peer_sca_set_eco4(void){}
int r_ble_ll_customize_peer_sca_get(void){return 0;}
int r_ble_ll_customize_peer_sca_get_eco4(void){return 0;}
int r_ble_ll_utils_calc_window_widening(void){return 0;}
int r_ble_ll_utils_calc_window_widening_eco4(void){return 0;}
#endif // !DEFAULT_BT_LE_PERIODIC_SYNC && !DEFAULT_BT_LE_ROLE_PERIPHERAL
#if !(CONFIG_BT_NIMBLE_ENABLED || CONFIG_BT_BLUEDROID_ENABLED)
void r_ble_vendor_hci_register(void){}
void r_ble_vendor_hci_register_eco4(void){}
void r_ble_vendor_hci_unregister(void){}
void r_ble_vendor_hci_unregister_eco4(void){}
void r_ble_ll_hci_vendor_event_is_enabled(void){}
void r_ble_ll_hci_vendor_event_is_enabled_eco4(void){}
void r_ble_ll_hci_vs_cmd_proc(void){}
void r_ble_ll_hci_vs_cmd_proc_eco4(void){}
void r_ble_ll_hci_vs_csa_set(void){}
void r_ble_ll_hci_vs_csa_set_eco4(void){}
void r_ble_ll_reset_config_params(void){}
void r_ble_ll_reset_config_params_eco4(void){}
#endif // !(CONFIG_BT_NIMBLE_ENABLED || CONFIG_BT_BLUEDROID_ENABLED)
#endif // _BLE_DUMMY_H_
-3
View File
@@ -74,9 +74,6 @@
#endif // CONFIG_BT_BLE_LOG_SPI_OUT_ENABLED
#endif /* CONFIG_BT_LE_CONTROLLER_LOG_MODE_BLE_LOG_V2 */
#if !CONFIG_BT_CTRL_RUN_IN_FLASH_ONLY
#include "ble_dummy.h"
#endif // !CONFIG_BT_CTRL_RUN_IN_FLASH_ONLY
/* Macro definition
************************************************************************
*/
+310 -1
View File
@@ -1,9 +1,10 @@
/*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2024-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "esp_bt_cfg.h"
#include "esp_attr.h"
#define BLE_ERR_UNKNOWN_HCI_CMD (0x01)
/* LL Features */
@@ -318,3 +319,311 @@ int r_ble_lll_dtm_end_test(void) { return BLE_ERR_UNKNOWN_HCI_CMD; }
int r_ble_lll_hci_dtm_rx_test_v2(void) { return BLE_ERR_UNKNOWN_HCI_CMD; }
int r_ble_lll_hci_dtm_tx_test_v2(void) { return BLE_ERR_UNKNOWN_HCI_CMD; }
#endif //!CONFIG_BT_LE_DTM_ENABLED
/* The following function is trimmed with module */
/* BLE LL ADV */
#if !DEFAULT_BT_LE_ROLE_BROADCASTER
int r_ble_ll_adv_env_init_eco4(void){return 0;}
void r_ble_ll_adv_scan_req_rxd(void){}
void r_ble_ll_adv_scan_req_rxd_eco4(void){}
void r_ble_ll_adv_status_check(void){}
void r_ble_ll_adv_status_check_eco4(void){}
int r_ble_ll_adv_set_adv_params_eco4(void){return BLE_ERR_UNKNOWN_HCI_CMD;}
void r_ble_ll_adv_set_enable(void){}
void r_ble_ll_adv_set_enable_eco4(void){}
void r_ble_ll_adv_sm_init(void){}
void r_ble_ll_adv_sm_init_eco4(void){}
int r_ble_ll_hci_set_adv_data_eco4(void){return BLE_ERR_UNKNOWN_HCI_CMD;}
int r_ble_ll_hci_set_scan_rsp_data_eco4(void){return BLE_ERR_UNKNOWN_HCI_CMD;}
void r_ble_ll_adv_scan_rsp_length_chk(void){}
void r_ble_ll_adv_scan_rsp_length_chk_eco4(void){}
void r_ble_ll_adv_data_length_chk(void){}
void r_ble_ll_adv_data_length_chk_eco4(void){}
/* Cut */
int r_ble_ll_adv_init_eco4(void){return 0;}
void r_ble_ll_adv_deinit_eco4(void){}
void r_ble_ll_adv_reset_eco4(void){}
bool r_ble_ll_adv_enabled_eco4(void){return 0;}
int r_ble_ll_adv_set_random_addr_eco4(void){return BLE_ERR_UNKNOWN_HCI_CMD;}
void r_ble_ll_adv_rpa_timeout_eco4(void){}
int r_ble_ll_adv_can_chg_whitelist_eco4(void){return 1;}
void r_ble_ll_adv_delay_get(void){}
void r_ble_ll_adv_delay_get_eco4(void){}
void r_ble_lll_adv_update_rsp_offset_eco4(void){}
void r_ble_ll_adv_sm_find_configured(void){}
void r_ble_ll_adv_sm_find_configured_eco4(void){}
int r_ble_ll_adv_hci_set_random_addr_eco4(void){return BLE_ERR_UNKNOWN_HCI_CMD;}
#endif // !DEFAULT_BT_LE_ROLE_BROADCASTER
#if !DEFAULT_BT_LE_ROLE_BROADCASTER || !DEFAULT_BT_LE_EXT_ADV
int r_ble_ll_adv_ext_set_param_eco4(void){return BLE_ERR_UNKNOWN_HCI_CMD;}
int r_ble_ll_adv_ext_set_adv_data_eco4(void){return BLE_ERR_UNKNOWN_HCI_CMD;}
int r_ble_ll_adv_ext_set_scan_rsp_eco4(void){return BLE_ERR_UNKNOWN_HCI_CMD;}
void r_ble_ll_adv_ext_estimate_data_itvl(void){}
void r_ble_ll_adv_ext_estimate_data_itvl_eco4(void){}
bool r_ble_ll_adv_ext_check_data_itvl_eco4(void){return true;}
void r_ble_ll_adv_aux_calculate_payload(void){}
void r_ble_ll_adv_aux_calculate_payload_eco4(void){}
int r_ble_lll_adv_periodic_start_eco4(void){return 0;};
void r_ble_ll_adv_aux_calculate(void){};
void r_ble_ll_adv_aux_calculate_eco4(void){};
#endif //!DEFAULT_BT_LE_ROLE_BROADCASTER || !DEFAULT_BT_LE_EXT_ADV
#if !DEFAULT_BT_LE_ROLE_OBSERVER
int r_ble_ll_scan_env_init_eco4(void){return 0;}
void r_ble_ll_scan_dup_update_legacy(void){}
void r_ble_ll_scan_dup_update_legacy_eco4(void){}
void r_ble_ll_scan_get_next_adv_prim_chan(void){}
void r_ble_ll_scan_get_next_adv_prim_chan_eco4(void){}
void r_ble_ll_scan_move_window_to(void){}
void r_ble_ll_scan_move_window_to_eco4(void){}
void r_ble_ll_scan_send_adv_report(void){}
void r_ble_ll_scan_send_adv_report_eco4(void){}
void r_ble_ll_scan_send_adv_lost_report(void){}
void r_ble_ll_scan_send_adv_lost_report_eco4(void){}
void r_ble_ll_scan_common_init(void){}
void r_ble_ll_scan_common_init_eco4(void){}
void r_ble_ll_scan_pre_process(void){}
void r_ble_ll_scan_pre_process_eco4(void){}
void r_ble_ll_scan_env_deinit_eco4(void){}
void r_ble_ll_check_scan_params(void){}
void r_ble_ll_check_scan_params_eco4(void){}
void r_ble_ll_scan_hci_specify_scan_chan(void){}
void r_ble_ll_scan_hci_specify_scan_chan_eco4(void){}
void r_ble_lll_scan_coex_event_cb(void){}
void r_ble_lll_scan_coex_event_cb_eco4(void){}
void r_ble_lll_scan_req_backoff(void){}
void r_ble_lll_scan_req_backoff_eco4(void){}
void r_ble_lll_scan_common_init(void){}
void r_ble_lll_scan_common_init_eco4(void){}
void r_ble_lll_scan_restart(void){}
void r_ble_lll_scan_restart_eco4(void){}
int r_ble_lll_scan_rx_pkt_isr_eco4(void){return -1;}
void r_ble_lll_scan_start(void){}
void r_ble_lll_scan_start_eco4(void){}
void r_ble_lll_scan_start_rx(void){}
void r_ble_lll_scan_start_rx_eco4(void){}
void r_ble_lll_scan_stop(void){}
void r_ble_lll_scan_stop_eco4(void){}
void r_ble_lll_scan_event_proc(void){}
void r_ble_lll_scan_event_proc_eco4(void){}
void r_ble_ll_get_chan_to_scan(void){}
void r_ble_ll_get_chan_to_scan_eco4(void){}
void r_ble_phy_set_scan_mode(void){}
void r_ble_phy_set_scan_mode_eco4(void){}
void r_ble_ll_scan_init_eco4(void){}
void r_ble_ll_scan_deinit_eco4(void){}
void r_ble_ll_scan_reset_eco4(void){}
int r_ble_ll_scan_can_chg_whitelist_eco4(void){return 1;}
bool r_ble_ll_scan_enabled_eco4(void){return 0;}
void r_ble_ll_scan_continue_status_get_eco4(void){}
void r_ble_ll_scan_continue_status_get_eco4_eco4(void){}
void r_ble_ll_scan_rxed(void){}
void r_ble_ll_scan_rxed_eco4(void){}
void r_ble_ll_scan_set_perfer_addr(void){}
void r_ble_ll_scan_set_perfer_addr_eco4(void){}
IRAM_ATTR int r_ble_lll_scan_chk_resume_eco4(void){return -1;}
int r_ble_ll_scan_status_check(void){return 0;}
int r_ble_ll_scan_status_check_eco4(void){return 0;}
#endif // !DEFAULT_BT_LE_ROLE_OBSERVER
#if !DEFAULT_BT_LE_ROLE_OBSERVER || !DEFAULT_BT_LE_EXT_SCAN
void r_ble_ll_scan_rx_pkt_in_on_aux_eco4(void){}
void r_ble_lll_aux_scan_cb(void){}
void r_ble_lll_aux_scan_cb_eco4(void){}
void r_ble_ll_hci_send_ext_adv_report(void){}
void r_ble_ll_hci_send_ext_adv_report_eco4(void){}
int r_ble_ll_hci_send_legacy_ext_adv_report_eco4(void){return -1;}
#endif //!DEFAULT_BT_LE_ROLE_OBSERVER || !DEFAULT_BT_LE_EXT_SCAN
#if !DEFAULT_BT_LE_ROLE_CENTROL
void r_ble_ll_conn_ext_master_init(void){}
void r_ble_ll_conn_ext_master_init_eco4(void){}
void r_ble_ll_conn_master_init(void){}
void r_ble_ll_conn_master_init_eco4(void){}
int r_ble_lll_init_rx_pkt_isr_eco4(void){return -1;}
void r_ble_ll_ctrl_rx_conn_param_rsp(void){}
void r_ble_ll_ctrl_rx_conn_param_rsp_eco4(void){}
#endif // !DEFAULT_BT_LE_ROLE_CENTROL
#if !DEFAULT_BT_LE_ROLE_PERIPHERAL
int r_ble_ll_conn_slave_start_eco4(void){return 0;}
void r_ble_ll_ctrl_rx_conn_update(void){}
void r_ble_ll_ctrl_rx_conn_update_eco4(void){}
void r_ble_lll_conn_event_delete_and_reschedule(void){}
void r_ble_lll_conn_event_delete_and_reschedule_eco4(void){}
void r_ble_ll_utils_verify_aa(void){}
void r_ble_ll_utils_verify_aa_eco4(void){}
#endif // !DEFAULT_BT_LE_ROLE_PERIPHERAL
#if !DEFAULT_BT_LE_ROLE_CENTROL && !DEFAULT_BT_LE_ROLE_PERIPHERAL
void r_ble_ll_conn_rx_data_pdu_eco4(void){}
int r_ble_ll_conn_callout_env_init(void){return 0;}
int r_ble_ll_conn_callout_env_init_eco4(void){return 0;}
void r_ble_ll_conn_callout_env_deinit(void){}
void r_ble_ll_conn_callout_env_deinit_eco4(void){}
void r_ble_ll_conn_hci_set_data_len(void){}
void r_ble_ll_conn_hci_set_data_len_eco4(void){}
void r_ble_ll_conn_module_deinit(void){}
void r_ble_ll_conn_module_deinit_eco4(void){}
void r_ble_ll_conn_module_init(void){}
void r_ble_ll_conn_module_init_eco4(void){}
void r_ble_ll_conn_next_event(void){}
void r_ble_ll_conn_next_event_eco4(void){}
void r_ble_ll_conn_set_txpwr_by_handle(void){}
void r_ble_ll_conn_set_txpwr_by_handle_eco4(void){}
void r_ble_ll_conn_sm_new(void){}
void r_ble_ll_conn_sm_new_eco4(void){}
void r_ble_ll_ctrl_rx_chanmap_req(void){}
void r_ble_ll_ctrl_rx_chanmap_req_eco4(void){}
void r_ble_ll_ctrl_conn_param_pdu_make(void){}
void r_ble_ll_ctrl_conn_param_pdu_make_eco4(void){}
void r_ble_ll_ctrl_rx_pdu(void){}
void r_ble_ll_ctrl_rx_pdu_eco4(void){}
void r_ble_ll_ctrl_stop_rsp_timer(void){}
void r_ble_ll_ctrl_stop_rsp_timer_eco4(void){}
void r_ble_ll_conn_update_new_conn_param(void){}
void r_ble_ll_conn_update_new_conn_param_eco4(void){}
void r_ble_ll_conn_update_new_phy(void){}
void r_ble_ll_conn_update_new_phy_eco4(void){}
void r_ble_ll_conn_update_new_chan_map(void){}
void r_ble_ll_conn_update_new_chan_map_eco4(void){}
void r_ble_lll_conn_module_init(void){}
void r_ble_lll_conn_module_init_eco4(void){}
void r_ble_lll_conn_pre_process(void){}
void r_ble_lll_conn_pre_process_eco4(void){}
void r_ble_lll_conn_create_scheduled(void){}
void r_ble_lll_conn_create_scheduled_eco4(void){}
void r_ble_phy_set_conn_mode(void){}
void r_ble_phy_set_conn_mode_eco4(void){}
void r_ble_phy_sequence_update_conn_ind_params(void){}
void r_ble_phy_sequence_update_conn_ind_params_eco4(void){}
void r_ble_phy_update_conn_sequence(void){}
void r_ble_phy_update_conn_sequence_eco4(void){}
void r_ble_lll_conn_event_end_timer_cb(void){}
void r_ble_lll_conn_event_end_timer_cb_eco4(void){}
int r_ble_lll_conn_rx_pkt_isr_eco4(void){return -1;}
/* Can't cut */
int r_ble_ll_conn_min_mem_env_init(void);
void r_ble_ll_conn_min_mem_env_deinit(void);
void r_ble_ll_conn_module_min_mem_reset(void);
int r_ble_ll_conn_env_init(void){return 0;}
int r_ble_ll_conn_env_init_eco4(void){return r_ble_ll_conn_min_mem_env_init();}
void r_ble_ll_conn_env_deinit(void){}
void r_ble_ll_conn_env_deinit_eco4(void){r_ble_ll_conn_min_mem_env_deinit();}
void r_ble_ll_conn_module_reset(void){};
void r_ble_ll_conn_module_reset_eco4(void){r_ble_ll_conn_module_min_mem_reset();};
int r_ble_ll_conn_status_check(void){return 0;}
int r_ble_ll_conn_status_check_eco4(void){return 0;}
void r_ble_ll_set_random_addr(void){};
void r_ble_ll_set_random_addr_eco4(void){};
void r_ble_lll_conn_env_deinit(void){};
void r_ble_lll_conn_env_deinit_eco4(void){};
void r_ble_ll_conn_init_ref(void){};
void r_ble_ll_conn_init_ref_eco4(void){};
#endif // !DEFAULT_BT_LE_ROLE_CENTROL && !DEFAULT_BT_LE_ROLE_PERIPHERAL
#if !DEFAULT_BT_LE_ROLE_PERIPHERAL || !DEFAULT_BT_LE_2M_PHY && !DEFAULT_BT_LE_CODED_PHY
uint8_t r_ble_ll_ctrl_rx_phy_update_ind_eco4(void){return 0x07;}
#endif // !DEFAULT_BT_LE_2M_PHY && !DEFAULT_BT_LE_CODED_PHY
#if !DEFAULT_BT_LE_50_FEATURE_SUPPORT || !DEFAULT_BT_LE_PERIODIC_SYNC
int r_ble_ll_sync_env_init_eco4(void){return 0;}
void r_ble_ll_sync_reset_eco4(void){}
void r_ble_ll_sync_parse_ext_hdr(void){}
void r_ble_ll_sync_parse_ext_hdr_eco4(void){}
void r_ble_ll_sync_info_event(void){}
void r_ble_ll_sync_info_event_eco4(void){}
bool r_ble_ll_sync_filter_enabled(void){return 0;}
bool r_ble_ll_sync_filter_enabled_eco4(void){return 0;}
void r_ble_ll_sync_periodic_ind(void){}
void r_ble_ll_sync_periodic_ind_eco4(void){}
void r_ble_ll_sync_init_eco4(void){}
void r_ble_ll_sync_deinit_eco4(void){}
bool r_ble_ll_sync_enabled_eco4(void){return false;}
int r_ble_ll_sync_status_check(void){return 0;}
int r_ble_ll_sync_status_check_eco4(void){return 0;}
#endif // !DEFAULT_BT_LE_PERIODIC_ADV
#if !CONFIG_BT_LE_SLEEP_ENABLE
void r_ble_lll_rfmgmt_controller_sleep_en(void){};
void r_ble_lll_rfmgmt_controller_sleep_en_eco4(void){};
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){}
void r_ble_lll_rfmgmt_set_sleep_cb_eco4(void *s_cb, void *w_cb, void *s_arg, void *w_arg, uint32_t us_to_enabled){}
void r_ble_lll_rfmgmt_disable(void){}
void r_ble_lll_rfmgmt_disable_eco4(void){}
void r_ble_lll_rfmgmt_timer_exp(void){}
void r_ble_lll_rfmgmt_timer_exp_eco4(void){}
void r_ble_lll_rfmgmt_timer_reschedule(void){}
void r_ble_lll_rfmgmt_timer_reschedule_eco4(void){}
void r_ble_lll_rfmgmt_enable(void){}
void r_ble_lll_rfmgmt_enable_eco4(void){}
void r_ble_lll_rfmgmt_enable_now(void){}
void r_ble_lll_rfmgmt_enable_now_eco4(void){}
bool r_ble_lll_rfmgmt_is_enabled(void){return 0;}
bool r_ble_lll_rfmgmt_is_enabled_eco4(void){return 0;}
void r_ble_lll_rfmgmt_reset(void){}
void r_ble_lll_rfmgmt_reset_eco4(void){}
int r_ble_lll_rfmgmt_env_init(void){return 0;}
int r_ble_lll_rfmgmt_env_init_eco4(void){return 0;}
void r_ble_lll_rfmgmt_should_skip_light_sleep_check(void){}
void r_ble_lll_rfmgmt_should_skip_light_sleep_check_eco4(void){}
void r_ble_lll_rfmgmt_wake_up_overhead_set(void){}
void r_ble_lll_rfmgmt_wake_up_overhead_set_eco4(void){}
void r_ble_lll_rfmgmt_get_wakeup_delta(void){}
void r_ble_lll_rfmgmt_get_wakeup_delta_eco4(void){}
#endif // CONFIG_BT_LE_SLEEP_ENABLE
#if !CONFIG_BT_LE_DTM_ENABLED
int r_ble_lll_dtm_env_init_eco4(void){return 0;}
void r_ble_lll_dtm_reset_eco4(void){};
void r_ble_lll_dtm_rx_create_ctx(void){}
void r_ble_lll_dtm_rx_create_ctx_eco4(void){}
void r_ble_lll_dtm_rx_pkt_in_eco4(void){}
void r_ble_lll_dtm_tx_create_ctx(void){}
void r_ble_lll_dtm_tx_create_ctx_eco4(void){}
void r_ble_lll_dtm_rx_resi_get(void){}
void r_ble_lll_dtm_rx_resi_get_eco4(void){}
void r_ble_lll_dtm_rx_rssi_get(void){}
void r_ble_lll_dtm_rx_rssi_get_eco4(void){}
int r_ble_lll_dtm_status_check(void){return 0;}
int r_ble_lll_dtm_status_check_eco4(void){return 0;}
#endif // !CONFIG_BT_LE_DTM_ENABLED
#if !DEFAULT_BT_LE_TX_CCA_ENABLED
void r_ble_lll_sched_offset_update(void){}
void r_ble_lll_sched_offset_update_eco4(void){}
#endif // !DEFAULT_BT_LE_TX_CCA_ENABLED
#if !DEFAULT_BT_LE_ROLE_OBSERVER && !DEFAULT_BT_LE_ROLE_CENTROL && !DEFAULT_BT_LE_ROLE_PERIPHERAL
void r_ble_phy_set_rxwin1(void){}
void r_ble_phy_set_rxwin1_eco4(void){}
#endif // !DEFAULT_BT_LE_ROLE_CENTROL && !DEFAULT_BT_LE_ROLE_PERIPHERAL
#if !DEFAULT_BT_LE_PERIODIC_SYNC && !DEFAULT_BT_LE_ROLE_PERIPHERAL
void r_ble_ll_customize_peer_sca_set(void){}
void r_ble_ll_customize_peer_sca_set_eco4(void){}
int r_ble_ll_customize_peer_sca_get(void){return 0;}
int r_ble_ll_customize_peer_sca_get_eco4(void){return 0;}
int r_ble_ll_utils_calc_window_widening(void){return 0;}
int r_ble_ll_utils_calc_window_widening_eco4(void){return 0;}
#endif // !DEFAULT_BT_LE_PERIODIC_SYNC && !DEFAULT_BT_LE_ROLE_PERIPHERAL
#if !(CONFIG_BT_NIMBLE_ENABLED || CONFIG_BT_BLUEDROID_ENABLED)
void r_ble_vendor_hci_register(void){}
void r_ble_vendor_hci_register_eco4(void){}
void r_ble_vendor_hci_unregister(void){}
void r_ble_vendor_hci_unregister_eco4(void){}
bool r_ble_ll_hci_vendor_event_is_enabled(void){return 0;}
bool r_ble_ll_hci_vendor_event_is_enabled_eco4(void){return 0;}
void r_ble_ll_hci_vs_cmd_proc(void){}
void r_ble_ll_hci_vs_cmd_proc_eco4(void){}
void r_ble_ll_hci_vs_csa_set(void){}
void r_ble_ll_hci_vs_csa_set_eco4(void){}
void r_ble_ll_reset_config_params(void){}
void r_ble_ll_reset_config_params_eco4(void){}
#endif // !(CONFIG_BT_NIMBLE_ENABLED || CONFIG_BT_BLUEDROID_ENABLED)
+1 -1
View File
@@ -569,7 +569,7 @@ menu "Memory Settings"
config BT_NIMBLE_MEMPOOL_RUNTIME_ALLOC
bool "Support on-demand runtime memory allocation for mempool"
depends on BT_NIMBLE_ENABLED && !SOC_ESP_NIMBLE_CONTROLLER
depends on BT_NIMBLE_ENABLED && BT_NIMBLE_STATIC_TO_DYNAMIC
default n
help
When this option is enabled, mempool does not require pre-allocating memory.
+4
View File
@@ -11,6 +11,10 @@
extern "C" {
#endif
#if !CONFIG_BT_NIMBLE_ENABLED
#define MYNEWT_VAL(val) (0)
#endif // !CONFIG_BT_NIMBLE_ENABLED
#if SOC_ESP_NIMBLE_CONTROLLER && CONFIG_BT_CONTROLLER_ENABLED
struct os_mempool;
+84 -120
View File
@@ -3,7 +3,7 @@
*
* SPDX-License-Identifier: Apache-2.0
*
* SPDX-FileContributor: 2019-2022 Espressif Systems (Shanghai) CO LTD
* SPDX-FileContributor: 2019-2026 Espressif Systems (Shanghai) CO LTD
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -38,6 +38,10 @@
#include <stdbool.h>
#include "os/os.h"
#if CONFIG_BT_NIMBLE_ENABLED
#include "syscfg/syscfg.h"
#endif // CONFIG_BT_NIMBLE_ENABLED
#ifdef __cplusplus
extern "C" {
#endif
@@ -77,13 +81,30 @@ struct os_mempool {
SLIST_HEAD(,os_memblock);
/** Name for memory block */
const char *name;
#if CONFIG_BT_NIMBLE_ENABLED
#if MYNEWT_VAL(MP_BLOCK_REUSED)
/** The number of allocated blocks. */
uint16_t mp_alloc_blocks;
#endif // MYNEWT_VAL(MP_BLOCK_REUSED)
#endif // CONFIG_BT_NIMBLE_ENABLED
};
/**
* Indicates an extended mempool. Address can be safely cast to
* (struct os_mempool_ext *).
*/
#define OS_MEMPOOL_F_EXT 0x01
#define OS_MEMPOOL_F_EXT BIT(0)
/* Flag to indicate runtime allocation mode */
#define OS_MEMPOOL_F_RUNTIME BIT(1)
/* Flag to indicate reuse block for runtime allocation mode */
#define OS_MEMPOOL_F_REUSED BIT(2)
/* Flag to indicate no address range comparison */
#define OS_MEMPOOL_F_FRAG BIT(3)
/* Flag to indicate mempool source */
#define OS_MEMPOOL_F_CONTROLLER BIT(4)
#define OS_MEMPOOL_F_LOW_PRIO BIT(5)
#define OS_MEMPOOL_F_FORBID BIT(6)
#define OS_MEMPOOL_F_COMBINATION BIT(7)
struct os_mempool_ext;
@@ -108,12 +129,27 @@ struct os_mempool_ext;
typedef os_error_t os_mempool_put_fn(struct os_mempool_ext *ome, void *data,
void *arg);
/**
* Block get callback function. If configured, this callback gets executed
* whenever a block is fetched from the corresponding extended mempool.
*
* @param ome The extended mempool that a block is being
* fetched.
* @param arg Optional argument configured along with the
* callback.
*
* @return void * pointer of block, return NULL if get failed
*/
typedef void *os_mempool_get_fn(struct os_mempool_ext *ome, void *arg);
struct os_mempool_ext {
struct os_mempool mpe_mp;
/* Callback that is executed immediately when a block is freed. */
os_mempool_put_fn *mpe_put_cb;
void *mpe_put_arg;
os_mempool_get_fn *mpe_get_cb;
void *mpe_get_arg;
};
#define OS_MEMPOOL_INFO_NAME_LEN (32)
@@ -163,123 +199,6 @@ typedef __uint128_t os_membuf_t;
#define OS_MEMPOOL_BYTES(n,blksize) \
(sizeof (os_membuf_t) * OS_MEMPOOL_SIZE((n), (blksize)))
#if SOC_ESP_NIMBLE_CONTROLLER && CONFIG_BT_CONTROLLER_ENABLED
/**
* Initialize a memory pool.
*
* @param mp Pointer to a pointer to a mempool
* @param blocks The number of blocks in the pool
* @param blocks_size The size of the block, in bytes.
* @param membuf Pointer to memory to contain blocks.
* @param name Name of the pool.
*
* @return os_error_t
*/
os_error_t r_os_mempool_init(struct os_mempool *mp, uint16_t blocks,
uint32_t block_size, void *membuf, const char *name);
#define os_mempool_init r_os_mempool_init
/**
* Initializes an extended memory pool. Extended attributes (e.g., callbacks)
* are not specified when this function is called; they are assigned manually
* after initialization.
*
* @param mpe The extended memory pool to initialize.
* @param blocks The number of blocks in the pool.
* @param block_size The size of each block, in bytes.
* @param membuf Pointer to memory to contain blocks.
* @param name Name of the pool.
*
* @return os_error_t
*/
os_error_t r_os_mempool_ext_init(struct os_mempool_ext *mpe, uint16_t blocks,
uint32_t block_size, void *membuf, const char *name);
#define os_mempool_ext_init r_os_mempool_ext_init
/**
* Removes the specified mempool from the list of initialized mempools.
*
* @param mp The mempool to unregister.
*
* @return 0 on success;
* OS_INVALID_PARM if the mempool is not
* registered.
*/
os_error_t r_os_mempool_unregister(struct os_mempool *mp);
#define os_mempool_unregister r_os_mempool_unregister
/**
* Clears a memory pool.
*
* @param mp The mempool to clear.
*
* @return os_error_t
*/
os_error_t r_os_mempool_clear(struct os_mempool *mp);
#define os_mempool_clear r_os_mempool_clear
/**
* Performs an integrity check of the specified mempool. This function
* attempts to detect memory corruption in the specified memory pool.
*
* @param mp The mempool to check.
*
* @return true if the memory pool passes the integrity
* check;
* false if the memory pool is corrupt.
*/
bool r_os_mempool_is_sane(const struct os_mempool *mp);
#define os_mempool_is_sane r_os_mempool_is_sane
/**
* Checks if a memory block was allocated from the specified mempool.
*
* @param mp The mempool to check as parent.
* @param block_addr The memory block to check as child.
*
* @return 0 if the block does not belong to the mempool;
* 1 if the block does belong to the mempool.
*/
int r_os_memblock_from(const struct os_mempool *mp, const void *block_addr);
#define os_memblock_from r_os_memblock_from
/**
* Get a memory block from a memory pool
*
* @param mp Pointer to the memory pool
*
* @return void* Pointer to block if available; NULL otherwise
*/
void *r_os_memblock_get(struct os_mempool *mp);
#define os_memblock_get r_os_memblock_get
/**
* Puts the memory block back into the pool, ignoring the put callback, if any.
* This function should only be called from a put callback to free a block
* without causing infinite recursion.
*
* @param mp Pointer to memory pool
* @param block_addr Pointer to memory block
*
* @return os_error_t
*/
os_error_t r_os_memblock_put_from_cb(struct os_mempool *mp, void *block_addr);
#define os_memblock_put_from_cb r_os_memblock_put_from_cb
/**
* Puts the memory block back into the pool
*
* @param mp Pointer to memory pool
* @param block_addr Pointer to memory block
*
* @return os_error_t
*/
os_error_t r_os_memblock_put(struct os_mempool *mp, void *block_addr);
#define os_memblock_put r_os_memblock_put
#else
/**
* Initialize a memory pool.
*
@@ -294,6 +213,24 @@ os_error_t r_os_memblock_put(struct os_mempool *mp, void *block_addr);
os_error_t os_mempool_init(struct os_mempool *mp, uint16_t blocks,
uint32_t block_size, void *membuf, const char *name);
/**
* @brief Initialize a memory pool.
* INTERNAL USE ONLY
*
* @param mp Pointer to a pointer to a mempool
* @param blocks The number of blocks in the pool
* @param blocks_size The size of the block, in bytes.
* @param membuf Pointer to memory to contain blocks.
* @param name Name of the pool.
* @param flags Mempool flags
*
* @return os_error_t
*/
os_error_t
os_mempool_init_internal(struct os_mempool *mp, uint16_t blocks,
uint32_t block_size, void *membuf, const char *name,
uint8_t flags);
/**
* Initializes an extended memory pool. Extended attributes (e.g., callbacks)
* are not specified when this function is called; they are assigned manually
@@ -310,6 +247,18 @@ os_error_t os_mempool_init(struct os_mempool *mp, uint16_t blocks,
os_error_t os_mempool_ext_init(struct os_mempool_ext *mpe, uint16_t blocks,
uint32_t block_size, void *membuf, const char *name);
/**
* Assign the put and get callback for an extended memory pool.
*
* @param mpe The extended memory pool
* @param put_cb Block put callback function
* @param put_arg Argument for put callback
* @param get_cb Block put callback function
* @param get_arg Argument for get callback
*/
void os_ext_mempool_register_cb(struct os_mempool_ext *mpe, void *put_cb, void *put_arg,
void *get_cb, void *get_arg);
/**
* Removes the specified mempool from the list of initialized mempools.
*
@@ -392,7 +341,22 @@ os_error_t os_memblock_put_from_cb(struct os_mempool *mp, void *block_addr);
* @return os_error_t
*/
os_error_t os_memblock_put(struct os_mempool *mp, void *block_addr);
#endif
/**
* @brief Set the mp_flags of memory pool
*
* @param mp Pointer to memory pool
* @param flags Flags value
*/
void os_mempool_flags_set(struct os_mempool *mp, uint8_t flags);
/**
* @brief Clear the mp_flags of memory pool
*
* @param mp Pointer to memory pool
* @param flags Flags value
*/
void os_mempool_flags_clear(struct os_mempool *mp, uint8_t flags);
#ifdef __cplusplus
}
+785
View File
@@ -0,0 +1,785 @@
/*
* SPDX-FileCopyrightText: 2015-2022 The Apache Software Foundation (ASF)
*
* SPDX-License-Identifier: Apache-2.0
*
* SPDX-FileContributor: 2019-2026 Espressif Systems (Shanghai) CO LTD
*/
#include "os/os.h"
#include <string.h>
#include <assert.h>
#include <stdbool.h>
#include "mem_api.h"
#include "esp_nimble_mem.h"
#if CONFIG_BT_NIMBLE_ENABLED
#include "os/os_trace_api.h"
#include "syscfg/syscfg.h"
#include "modlog/modlog.h"
#if !MYNEWT_VAL(OS_SYSVIEW_TRACE_MEMPOOL)
#define OS_TRACE_DISABLE_FILE_API
#endif
#endif
#if CONFIG_BT_CTRL_RUN_IN_FLASH_ONLY
#define MEMPOOL_IRAM_ATTR
#else
#define MEMPOOL_IRAM_ATTR IRAM_ATTR
#endif // CONFIG_BT_CTRL_RUN_IN_FLASH_ONLY
#define OS_MEM_TRUE_BLOCK_SIZE(bsize) OS_ALIGN(bsize, OS_ALIGNMENT)
#if MYNEWT_VAL(OS_MEMPOOL_GUARD)
#define OS_MEMPOOL_TRUE_BLOCK_SIZE(mp) \
(((mp)->mp_flags & OS_MEMPOOL_F_EXT) ? \
OS_MEM_TRUE_BLOCK_SIZE(mp->mp_block_size) : \
(OS_MEM_TRUE_BLOCK_SIZE(mp->mp_block_size) + sizeof(os_membuf_t)))
#else
#define OS_MEMPOOL_TRUE_BLOCK_SIZE(mp) OS_MEM_TRUE_BLOCK_SIZE(mp->mp_block_size)
#endif
#if !MYNEWT_VAL(BLE_STATIC_TO_DYNAMIC)
STAILQ_HEAD(, os_mempool) g_os_mempool_list = STAILQ_HEAD_INITIALIZER(g_os_mempool_list);
#else
STAILQ_HEAD(, os_mempool) g_os_mempool_list;
static bool g_os_mempool_list_inited;
#endif // !MYNEWT_VAL(BLE_STATIC_TO_DYNAMIC)
#if MYNEWT_VAL(OS_MEMPOOL_POISON)
static uint32_t os_mem_poison = 0xde7ec7ed;
static_assert(sizeof(struct os_memblock) % 4 == 0, "sizeof(struct os_memblock) shall be aligned to 4");
static_assert(sizeof(os_mem_poison) == 4, "sizeof(os_mem_poison) shall be 4");
static void MEMPOOL_IRAM_ATTR
os_mempool_poison(const struct os_mempool *mp, void *start)
{
uint32_t *p;
uint32_t *end;
int sz;
sz = OS_MEM_TRUE_BLOCK_SIZE(mp->mp_block_size);
p = start;
end = p + sz / 4;
p += sizeof(struct os_memblock) / 4;
while (p < end) {
*p = os_mem_poison;
p++;
}
}
static void MEMPOOL_IRAM_ATTR
os_mempool_poison_check(const struct os_mempool *mp, void *start)
{
uint32_t *p;
uint32_t *end;
int sz;
sz = OS_MEM_TRUE_BLOCK_SIZE(mp->mp_block_size);
p = start;
end = p + sz / 4;
p += sizeof(struct os_memblock) / 4;
while (p < end) {
assert(*p == os_mem_poison);
p++;
}
}
#else
#define os_mempool_poison(mp, start)
#define os_mempool_poison_check(mp, start)
#endif
#if MYNEWT_VAL(OS_MEMPOOL_GUARD)
#define OS_MEMPOOL_GUARD_PATTERN 0xBAFF1ED1
static void MEMPOOL_IRAM_ATTR
os_mempool_guard(const struct os_mempool *mp, void *start)
{
uint32_t *tgt;
if ((mp->mp_flags & OS_MEMPOOL_F_EXT) == 0) {
tgt = (uint32_t *)((uintptr_t)start +
OS_MEM_TRUE_BLOCK_SIZE(mp->mp_block_size));
*tgt = OS_MEMPOOL_GUARD_PATTERN;
}
}
static void MEMPOOL_IRAM_ATTR
os_mempool_guard_check(const struct os_mempool *mp, void *start)
{
uint32_t *tgt;
if ((mp->mp_flags & OS_MEMPOOL_F_EXT) == 0) {
tgt = (uint32_t *)((uintptr_t)start +
OS_MEM_TRUE_BLOCK_SIZE(mp->mp_block_size));
assert(*tgt == OS_MEMPOOL_GUARD_PATTERN);
}
}
#else
#define os_mempool_guard(mp, start)
#define os_mempool_guard_check(mp, start)
#endif
#if MYNEWT_VAL(MP_RUNTIME_ALLOC)
static os_error_t os_mempool_mem_free(struct os_mempool *mp);
#endif // MYNEWT_VAL(MP_RUNTIME_ALLOC)
#if MYNEWT_VAL(BLE_STATIC_TO_DYNAMIC)
static void
os_mempool_list_ensure_init(void)
{
if (!g_os_mempool_list_inited) {
STAILQ_INIT(&g_os_mempool_list);
g_os_mempool_list_inited = true;
}
}
#endif // MYNEWT_VAL(BLE_STATIC_TO_DYNAMIC)
os_error_t
os_mempool_init_internal(struct os_mempool *mp, uint16_t blocks,
uint32_t block_size, void *membuf, const char *name,
uint8_t flags)
{
int true_block_size;
int i;
uint8_t *block_addr;
struct os_memblock *block_ptr;
/* Check for valid parameters */
if (!mp || (block_size == 0)) {
return OS_INVALID_PARM;
}
/* For runtime allocation mode, membuf can be NULL */
#if !MYNEWT_VAL(MP_RUNTIME_ALLOC)
if ((!membuf) && (blocks != 0)) {
return OS_INVALID_PARM;
}
#endif
if (membuf != NULL) {
/* Blocks need to be sized properly and memory buffer should be
* aligned
*/
if (((uint32_t)(uintptr_t)membuf & (OS_ALIGNMENT - 1)) != 0) {
return OS_MEM_NOT_ALIGNED;
}
}
/* Initialize the memory pool structure */
mp->mp_block_size = block_size;
mp->mp_num_free = blocks;
mp->mp_min_free = blocks;
mp->mp_flags = flags;
mp->mp_num_blocks = blocks;
mp->mp_membuf_addr = (uint32_t)(uintptr_t)membuf;
mp->name = name;
SLIST_FIRST(mp) = membuf;
#if MYNEWT_VAL(MP_RUNTIME_ALLOC)
if (membuf == NULL) {
/* Runtime allocation mode */
mp->mp_membuf_addr = 0;
mp->mp_flags |= OS_MEMPOOL_F_RUNTIME;
#if MYNEWT_VAL(MP_BLOCK_REUSED)
mp->mp_flags |= OS_MEMPOOL_F_REUSED;
mp->mp_alloc_blocks = 0;
#endif
SLIST_FIRST(mp) = NULL;
#if MYNEWT_VAL(BLE_STATIC_TO_DYNAMIC)
os_mempool_list_ensure_init();
#endif // MYNEWT_VAL(BLE_STATIC_TO_DYNAMIC)
/* Check if mempool is already in the list (reinitialization case) */
struct os_mempool *cur;
if (!STAILQ_EMPTY(&g_os_mempool_list)) {
STAILQ_FOREACH(cur, &g_os_mempool_list, mp_list) {
if (cur->name == mp->name) {
/* Mempool is already in the list, remove it first */
os_mempool_unregister(cur);
break;
}
}
}
STAILQ_INSERT_TAIL(&g_os_mempool_list, mp, mp_list);
return OS_OK;
}
#endif
if (blocks > 0) {
os_mempool_poison(mp, membuf);
os_mempool_guard(mp, membuf);
true_block_size = OS_MEMPOOL_TRUE_BLOCK_SIZE(mp);
/* Chain the memory blocks to the free list */
block_addr = (uint8_t *)membuf;
block_ptr = (struct os_memblock *)block_addr;
for (i = 1; i < blocks; i++) {
block_addr += true_block_size;
os_mempool_poison(mp, block_addr);
os_mempool_guard(mp, block_addr);
SLIST_NEXT(block_ptr, mb_next) = (struct os_memblock *)block_addr;
block_ptr = (struct os_memblock *)block_addr;
}
/* Last one in the list should be NULL */
SLIST_NEXT(block_ptr, mb_next) = NULL;
}
#if MYNEWT_VAL(BLE_STATIC_TO_DYNAMIC)
os_mempool_list_ensure_init();
#endif // MYNEWT_VAL(BLE_STATIC_TO_DYNAMIC)
/* Check if mempool is already in the list (reinitialization case) */
struct os_mempool *cur;
if (!STAILQ_EMPTY(&g_os_mempool_list)) {
STAILQ_FOREACH(cur, &g_os_mempool_list, mp_list) {
if (cur->name == mp->name) {
/* Mempool is already in the list, remove it first */
os_mempool_unregister(cur);
break;
}
}
}
STAILQ_INSERT_TAIL(&g_os_mempool_list, mp, mp_list);
return OS_OK;
}
os_error_t
os_mempool_init(struct os_mempool *mp, uint16_t blocks, uint32_t block_size,
void *membuf, const char *name)
{
return os_mempool_init_internal(mp, blocks, block_size, membuf, name, 0);
}
os_error_t
os_mempool_ext_init(struct os_mempool_ext *mpe, uint16_t blocks,
uint32_t block_size, void *membuf, const char *name)
{
int rc;
rc = os_mempool_init_internal(&mpe->mpe_mp, blocks, block_size, membuf,
name, OS_MEMPOOL_F_EXT);
if (rc != 0) {
return rc;
}
mpe->mpe_put_cb = NULL;
mpe->mpe_put_arg = NULL;
mpe->mpe_get_cb = NULL;
mpe->mpe_get_arg = NULL;
return 0;
}
void os_ext_mempool_register_cb(struct os_mempool_ext *mpe,
void *put_cb, void *put_arg,
void *get_cb, void *get_arg)
{
mpe->mpe_put_cb = put_cb;
mpe->mpe_put_arg = put_arg;
mpe->mpe_get_cb = get_cb;
mpe->mpe_get_arg = get_arg;
}
os_error_t
os_mempool_unregister(struct os_mempool *mp)
{
struct os_mempool *cur;
/* Remove the mempool from the global stailq. This is done manually rather
* than with `STAILQ_REMOVE` to allow for a graceful failure if the mempool
* isn't found.
*/
#if MYNEWT_VAL(BLE_STATIC_TO_DYNAMIC)
os_mempool_list_ensure_init();
#endif // MYNEWT_VAL(BLE_STATIC_TO_DYNAMIC)
cur = NULL;
if (!STAILQ_EMPTY(&g_os_mempool_list)) {
STAILQ_FOREACH(cur, &g_os_mempool_list, mp_list) {
if (cur == mp) {
break;
}
}
}
if (cur == NULL) {
return OS_INVALID_PARM;
}
#if MYNEWT_VAL(MP_RUNTIME_ALLOC)
os_mempool_mem_free(cur);
#endif // MYNEWT_VAL(MP_RUNTIME_ALLOC)
STAILQ_REMOVE(&g_os_mempool_list, cur, os_mempool, mp_list);
#if MYNEWT_VAL(BLE_STATIC_TO_DYNAMIC)
if (STAILQ_EMPTY(&g_os_mempool_list)) {
g_os_mempool_list_inited = false;
}
#endif // MYNEWT_VAL(BLE_STATIC_TO_DYNAMIC)
return 0;
}
os_error_t
os_mempool_clear(struct os_mempool *mp)
{
struct os_memblock *block_ptr;
int true_block_size;
uint8_t *block_addr;
uint16_t blocks;
if (!mp) {
return OS_INVALID_PARM;
}
#if MYNEWT_VAL(MP_RUNTIME_ALLOC)
if (os_mempool_mem_free(mp) == OS_OK) {
return OS_OK;
}
#endif // MYNEWT_VAL(MP_RUNTIME_ALLOC)
true_block_size = OS_MEMPOOL_TRUE_BLOCK_SIZE(mp);
/* cleanup the memory pool structure */
mp->mp_num_free = mp->mp_num_blocks;
mp->mp_min_free = mp->mp_num_blocks;
os_mempool_poison(mp, (void *)mp->mp_membuf_addr);
os_mempool_guard(mp, (void *)mp->mp_membuf_addr);
SLIST_FIRST(mp) = (void *)(uintptr_t)mp->mp_membuf_addr;
/* Chain the memory blocks to the free list */
block_addr = (uint8_t *)(uintptr_t)mp->mp_membuf_addr;
block_ptr = (struct os_memblock *)block_addr;
blocks = mp->mp_num_blocks;
while (blocks > 1) {
block_addr += true_block_size;
os_mempool_poison(mp, block_addr);
os_mempool_guard(mp, block_addr);
SLIST_NEXT(block_ptr, mb_next) = (struct os_memblock *)block_addr;
block_ptr = (struct os_memblock *)block_addr;
--blocks;
}
/* Last one in the list should be NULL */
SLIST_NEXT(block_ptr, mb_next) = NULL;
return OS_OK;
}
os_error_t
os_mempool_ext_clear(struct os_mempool_ext *mpe)
{
os_error_t rc;
mpe->mpe_put_cb = NULL;
mpe->mpe_put_arg = NULL;
mpe->mpe_get_cb = NULL;
mpe->mpe_get_arg = NULL;
rc = os_mempool_clear(&mpe->mpe_mp);
#if MYNEWT_VAL(MP_RUNTIME_ALLOC)
mpe->mpe_mp.mp_flags &= ~OS_MEMPOOL_F_EXT;
#else
mpe->mpe_mp.mp_flags = 0;
#endif
return rc;
}
bool
os_mempool_is_sane(const struct os_mempool *mp)
{
struct os_memblock *block;
#if MYNEWT_VAL(MP_RUNTIME_ALLOC)
/* Runtime mode cannot verify sanity */
if (mp->mp_flags & OS_MEMPOOL_F_RUNTIME) {
assert(0);
}
#endif
/* Verify that each block in the free list belongs to the mempool. */
SLIST_FOREACH(block, mp, mb_next) {
if (!os_memblock_from(mp, block)) {
return false;
}
os_mempool_poison_check(mp, block);
os_mempool_guard_check(mp, block);
}
return true;
}
int MEMPOOL_IRAM_ATTR
os_memblock_from(const struct os_mempool *mp, const void *block_addr)
{
uint32_t true_block_size;
uintptr_t baddr32;
uint32_t end;
#if MYNEWT_VAL(MP_RUNTIME_ALLOC)
/* Runtime allocation mode doesn't support from */
if (mp->mp_flags & OS_MEMPOOL_F_RUNTIME) {
assert(0);
}
#endif
static_assert(sizeof block_addr == sizeof baddr32,
"Pointer to void must be 32-bits.");
baddr32 = (uint32_t)(uintptr_t)block_addr;
true_block_size = OS_MEMPOOL_TRUE_BLOCK_SIZE(mp);
end = mp->mp_membuf_addr + (mp->mp_num_blocks * true_block_size);
/* Check that the block is in the memory buffer range. */
if ((baddr32 < mp->mp_membuf_addr) || (baddr32 >= end)) {
return 0;
}
/* All freed blocks should be on true block size boundaries! */
if (!(mp->mp_flags & OS_MEMPOOL_F_COMBINATION) &&
((baddr32 - mp->mp_membuf_addr) % true_block_size) != 0) {
return 0;
}
return 1;
}
void * MEMPOOL_IRAM_ATTR
os_memblock_get(struct os_mempool *mp)
{
os_sr_t sr;
struct os_mempool_ext *mpe;
struct os_memblock *block;
/* Check to make sure they passed in a memory pool (or something) */
block = NULL;
if (mp && mp->mp_flags & OS_MEMPOOL_F_EXT) {
mpe = (struct os_mempool_ext *)mp;
if (mpe->mpe_get_cb != NULL) {
block = mpe->mpe_get_cb(mpe, mpe->mpe_get_arg);
return block;
}
}
#if MYNEWT_VAL(MP_RUNTIME_ALLOC)
/* Runtime allocation mode */
if (mp && mp->mp_flags & OS_MEMPOOL_F_RUNTIME) {
bool need_alloc = false;
void *allocated_block;
uint32_t alloc_size;
OS_ENTER_CRITICAL(sr);
if (mp->mp_num_free) {
#if MYNEWT_VAL(MP_BLOCK_REUSED)
if (mp->mp_flags & OS_MEMPOOL_F_REUSED) {
if (!SLIST_EMPTY(mp)) {
block = SLIST_FIRST(mp);
SLIST_REMOVE_HEAD(mp, mb_next);
} else {
assert(mp->mp_alloc_blocks < mp->mp_num_blocks);
need_alloc = true;
mp->mp_alloc_blocks++;
}
} else
#endif
{
need_alloc = true;
}
/* Decrement number free by 1 */
mp->mp_num_free--;
if (mp->mp_min_free > mp->mp_num_free) {
mp->mp_min_free = mp->mp_num_free;
}
}
OS_EXIT_CRITICAL(sr);
/* Allocate outside critical section to avoid holding lock too long */
if (need_alloc) {
alloc_size = OS_MEMPOOL_TRUE_BLOCK_SIZE(mp);
allocated_block = nimble_platform_mem_malloc(alloc_size);
if (allocated_block) {
/* Initialize poison and guard */
os_mempool_poison(mp, allocated_block);
os_mempool_guard(mp, allocated_block);
/* Save mempool pointer for block */
block = (struct os_memblock *)(allocated_block);
} else {
// Should not happen
OS_ENTER_CRITICAL(sr);
mp->mp_num_free++;
if (mp->mp_flags & OS_MEMPOOL_F_REUSED) {
mp->mp_alloc_blocks--;
}
OS_EXIT_CRITICAL(sr);
}
} else if (block) {
os_mempool_poison_check(mp, block);
os_mempool_guard_check(mp, block);
}
return block;
}
#endif
if (mp) {
OS_ENTER_CRITICAL(sr);
/* Check for any free */
if (mp->mp_num_free) {
/* Get a free block */
block = SLIST_FIRST(mp);
/* Set new free list head */
SLIST_FIRST(mp) = SLIST_NEXT(block, mb_next);
/* Decrement number free by 1 */
mp->mp_num_free--;
if (mp->mp_min_free > mp->mp_num_free) {
mp->mp_min_free = mp->mp_num_free;
}
}
OS_EXIT_CRITICAL(sr);
if (block) {
os_mempool_poison_check(mp, block);
os_mempool_guard_check(mp, block);
}
}
return (void *)block;
}
os_error_t MEMPOOL_IRAM_ATTR
os_memblock_put_from_cb(struct os_mempool *mp, void *block_addr)
{
os_sr_t sr;
struct os_memblock *block;
#if MYNEWT_VAL(MP_RUNTIME_ALLOC)
if (mp->mp_flags & OS_MEMPOOL_F_RUNTIME) {
bool need_free = true;
os_mempool_guard_check(mp, block_addr);
/* Runtime allocation mode - free directly */
OS_ENTER_CRITICAL(sr);
#if MYNEWT_VAL(MP_BLOCK_REUSED)
if (mp->mp_flags & OS_MEMPOOL_F_REUSED) {
block = (struct os_memblock *)block_addr;
SLIST_INSERT_HEAD(mp, block, mb_next);
need_free = false;
}
#endif
mp->mp_num_free++;
assert(mp->mp_num_blocks >= mp->mp_num_free);
OS_EXIT_CRITICAL(sr);
/* Free outside critical section */
if (need_free) {
nimble_platform_mem_free(block_addr);
} else {
os_mempool_poison(mp, block_addr);
}
return OS_OK;
}
#endif
/* Validate that the block belongs to this mempool */
if (!(mp->mp_flags & OS_MEMPOOL_F_FRAG) &&
!os_memblock_from(mp, block_addr)) {
return OS_INVALID_PARM;
}
os_mempool_guard_check(mp, block_addr);
os_mempool_poison(mp, block_addr);
block = (struct os_memblock *)block_addr;
OS_ENTER_CRITICAL(sr);
/* Check for duplicate free - verify block is not already in free list */
{
struct os_memblock *cur;
SLIST_FOREACH(cur, mp, mb_next) {
if (cur == block) {
OS_EXIT_CRITICAL(sr);
return OS_INVALID_PARM;
}
}
}
/* Check that the number free doesn't exceed number blocks */
if (mp->mp_num_free >= mp->mp_num_blocks) {
OS_EXIT_CRITICAL(sr);
return OS_INVALID_PARM;
}
/* Chain current free list pointer to this block; make this block head */
SLIST_NEXT(block, mb_next) = SLIST_FIRST(mp);
SLIST_FIRST(mp) = block;
/* Increment number free */
mp->mp_num_free++;
OS_EXIT_CRITICAL(sr);
return OS_OK;
}
os_error_t MEMPOOL_IRAM_ATTR
os_memblock_put(struct os_mempool *mp, void *block_addr)
{
struct os_mempool_ext *mpe;
os_error_t ret;
#if MYNEWT_VAL(OS_MEMPOOL_CHECK)
struct os_memblock *block;
#endif
/* Make sure parameters are valid */
if ((mp == NULL) || (block_addr == NULL)) {
ret = OS_INVALID_PARM;
goto done;
}
#if MYNEWT_VAL(OS_MEMPOOL_CHECK)
#if MYNEWT_VAL(MP_RUNTIME_ALLOC)
if (!(mp->mp_flags & OS_MEMPOOL_F_RUNTIME))
#endif
{
/* Check that the block we are freeing is a valid block! */
assert(os_memblock_from(mp, block_addr));
}
/*
* Check for duplicate free.
*/
SLIST_FOREACH(block, mp, mb_next) {
assert(block != (struct os_memblock *)block_addr);
}
#endif
/* If this is an extended mempool with a put callback, call the callback
* instead of freeing the block directly.
*/
if (mp->mp_flags & OS_MEMPOOL_F_EXT) {
mpe = (struct os_mempool_ext *)mp;
if (mpe->mpe_put_cb != NULL) {
ret = mpe->mpe_put_cb(mpe, block_addr, mpe->mpe_put_arg);
goto done;
}
}
/* No callback; free the block. */
ret = os_memblock_put_from_cb(mp, block_addr);
done:
return ret;
}
struct os_mempool *
os_mempool_info_get_next(struct os_mempool *mp, struct os_mempool_info *omi)
{
struct os_mempool *cur;
#if MYNEWT_VAL(BLE_STATIC_TO_DYNAMIC)
os_mempool_list_ensure_init();
#endif // MYNEWT_VAL(BLE_STATIC_TO_DYNAMIC)
if (mp == NULL) {
cur = STAILQ_FIRST(&g_os_mempool_list);
} else {
cur = STAILQ_NEXT(mp, mp_list);
}
if (cur == NULL) {
return (NULL);
}
omi->omi_block_size = cur->mp_block_size;
omi->omi_num_blocks = cur->mp_num_blocks;
omi->omi_num_free = cur->mp_num_free;
omi->omi_min_free = cur->mp_min_free;
strncpy(omi->omi_name, cur->name, sizeof(omi->omi_name) - 1);
omi->omi_name[sizeof(omi->omi_name) - 1] = '\0';
return (cur);
}
void
os_mempool_flags_set(struct os_mempool *mp, uint8_t flags)
{
mp->mp_flags |= flags;
}
void
os_mempool_flags_clear(struct os_mempool *mp, uint8_t flags)
{
mp->mp_flags &= ~flags;
}
void
os_mempool_module_init(void)
{
#if MYNEWT_VAL(BLE_STATIC_TO_DYNAMIC)
os_mempool_list_ensure_init();
#endif // MYNEWT_VAL(BLE_STATIC_TO_DYNAMIC)
}
#if MYNEWT_VAL(MP_RUNTIME_ALLOC)
static os_error_t
os_mempool_mem_free(struct os_mempool *mp)
{
/* For runtime allocation mode, check whether all blocks have been freed */
if (!(mp->mp_flags & OS_MEMPOOL_F_RUNTIME)) {
return OS_EINVAL;
}
/* NOTE: if mempool gets cleared before all mem block is retrieved, it may leads to mem trampling */
assert(mp->mp_num_free == mp->mp_num_blocks);
#if MYNEWT_VAL(MP_BLOCK_REUSED)
struct os_memblock *block_ptr;
/* For block reused mode, free all allocated blocks */
if (mp->mp_flags & OS_MEMPOOL_F_REUSED) {
uint16_t cnt;
for (cnt = 0; cnt < mp->mp_alloc_blocks; cnt ++) {
block_ptr = SLIST_FIRST(mp);
if (block_ptr) {
assert(block_ptr);
SLIST_REMOVE_HEAD(mp, mb_next);
nimble_platform_mem_free(block_ptr);
}
}
mp->mp_alloc_blocks = 0;
}
#endif
/* Only reset statistics */
SLIST_FIRST(mp) = NULL;
mp->mp_min_free = mp->mp_num_blocks;
return OS_OK;
}
#endif
void
os_mempool_deinit(bool is_controller)
{
struct os_mempool *mp = NULL;
struct os_mempool *next = NULL;
mp = STAILQ_FIRST(&g_os_mempool_list);
// All mempool blocks should be reclaimed and mempool removed from mempool list after nimble deinit
while (mp) {
if (is_controller == !!(mp->mp_flags & OS_MEMPOOL_F_CONTROLLER)) {
next = STAILQ_NEXT(mp, mp_list);
os_mempool_unregister(mp);
mp = next;
} else {
mp = STAILQ_NEXT(mp, mp_list);
}
}
}
+114 -2
View File
@@ -3,7 +3,7 @@
*
* SPDX-License-Identifier: Apache-2.0
*
* SPDX-FileContributor: 2019-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileContributor: 2019-2026 Espressif Systems (Shanghai) CO LTD
*/
#include <assert.h>
@@ -62,9 +62,11 @@ static STAILQ_HEAD(, os_mbuf_pool) g_msys_pool_list =
SYSINIT_MSYS_1_MEMBLOCK_SIZE)
#if !CONFIG_BT_LE_MSYS_INIT_IN_CONTROLLER
#if !CONFIG_BT_NIMBLE_STATIC_TO_DYNAMIC
static os_membuf_t *os_msys_init_1_data;
static struct os_mbuf_pool os_msys_init_1_mbuf_pool;
static struct os_mempool os_msys_init_1_mempool;
#endif // !CONFIG_BT_NIMBLE_STATIC_TO_DYNAMIC
#endif // !CONFIG_BT_LE_MSYS_INIT_IN_CONTROLLER
#endif
@@ -76,12 +78,59 @@ static struct os_mempool os_msys_init_1_mempool;
SYSINIT_MSYS_2_MEMBLOCK_SIZE)
#if !CONFIG_BT_LE_MSYS_INIT_IN_CONTROLLER
#if !CONFIG_BT_NIMBLE_STATIC_TO_DYNAMIC
static os_membuf_t *os_msys_init_2_data;
static struct os_mbuf_pool os_msys_init_2_mbuf_pool;
static struct os_mempool os_msys_init_2_mempool;
#endif // !CONFIG_BT_NIMBLE_STATIC_TO_DYNAMIC
#endif // !CONFIG_BT_LE_MSYS_INIT_IN_CONTROLLER
#endif
#if !CONFIG_BT_LE_MSYS_INIT_IN_CONTROLLER && CONFIG_BT_NIMBLE_STATIC_TO_DYNAMIC
/* Context structure holding all MSYS resources */
typedef struct {
#if OS_MSYS_1_BLOCK_COUNT > 0
os_membuf_t *init_1_data;
struct os_mbuf_pool init_1_mbuf_pool;
struct os_mempool init_1_mempool;
#endif
#if OS_MSYS_2_BLOCK_COUNT > 0
os_membuf_t *init_2_data;
struct os_mbuf_pool init_2_mbuf_pool;
struct os_mempool init_2_mempool;
#endif
} os_msys_ctx_t;
static os_msys_ctx_t *os_msys_ctx = NULL;
#if OS_MSYS_1_BLOCK_COUNT > 0
#define os_msys_init_1_data (os_msys_ctx->init_1_data)
#define os_msys_init_1_mbuf_pool (os_msys_ctx->init_1_mbuf_pool)
#define os_msys_init_1_mempool (os_msys_ctx->init_1_mempool)
#endif // OS_MSYS_1_BLOCK_COUNT
#if OS_MSYS_2_BLOCK_COUNT > 0
#define os_msys_init_2_data (os_msys_ctx->init_2_data)
#define os_msys_init_2_mbuf_pool (os_msys_ctx->init_2_mbuf_pool)
#define os_msys_init_2_mempool (os_msys_ctx->init_2_mempool)
#endif // OS_MSYS_2_BLOCK_COUNT
static int
ble_os_msys_ensure_ctx(void)
{
if(os_msys_ctx) {
return 0;
}
os_msys_ctx = nimble_platform_mem_calloc(1, sizeof(*os_msys_ctx));
if(!os_msys_ctx) {
return -1;
}
return 0;
}
#endif // !CONFIG_BT_LE_MSYS_INIT_IN_CONTROLLER && CONFIG_BT_NIMBLE_STATIC_TO_DYNAMIC
#if CONFIG_BT_LE_MSYS_INIT_IN_CONTROLLER
extern int r_esp_ble_msys_init(uint16_t msys_size1, uint16_t msys_size2, uint16_t msys_cnt1, uint16_t msys_cnt2, uint8_t from_heap);
extern void r_esp_ble_msys_deinit(void);
@@ -168,6 +217,44 @@ os_msys_init_once(void *data, struct os_mempool *mempool,
int
os_msys_buf_alloc(void)
{
#if CONFIG_BT_NIMBLE_STATIC_TO_DYNAMIC
if (ble_os_msys_ensure_ctx()){
return ESP_FAIL;
}
#endif // CONFIG_BT_NIMBLE_STATIC_TO_DYNAMIC
#if MYNEWT_VAL(MP_RUNTIME_ALLOC)
return ESP_OK;
#endif
#if CONFIG_BT_NIMBLE_STATIC_TO_DYNAMIC
#if OS_MSYS_1_BLOCK_COUNT > 0
if (!os_msys_ctx->init_1_data) {
os_msys_ctx->init_1_data = nimble_platform_mem_calloc(1, (sizeof(os_membuf_t) * SYSINIT_MSYS_1_MEMPOOL_SIZE));
if(!os_msys_ctx->init_1_data){
nimble_platform_mem_free(os_msys_ctx);
os_msys_ctx = NULL;
return ESP_FAIL;
}
}
#endif
#if OS_MSYS_2_BLOCK_COUNT > 0
if (!os_msys_ctx->init_2_data) {
os_msys_ctx->init_2_data = nimble_platform_mem_calloc(1, (sizeof(os_membuf_t) * SYSINIT_MSYS_2_MEMPOOL_SIZE));
if(!os_msys_ctx->init_2_data) {
#if OS_MSYS_1_BLOCK_COUNT > 0
nimble_platform_mem_free(os_msys_ctx->init_1_data);
os_msys_ctx->init_1_data = NULL;
#endif
nimble_platform_mem_free(os_msys_ctx);
os_msys_ctx = NULL;
return ESP_FAIL;
}
}
#endif
#else
#if OS_MSYS_1_BLOCK_COUNT > 0
os_msys_init_1_data = (os_membuf_t *)nimble_platform_mem_calloc(1, (sizeof(os_membuf_t) * SYSINIT_MSYS_1_MEMPOOL_SIZE));
if (!os_msys_init_1_data) {
@@ -185,6 +272,7 @@ os_msys_buf_alloc(void)
return ESP_ERR_NO_MEM;
}
#endif
#endif // CONFIG_BT_NIMBLE_STATIC_TO_DYNAMIC
return ESP_OK;
}
@@ -192,16 +280,40 @@ os_msys_buf_alloc(void)
void
os_msys_buf_free(void)
{
#if CONFIG_BT_NIMBLE_STATIC_TO_DYNAMIC
if (os_msys_ctx) {
#if OS_MSYS_1_BLOCK_COUNT > 0
if (os_msys_ctx->init_1_data) {
nimble_platform_mem_free(os_msys_ctx->init_1_data);
os_msys_ctx->init_1_data = NULL;
}
os_mempool_unregister(&os_msys_ctx->init_1_mempool);
#endif
#if OS_MSYS_2_BLOCK_COUNT > 0
if (os_msys_ctx->init_2_data) {
nimble_platform_mem_free(os_msys_ctx->init_2_data);
os_msys_ctx->init_2_data = NULL;
}
os_mempool_unregister(&os_msys_ctx->init_2_mempool);
#endif
nimble_platform_mem_free(os_msys_ctx);
os_msys_ctx = NULL;
}
#else
#if OS_MSYS_1_BLOCK_COUNT > 0
nimble_platform_mem_free(os_msys_init_1_data);
os_msys_init_1_data = NULL;
os_mempool_unregister(&os_msys_init_1_mempool);
#endif
#if OS_MSYS_2_BLOCK_COUNT > 0
nimble_platform_mem_free(os_msys_init_2_data);
os_msys_init_2_data = NULL;
os_mempool_unregister(&os_msys_init_1_mempool);
#endif
#endif // CONFIG_BT_NIMBLE_STATIC_TO_DYNAMIC
}
void os_msys_init(void)
@@ -165,13 +165,10 @@ npl_freertos_eventq_deinit(struct ble_npl_eventq *evq)
{
struct ble_npl_eventq_freertos *eventq = (struct ble_npl_eventq_freertos *)evq->eventq;
#if CONFIG_BT_NIMBLE_STATIC_TO_DYNAMIC
/* Deinit can be invoked twice without init . Handle this case */
if (eventq == NULL) {
return;
}
#endif
BLE_LL_ASSERT(eventq);
vQueueDelete(eventq->q);
#if OS_MEM_ALLOC
@@ -47,6 +47,7 @@ static void
hci_driver_util_memory_deinit(void)
{
if (s_hci_driver_util_env.tx_entry_pool) {
os_mempool_unregister(s_hci_driver_util_env.tx_entry_pool);
free(s_hci_driver_util_env.tx_entry_pool);
s_hci_driver_util_env.tx_entry_pool = NULL;
}
@@ -35,8 +35,8 @@ r_ble_controller_get_rom_compile_version = 0x40000ac4;
//r_ble_hci_ram_reset = 0x40000ad8;
//r_ble_hci_ram_set_acl_free_cb = 0x40000adc;
//r_ble_hci_trans_acl_buf_alloc = 0x40000ae0;
r_ble_hci_trans_buf_alloc = 0x40000ae4;
r_ble_hci_trans_buf_free = 0x40000ae8;
//r_ble_hci_trans_buf_alloc = 0x40000ae4;
//r_ble_hci_trans_buf_free = 0x40000ae8;
r_ble_hci_trans_cfg_hs = 0x40000aec;
r_ble_hci_trans_cfg_ll = 0x40000af0;
r_ble_hci_trans_deinit = 0x40000af4;
@@ -409,7 +409,7 @@ r_ble_ll_init_alloc_conn_comp_ev = 0x400010ac;
r_ble_ll_init_get_conn_comp_ev = 0x400010b0;
r_ble_ll_init_rx_pkt_in = 0x400010b4;
r_ble_ll_is_addr_empty = 0x400010b8;
r_ble_ll_is_controller_busy = 0x400010bc;
//r_ble_ll_is_controller_busy = 0x400010bc;
r_ble_ll_is_on_resolv_list = 0x400010c0;
r_ble_ll_is_our_devaddr = 0x400010c4;
r_ble_ll_is_rpa = 0x400010c8;
@@ -477,7 +477,7 @@ r_ble_ll_scan_add_scan_rsp_adv = 0x400011bc;
r_ble_ll_scan_adv_decode_addr = 0x400011c0;
r_ble_ll_scan_aux_data_ref = 0x400011c4;
r_ble_ll_scan_aux_data_unref = 0x400011c8;
//r_ble_ll_scan_can_chg_whitelist = 0x400011cc;
r_ble_ll_scan_can_chg_whitelist = 0x400011cc;
r_ble_ll_scan_check_periodic_sync = 0x400011d0;
r_ble_ll_scan_classify_filter_aux_init = 0x400011d4;
r_ble_ll_scan_classify_filter_init = 0x400011d8;
@@ -793,7 +793,7 @@ r_ble_lll_scan_deinit = 0x400016ac;
r_ble_lll_scan_duration_period_timers_restart = 0x400016b0;
r_ble_lll_scan_duration_period_timers_stop = 0x400016b4;
r_ble_lll_scan_duration_timer_cb = 0x400016b8;
//r_ble_lll_scan_event_proc = 0x400016bc;
r_ble_lll_scan_event_proc = 0x400016bc;
r_ble_lll_scan_ext_adv_init = 0x400016c0;
r_ble_lll_scan_halt = 0x400016c4;
r_ble_lll_scan_has_sent_scan_req = 0x400016c8;
@@ -30,8 +30,8 @@ r_ble_controller_get_rom_compile_version = 0x40000ac4;
//r_ble_hci_ram_reset = 0x40000ad8;
//r_ble_hci_ram_set_acl_free_cb = 0x40000adc;
//r_ble_hci_trans_acl_buf_alloc = 0x40000ae0;
r_ble_hci_trans_buf_alloc = 0x40000ae4;
r_ble_hci_trans_buf_free = 0x40000ae8;
//r_ble_hci_trans_buf_alloc = 0x40000ae4;
//r_ble_hci_trans_buf_free = 0x40000ae8;
r_ble_hci_trans_cfg_hs = 0x40000aec;
r_ble_hci_trans_cfg_ll = 0x40000af0;
//r_ble_hci_trans_init = 0x40000afc;
@@ -327,7 +327,7 @@ r_ble_ll_hw_error = 0x400010a4;
r_ble_ll_init_alloc_conn_comp_ev = 0x400010ac;
r_ble_ll_init_get_conn_comp_ev = 0x400010b0;
r_ble_ll_is_addr_empty = 0x400010b8;
r_ble_ll_is_controller_busy = 0x400010bc;
//r_ble_ll_is_controller_busy = 0x400010bc;
r_ble_ll_is_on_resolv_list = 0x400010c0;
r_ble_ll_is_our_devaddr = 0x400010c4;
r_ble_ll_is_rpa = 0x400010c8;
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -114,7 +114,9 @@ ext_bleprph_advertise(void)
memset (&params, 0, sizeof(params));
/* enable connectable advertising */
#if NIMBLE_BLE_CONNECT
params.connectable = 1;
#endif // NIMBLE_BLE_CONNECT
/* advertise using random addr */
params.own_addr_type = own_addr_type;
@@ -193,11 +195,13 @@ bleprph_advertise(void)
fields.tx_pwr_lvl_is_present = 1;
fields.tx_pwr_lvl = BLE_HS_ADV_TX_PWR_LVL_AUTO;
#if CONFIG_BT_NIMBLE_GAP_SERVICE
const char *name;
name = ble_svc_gap_device_name();
fields.name = (uint8_t *)name;
fields.name_len = strlen(name);
fields.name_is_complete = 1;
#endif
fields.uuids16 = (ble_uuid16_t[]) {
BLE_UUID16_INIT(GATT_SVR_SVC_ALERT_UUID)
@@ -420,9 +424,9 @@ bleprph_gap_event(struct ble_gap_event *event, void *arg)
case BLE_GAP_EVENT_PASSKEY_ACTION:
ESP_LOGI(tag, "PASSKEY_ACTION_EVENT started ");
#if NIMBLE_BLE_CONNECT && NIMBLE_BLE_SM
struct ble_sm_io pkey = {0};
int key = 0;
if (event->passkey.params.action == BLE_SM_IOACT_DISP) {
pkey.action = event->passkey.params.action;
/* WARNING: Hardcoded passkey for demonstration only.
@@ -463,6 +467,7 @@ bleprph_gap_event(struct ble_gap_event *event, void *arg)
rc = ble_sm_inject_io(event->passkey.conn_handle, &pkey);
ESP_LOGI(tag, "ble_sm_inject_io result: %d", rc);
}
#endif // NIMBLE_BLE_CONNECT && NIMBLE_BLE_SM
return 0;
#if CONFIG_EXAMPLE_SLEEP_WAKEUP
@@ -2,4 +2,4 @@
# Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap
nvs, data, nvs, , 0x6000,
phy_init, data, phy, , 0x1000,
factory, app, factory, , 0x140000,
factory, app, factory, , 0x141000,
1 # Name, Type, SubType, Offset, Size, Flags
2 # Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap
3 nvs, data, nvs, , 0x6000,
4 phy_init, data, phy, , 0x1000,
5 factory, app, factory, , 0x140000, factory, app, factory, , 0x141000,