aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGhaith Oueslati <[email protected]>2023-05-26 11:24:08 +0100
committerGitHub <[email protected]>2023-05-26 11:24:08 +0100
commit859e539f85c7f4770050cc11f83fe1f6d040cd1d (patch)
treee34e588e85dadbf8e92f2da4acab008b96e6e83d
parent984cd47b417a7bab986ff11b589b88fcae2940b9 (diff)
parentabbaaeee378f41ddf9f1a3c40777be3572680484 (diff)
Merge branch 'tl_mbox' into ipcc
-rw-r--r--embassy-stm32/Cargo.toml10
-rw-r--r--embassy-stm32/src/tl_mbox/ble.rs11
-rw-r--r--embassy-stm32/src/tl_mbox/channels.rs144
-rw-r--r--embassy-stm32/src/tl_mbox/mac_802_15_4.rs82
-rw-r--r--embassy-stm32/src/tl_mbox/mm.rs2
-rw-r--r--embassy-stm32/src/tl_mbox/mod.rs90
-rw-r--r--embassy-stm32/src/tl_mbox/sys.rs1
7 files changed, 266 insertions, 74 deletions
diff --git a/embassy-stm32/Cargo.toml b/embassy-stm32/Cargo.toml
index 0d7e03bf5..653f328c4 100644
--- a/embassy-stm32/Cargo.toml
+++ b/embassy-stm32/Cargo.toml
@@ -110,6 +110,16 @@ unstable-pac = []
110# Implement embedded-hal-async traits if `nightly` is set as well. 110# Implement embedded-hal-async traits if `nightly` is set as well.
111unstable-traits = ["embedded-hal-1", "dep:embedded-hal-nb"] 111unstable-traits = ["embedded-hal-1", "dep:embedded-hal-nb"]
112 112
113# stm32wb specific
114# support for wireless stacks
115ble = []
116thread = []
117lld-tests = []
118ble-lld = []
119mac-802_15_4 = []
120zigbee = []
121traces = []
122
113# Chip-selection features 123# Chip-selection features
114stm32c011d6 = [ "stm32-metapac/stm32c011d6" ] 124stm32c011d6 = [ "stm32-metapac/stm32c011d6" ]
115stm32c011f4 = [ "stm32-metapac/stm32c011f4" ] 125stm32c011f4 = [ "stm32-metapac/stm32c011f4" ]
diff --git a/embassy-stm32/src/tl_mbox/ble.rs b/embassy-stm32/src/tl_mbox/ble.rs
index 5cc0bb200..0699d1867 100644
--- a/embassy-stm32/src/tl_mbox/ble.rs
+++ b/embassy-stm32/src/tl_mbox/ble.rs
@@ -65,4 +65,15 @@ impl Ble {
65 65
66 Ipcc::c1_set_flag_channel(channels::cpu1::IPCC_BLE_CMD_CHANNEL); 66 Ipcc::c1_set_flag_channel(channels::cpu1::IPCC_BLE_CMD_CHANNEL);
67 } 67 }
68
69 pub(crate) fn send_acl_data() {
70 unsafe {
71 (*(*TL_REF_TABLE.assume_init().ble_table).phci_acl_data_buffer)
72 .acl_data_serial
73 .ty = TlPacketType::AclData as u8;
74 }
75
76 Ipcc::c1_set_flag_channel(channels::Cpu1Channel::HciAclData.into());
77 Ipcc::c1_set_tx_channel(channels::Cpu1Channel::HciAclData.into(), true);
78 }
68} 79}
diff --git a/embassy-stm32/src/tl_mbox/channels.rs b/embassy-stm32/src/tl_mbox/channels.rs
index aaa6ce177..94e97230f 100644
--- a/embassy-stm32/src/tl_mbox/channels.rs
+++ b/embassy-stm32/src/tl_mbox/channels.rs
@@ -49,56 +49,104 @@
49//! | | 49//! | |
50//! 50//!
51 51
52pub mod cpu1 { 52use crate::ipcc::IpccChannel;
53 use crate::ipcc::IpccChannel;
54 53
55 // Not used currently but reserved 54pub enum Cpu1Channel {
56 pub const IPCC_BLE_CMD_CHANNEL: IpccChannel = IpccChannel::Channel1; 55 BleCmd,
57 // Not used currently but reserved 56 SystemCmdRsp,
58 pub const IPCC_SYSTEM_CMD_RSP_CHANNEL: IpccChannel = IpccChannel::Channel2; 57 #[cfg(feature = "thread")]
59 #[allow(dead_code)] // Not used currently but reserved 58 ThreadOtCmdRsp,
60 pub const IPCC_THREAD_OT_CMD_RSP_CHANNEL: IpccChannel = IpccChannel::Channel3; 59 #[cfg(feature = "zigbee")]
61 #[allow(dead_code)] // Not used currently but reserved 60 ZigbeeCmdAppli,
62 pub const IPCC_ZIGBEE_CMD_APPLI_CHANNEL: IpccChannel = IpccChannel::Channel3; 61 MmReleaseBuffer,
63 #[allow(dead_code)] // Not used currently but reserved 62 #[cfg(feature = "mac-802_15_4")]
64 pub const IPCC_MAC_802_15_4_CMD_RSP_CHANNEL: IpccChannel = IpccChannel::Channel3; 63 Mac802_15_4cmdRsp,
65 // Not used currently but reserved 64 #[cfg(feature = "thread")]
66 pub const IPCC_MM_RELEASE_BUFFER_CHANNEL: IpccChannel = IpccChannel::Channel4; 65 ThreadCliCmd,
67 #[allow(dead_code)] // Not used currently but reserved 66 #[cfg(feature = "lld-tests")]
68 pub const IPCC_THREAD_CLI_CMD_CHANNEL: IpccChannel = IpccChannel::Channel5; 67 LldTestsCliCmd,
69 #[allow(dead_code)] // Not used currently but reserved 68 #[cfg(feature = "ble-lld")]
70 pub const IPCC_LLDTESTS_CLI_CMD_CHANNEL: IpccChannel = IpccChannel::Channel5; 69 BleLldCmd,
71 #[allow(dead_code)] // Not used currently but reserved 70 HciAclData,
72 pub const IPCC_BLE_LLD_CMD_CHANNEL: IpccChannel = IpccChannel::Channel5;
73 #[allow(dead_code)] // Not used currently but reserved
74 pub const IPCC_HCI_ACL_DATA_CHANNEL: IpccChannel = IpccChannel::Channel6;
75} 71}
76 72
77pub mod cpu2 { 73impl From<Cpu1Channel> for IpccChannel {
78 use crate::ipcc::IpccChannel; 74 fn from(value: Cpu1Channel) -> Self {
75 match value {
76 Cpu1Channel::BleCmd => IpccChannel::Channel1,
77 Cpu1Channel::SystemCmdRsp => IpccChannel::Channel2,
78 #[cfg(feature = "thread")]
79 Cpu1Channel::ThreadOtCmdRsp => IpccChannel::Channel3,
80 #[cfg(feature = "zigbee")]
81 Cpu1Channel::ZigbeeCmdAppli => IpccChannel::Channel3,
82 #[cfg(feature = "mac-802_15_4")]
83 Cpu1Channel::Mac802_15_4cmdRsp => IpccChannel::Channel3,
84 Cpu1Channel::MmReleaseBuffer => IpccChannel::Channel4,
85 #[cfg(feature = "thread")]
86 Cpu1Channel::ThreadCliCmd => IpccChannel::Channel5,
87 #[cfg(feature = "lld-tests")]
88 Cpu1Channel::LldTestsCliCmd => IpccChannel::Channel5,
89 #[cfg(feature = "ble-lld")]
90 Cpu1Channel::BleLldCmd => IpccChannel::Channel5,
91 Cpu1Channel::HciAclData => IpccChannel::Channel6,
92 }
93 }
94}
95
96pub enum Cpu2Channel {
97 BleEvent,
98 SystemEvent,
99 #[cfg(feature = "thread")]
100 ThreadNotifAck,
101 #[cfg(feature = "zigbee")]
102 ZigbeeAppliNotifAck,
103 #[cfg(feature = "mac-802_15_4")]
104 Mac802_15_4NotifAck,
105 #[cfg(feature = "lld-tests")]
106 LldTestsM0Cmd,
107 #[cfg(feature = "ble-lld")]
108 BleLldM0Cmd,
109 #[cfg(feature = "traces")]
110 Traces,
111 #[cfg(feature = "thread")]
112 ThreadCliNotifAck,
113 #[cfg(feature = "lld-tests")]
114 LldTestsCliRsp,
115 #[cfg(feature = "ble-lld")]
116 BleLldCliRsp,
117 #[cfg(feature = "ble-lld")]
118 BleLldRsp,
119 #[cfg(feature = "zigbee")]
120 ZigbeeM0Request,
121}
79 122
80 pub const IPCC_BLE_EVENT_CHANNEL: IpccChannel = IpccChannel::Channel1; 123impl From<Cpu2Channel> for IpccChannel {
81 pub const IPCC_SYSTEM_EVENT_CHANNEL: IpccChannel = IpccChannel::Channel2; 124 fn from(value: Cpu2Channel) -> Self {
82 #[allow(dead_code)] // Not used currently but reserved 125 match value {
83 pub const IPCC_THREAD_NOTIFICATION_ACK_CHANNEL: IpccChannel = IpccChannel::Channel3; 126 Cpu2Channel::BleEvent => IpccChannel::Channel1,
84 #[allow(dead_code)] // Not used currently but reserved 127 Cpu2Channel::SystemEvent => IpccChannel::Channel2,
85 pub const IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL: IpccChannel = IpccChannel::Channel3; 128 #[cfg(feature = "thread")]
86 #[allow(dead_code)] // Not used currently but reserved 129 Cpu2Channel::ThreadNotifAck => IpccChannel::Channel3,
87 pub const IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL: IpccChannel = IpccChannel::Channel3; 130 #[cfg(feature = "zigbee")]
88 #[allow(dead_code)] // Not used currently but reserved 131 Cpu2Channel::ZigbeeAppliNotifAck => IpccChannel::Channel3,
89 pub const IPCC_LDDTESTS_M0_CMD_CHANNEL: IpccChannel = IpccChannel::Channel3; 132 #[cfg(feature = "mac-802_15_4")]
90 #[allow(dead_code)] // Not used currently but reserved 133 Cpu2Channel::Mac802_15_4NotifAck => IpccChannel::Channel3,
91 pub const IPCC_BLE_LLD_M0_CMD_CHANNEL: IpccChannel = IpccChannel::Channel3; 134 #[cfg(feature = "lld-tests")]
92 #[allow(dead_code)] // Not used currently but reserved 135 Cpu2Channel::LldTestsM0Cmd => IpccChannel::Channel3,
93 pub const IPCC_TRACES_CHANNEL: IpccChannel = IpccChannel::Channel4; 136 #[cfg(feature = "ble-lld")]
94 #[allow(dead_code)] // Not used currently but reserved 137 Cpu2Channel::BleLldM0Cmd => IpccChannel::Channel3,
95 pub const IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL: IpccChannel = IpccChannel::Channel5; 138 #[cfg(feature = "traces")]
96 #[allow(dead_code)] // Not used currently but reserved 139 Cpu2Channel::Traces => IpccChannel::Channel4,
97 pub const IPCC_LLDTESTS_CLI_RSP_CHANNEL: IpccChannel = IpccChannel::Channel5; 140 #[cfg(feature = "thread")]
98 #[allow(dead_code)] // Not used currently but reserved 141 Cpu2Channel::ThreadCliNotifAck => IpccChannel::Channel5,
99 pub const IPCC_BLE_LLD_CLI_RSP_CHANNEL: IpccChannel = IpccChannel::Channel5; 142 #[cfg(feature = "lld-tests")]
100 #[allow(dead_code)] // Not used currently but reserved 143 Cpu2Channel::LldTestsCliRsp => IpccChannel::Channel5,
101 pub const IPCC_BLE_LLD_RSP_CHANNEL: IpccChannel = IpccChannel::Channel5; 144 #[cfg(feature = "ble-lld")]
102 #[allow(dead_code)] // Not used currently but reserved 145 Cpu2Channel::BleLldCliRsp => IpccChannel::Channel5,
103 pub const IPCC_ZIGBEE_M0_REQUEST_CHANNEL: IpccChannel = IpccChannel::Channel5; 146 #[cfg(feature = "ble-lld")]
147 Cpu2Channel::BleLldRsp => IpccChannel::Channel5,
148 #[cfg(feature = "zigbee")]
149 Cpu2Channel::ZigbeeM0Request => IpccChannel::Channel5,
150 }
151 }
104} 152}
diff --git a/embassy-stm32/src/tl_mbox/mac_802_15_4.rs b/embassy-stm32/src/tl_mbox/mac_802_15_4.rs
new file mode 100644
index 000000000..19f951130
--- /dev/null
+++ b/embassy-stm32/src/tl_mbox/mac_802_15_4.rs
@@ -0,0 +1,82 @@
1use core::mem::MaybeUninit;
2
3use embassy_futures::block_on;
4
5use super::cmd::{CmdPacket, CmdSerial};
6use super::consts::TlPacketType;
7use super::evt::{EvtBox, EvtPacket};
8use super::unsafe_linked_list::LinkedListNode;
9use super::{
10 channels, Mac802_15_4Table, EVT_QUEUE, MAC_802_15_4_CMD_BUFFER, MAC_802_15_4_NOTIF_RSP_EVT_BUFFER, TL_CHANNEL,
11 TL_MAC_802_15_4_TABLE, TL_REF_TABLE,
12};
13use crate::ipcc::Ipcc;
14
15pub struct Mac802_15_4;
16
17impl Mac802_15_4 {
18 pub(crate) fn init(ipcc: &mut Ipcc) -> Self {
19 unsafe {
20 LinkedListNode::init_head(EVT_QUEUE.as_mut_ptr());
21
22 TL_MAC_802_15_4_TABLE = MaybeUninit::new(Mac802_15_4Table {
23 pcmd_rsp_buffer: MAC_802_15_4_CMD_BUFFER.as_mut_ptr().cast(),
24 pnotack_buffer: MAC_802_15_4_NOTIF_RSP_EVT_BUFFER.as_mut_ptr().cast(),
25 evt_queue: EVT_QUEUE.as_ptr().cast(),
26 });
27 }
28
29 ipcc.c1_set_rx_channel(channels::Cpu2Channel::Mac802_15_4NotifAck.into(), true);
30
31 Self
32 }
33
34 pub(crate) fn notif_evt_handler(ipcc: &mut Ipcc) {
35 unsafe {
36 let notif_buffer: *mut EvtPacket = (*TL_REF_TABLE.assume_init().mac_802_15_4_table).pnotack_buffer.cast();
37 let event = EvtBox::new(notif_buffer);
38
39 block_on(TL_CHANNEL.send(event));
40 }
41
42 ipcc.c1_set_rx_channel(channels::Cpu2Channel::Mac802_15_4NotifAck.into(), false);
43 }
44
45 pub(crate) fn cmd_evt_handler(ipcc: &mut Ipcc) {
46 unsafe {
47 let _notif_buffer = (*TL_REF_TABLE.assume_init().mac_802_15_4_table).pcmd_rsp_buffer;
48
49 // NOTE: ST's HAL does nothing with this buffer, ??????
50 }
51
52 ipcc.c1_set_tx_channel(channels::Cpu1Channel::Mac802_15_4cmdRsp.into(), false);
53 }
54
55 pub(crate) fn send_cmd(ipcc: &mut Ipcc, buf: &[u8]) {
56 unsafe {
57 let pcmd_buffer: *mut CmdPacket = (*TL_REF_TABLE.assume_init().mac_802_15_4_table).pcmd_rsp_buffer.cast();
58 let pcmd_serial: *mut CmdSerial = &mut (*pcmd_buffer).cmd_serial;
59 let pcmd_serial_buf: *mut u8 = pcmd_serial.cast();
60
61 core::ptr::copy(buf.as_ptr(), pcmd_serial_buf, buf.len());
62
63 let cmd_packet: &mut CmdPacket =
64 &mut *(*TL_REF_TABLE.assume_init().mac_802_15_4_table).pcmd_rsp_buffer.cast();
65 cmd_packet.cmd_serial.ty = TlPacketType::OtCmd as u8;
66 }
67
68 ipcc.c1_set_flag_channel(channels::Cpu1Channel::Mac802_15_4cmdRsp.into());
69 ipcc.c1_set_tx_channel(channels::Cpu1Channel::Mac802_15_4cmdRsp.into(), true);
70 }
71
72 pub(crate) fn send_ack(ipcc: &mut Ipcc) {
73 // TODO
74 unsafe {
75 let packet: &mut CmdPacket = &mut *(*TL_REF_TABLE.assume_init().mac_802_15_4_table).pnotack_buffer.cast();
76 packet.cmd_serial.ty = TlPacketType::OtAck as u8;
77 }
78
79 ipcc.c1_clear_flag_channel(channels::Cpu2Channel::Mac802_15_4NotifAck.into());
80 ipcc.c1_set_rx_channel(channels::Cpu2Channel::Mac802_15_4NotifAck.into(), true);
81 }
82}
diff --git a/embassy-stm32/src/tl_mbox/mm.rs b/embassy-stm32/src/tl_mbox/mm.rs
index 6e0818cf1..cb161ce58 100644
--- a/embassy-stm32/src/tl_mbox/mm.rs
+++ b/embassy-stm32/src/tl_mbox/mm.rs
@@ -11,7 +11,7 @@ use crate::ipcc::Ipcc;
11pub struct MemoryManager; 11pub struct MemoryManager;
12 12
13impl MemoryManager { 13impl MemoryManager {
14 pub fn new() -> Self { 14 pub fn init() -> Self {
15 unsafe { 15 unsafe {
16 LinkedListNode::init_head(FREE_BUFF_QUEUE.as_mut_ptr()); 16 LinkedListNode::init_head(FREE_BUFF_QUEUE.as_mut_ptr());
17 LinkedListNode::init_head(LOCAL_FREE_BUF_QUEUE.as_mut_ptr()); 17 LinkedListNode::init_head(LOCAL_FREE_BUF_QUEUE.as_mut_ptr());
diff --git a/embassy-stm32/src/tl_mbox/mod.rs b/embassy-stm32/src/tl_mbox/mod.rs
index 1c927efa0..fe366f6d8 100644
--- a/embassy-stm32/src/tl_mbox/mod.rs
+++ b/embassy-stm32/src/tl_mbox/mod.rs
@@ -5,9 +5,12 @@ use embassy_cortex_m::interrupt::{Interrupt, InterruptExt};
5use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; 5use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
6use embassy_sync::channel::Channel; 6use embassy_sync::channel::Channel;
7 7
8#[cfg(feature = "ble")]
8use self::ble::Ble; 9use self::ble::Ble;
9use self::cmd::{AclDataPacket, CmdPacket}; 10use self::cmd::{AclDataPacket, CmdPacket};
10use self::evt::{CsEvt, EvtBox}; 11use self::evt::{CsEvt, EvtBox};
12#[cfg(feature = "mac-802_15_4")]
13use self::mac_802_15_4::Mac802_15_4;
11use self::mm::MemoryManager; 14use self::mm::MemoryManager;
12use self::shci::{shci_ble_init, ShciBleInitCmdParam}; 15use self::shci::{shci_ble_init, ShciBleInitCmdParam};
13use self::sys::Sys; 16use self::sys::Sys;
@@ -15,7 +18,6 @@ use self::unsafe_linked_list::LinkedListNode;
15use crate::interrupt; 18use crate::interrupt;
16use crate::ipcc::{Config, Ipcc}; 19use crate::ipcc::{Config, Ipcc};
17 20
18mod ble;
19mod channels; 21mod channels;
20mod cmd; 22mod cmd;
21mod consts; 23mod consts;
@@ -25,6 +27,11 @@ mod shci;
25mod sys; 27mod sys;
26mod unsafe_linked_list; 28mod unsafe_linked_list;
27 29
30#[cfg(feature = "ble")]
31mod ble;
32#[cfg(feature = "mac-802_15_4")]
33mod mac_802_15_4;
34
28pub type PacketHeader = LinkedListNode; 35pub type PacketHeader = LinkedListNode;
29 36
30const TL_PACKET_HEADER_SIZE: usize = core::mem::size_of::<PacketHeader>(); 37const TL_PACKET_HEADER_SIZE: usize = core::mem::size_of::<PacketHeader>();
@@ -212,8 +219,8 @@ struct TracesTable {
212 219
213#[repr(C, packed)] 220#[repr(C, packed)]
214struct Mac802_15_4Table { 221struct Mac802_15_4Table {
215 pcmd_rsp_buffer: *const u8, 222 pcmd_rsp_buffer: *mut u8,
216 pnotack_buffer: *const u8, 223 pnotack_buffer: *mut u8,
217 evt_queue: *const u8, 224 evt_queue: *const u8,
218} 225}
219 226
@@ -233,6 +240,7 @@ pub struct RefTable {
233 ble_lld_table: *const BleLldTable, 240 ble_lld_table: *const BleLldTable,
234} 241}
235 242
243// -------------------- reference table --------------------
236#[link_section = "TL_REF_TABLE"] 244#[link_section = "TL_REF_TABLE"]
237pub static mut TL_REF_TABLE: MaybeUninit<RefTable> = MaybeUninit::uninit(); 245pub static mut TL_REF_TABLE: MaybeUninit<RefTable> = MaybeUninit::uninit();
238 246
@@ -266,38 +274,50 @@ static mut TL_MAC_802_15_4_TABLE: MaybeUninit<Mac802_15_4Table> = MaybeUninit::u
266#[link_section = "MB_MEM1"] 274#[link_section = "MB_MEM1"]
267static mut TL_ZIGBEE_TABLE: MaybeUninit<ZigbeeTable> = MaybeUninit::uninit(); 275static mut TL_ZIGBEE_TABLE: MaybeUninit<ZigbeeTable> = MaybeUninit::uninit();
268 276
269#[allow(dead_code)] // Not used currently but reserved 277// -------------------- tables --------------------
270#[link_section = "MB_MEM1"] 278#[link_section = "MB_MEM1"]
271static mut FREE_BUFF_QUEUE: MaybeUninit<LinkedListNode> = MaybeUninit::uninit(); 279static mut FREE_BUFF_QUEUE: MaybeUninit<LinkedListNode> = MaybeUninit::uninit();
272 280
273// not in shared RAM
274static mut LOCAL_FREE_BUF_QUEUE: MaybeUninit<LinkedListNode> = MaybeUninit::uninit();
275
276#[link_section = "MB_MEM2"] 281#[link_section = "MB_MEM2"]
277static mut CS_BUFFER: MaybeUninit<[u8; TL_PACKET_HEADER_SIZE + TL_EVT_HEADER_SIZE + TL_CS_EVT_SIZE]> = 282static mut CS_BUFFER: MaybeUninit<[u8; TL_PACKET_HEADER_SIZE + TL_EVT_HEADER_SIZE + TL_CS_EVT_SIZE]> =
278 MaybeUninit::uninit(); 283 MaybeUninit::uninit();
279 284
280#[link_section = "MB_MEM2"] 285#[link_section = "MB_MEM1"]
281static mut EVT_QUEUE: MaybeUninit<LinkedListNode> = MaybeUninit::uninit(); 286static mut EVT_QUEUE: MaybeUninit<LinkedListNode> = MaybeUninit::uninit();
282 287
283#[link_section = "MB_MEM2"] 288#[link_section = "MB_MEM2"]
284static mut SYSTEM_EVT_QUEUE: MaybeUninit<LinkedListNode> = MaybeUninit::uninit(); 289static mut SYSTEM_EVT_QUEUE: MaybeUninit<LinkedListNode> = MaybeUninit::uninit();
285 290
286#[link_section = "MB_MEM2"] 291// not in shared RAM
287static mut SYS_CMD_BUF: MaybeUninit<CmdPacket> = MaybeUninit::uninit(); 292static mut LOCAL_FREE_BUF_QUEUE: MaybeUninit<LinkedListNode> = MaybeUninit::uninit();
288 293
294// -------------------- app tables --------------------
289#[link_section = "MB_MEM2"] 295#[link_section = "MB_MEM2"]
290static mut EVT_POOL: MaybeUninit<[u8; POOL_SIZE]> = MaybeUninit::uninit(); 296static mut EVT_POOL: MaybeUninit<[u8; POOL_SIZE]> = MaybeUninit::uninit();
291 297
292#[link_section = "MB_MEM2"] 298#[link_section = "MB_MEM2"]
299static mut SYS_CMD_BUF: MaybeUninit<CmdPacket> = MaybeUninit::uninit();
300
301#[link_section = "MB_MEM2"]
293static mut SYS_SPARE_EVT_BUF: MaybeUninit<[u8; TL_PACKET_HEADER_SIZE + TL_EVT_HEADER_SIZE + 255]> = 302static mut SYS_SPARE_EVT_BUF: MaybeUninit<[u8; TL_PACKET_HEADER_SIZE + TL_EVT_HEADER_SIZE + 255]> =
294 MaybeUninit::uninit(); 303 MaybeUninit::uninit();
295 304
305#[cfg(feature = "mac-802_15_4")]
296#[link_section = "MB_MEM2"] 306#[link_section = "MB_MEM2"]
297static mut BLE_SPARE_EVT_BUF: MaybeUninit<[u8; TL_PACKET_HEADER_SIZE + TL_EVT_HEADER_SIZE + 255]> = 307static mut MAC_802_15_4_CMD_BUFFER: MaybeUninit<CmdPacket> = MaybeUninit::uninit();
308
309#[cfg(feature = "mac-802_15_4")]
310#[link_section = "MB_MEM2"]
311static mut MAC_802_15_4_NOTIF_RSP_EVT_BUFFER: MaybeUninit<[u8; TL_PACKET_HEADER_SIZE + TL_EVT_HEADER_SIZE + 255]> =
298 MaybeUninit::uninit(); 312 MaybeUninit::uninit();
299 313
314#[cfg(feature = "ble")]
300#[link_section = "MB_MEM2"] 315#[link_section = "MB_MEM2"]
316static mut BLE_SPARE_EVT_BUF: MaybeUninit<[u8; TL_PACKET_HEADER_SIZE + TL_EVT_HEADER_SIZE + 255]> =
317 MaybeUninit::uninit();
318
319#[cfg(feature = "ble")]
320#[link_section = "MB_MEM1"]
301static mut BLE_CMD_BUFFER: MaybeUninit<CmdPacket> = MaybeUninit::uninit(); 321static mut BLE_CMD_BUFFER: MaybeUninit<CmdPacket> = MaybeUninit::uninit();
302 322
303#[link_section = "MB_MEM2"] 323#[link_section = "MB_MEM2"]
@@ -307,10 +327,14 @@ static mut HCI_ACL_DATA_BUFFER: MaybeUninit<[u8; TL_PACKET_HEADER_SIZE + 5 + 251
307// TODO: get a better size, this is a placeholder 327// TODO: get a better size, this is a placeholder
308pub(crate) static TL_CHANNEL: Channel<CriticalSectionRawMutex, EvtBox, 5> = Channel::new(); 328pub(crate) static TL_CHANNEL: Channel<CriticalSectionRawMutex, EvtBox, 5> = Channel::new();
309 329
310pub struct TlMbox { 330pub struct TlMbox;
311 _sys: Sys, 331
312 _ble: Ble, 332pub enum MailboxTarget {
313 _mm: MemoryManager, 333 Sys,
334 #[cfg(feature = "ble")]
335 Ble,
336 #[cfg(feature = "mac-802_15_4")]
337 Mac802_15_4,
314} 338}
315 339
316impl TlMbox { 340impl TlMbox {
@@ -356,9 +380,14 @@ impl TlMbox {
356 380
357 Ipcc::init(config); 381 Ipcc::init(config);
358 382
359 let _sys = Sys::new(); 383 Sys::init();
360 let _ble = Ble::new(); 384 MemoryManager::init();
361 let _mm = MemoryManager::new(); 385
386 #[cfg(feature = "ble")]
387 Ble::init();
388
389 #[cfg(feature = "mac-802_15_4")]
390 Mac802_15_4::init();
362 391
363 // enable interrupts 392 // enable interrupts
364 unsafe { crate::interrupt::IPCC_C1_RX::steal() }.unpend(); 393 unsafe { crate::interrupt::IPCC_C1_RX::steal() }.unpend();
@@ -367,7 +396,7 @@ impl TlMbox {
367 unsafe { crate::interrupt::IPCC_C1_RX::steal() }.enable(); 396 unsafe { crate::interrupt::IPCC_C1_RX::steal() }.enable();
368 unsafe { crate::interrupt::IPCC_C1_TX::steal() }.enable(); 397 unsafe { crate::interrupt::IPCC_C1_TX::steal() }.enable();
369 398
370 TlMbox { _sys, _ble, _mm } 399 Self
371 } 400 }
372 401
373 pub fn wireless_fw_info(&self) -> Option<WirelessFwInfoTable> { 402 pub fn wireless_fw_info(&self) -> Option<WirelessFwInfoTable> {
@@ -381,17 +410,30 @@ impl TlMbox {
381 } 410 }
382 } 411 }
383 412
413 #[cfg(feature = "ble")]
384 pub fn shci_ble_init(&self, param: ShciBleInitCmdParam) { 414 pub fn shci_ble_init(&self, param: ShciBleInitCmdParam) {
385 shci_ble_init(param); 415 shci_ble_init(param);
386 } 416 }
387 417
388 pub fn send_ble_cmd(&self, buf: &[u8]) { 418 pub fn send_cmd(&self, buf: &[u8], target: MailboxTarget) {
389 ble::Ble::send_cmd(buf); 419 match target {
420 MailboxTarget::Sys => Sys::send_cmd(buf),
421 #[cfg(feature = "ble")]
422 MailboxTarget::Ble => Ble::send_cmd(buf),
423 #[cfg(feature = "mac-802_15_4")]
424 MailboxTarget::Mac802_15_4 => Mac802_15_4::send_cmd(buf),
425 }
390 } 426 }
391 427
392 // pub fn send_sys_cmd(&self, buf: &[u8]) { 428 pub fn send_ack(&self, target: MailboxTarget) {
393 // sys::Sys::send_cmd(buf); 429 match target {
394 // } 430 #[cfg(feature = "ble")]
431 MailboxTarget::Ble => Ble::send_acl_data(),
432 #[cfg(feature = "mac-802_15_4")]
433 MailboxTarget::Mac802_15_4 => Mac802_15_4::send_ack(),
434 MailboxTarget::Sys => { /* does nothing */ }
435 }
436 }
395 437
396 pub async fn read(&self) -> EvtBox { 438 pub async fn read(&self) -> EvtBox {
397 TL_CHANNEL.recv().await 439 TL_CHANNEL.recv().await
diff --git a/embassy-stm32/src/tl_mbox/sys.rs b/embassy-stm32/src/tl_mbox/sys.rs
index 79e257148..4ffbe8e6a 100644
--- a/embassy-stm32/src/tl_mbox/sys.rs
+++ b/embassy-stm32/src/tl_mbox/sys.rs
@@ -70,7 +70,6 @@ impl Sys {
70 #[allow(dead_code)] 70 #[allow(dead_code)]
71 pub(crate) fn send_cmd(buf: &[u8]) { 71 pub(crate) fn send_cmd(buf: &[u8]) {
72 unsafe { 72 unsafe {
73 // TODO: check this
74 let cmd_buffer = &mut *(*TL_REF_TABLE.assume_init().sys_table).pcmd_buffer; 73 let cmd_buffer = &mut *(*TL_REF_TABLE.assume_init().sys_table).pcmd_buffer;
75 let cmd_serial: *mut CmdSerial = &mut cmd_buffer.cmd_serial; 74 let cmd_serial: *mut CmdSerial = &mut cmd_buffer.cmd_serial;
76 let cmd_serial_buf = cmd_serial.cast(); 75 let cmd_serial_buf = cmd_serial.cast();