aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32-wpan
diff options
context:
space:
mode:
authorxoviat <[email protected]>2025-11-23 18:22:05 +0000
committerGitHub <[email protected]>2025-11-23 18:22:05 +0000
commit1573bd6329af67860757f629b22d2c232504b73f (patch)
tree589cd69613bca67a5e06791fa160eefb1531abce /embassy-stm32-wpan
parent54a153a9a24a58a7cfa1210f78f61beb913baf2d (diff)
parent25cd9603ed738e3e4b90b2644a4323d57de71216 (diff)
Merge pull request #4933 from xoviat/wpan3
wpan: use ptr arithmetic and update pac
Diffstat (limited to 'embassy-stm32-wpan')
-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
4 files changed, 36 insertions, 21 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")]