esp-hal/esp-wifi/src/ble/os_adapter_esp32c6.rs

129 lines
3.4 KiB
Rust

use crate::{
binary::include::esp_bt_controller_config_t,
common_adapter::RADIO_CLOCKS,
hal::system::{RadioClockController, RadioPeripherals},
};
pub(crate) static mut ISR_INTERRUPT_4: (
*mut crate::binary::c_types::c_void,
*mut crate::binary::c_types::c_void,
) = (core::ptr::null_mut(), core::ptr::null_mut());
pub(crate) static mut ISR_INTERRUPT_7: (
*mut crate::binary::c_types::c_void,
*mut crate::binary::c_types::c_void,
) = (core::ptr::null_mut(), core::ptr::null_mut());
pub(crate) static BLE_CONFIG: esp_bt_controller_config_t = esp_bt_controller_config_t {
config_version: 0x20240422,
ble_ll_resolv_list_size: 4,
ble_hci_evt_hi_buf_count: 30,
ble_hci_evt_lo_buf_count: 8,
ble_ll_sync_list_cnt: 5,
ble_ll_sync_cnt: 20,
ble_ll_rsp_dup_list_count: 20,
ble_ll_adv_dup_list_count: 20,
ble_ll_tx_pwr_dbm: 9,
rtc_freq: 32000,
ble_ll_sca: 60,
ble_ll_scan_phy_number: 1,
ble_ll_conn_def_auth_pyld_tmo: 3000,
ble_ll_jitter_usecs: 16,
ble_ll_sched_max_adv_pdu_usecs: 376,
ble_ll_sched_direct_adv_max_usecs: 502,
ble_ll_sched_adv_max_usecs: 852,
ble_scan_rsp_data_max_len: 31,
ble_ll_cfg_num_hci_cmd_pkts: 1,
ble_ll_ctrl_proc_timeout_ms: 40000,
nimble_max_connections: 2,
ble_whitelist_size: 12,
ble_acl_buf_size: 255,
ble_acl_buf_count: 24,
ble_hci_evt_buf_size: 70,
ble_multi_adv_instances: 1,
ble_ext_adv_max_size: 31,
controller_task_stack_size: 4096,
controller_task_prio: 253,
controller_run_cpu: 0,
enable_qa_test: 0,
enable_bqb_test: 0,
enable_tx_cca: 0,
cca_rssi_thresh: (256 - 50) as u8,
sleep_en: 0,
coex_phy_coded_tx_rx_time_limit: 0,
dis_scan_backoff: 0,
ble_scan_classify_filter_enable: 1,
cca_drop_mode: 0, //???
cca_low_tx_pwr: 0, //???
main_xtal_freq: 40,
ignore_wl_for_direct_adv: 0,
config_magic: 0x5A5AA5A5,
cpu_freq_mhz: 160,
enable_pcl: 0, // CONFIG_BT_LE_POWER_CONTROL_ENABLED
version_num: 0,
csa2_select: 1,
};
pub(crate) fn bt_periph_module_enable() {
unsafe {
unwrap!(RADIO_CLOCKS.as_mut()).enable(RadioPeripherals::Bt);
}
}
pub(crate) fn disable_sleep_mode() {
// nothing
}
pub(super) unsafe extern "C" fn esp_intr_alloc(
source: u32,
flags: u32,
handler: *mut crate::binary::c_types::c_void,
arg: *mut crate::binary::c_types::c_void,
ret_handle: *mut *mut crate::binary::c_types::c_void,
) -> i32 {
trace!(
"esp_intr_alloc {} {} {:?} {:?} {:?}",
source,
flags,
handler,
arg,
ret_handle
);
match source {
4 => ISR_INTERRUPT_4 = (handler, arg),
7 => ISR_INTERRUPT_7 = (handler, arg),
_ => panic!("Unexpected interrupt source {}", source),
}
0
}
pub(super) fn ble_rtc_clk_init() {
unsafe {
unwrap!(RADIO_CLOCKS.as_mut()).ble_rtc_clk_init();
}
}
pub(super) unsafe extern "C" fn esp_reset_rpa_moudle() {
trace!("esp_reset_rpa_moudle");
unsafe {
unwrap!(RADIO_CLOCKS.as_mut()).reset_rpa();
}
}
#[allow(improper_ctypes_definitions)]
#[no_mangle]
unsafe extern "C" fn jrand48(
_xsubi: [crate::binary::c_types::c_ushort; 3],
) -> crate::binary::c_types::c_long {
// this is not very random but good enough for now - it's apparently not used
// for crypto
unsafe {
static mut VALUE: u32 = 0;
VALUE = VALUE.wrapping_add(3);
VALUE as i32
}
}