diff --git a/embassy-stm32/src/ipcc.rs b/embassy-stm32/src/ipcc.rs index 2b9caf8e..ea33b32c 100644 --- a/embassy-stm32/src/ipcc.rs +++ b/embassy-stm32/src/ipcc.rs @@ -1,5 +1,3 @@ -use embassy_hal_common::{into_ref, Peripheral, PeripheralRef}; - use crate::ipcc::sealed::Instance; use crate::peripherals::IPCC; use crate::rcc::sealed::RccPeripheral; @@ -29,22 +27,10 @@ pub(crate) mod sealed { } } -pub struct Ipcc<'d> { - _peri: PeripheralRef<'d, IPCC>, -} +pub(crate) struct Ipcc; -impl<'d> Ipcc<'d> { - pub fn new(peri: impl Peripheral
+ 'd, _config: Config) -> Self { - Self::new_inner(peri) - } - - pub(crate) fn new_inner(peri: impl Peripheral
+ 'd) -> Self {
- into_ref!(peri);
-
- Self { _peri: peri }
- }
-
- pub fn init(&mut self) {
+impl Ipcc {
+ pub(crate) fn init(_config: Config) {
IPCC::enable();
IPCC::reset();
IPCC::set_cpu2(true);
@@ -61,56 +47,60 @@ impl<'d> Ipcc<'d> {
}
}
- pub fn c1_set_rx_channel(&mut self, channel: IpccChannel, enabled: bool) {
+ pub(crate) fn c1_set_rx_channel(channel: IpccChannel, enabled: bool) {
let regs = IPCC::regs();
// If bit is set to 1 then interrupt is disabled
unsafe { regs.cpu(0).mr().modify(|w| w.set_chom(channel as usize, !enabled)) }
}
- pub fn c1_get_rx_channel(&self, channel: IpccChannel) -> bool {
+ pub(crate) fn c1_get_rx_channel(channel: IpccChannel) -> bool {
let regs = IPCC::regs();
// If bit is set to 1 then interrupt is disabled
unsafe { !regs.cpu(0).mr().read().chom(channel as usize) }
}
- pub fn c2_set_rx_channel(&mut self, channel: IpccChannel, enabled: bool) {
+ #[allow(dead_code)]
+ pub(crate) fn c2_set_rx_channel(channel: IpccChannel, enabled: bool) {
let regs = IPCC::regs();
// If bit is set to 1 then interrupt is disabled
unsafe { regs.cpu(1).mr().modify(|w| w.set_chom(channel as usize, !enabled)) }
}
- pub fn c2_get_rx_channel(&self, channel: IpccChannel) -> bool {
+ #[allow(dead_code)]
+ pub(crate) fn c2_get_rx_channel(channel: IpccChannel) -> bool {
let regs = IPCC::regs();
// If bit is set to 1 then interrupt is disabled
unsafe { !regs.cpu(1).mr().read().chom(channel as usize) }
}
- pub fn c1_set_tx_channel(&mut self, channel: IpccChannel, enabled: bool) {
+ pub(crate) fn c1_set_tx_channel(channel: IpccChannel, enabled: bool) {
let regs = IPCC::regs();
// If bit is set to 1 then interrupt is disabled
unsafe { regs.cpu(0).mr().modify(|w| w.set_chfm(channel as usize, !enabled)) }
}
- pub fn c1_get_tx_channel(&self, channel: IpccChannel) -> bool {
+ pub(crate) fn c1_get_tx_channel(channel: IpccChannel) -> bool {
let regs = IPCC::regs();
// If bit is set to 1 then interrupt is disabled
unsafe { !regs.cpu(0).mr().read().chfm(channel as usize) }
}
- pub fn c2_set_tx_channel(&mut self, channel: IpccChannel, enabled: bool) {
+ #[allow(dead_code)]
+ pub(crate) fn c2_set_tx_channel(channel: IpccChannel, enabled: bool) {
let regs = IPCC::regs();
// If bit is set to 1 then interrupt is disabled
unsafe { regs.cpu(1).mr().modify(|w| w.set_chfm(channel as usize, !enabled)) }
}
- pub fn c2_get_tx_channel(&self, channel: IpccChannel) -> bool {
+ #[allow(dead_code)]
+ pub(crate) fn c2_get_tx_channel(channel: IpccChannel) -> bool {
let regs = IPCC::regs();
// If bit is set to 1 then interrupt is disabled
@@ -118,53 +108,51 @@ impl<'d> Ipcc<'d> {
}
/// clears IPCC receive channel status for CPU1
- pub fn c1_clear_flag_channel(&mut self, channel: IpccChannel) {
+ pub(crate) fn c1_clear_flag_channel(channel: IpccChannel) {
let regs = IPCC::regs();
unsafe { regs.cpu(0).scr().write(|w| w.set_chc(channel as usize, true)) }
}
+ #[allow(dead_code)]
/// clears IPCC receive channel status for CPU2
- pub fn c2_clear_flag_channel(&mut self, channel: IpccChannel) {
+ pub(crate) fn c2_clear_flag_channel(channel: IpccChannel) {
let regs = IPCC::regs();
unsafe { regs.cpu(1).scr().write(|w| w.set_chc(channel as usize, true)) }
}
- pub fn c1_set_flag_channel(&mut self, channel: IpccChannel) {
+ pub(crate) fn c1_set_flag_channel(channel: IpccChannel) {
let regs = IPCC::regs();
unsafe { regs.cpu(0).scr().write(|w| w.set_chs(channel as usize, true)) }
}
- pub fn c2_set_flag_channel(&mut self, channel: IpccChannel) {
+ #[allow(dead_code)]
+ pub(crate) fn c2_set_flag_channel(channel: IpccChannel) {
let regs = IPCC::regs();
unsafe { regs.cpu(1).scr().write(|w| w.set_chs(channel as usize, true)) }
}
- pub fn c1_is_active_flag(&self, channel: IpccChannel) -> bool {
+ pub(crate) fn c1_is_active_flag(channel: IpccChannel) -> bool {
let regs = IPCC::regs();
unsafe { regs.cpu(0).sr().read().chf(channel as usize) }
}
- pub fn c2_is_active_flag(&self, channel: IpccChannel) -> bool {
+ pub(crate) fn c2_is_active_flag(channel: IpccChannel) -> bool {
let regs = IPCC::regs();
unsafe { regs.cpu(1).sr().read().chf(channel as usize) }
}
- pub fn is_tx_pending(&self, channel: IpccChannel) -> bool {
- !self.c1_is_active_flag(channel) && self.c1_get_tx_channel(channel)
+ pub(crate) fn is_tx_pending(channel: IpccChannel) -> bool {
+ !Self::c1_is_active_flag(channel) && Self::c1_get_tx_channel(channel)
}
- pub fn is_rx_pending(&self, channel: IpccChannel) -> bool {
- self.c2_is_active_flag(channel) && self.c1_get_rx_channel(channel)
- }
-
- pub fn as_mut_ptr(&self) -> *mut Self {
- unsafe { &mut core::ptr::read(self) as *mut _ }
+ pub(crate) fn is_rx_pending(channel: IpccChannel) -> bool {
+ Self::c2_is_active_flag(channel) && Self::c1_get_rx_channel(channel)
}
}
diff --git a/embassy-stm32/src/tl_mbox/ble.rs b/embassy-stm32/src/tl_mbox/ble.rs
index d8bf14d4..5cc0bb20 100644
--- a/embassy-stm32/src/tl_mbox/ble.rs
+++ b/embassy-stm32/src/tl_mbox/ble.rs
@@ -16,7 +16,7 @@ use crate::tl_mbox::cmd::CmdPacket;
pub struct Ble;
impl Ble {
- pub(crate) fn new(ipcc: &mut Ipcc) -> Self {
+ pub(crate) fn new() -> Self {
unsafe {
LinkedListNode::init_head(EVT_QUEUE.as_mut_ptr());
@@ -28,12 +28,12 @@ impl Ble {
});
}
- ipcc.c1_set_rx_channel(channels::cpu2::IPCC_BLE_EVENT_CHANNEL, true);
+ Ipcc::c1_set_rx_channel(channels::cpu2::IPCC_BLE_EVENT_CHANNEL, true);
Ble
}
- pub(crate) fn evt_handler(ipcc: &mut Ipcc) {
+ pub(crate) fn evt_handler() {
unsafe {
let mut node_ptr = core::ptr::null_mut();
let node_ptr_ptr: *mut _ = &mut node_ptr;
@@ -48,10 +48,10 @@ impl Ble {
}
}
- ipcc.c1_clear_flag_channel(channels::cpu2::IPCC_BLE_EVENT_CHANNEL);
+ Ipcc::c1_clear_flag_channel(channels::cpu2::IPCC_BLE_EVENT_CHANNEL);
}
- pub(crate) fn send_cmd(ipcc: &mut Ipcc, buf: &[u8]) {
+ pub(crate) fn send_cmd(buf: &[u8]) {
unsafe {
let pcmd_buffer: *mut CmdPacket = (*TL_REF_TABLE.assume_init().ble_table).pcmd_buffer;
let pcmd_serial: *mut CmdSerial = &mut (*pcmd_buffer).cmd_serial;
@@ -63,6 +63,6 @@ impl Ble {
cmd_packet.cmd_serial.ty = TlPacketType::BleCmd as u8;
}
- ipcc.c1_set_flag_channel(channels::cpu1::IPCC_BLE_CMD_CHANNEL);
+ Ipcc::c1_set_flag_channel(channels::cpu1::IPCC_BLE_CMD_CHANNEL);
}
}
diff --git a/embassy-stm32/src/tl_mbox/evt.rs b/embassy-stm32/src/tl_mbox/evt.rs
index 770133f2..04feb3e6 100644
--- a/embassy-stm32/src/tl_mbox/evt.rs
+++ b/embassy-stm32/src/tl_mbox/evt.rs
@@ -131,9 +131,6 @@ impl EvtBox {
impl Drop for EvtBox {
fn drop(&mut self) {
- use crate::ipcc::Ipcc;
-
- let mut ipcc = Ipcc::new_inner(unsafe { crate::Peripherals::steal() }.IPCC);
- mm::MemoryManager::evt_drop(self.ptr, &mut ipcc);
+ mm::MemoryManager::evt_drop(self.ptr);
}
}
diff --git a/embassy-stm32/src/tl_mbox/mm.rs b/embassy-stm32/src/tl_mbox/mm.rs
index f99ffa39..6e0818cf 100644
--- a/embassy-stm32/src/tl_mbox/mm.rs
+++ b/embassy-stm32/src/tl_mbox/mm.rs
@@ -30,27 +30,27 @@ impl MemoryManager {
MemoryManager
}
- pub fn evt_handler(ipcc: &mut Ipcc) {
- ipcc.c1_set_tx_channel(channels::cpu1::IPCC_MM_RELEASE_BUFFER_CHANNEL, false);
+ pub fn evt_handler() {
+ Ipcc::c1_set_tx_channel(channels::cpu1::IPCC_MM_RELEASE_BUFFER_CHANNEL, false);
Self::send_free_buf();
- ipcc.c1_set_flag_channel(channels::cpu1::IPCC_MM_RELEASE_BUFFER_CHANNEL);
+ Ipcc::c1_set_flag_channel(channels::cpu1::IPCC_MM_RELEASE_BUFFER_CHANNEL);
}
- pub fn evt_drop(evt: *mut EvtPacket, ipcc: &mut Ipcc) {
+ pub fn evt_drop(evt: *mut EvtPacket) {
unsafe {
let list_node = evt.cast();
LinkedListNode::remove_tail(LOCAL_FREE_BUF_QUEUE.as_mut_ptr(), list_node);
}
- let channel_is_busy = ipcc.c1_is_active_flag(channels::cpu1::IPCC_MM_RELEASE_BUFFER_CHANNEL);
+ let channel_is_busy = Ipcc::c1_is_active_flag(channels::cpu1::IPCC_MM_RELEASE_BUFFER_CHANNEL);
// postpone event buffer freeing to IPCC interrupt handler
if channel_is_busy {
- ipcc.c1_set_tx_channel(channels::cpu1::IPCC_MM_RELEASE_BUFFER_CHANNEL, true);
+ Ipcc::c1_set_tx_channel(channels::cpu1::IPCC_MM_RELEASE_BUFFER_CHANNEL, true);
} else {
Self::send_free_buf();
- ipcc.c1_set_flag_channel(channels::cpu1::IPCC_MM_RELEASE_BUFFER_CHANNEL);
+ Ipcc::c1_set_flag_channel(channels::cpu1::IPCC_MM_RELEASE_BUFFER_CHANNEL);
}
}
diff --git a/embassy-stm32/src/tl_mbox/mod.rs b/embassy-stm32/src/tl_mbox/mod.rs
index dc6104cc..1c927efa 100644
--- a/embassy-stm32/src/tl_mbox/mod.rs
+++ b/embassy-stm32/src/tl_mbox/mod.rs
@@ -1,6 +1,7 @@
use core::mem::MaybeUninit;
use bit_field::BitField;
+use embassy_cortex_m::interrupt::{Interrupt, InterruptExt};
use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
use embassy_sync::channel::Channel;
@@ -12,7 +13,7 @@ use self::shci::{shci_ble_init, ShciBleInitCmdParam};
use self::sys::Sys;
use self::unsafe_linked_list::LinkedListNode;
use crate::interrupt;
-use crate::ipcc::Ipcc;
+use crate::ipcc::{Config, Ipcc};
mod ble;
mod channels;
@@ -58,13 +59,30 @@ pub struct FusInfoTable {
pub struct ReceiveInterruptHandler {}
impl interrupt::Handler