mirror of
https://github.com/espressif/esp-idf.git
synced 2026-04-27 19:13:21 +00:00
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:
@@ -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"
|
||||
|
||||
@@ -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_
|
||||
@@ -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
|
||||
************************************************************************
|
||||
*/
|
||||
|
||||
@@ -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)
|
||||
|
||||
Submodule components/bt/controller/lib_esp32c2/esp32c2-bt-lib updated: 1b0f5aac0f...a1e63f9079
Submodule components/bt/controller/lib_esp32c5/esp32c5-bt-lib updated: 77c67a4d06...8903f67002
Submodule components/bt/controller/lib_esp32c6/esp32c6-bt-lib updated: 9d05fc931a...47becdd678
Submodule components/bt/controller/lib_esp32h2/esp32h2-bt-lib updated: 126dbfeec7...8b9bd1e73d
@@ -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.
|
||||
|
||||
Submodule components/bt/host/nimble/nimble updated: 5c1a43ca3d...27db5fca0e
@@ -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;
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 (¶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
|
||||
|
||||
@@ -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,
|
||||
|
||||
|
Reference in New Issue
Block a user