From 5c96decc195c48b0bac03124a746e32f9ac405e9 Mon Sep 17 00:00:00 2001 From: Jin Chen Date: Fri, 20 Mar 2026 17:07:38 +0800 Subject: [PATCH 1/7] feat(ble): make env init function cuttable on ESP32-C2 (cherry picked from commit 5ec82368ba0787b18b09cc4082799045022bd210) Co-authored-by: cjin --- components/bt/CMakeLists.txt | 6 +- components/bt/controller/esp32c2/ble.c | 2 + components/bt/controller/esp32c2/bt.c | 3 - components/bt/controller/esp32c2/dummy.c | 310 +++++++++++++++++- .../esp32c2/ld/esp32c2.rom.ble-eco4.ld | 10 +- .../esp_rom/esp32c2/ld/esp32c2.rom.ble.ld | 6 +- 6 files changed, 321 insertions(+), 16 deletions(-) diff --git a/components/bt/CMakeLists.txt b/components/bt/CMakeLists.txt index deefb9f03a..45e8aa4891 100644 --- a/components/bt/CMakeLists.txt +++ b/components/bt/CMakeLists.txt @@ -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) diff --git a/components/bt/controller/esp32c2/ble.c b/components/bt/controller/esp32c2/ble.c index 6dfb56e288..27ff2130a2 100644 --- a/components/bt/controller/esp32c2/ble.c +++ b/components/bt/controller/esp32c2/ble.c @@ -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 diff --git a/components/bt/controller/esp32c2/bt.c b/components/bt/controller/esp32c2/bt.c index 1fea1a19ae..ce5d61d9ce 100644 --- a/components/bt/controller/esp32c2/bt.c +++ b/components/bt/controller/esp32c2/bt.c @@ -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 ************************************************************************ */ diff --git a/components/bt/controller/esp32c2/dummy.c b/components/bt/controller/esp32c2/dummy.c index b6ece60ac9..507872f9b7 100644 --- a/components/bt/controller/esp32c2/dummy.c +++ b/components/bt/controller/esp32c2/dummy.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -318,3 +318,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){} +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) diff --git a/components/esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld b/components/esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld index bf4efb71fd..6f41a006bc 100644 --- a/components/esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld +++ b/components/esp_rom/esp32c2/ld/esp32c2.rom.ble-eco4.ld @@ -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; diff --git a/components/esp_rom/esp32c2/ld/esp32c2.rom.ble.ld b/components/esp_rom/esp32c2/ld/esp32c2.rom.ble.ld index 576b3e3b8d..83356ce1d2 100644 --- a/components/esp_rom/esp32c2/ld/esp32c2.rom.ble.ld +++ b/components/esp_rom/esp32c2/ld/esp32c2.rom.ble.ld @@ -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; From beb32e63cbd456500f3e1f39315a72496658545c Mon Sep 17 00:00:00 2001 From: Jin Chen Date: Fri, 20 Mar 2026 17:07:38 +0800 Subject: [PATCH 2/7] change(ble): [AUTO_MR] Update lib_esp32c5 to 913c704d (cherry picked from commit 739cb8e00dcd54f0b78ca1a4202fa82559df1c3f) Co-authored-by: zhaoweiliang --- components/bt/controller/lib_esp32c5/esp32c5-bt-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32c5/esp32c5-bt-lib b/components/bt/controller/lib_esp32c5/esp32c5-bt-lib index 77c67a4d06..8903f67002 160000 --- a/components/bt/controller/lib_esp32c5/esp32c5-bt-lib +++ b/components/bt/controller/lib_esp32c5/esp32c5-bt-lib @@ -1 +1 @@ -Subproject commit 77c67a4d06c95113a2d1766892cde59f5af744af +Subproject commit 8903f670023bff58180abe39431a55a1ea1a67c5 From 27009cf2b655c5103a08c34dbfad66ce09ebd906 Mon Sep 17 00:00:00 2001 From: Jin Chen Date: Fri, 20 Mar 2026 17:07:38 +0800 Subject: [PATCH 3/7] change(ble): [AUTO_MR] Update lib_esp32c6 to 913c704d (cherry picked from commit 06010a8b791cc5f68203f751e17052bf7e2440c7) Co-authored-by: zhaoweiliang --- components/bt/controller/lib_esp32c6/esp32c6-bt-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32c6/esp32c6-bt-lib b/components/bt/controller/lib_esp32c6/esp32c6-bt-lib index 9d05fc931a..47becdd678 160000 --- a/components/bt/controller/lib_esp32c6/esp32c6-bt-lib +++ b/components/bt/controller/lib_esp32c6/esp32c6-bt-lib @@ -1 +1 @@ -Subproject commit 9d05fc931ae771de52de7e4b4c7090f5b3ec0ec4 +Subproject commit 47becdd678e66f2c0cc9aaf301f9196ec27a68f1 From 741f0f16dabba446103f4861c73ece458f76ef36 Mon Sep 17 00:00:00 2001 From: Jin Chen Date: Fri, 20 Mar 2026 17:07:39 +0800 Subject: [PATCH 4/7] change(ble): [AUTO_MR] Update lib_esp32h2 to 913c704d (cherry picked from commit a8d705ff7ab6df96726a0be8dbe6cfd0c52b3649) Co-authored-by: zhaoweiliang --- components/bt/controller/lib_esp32h2/esp32h2-bt-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32h2/esp32h2-bt-lib b/components/bt/controller/lib_esp32h2/esp32h2-bt-lib index 126dbfeec7..8b9bd1e73d 160000 --- a/components/bt/controller/lib_esp32h2/esp32h2-bt-lib +++ b/components/bt/controller/lib_esp32h2/esp32h2-bt-lib @@ -1 +1 @@ -Subproject commit 126dbfeec7e7291458ce6ff8f9297e46f8946733 +Subproject commit 8b9bd1e73d4d7d9d7ce08ef3a538edcac10e7235 From a22bdd40610e32b2f3fa625f9cb533afb5af3dd0 Mon Sep 17 00:00:00 2001 From: zhaoweiliang Date: Thu, 12 Mar 2026 12:14:03 +0800 Subject: [PATCH 5/7] change(ble): [AUTO_MR] Update lib_esp32c2 to b8594335 --- components/bt/controller/lib_esp32c2/esp32c2-bt-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32c2/esp32c2-bt-lib b/components/bt/controller/lib_esp32c2/esp32c2-bt-lib index 1b0f5aac0f..a1e63f9079 160000 --- a/components/bt/controller/lib_esp32c2/esp32c2-bt-lib +++ b/components/bt/controller/lib_esp32c2/esp32c2-bt-lib @@ -1 +1 @@ -Subproject commit 1b0f5aac0fcf91ea042c781e6da10a528ca0da03 +Subproject commit a1e63f9079c48dbb01033f7930ba09f9336ea6ca From 8aa53a7bbdd49520cc5ec651c3c50c9255835990 Mon Sep 17 00:00:00 2001 From: cjin Date: Fri, 6 Mar 2026 10:51:28 +0800 Subject: [PATCH 6/7] feat(ble): supported ble mempool run time allocation for esp ip chips --- components/bt/CMakeLists.txt | 3 +- components/bt/controller/esp32c2/ble_dummy.h | 312 ------- components/bt/controller/esp32c2/dummy.c | 3 +- components/bt/host/nimble/Kconfig.in | 2 +- components/bt/host/nimble/nimble | 2 +- components/bt/porting/include/mem_api.h | 4 + components/bt/porting/include/os/os_mempool.h | 204 ++--- components/bt/porting/mem/os_mempool.c | 785 ++++++++++++++++++ components/bt/porting/mem/os_msys_init.c | 116 ++- .../npl/freertos/src/npl_os_freertos.c | 3 - .../transport/driver/common/hci_driver_util.c | 1 + .../bluetooth/nimble/power_save/main/main.c | 9 +- 12 files changed, 1001 insertions(+), 443 deletions(-) delete mode 100644 components/bt/controller/esp32c2/ble_dummy.h create mode 100644 components/bt/porting/mem/os_mempool.c diff --git a/components/bt/CMakeLists.txt b/components/bt/CMakeLists.txt index 45e8aa4891..7123c95766 100644 --- a/components/bt/CMakeLists.txt +++ b/components/bt/CMakeLists.txt @@ -695,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" ) @@ -906,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" diff --git a/components/bt/controller/esp32c2/ble_dummy.h b/components/bt/controller/esp32c2/ble_dummy.h deleted file mode 100644 index 8d38b84d26..0000000000 --- a/components/bt/controller/esp32c2/ble_dummy.h +++ /dev/null @@ -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_ diff --git a/components/bt/controller/esp32c2/dummy.c b/components/bt/controller/esp32c2/dummy.c index 507872f9b7..819a3ed1b2 100644 --- a/components/bt/controller/esp32c2/dummy.c +++ b/components/bt/controller/esp32c2/dummy.c @@ -4,6 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ #include "esp_bt_cfg.h" +#include "esp_attr.h" #define BLE_ERR_UNKNOWN_HCI_CMD (0x01) /* LL Features */ @@ -423,7 +424,7 @@ 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){} -int r_ble_lll_scan_chk_resume_eco4(void){return -1;} +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 diff --git a/components/bt/host/nimble/Kconfig.in b/components/bt/host/nimble/Kconfig.in index dc0fb9fbb2..f85574b7b7 100644 --- a/components/bt/host/nimble/Kconfig.in +++ b/components/bt/host/nimble/Kconfig.in @@ -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. diff --git a/components/bt/host/nimble/nimble b/components/bt/host/nimble/nimble index 5c1a43ca3d..27db5fca0e 160000 --- a/components/bt/host/nimble/nimble +++ b/components/bt/host/nimble/nimble @@ -1 +1 @@ -Subproject commit 5c1a43ca3d205c3d5183e57dedce335fb6a81155 +Subproject commit 27db5fca0eedcb7e0e3d41b9943fbfa91b29dbf0 diff --git a/components/bt/porting/include/mem_api.h b/components/bt/porting/include/mem_api.h index 854074613a..4e2fc86d6d 100644 --- a/components/bt/porting/include/mem_api.h +++ b/components/bt/porting/include/mem_api.h @@ -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; diff --git a/components/bt/porting/include/os/os_mempool.h b/components/bt/porting/include/os/os_mempool.h index 3ef8e6d579..4363d7474c 100644 --- a/components/bt/porting/include/os/os_mempool.h +++ b/components/bt/porting/include/os/os_mempool.h @@ -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 #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 } diff --git a/components/bt/porting/mem/os_mempool.c b/components/bt/porting/mem/os_mempool.c new file mode 100644 index 0000000000..6893ec4a0e --- /dev/null +++ b/components/bt/porting/mem/os_mempool.c @@ -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 +#include +#include + +#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); + } + } +} diff --git a/components/bt/porting/mem/os_msys_init.c b/components/bt/porting/mem/os_msys_init.c index b0340f42cf..5465e41e53 100644 --- a/components/bt/porting/mem/os_msys_init.c +++ b/components/bt/porting/mem/os_msys_init.c @@ -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 @@ -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) diff --git a/components/bt/porting/npl/freertos/src/npl_os_freertos.c b/components/bt/porting/npl/freertos/src/npl_os_freertos.c index 1e98cf8933..4871af528c 100644 --- a/components/bt/porting/npl/freertos/src/npl_os_freertos.c +++ b/components/bt/porting/npl/freertos/src/npl_os_freertos.c @@ -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 diff --git a/components/bt/porting/transport/driver/common/hci_driver_util.c b/components/bt/porting/transport/driver/common/hci_driver_util.c index 3c3a49cd78..e06bd3657a 100644 --- a/components/bt/porting/transport/driver/common/hci_driver_util.c +++ b/components/bt/porting/transport/driver/common/hci_driver_util.c @@ -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; } diff --git a/examples/bluetooth/nimble/power_save/main/main.c b/examples/bluetooth/nimble/power_save/main/main.c index 2e4fc3d619..6b0c570c6b 100644 --- a/examples/bluetooth/nimble/power_save/main/main.c +++ b/examples/bluetooth/nimble/power_save/main/main.c @@ -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 (¶ms, 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 From b7b8dc27dcbc8e72157136c4f2d5dded2ea1f2f8 Mon Sep 17 00:00:00 2001 From: cjin Date: Mon, 30 Mar 2026 08:39:39 +0800 Subject: [PATCH 7/7] fix(wifi): expand app partition size for wifi_prov_mgr --- examples/provisioning/wifi_prov_mgr/partitions.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/provisioning/wifi_prov_mgr/partitions.csv b/examples/provisioning/wifi_prov_mgr/partitions.csv index 7fc5c815b9..71590f389b 100644 --- a/examples/provisioning/wifi_prov_mgr/partitions.csv +++ b/examples/provisioning/wifi_prov_mgr/partitions.csv @@ -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,