aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32-wpan/src/cmd.rs21
-rw-r--r--embassy-stm32-wpan/src/evt.rs1
-rw-r--r--embassy-stm32-wpan/src/shci.rs18
-rw-r--r--embassy-stm32-wpan/src/sub/sys.rs17
-rw-r--r--embassy-stm32/src/ipcc.rs2
5 files changed, 37 insertions, 22 deletions
diff --git a/embassy-stm32-wpan/src/cmd.rs b/embassy-stm32-wpan/src/cmd.rs
index 5c81a4aa7..787c22c4b 100644
--- a/embassy-stm32-wpan/src/cmd.rs
+++ b/embassy-stm32-wpan/src/cmd.rs
@@ -1,4 +1,5 @@
1use core::ptr; 1use core::ptr;
2use core::sync::atomic::{Ordering, compiler_fence};
2 3
3use crate::PacketHeader; 4use crate::PacketHeader;
4use crate::consts::TlPacketType; 5use crate::consts::TlPacketType;
@@ -45,11 +46,11 @@ pub struct CmdPacket {
45 46
46impl CmdPacket { 47impl CmdPacket {
47 pub unsafe fn write_into(cmd_buf: *mut CmdPacket, packet_type: TlPacketType, cmd_code: u16, payload: &[u8]) { 48 pub unsafe fn write_into(cmd_buf: *mut CmdPacket, packet_type: TlPacketType, cmd_code: u16, payload: &[u8]) {
48 let p_cmd_serial = &mut (*cmd_buf).cmdserial as *mut _ as *mut CmdSerialStub; 49 let p_cmd_serial = (cmd_buf as *mut u8).add(size_of::<PacketHeader>());
49 let p_payload = &mut (*cmd_buf).cmdserial.cmd.payload as *mut _; 50 let p_payload = p_cmd_serial.add(size_of::<CmdSerialStub>());
50 51
51 ptr::write_volatile( 52 ptr::write_unaligned(
52 p_cmd_serial, 53 p_cmd_serial as *mut _,
53 CmdSerialStub { 54 CmdSerialStub {
54 ty: packet_type as u8, 55 ty: packet_type as u8,
55 cmd_code, 56 cmd_code,
@@ -58,6 +59,8 @@ impl CmdPacket {
58 ); 59 );
59 60
60 ptr::copy_nonoverlapping(payload as *const _ as *const u8, p_payload, payload.len()); 61 ptr::copy_nonoverlapping(payload as *const _ as *const u8, p_payload, payload.len());
62
63 compiler_fence(Ordering::Release);
61 } 64 }
62} 65}
63 66
@@ -87,11 +90,11 @@ pub struct AclDataPacket {
87 90
88impl AclDataPacket { 91impl AclDataPacket {
89 pub unsafe fn write_into(cmd_buf: *mut AclDataPacket, packet_type: TlPacketType, handle: u16, payload: &[u8]) { 92 pub unsafe fn write_into(cmd_buf: *mut AclDataPacket, packet_type: TlPacketType, handle: u16, payload: &[u8]) {
90 let p_cmd_serial = &mut (*cmd_buf).acl_data_serial as *mut _ as *mut AclDataSerialStub; 93 let p_cmd_serial = (cmd_buf as *mut u8).add(size_of::<PacketHeader>());
91 let p_payload = &mut (*cmd_buf).acl_data_serial.acl_data as *mut _; 94 let p_payload = p_cmd_serial.add(size_of::<AclDataSerialStub>());
92 95
93 ptr::write_volatile( 96 ptr::write_unaligned(
94 p_cmd_serial, 97 p_cmd_serial as *mut _,
95 AclDataSerialStub { 98 AclDataSerialStub {
96 ty: packet_type as u8, 99 ty: packet_type as u8,
97 handle: handle, 100 handle: handle,
@@ -100,5 +103,7 @@ impl AclDataPacket {
100 ); 103 );
101 104
102 ptr::copy_nonoverlapping(payload as *const _ as *const u8, p_payload, payload.len()); 105 ptr::copy_nonoverlapping(payload as *const _ as *const u8, p_payload, payload.len());
106
107 compiler_fence(Ordering::Release);
103 } 108 }
104} 109}
diff --git a/embassy-stm32-wpan/src/evt.rs b/embassy-stm32-wpan/src/evt.rs
index c6528413d..f32821269 100644
--- a/embassy-stm32-wpan/src/evt.rs
+++ b/embassy-stm32-wpan/src/evt.rs
@@ -67,6 +67,7 @@ pub struct EvtSerial {
67pub struct EvtStub { 67pub struct EvtStub {
68 pub kind: u8, 68 pub kind: u8,
69 pub evt_code: u8, 69 pub evt_code: u8,
70 pub payload_len: u8,
70} 71}
71 72
72/// This format shall be used for all events (asynchronous and command response) reported 73/// This format shall be used for all events (asynchronous and command response) reported
diff --git a/embassy-stm32-wpan/src/shci.rs b/embassy-stm32-wpan/src/shci.rs
index 30d689716..e93f55598 100644
--- a/embassy-stm32-wpan/src/shci.rs
+++ b/embassy-stm32-wpan/src/shci.rs
@@ -1,6 +1,10 @@
1use core::{mem, slice}; 1use core::sync::atomic::{Ordering, compiler_fence};
2use core::{mem, ptr, slice};
2 3
4use crate::PacketHeader;
5use crate::cmd::CmdPacket;
3use crate::consts::{TL_CS_EVT_SIZE, TL_EVT_HEADER_SIZE, TL_PACKET_HEADER_SIZE}; 6use crate::consts::{TL_CS_EVT_SIZE, TL_EVT_HEADER_SIZE, TL_PACKET_HEADER_SIZE};
7use crate::evt::{CcEvt, EvtStub};
4 8
5const SHCI_OGF: u16 = 0x3F; 9const SHCI_OGF: u16 = 0x3F;
6 10
@@ -21,6 +25,18 @@ pub enum SchiCommandStatus {
21 ShciFusCmdNotSupported = 0xFF, 25 ShciFusCmdNotSupported = 0xFF,
22} 26}
23 27
28impl SchiCommandStatus {
29 pub unsafe fn from_packet(cmd_buf: *const CmdPacket) -> Result<Self, ()> {
30 let p_cmd_serial = (cmd_buf as *mut u8).add(size_of::<PacketHeader>());
31 let p_evt_payload = p_cmd_serial.add(size_of::<EvtStub>());
32
33 compiler_fence(Ordering::Acquire);
34 let cc_evt = ptr::read_unaligned(p_evt_payload as *const CcEvt);
35
36 cc_evt.payload[0].try_into()
37 }
38}
39
24impl TryFrom<u8> for SchiCommandStatus { 40impl TryFrom<u8> for SchiCommandStatus {
25 type Error = (); 41 type Error = ();
26 42
diff --git a/embassy-stm32-wpan/src/sub/sys.rs b/embassy-stm32-wpan/src/sub/sys.rs
index 8a3382f86..549811685 100644
--- a/embassy-stm32-wpan/src/sub/sys.rs
+++ b/embassy-stm32-wpan/src/sub/sys.rs
@@ -1,10 +1,9 @@
1use core::ptr;
2
3use crate::cmd::CmdPacket; 1use crate::cmd::CmdPacket;
4use crate::consts::TlPacketType; 2use crate::consts::TlPacketType;
5use crate::evt::{CcEvt, EvtBox, EvtPacket}; 3use crate::evt::EvtBox;
6#[allow(unused_imports)] 4#[cfg(feature = "ble")]
7use crate::shci::{SchiCommandStatus, ShciBleInitCmdParam, ShciOpcode}; 5use crate::shci::ShciBleInitCmdParam;
6use crate::shci::{SchiCommandStatus, ShciOpcode};
8use crate::sub::mm; 7use crate::sub::mm;
9use crate::tables::{SysTable, WirelessFwInfoTable}; 8use crate::tables::{SysTable, WirelessFwInfoTable};
10use crate::unsafe_linked_list::LinkedListNode; 9use crate::unsafe_linked_list::LinkedListNode;
@@ -50,13 +49,7 @@ impl Sys {
50 self.write(opcode, payload).await; 49 self.write(opcode, payload).await;
51 Ipcc::flush(channels::cpu1::IPCC_SYSTEM_CMD_RSP_CHANNEL).await; 50 Ipcc::flush(channels::cpu1::IPCC_SYSTEM_CMD_RSP_CHANNEL).await;
52 51
53 unsafe { 52 unsafe { SchiCommandStatus::from_packet(SYS_CMD_BUF.as_ptr()) }
54 let p_event_packet = SYS_CMD_BUF.as_ptr() as *const EvtPacket;
55 let p_command_event = &((*p_event_packet).evt_serial.evt.payload) as *const _ as *const CcEvt;
56 let p_payload = &((*p_command_event).payload) as *const u8;
57
58 ptr::read_volatile(p_payload).try_into()
59 }
60 } 53 }
61 54
62 #[cfg(feature = "mac")] 55 #[cfg(feature = "mac")]
diff --git a/embassy-stm32/src/ipcc.rs b/embassy-stm32/src/ipcc.rs
index e1d8b1c2a..b9be1b1d2 100644
--- a/embassy-stm32/src/ipcc.rs
+++ b/embassy-stm32/src/ipcc.rs
@@ -147,7 +147,7 @@ impl Ipcc {
147 // If bit is set to 1 then interrupt is disabled; we want to enable the interrupt 147 // If bit is set to 1 then interrupt is disabled; we want to enable the interrupt
148 regs.cpu(0).mr().modify(|w| w.set_chfm(channel as usize, false)); 148 regs.cpu(0).mr().modify(|w| w.set_chfm(channel as usize, false));
149 149
150 compiler_fence(Ordering::SeqCst); 150 compiler_fence(Ordering::Release);
151 151
152 if !regs.cpu(0).sr().read().chf(channel as usize) { 152 if !regs.cpu(0).sr().read().chf(channel as usize) {
153 // If bit is set to 1 then interrupt is disabled; we want to disable the interrupt 153 // If bit is set to 1 then interrupt is disabled; we want to disable the interrupt