diff options
| author | xoviat <[email protected]> | 2023-05-27 15:05:23 -0500 |
|---|---|---|
| committer | xoviat <[email protected]> | 2023-05-27 15:05:23 -0500 |
| commit | 37e104a6b380c3c7ec20346a44b11050476a6116 (patch) | |
| tree | c7385bd0acc159c01b7cce9c63e3c273d480cd28 | |
| parent | 7e501855fc2ee98bef6be56244c4587610dbdc32 (diff) | |
stm32/ipcc: refactor tl_mbox
| -rw-r--r-- | embassy-stm32/src/tl_mbox/ble.rs | 14 | ||||
| -rw-r--r-- | embassy-stm32/src/tl_mbox/channels.rs | 4 | ||||
| -rw-r--r-- | embassy-stm32/src/tl_mbox/evt.rs | 4 | ||||
| -rw-r--r-- | embassy-stm32/src/tl_mbox/mm.rs | 10 | ||||
| -rw-r--r-- | embassy-stm32/src/tl_mbox/mod.rs | 46 | ||||
| -rw-r--r-- | embassy-stm32/src/tl_mbox/shci.rs | 2 | ||||
| -rw-r--r-- | embassy-stm32/src/tl_mbox/sys.rs | 16 |
7 files changed, 51 insertions, 45 deletions
diff --git a/embassy-stm32/src/tl_mbox/ble.rs b/embassy-stm32/src/tl_mbox/ble.rs index 5cc0bb200..062377999 100644 --- a/embassy-stm32/src/tl_mbox/ble.rs +++ b/embassy-stm32/src/tl_mbox/ble.rs | |||
| @@ -1,5 +1,3 @@ | |||
| 1 | use core::mem::MaybeUninit; | ||
| 2 | |||
| 3 | use embassy_futures::block_on; | 1 | use embassy_futures::block_on; |
| 4 | 2 | ||
| 5 | use super::cmd::CmdSerial; | 3 | use super::cmd::CmdSerial; |
| @@ -10,17 +8,17 @@ use super::{ | |||
| 10 | channels, BleTable, BLE_CMD_BUFFER, CS_BUFFER, EVT_QUEUE, HCI_ACL_DATA_BUFFER, TL_BLE_TABLE, TL_CHANNEL, | 8 | channels, BleTable, BLE_CMD_BUFFER, CS_BUFFER, EVT_QUEUE, HCI_ACL_DATA_BUFFER, TL_BLE_TABLE, TL_CHANNEL, |
| 11 | TL_REF_TABLE, | 9 | TL_REF_TABLE, |
| 12 | }; | 10 | }; |
| 13 | use crate::ipcc::Ipcc; | ||
| 14 | use crate::tl_mbox::cmd::CmdPacket; | 11 | use crate::tl_mbox::cmd::CmdPacket; |
| 12 | use crate::tl_mbox::ipcc::Ipcc; | ||
| 15 | 13 | ||
| 16 | pub struct Ble; | 14 | pub struct Ble; |
| 17 | 15 | ||
| 18 | impl Ble { | 16 | impl Ble { |
| 19 | pub(crate) fn new() -> Self { | 17 | pub fn enable() { |
| 20 | unsafe { | 18 | unsafe { |
| 21 | LinkedListNode::init_head(EVT_QUEUE.as_mut_ptr()); | 19 | LinkedListNode::init_head(EVT_QUEUE.as_mut_ptr()); |
| 22 | 20 | ||
| 23 | TL_BLE_TABLE = MaybeUninit::new(BleTable { | 21 | TL_BLE_TABLE.as_mut_ptr().write_volatile(BleTable { |
| 24 | pcmd_buffer: BLE_CMD_BUFFER.as_mut_ptr().cast(), | 22 | pcmd_buffer: BLE_CMD_BUFFER.as_mut_ptr().cast(), |
| 25 | pcs_buffer: CS_BUFFER.as_mut_ptr().cast(), | 23 | pcs_buffer: CS_BUFFER.as_mut_ptr().cast(), |
| 26 | pevt_queue: EVT_QUEUE.as_ptr().cast(), | 24 | pevt_queue: EVT_QUEUE.as_ptr().cast(), |
| @@ -29,11 +27,9 @@ impl Ble { | |||
| 29 | } | 27 | } |
| 30 | 28 | ||
| 31 | Ipcc::c1_set_rx_channel(channels::cpu2::IPCC_BLE_EVENT_CHANNEL, true); | 29 | Ipcc::c1_set_rx_channel(channels::cpu2::IPCC_BLE_EVENT_CHANNEL, true); |
| 32 | |||
| 33 | Ble | ||
| 34 | } | 30 | } |
| 35 | 31 | ||
| 36 | pub(crate) fn evt_handler() { | 32 | pub fn evt_handler() { |
| 37 | unsafe { | 33 | unsafe { |
| 38 | let mut node_ptr = core::ptr::null_mut(); | 34 | let mut node_ptr = core::ptr::null_mut(); |
| 39 | let node_ptr_ptr: *mut _ = &mut node_ptr; | 35 | let node_ptr_ptr: *mut _ = &mut node_ptr; |
| @@ -51,7 +47,7 @@ impl Ble { | |||
| 51 | Ipcc::c1_clear_flag_channel(channels::cpu2::IPCC_BLE_EVENT_CHANNEL); | 47 | Ipcc::c1_clear_flag_channel(channels::cpu2::IPCC_BLE_EVENT_CHANNEL); |
| 52 | } | 48 | } |
| 53 | 49 | ||
| 54 | pub(crate) fn send_cmd(buf: &[u8]) { | 50 | pub fn send_cmd(buf: &[u8]) { |
| 55 | unsafe { | 51 | unsafe { |
| 56 | let pcmd_buffer: *mut CmdPacket = (*TL_REF_TABLE.assume_init().ble_table).pcmd_buffer; | 52 | let pcmd_buffer: *mut CmdPacket = (*TL_REF_TABLE.assume_init().ble_table).pcmd_buffer; |
| 57 | let pcmd_serial: *mut CmdSerial = &mut (*pcmd_buffer).cmd_serial; | 53 | let pcmd_serial: *mut CmdSerial = &mut (*pcmd_buffer).cmd_serial; |
diff --git a/embassy-stm32/src/tl_mbox/channels.rs b/embassy-stm32/src/tl_mbox/channels.rs index aaa6ce177..25a065ba4 100644 --- a/embassy-stm32/src/tl_mbox/channels.rs +++ b/embassy-stm32/src/tl_mbox/channels.rs | |||
| @@ -50,7 +50,7 @@ | |||
| 50 | //! | 50 | //! |
| 51 | 51 | ||
| 52 | pub mod cpu1 { | 52 | pub mod cpu1 { |
| 53 | use crate::ipcc::IpccChannel; | 53 | use crate::tl_mbox::ipcc::IpccChannel; |
| 54 | 54 | ||
| 55 | // Not used currently but reserved | 55 | // Not used currently but reserved |
| 56 | pub const IPCC_BLE_CMD_CHANNEL: IpccChannel = IpccChannel::Channel1; | 56 | pub const IPCC_BLE_CMD_CHANNEL: IpccChannel = IpccChannel::Channel1; |
| @@ -75,7 +75,7 @@ pub mod cpu1 { | |||
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | pub mod cpu2 { | 77 | pub mod cpu2 { |
| 78 | use crate::ipcc::IpccChannel; | 78 | use crate::tl_mbox::ipcc::IpccChannel; |
| 79 | 79 | ||
| 80 | pub const IPCC_BLE_EVENT_CHANNEL: IpccChannel = IpccChannel::Channel1; | 80 | pub const IPCC_BLE_EVENT_CHANNEL: IpccChannel = IpccChannel::Channel1; |
| 81 | pub const IPCC_SYSTEM_EVENT_CHANNEL: IpccChannel = IpccChannel::Channel2; | 81 | pub const IPCC_SYSTEM_EVENT_CHANNEL: IpccChannel = IpccChannel::Channel2; |
diff --git a/embassy-stm32/src/tl_mbox/evt.rs b/embassy-stm32/src/tl_mbox/evt.rs index 04feb3e68..47a8b72fd 100644 --- a/embassy-stm32/src/tl_mbox/evt.rs +++ b/embassy-stm32/src/tl_mbox/evt.rs | |||
| @@ -3,7 +3,7 @@ use core::mem::MaybeUninit; | |||
| 3 | use super::cmd::{AclDataPacket, AclDataSerial}; | 3 | use super::cmd::{AclDataPacket, AclDataSerial}; |
| 4 | use super::consts::TlPacketType; | 4 | use super::consts::TlPacketType; |
| 5 | use super::{PacketHeader, TL_EVT_HEADER_SIZE}; | 5 | use super::{PacketHeader, TL_EVT_HEADER_SIZE}; |
| 6 | use crate::tl_mbox::mm; | 6 | use crate::tl_mbox::mm::MemoryManager; |
| 7 | 7 | ||
| 8 | /// the payload of [`Evt`] for a command status event | 8 | /// the payload of [`Evt`] for a command status event |
| 9 | #[derive(Copy, Clone)] | 9 | #[derive(Copy, Clone)] |
| @@ -131,6 +131,6 @@ impl EvtBox { | |||
| 131 | 131 | ||
| 132 | impl Drop for EvtBox { | 132 | impl Drop for EvtBox { |
| 133 | fn drop(&mut self) { | 133 | fn drop(&mut self) { |
| 134 | mm::MemoryManager::evt_drop(self.ptr); | 134 | MemoryManager::evt_drop(self.ptr); |
| 135 | } | 135 | } |
| 136 | } | 136 | } |
diff --git a/embassy-stm32/src/tl_mbox/mm.rs b/embassy-stm32/src/tl_mbox/mm.rs index 6e0818cf1..e28a6aa0c 100644 --- a/embassy-stm32/src/tl_mbox/mm.rs +++ b/embassy-stm32/src/tl_mbox/mm.rs | |||
| @@ -1,22 +1,20 @@ | |||
| 1 | use core::mem::MaybeUninit; | ||
| 2 | |||
| 3 | use super::evt::EvtPacket; | 1 | use super::evt::EvtPacket; |
| 4 | use super::unsafe_linked_list::LinkedListNode; | 2 | use super::unsafe_linked_list::LinkedListNode; |
| 5 | use super::{ | 3 | use super::{ |
| 6 | channels, MemManagerTable, BLE_SPARE_EVT_BUF, EVT_POOL, FREE_BUFF_QUEUE, LOCAL_FREE_BUF_QUEUE, POOL_SIZE, | 4 | channels, MemManagerTable, BLE_SPARE_EVT_BUF, EVT_POOL, FREE_BUFF_QUEUE, LOCAL_FREE_BUF_QUEUE, POOL_SIZE, |
| 7 | SYS_SPARE_EVT_BUF, TL_MEM_MANAGER_TABLE, TL_REF_TABLE, | 5 | SYS_SPARE_EVT_BUF, TL_MEM_MANAGER_TABLE, TL_REF_TABLE, |
| 8 | }; | 6 | }; |
| 9 | use crate::ipcc::Ipcc; | 7 | use crate::tl_mbox::ipcc::Ipcc; |
| 10 | 8 | ||
| 11 | pub struct MemoryManager; | 9 | pub struct MemoryManager; |
| 12 | 10 | ||
| 13 | impl MemoryManager { | 11 | impl MemoryManager { |
| 14 | pub fn new() -> Self { | 12 | pub fn enable() { |
| 15 | unsafe { | 13 | unsafe { |
| 16 | LinkedListNode::init_head(FREE_BUFF_QUEUE.as_mut_ptr()); | 14 | LinkedListNode::init_head(FREE_BUFF_QUEUE.as_mut_ptr()); |
| 17 | LinkedListNode::init_head(LOCAL_FREE_BUF_QUEUE.as_mut_ptr()); | 15 | LinkedListNode::init_head(LOCAL_FREE_BUF_QUEUE.as_mut_ptr()); |
| 18 | 16 | ||
| 19 | TL_MEM_MANAGER_TABLE = MaybeUninit::new(MemManagerTable { | 17 | TL_MEM_MANAGER_TABLE.as_mut_ptr().write_volatile(MemManagerTable { |
| 20 | spare_ble_buffer: BLE_SPARE_EVT_BUF.as_ptr().cast(), | 18 | spare_ble_buffer: BLE_SPARE_EVT_BUF.as_ptr().cast(), |
| 21 | spare_sys_buffer: SYS_SPARE_EVT_BUF.as_ptr().cast(), | 19 | spare_sys_buffer: SYS_SPARE_EVT_BUF.as_ptr().cast(), |
| 22 | ble_pool: EVT_POOL.as_ptr().cast(), | 20 | ble_pool: EVT_POOL.as_ptr().cast(), |
| @@ -26,8 +24,6 @@ impl MemoryManager { | |||
| 26 | traces_pool_size: 0, | 24 | traces_pool_size: 0, |
| 27 | }); | 25 | }); |
| 28 | } | 26 | } |
| 29 | |||
| 30 | MemoryManager | ||
| 31 | } | 27 | } |
| 32 | 28 | ||
| 33 | pub fn evt_handler() { | 29 | pub fn evt_handler() { |
diff --git a/embassy-stm32/src/tl_mbox/mod.rs b/embassy-stm32/src/tl_mbox/mod.rs index 1c927efa0..616f7dc56 100644 --- a/embassy-stm32/src/tl_mbox/mod.rs +++ b/embassy-stm32/src/tl_mbox/mod.rs | |||
| @@ -1,7 +1,9 @@ | |||
| 1 | use core::mem::MaybeUninit; | 1 | use core::mem::MaybeUninit; |
| 2 | 2 | ||
| 3 | use atomic_polyfill::{compiler_fence, Ordering}; | ||
| 3 | use bit_field::BitField; | 4 | use bit_field::BitField; |
| 4 | use embassy_cortex_m::interrupt::{Interrupt, InterruptExt}; | 5 | use embassy_cortex_m::interrupt::{Interrupt, InterruptExt}; |
| 6 | use embassy_hal_common::{into_ref, Peripheral, PeripheralRef}; | ||
| 5 | use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; | 7 | use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; |
| 6 | use embassy_sync::channel::Channel; | 8 | use embassy_sync::channel::Channel; |
| 7 | 9 | ||
| @@ -13,13 +15,16 @@ use self::shci::{shci_ble_init, ShciBleInitCmdParam}; | |||
| 13 | use self::sys::Sys; | 15 | use self::sys::Sys; |
| 14 | use self::unsafe_linked_list::LinkedListNode; | 16 | use self::unsafe_linked_list::LinkedListNode; |
| 15 | use crate::interrupt; | 17 | use crate::interrupt; |
| 16 | use crate::ipcc::{Config, Ipcc}; | 18 | use crate::peripherals::IPCC; |
| 19 | pub use crate::tl_mbox::ipcc::Config; | ||
| 20 | use crate::tl_mbox::ipcc::Ipcc; | ||
| 17 | 21 | ||
| 18 | mod ble; | 22 | mod ble; |
| 19 | mod channels; | 23 | mod channels; |
| 20 | mod cmd; | 24 | mod cmd; |
| 21 | mod consts; | 25 | mod consts; |
| 22 | mod evt; | 26 | mod evt; |
| 27 | mod ipcc; | ||
| 23 | mod mm; | 28 | mod mm; |
| 24 | mod shci; | 29 | mod shci; |
| 25 | mod sys; | 30 | mod sys; |
| @@ -60,6 +65,8 @@ pub struct ReceiveInterruptHandler {} | |||
| 60 | 65 | ||
| 61 | impl interrupt::Handler<interrupt::IPCC_C1_RX> for ReceiveInterruptHandler { | 66 | impl interrupt::Handler<interrupt::IPCC_C1_RX> for ReceiveInterruptHandler { |
| 62 | unsafe fn on_interrupt() { | 67 | unsafe fn on_interrupt() { |
| 68 | // info!("ipcc rx interrupt"); | ||
| 69 | |||
| 63 | if Ipcc::is_rx_pending(channels::cpu2::IPCC_SYSTEM_EVENT_CHANNEL) { | 70 | if Ipcc::is_rx_pending(channels::cpu2::IPCC_SYSTEM_EVENT_CHANNEL) { |
| 64 | sys::Sys::evt_handler(); | 71 | sys::Sys::evt_handler(); |
| 65 | } else if Ipcc::is_rx_pending(channels::cpu2::IPCC_BLE_EVENT_CHANNEL) { | 72 | } else if Ipcc::is_rx_pending(channels::cpu2::IPCC_BLE_EVENT_CHANNEL) { |
| @@ -74,6 +81,8 @@ pub struct TransmitInterruptHandler {} | |||
| 74 | 81 | ||
| 75 | impl interrupt::Handler<interrupt::IPCC_C1_TX> for TransmitInterruptHandler { | 82 | impl interrupt::Handler<interrupt::IPCC_C1_TX> for TransmitInterruptHandler { |
| 76 | unsafe fn on_interrupt() { | 83 | unsafe fn on_interrupt() { |
| 84 | // info!("ipcc tx interrupt"); | ||
| 85 | |||
| 77 | if Ipcc::is_tx_pending(channels::cpu1::IPCC_SYSTEM_CMD_RSP_CHANNEL) { | 86 | if Ipcc::is_tx_pending(channels::cpu1::IPCC_SYSTEM_CMD_RSP_CHANNEL) { |
| 78 | // TODO: handle this case | 87 | // TODO: handle this case |
| 79 | let _ = sys::Sys::cmd_evt_handler(); | 88 | let _ = sys::Sys::cmd_evt_handler(); |
| @@ -307,21 +316,24 @@ static mut HCI_ACL_DATA_BUFFER: MaybeUninit<[u8; TL_PACKET_HEADER_SIZE + 5 + 251 | |||
| 307 | // TODO: get a better size, this is a placeholder | 316 | // TODO: get a better size, this is a placeholder |
| 308 | pub(crate) static TL_CHANNEL: Channel<CriticalSectionRawMutex, EvtBox, 5> = Channel::new(); | 317 | pub(crate) static TL_CHANNEL: Channel<CriticalSectionRawMutex, EvtBox, 5> = Channel::new(); |
| 309 | 318 | ||
| 310 | pub struct TlMbox { | 319 | pub struct TlMbox<'d> { |
| 311 | _sys: Sys, | 320 | _ipcc: PeripheralRef<'d, IPCC>, |
| 312 | _ble: Ble, | ||
| 313 | _mm: MemoryManager, | ||
| 314 | } | 321 | } |
| 315 | 322 | ||
| 316 | impl TlMbox { | 323 | impl<'d> TlMbox<'d> { |
| 317 | /// initializes low-level transport between CPU1 and BLE stack on CPU2 | 324 | /// initializes low-level transport between CPU1 and BLE stack on CPU2 |
| 318 | pub fn init( | 325 | pub fn new( |
| 326 | ipcc: impl Peripheral<P = IPCC> + 'd, | ||
| 319 | _irqs: impl interrupt::Binding<interrupt::IPCC_C1_RX, ReceiveInterruptHandler> | 327 | _irqs: impl interrupt::Binding<interrupt::IPCC_C1_RX, ReceiveInterruptHandler> |
| 320 | + interrupt::Binding<interrupt::IPCC_C1_TX, TransmitInterruptHandler>, | 328 | + interrupt::Binding<interrupt::IPCC_C1_TX, TransmitInterruptHandler>, |
| 321 | config: Config, | 329 | config: Config, |
| 322 | ) -> TlMbox { | 330 | ) -> Self { |
| 331 | into_ref!(ipcc); | ||
| 332 | |||
| 323 | unsafe { | 333 | unsafe { |
| 324 | TL_REF_TABLE = MaybeUninit::new(RefTable { | 334 | compiler_fence(Ordering::AcqRel); |
| 335 | |||
| 336 | TL_REF_TABLE.as_mut_ptr().write_volatile(RefTable { | ||
| 325 | device_info_table: TL_DEVICE_INFO_TABLE.as_ptr(), | 337 | device_info_table: TL_DEVICE_INFO_TABLE.as_ptr(), |
| 326 | ble_table: TL_BLE_TABLE.as_ptr(), | 338 | ble_table: TL_BLE_TABLE.as_ptr(), |
| 327 | thread_table: TL_THREAD_TABLE.as_ptr(), | 339 | thread_table: TL_THREAD_TABLE.as_ptr(), |
| @@ -334,6 +346,10 @@ impl TlMbox { | |||
| 334 | ble_lld_table: TL_BLE_LLD_TABLE.as_ptr(), | 346 | ble_lld_table: TL_BLE_LLD_TABLE.as_ptr(), |
| 335 | }); | 347 | }); |
| 336 | 348 | ||
| 349 | // info!("TL_REF_TABLE addr: {:x}", TL_REF_TABLE.as_ptr() as usize); | ||
| 350 | |||
| 351 | compiler_fence(Ordering::AcqRel); | ||
| 352 | |||
| 337 | TL_SYS_TABLE = MaybeUninit::zeroed(); | 353 | TL_SYS_TABLE = MaybeUninit::zeroed(); |
| 338 | TL_DEVICE_INFO_TABLE = MaybeUninit::zeroed(); | 354 | TL_DEVICE_INFO_TABLE = MaybeUninit::zeroed(); |
| 339 | TL_BLE_TABLE = MaybeUninit::zeroed(); | 355 | TL_BLE_TABLE = MaybeUninit::zeroed(); |
| @@ -352,13 +368,15 @@ impl TlMbox { | |||
| 352 | CS_BUFFER = MaybeUninit::zeroed(); | 368 | CS_BUFFER = MaybeUninit::zeroed(); |
| 353 | BLE_CMD_BUFFER = MaybeUninit::zeroed(); | 369 | BLE_CMD_BUFFER = MaybeUninit::zeroed(); |
| 354 | HCI_ACL_DATA_BUFFER = MaybeUninit::zeroed(); | 370 | HCI_ACL_DATA_BUFFER = MaybeUninit::zeroed(); |
| 371 | |||
| 372 | compiler_fence(Ordering::AcqRel); | ||
| 355 | } | 373 | } |
| 356 | 374 | ||
| 357 | Ipcc::init(config); | 375 | Ipcc::enable(config); |
| 358 | 376 | ||
| 359 | let _sys = Sys::new(); | 377 | Sys::enable(); |
| 360 | let _ble = Ble::new(); | 378 | Ble::enable(); |
| 361 | let _mm = MemoryManager::new(); | 379 | MemoryManager::enable(); |
| 362 | 380 | ||
| 363 | // enable interrupts | 381 | // enable interrupts |
| 364 | unsafe { crate::interrupt::IPCC_C1_RX::steal() }.unpend(); | 382 | unsafe { crate::interrupt::IPCC_C1_RX::steal() }.unpend(); |
| @@ -367,7 +385,7 @@ impl TlMbox { | |||
| 367 | unsafe { crate::interrupt::IPCC_C1_RX::steal() }.enable(); | 385 | unsafe { crate::interrupt::IPCC_C1_RX::steal() }.enable(); |
| 368 | unsafe { crate::interrupt::IPCC_C1_TX::steal() }.enable(); | 386 | unsafe { crate::interrupt::IPCC_C1_TX::steal() }.enable(); |
| 369 | 387 | ||
| 370 | TlMbox { _sys, _ble, _mm } | 388 | Self { _ipcc: ipcc } |
| 371 | } | 389 | } |
| 372 | 390 | ||
| 373 | pub fn wireless_fw_info(&self) -> Option<WirelessFwInfoTable> { | 391 | pub fn wireless_fw_info(&self) -> Option<WirelessFwInfoTable> { |
diff --git a/embassy-stm32/src/tl_mbox/shci.rs b/embassy-stm32/src/tl_mbox/shci.rs index 3d7e994ae..6b5b2dd19 100644 --- a/embassy-stm32/src/tl_mbox/shci.rs +++ b/embassy-stm32/src/tl_mbox/shci.rs | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | use super::cmd::CmdPacket; | 3 | use super::cmd::CmdPacket; |
| 4 | use super::consts::TlPacketType; | 4 | use super::consts::TlPacketType; |
| 5 | use super::{channels, TL_CS_EVT_SIZE, TL_EVT_HEADER_SIZE, TL_PACKET_HEADER_SIZE, TL_SYS_TABLE}; | 5 | use super::{channels, TL_CS_EVT_SIZE, TL_EVT_HEADER_SIZE, TL_PACKET_HEADER_SIZE, TL_SYS_TABLE}; |
| 6 | use crate::ipcc::Ipcc; | 6 | use crate::tl_mbox::ipcc::Ipcc; |
| 7 | 7 | ||
| 8 | const SCHI_OPCODE_BLE_INIT: u16 = 0xfc66; | 8 | const SCHI_OPCODE_BLE_INIT: u16 = 0xfc66; |
| 9 | pub const TL_BLE_EVT_CS_PACKET_SIZE: usize = TL_EVT_HEADER_SIZE + TL_CS_EVT_SIZE; | 9 | pub const TL_BLE_EVT_CS_PACKET_SIZE: usize = TL_EVT_HEADER_SIZE + TL_CS_EVT_SIZE; |
diff --git a/embassy-stm32/src/tl_mbox/sys.rs b/embassy-stm32/src/tl_mbox/sys.rs index 79e257148..9685fb920 100644 --- a/embassy-stm32/src/tl_mbox/sys.rs +++ b/embassy-stm32/src/tl_mbox/sys.rs | |||
| @@ -1,5 +1,3 @@ | |||
| 1 | use core::mem::MaybeUninit; | ||
| 2 | |||
| 3 | use embassy_futures::block_on; | 1 | use embassy_futures::block_on; |
| 4 | 2 | ||
| 5 | use super::cmd::{CmdPacket, CmdSerial}; | 3 | use super::cmd::{CmdPacket, CmdSerial}; |
| @@ -7,27 +5,25 @@ use super::consts::TlPacketType; | |||
| 7 | use super::evt::{CcEvt, EvtBox, EvtSerial}; | 5 | use super::evt::{CcEvt, EvtBox, EvtSerial}; |
| 8 | use super::unsafe_linked_list::LinkedListNode; | 6 | use super::unsafe_linked_list::LinkedListNode; |
| 9 | use super::{channels, SysTable, SYSTEM_EVT_QUEUE, SYS_CMD_BUF, TL_CHANNEL, TL_REF_TABLE, TL_SYS_TABLE}; | 7 | use super::{channels, SysTable, SYSTEM_EVT_QUEUE, SYS_CMD_BUF, TL_CHANNEL, TL_REF_TABLE, TL_SYS_TABLE}; |
| 10 | use crate::ipcc::Ipcc; | 8 | use crate::tl_mbox::ipcc::Ipcc; |
| 11 | 9 | ||
| 12 | pub struct Sys; | 10 | pub struct Sys; |
| 13 | 11 | ||
| 14 | impl Sys { | 12 | impl Sys { |
| 15 | pub(crate) fn new() -> Self { | 13 | pub fn enable() { |
| 16 | unsafe { | 14 | unsafe { |
| 17 | LinkedListNode::init_head(SYSTEM_EVT_QUEUE.as_mut_ptr()); | 15 | LinkedListNode::init_head(SYSTEM_EVT_QUEUE.as_mut_ptr()); |
| 18 | 16 | ||
| 19 | TL_SYS_TABLE = MaybeUninit::new(SysTable { | 17 | TL_SYS_TABLE.as_mut_ptr().write_volatile(SysTable { |
| 20 | pcmd_buffer: SYS_CMD_BUF.as_mut_ptr(), | 18 | pcmd_buffer: SYS_CMD_BUF.as_mut_ptr(), |
| 21 | sys_queue: SYSTEM_EVT_QUEUE.as_ptr(), | 19 | sys_queue: SYSTEM_EVT_QUEUE.as_ptr(), |
| 22 | }); | 20 | }); |
| 23 | } | 21 | } |
| 24 | 22 | ||
| 25 | Ipcc::c1_set_rx_channel(channels::cpu2::IPCC_SYSTEM_EVENT_CHANNEL, true); | 23 | Ipcc::c1_set_rx_channel(channels::cpu2::IPCC_SYSTEM_EVENT_CHANNEL, true); |
| 26 | |||
| 27 | Sys | ||
| 28 | } | 24 | } |
| 29 | 25 | ||
| 30 | pub(crate) fn evt_handler() { | 26 | pub fn evt_handler() { |
| 31 | unsafe { | 27 | unsafe { |
| 32 | let mut node_ptr = core::ptr::null_mut(); | 28 | let mut node_ptr = core::ptr::null_mut(); |
| 33 | let node_ptr_ptr: *mut _ = &mut node_ptr; | 29 | let node_ptr_ptr: *mut _ = &mut node_ptr; |
| @@ -46,7 +42,7 @@ impl Sys { | |||
| 46 | Ipcc::c1_clear_flag_channel(channels::cpu2::IPCC_SYSTEM_EVENT_CHANNEL); | 42 | Ipcc::c1_clear_flag_channel(channels::cpu2::IPCC_SYSTEM_EVENT_CHANNEL); |
| 47 | } | 43 | } |
| 48 | 44 | ||
| 49 | pub(crate) fn cmd_evt_handler() -> CcEvt { | 45 | pub fn cmd_evt_handler() -> CcEvt { |
| 50 | Ipcc::c1_set_tx_channel(channels::cpu1::IPCC_SYSTEM_CMD_RSP_CHANNEL, false); | 46 | Ipcc::c1_set_tx_channel(channels::cpu1::IPCC_SYSTEM_CMD_RSP_CHANNEL, false); |
| 51 | 47 | ||
| 52 | // ST's command response data structure is really convoluted. | 48 | // ST's command response data structure is really convoluted. |
| @@ -68,7 +64,7 @@ impl Sys { | |||
| 68 | } | 64 | } |
| 69 | 65 | ||
| 70 | #[allow(dead_code)] | 66 | #[allow(dead_code)] |
| 71 | pub(crate) fn send_cmd(buf: &[u8]) { | 67 | pub fn send_cmd(buf: &[u8]) { |
| 72 | unsafe { | 68 | unsafe { |
| 73 | // TODO: check this | 69 | // TODO: check this |
| 74 | let cmd_buffer = &mut *(*TL_REF_TABLE.assume_init().sys_table).pcmd_buffer; | 70 | let cmd_buffer = &mut *(*TL_REF_TABLE.assume_init().sys_table).pcmd_buffer; |
