#![no_std] #![cfg_attr(feature = "ble", feature(async_fn_in_trait))] // This must go FIRST so that all the other modules see its macros. pub mod fmt; use core::mem::MaybeUninit; use core::sync::atomic::{compiler_fence, Ordering}; use embassy_hal_common::{into_ref, Peripheral, PeripheralRef}; use embassy_stm32::interrupt; use embassy_stm32::ipcc::{Config, Ipcc, ReceiveInterruptHandler, TransmitInterruptHandler}; use embassy_stm32::peripherals::IPCC; use mm::MemoryManager; use sys::Sys; use tables::*; use unsafe_linked_list::LinkedListNode; #[cfg(feature = "ble")] pub mod ble; pub mod channels; pub mod cmd; pub mod consts; pub mod evt; pub mod lhci; #[cfg(feature = "mac")] pub mod mac; pub mod mm; pub mod shci; pub mod sys; pub mod tables; pub mod unsafe_linked_list; type PacketHeader = LinkedListNode; pub struct TlMbox<'d> { _ipcc: PeripheralRef<'d, IPCC>, pub sys_subsystem: Sys, pub mm_subsystem: MemoryManager, #[cfg(feature = "ble")] pub ble_subsystem: ble::Ble, #[cfg(feature = "mac")] pub mac_subsystem: mac::Mac, } impl<'d> TlMbox<'d> { pub fn init( ipcc: impl Peripheral

+ 'd, _irqs: impl interrupt::typelevel::Binding + interrupt::typelevel::Binding, config: Config, ) -> Self { into_ref!(ipcc); unsafe { TL_REF_TABLE.as_mut_ptr().write_volatile(RefTable { device_info_table: TL_DEVICE_INFO_TABLE.as_ptr(), ble_table: TL_BLE_TABLE.as_ptr(), thread_table: TL_THREAD_TABLE.as_ptr(), sys_table: TL_SYS_TABLE.as_ptr(), mem_manager_table: TL_MEM_MANAGER_TABLE.as_ptr(), traces_table: TL_TRACES_TABLE.as_ptr(), mac_802_15_4_table: TL_MAC_802_15_4_TABLE.as_ptr(), // zigbee_table: TL_ZIGBEE_TABLE.as_ptr(), // lld_tests_table: TL_LLD_TESTS_TABLE.as_ptr(), // ble_lld_table: TL_BLE_LLD_TABLE.as_ptr(), }); TL_SYS_TABLE .as_mut_ptr() .write_volatile(MaybeUninit::zeroed().assume_init()); TL_DEVICE_INFO_TABLE .as_mut_ptr() .write_volatile(MaybeUninit::zeroed().assume_init()); TL_BLE_TABLE .as_mut_ptr() .write_volatile(MaybeUninit::zeroed().assume_init()); TL_THREAD_TABLE .as_mut_ptr() .write_volatile(MaybeUninit::zeroed().assume_init()); TL_MEM_MANAGER_TABLE .as_mut_ptr() .write_volatile(MaybeUninit::zeroed().assume_init()); TL_TRACES_TABLE .as_mut_ptr() .write_volatile(MaybeUninit::zeroed().assume_init()); TL_MAC_802_15_4_TABLE .as_mut_ptr() .write_volatile(MaybeUninit::zeroed().assume_init()); // TL_ZIGBEE_TABLE // .as_mut_ptr() // .write_volatile(MaybeUninit::zeroed().assume_init()); // TL_LLD_TESTS_TABLE // .as_mut_ptr() // .write_volatile(MaybeUninit::zeroed().assume_init()); // TL_BLE_LLD_TABLE // .as_mut_ptr() // .write_volatile(MaybeUninit::zeroed().assume_init()); EVT_POOL .as_mut_ptr() .write_volatile(MaybeUninit::zeroed().assume_init()); SYS_SPARE_EVT_BUF .as_mut_ptr() .write_volatile(MaybeUninit::zeroed().assume_init()); BLE_SPARE_EVT_BUF .as_mut_ptr() .write_volatile(MaybeUninit::zeroed().assume_init()); { BLE_CMD_BUFFER .as_mut_ptr() .write_volatile(MaybeUninit::zeroed().assume_init()); HCI_ACL_DATA_BUFFER .as_mut_ptr() .write_volatile(MaybeUninit::zeroed().assume_init()); CS_BUFFER .as_mut_ptr() .write_volatile(MaybeUninit::zeroed().assume_init()); } } compiler_fence(Ordering::SeqCst); Ipcc::enable(config); Self { _ipcc: ipcc, sys_subsystem: sys::Sys::new(), #[cfg(feature = "ble")] ble_subsystem: ble::Ble::new(), #[cfg(feature = "mac")] mac_subsystem: mac::Mac::new(), mm_subsystem: mm::MemoryManager::new(), } } }