diff options
| author | Raul Alimbekov <[email protected]> | 2025-12-16 09:05:22 +0300 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-12-16 09:05:22 +0300 |
| commit | c9a04b4b732b7a3b696eb8223664c1a7942b1875 (patch) | |
| tree | 6dbe5c02e66eed8d8762f13f95afd24f8db2b38c /embassy-stm32-wpan/src/wb55/cmd.rs | |
| parent | cde24a3ef1117653ba5ed4184102b33f745782fb (diff) | |
| parent | 5ae6e060ec1c90561719aabdc29d5b6e7b8b0a82 (diff) | |
Merge branch 'main' into main
Diffstat (limited to 'embassy-stm32-wpan/src/wb55/cmd.rs')
| -rw-r--r-- | embassy-stm32-wpan/src/wb55/cmd.rs | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/embassy-stm32-wpan/src/wb55/cmd.rs b/embassy-stm32-wpan/src/wb55/cmd.rs new file mode 100644 index 000000000..34f02d6e7 --- /dev/null +++ b/embassy-stm32-wpan/src/wb55/cmd.rs | |||
| @@ -0,0 +1,109 @@ | |||
| 1 | use core::ptr; | ||
| 2 | use core::sync::atomic::{Ordering, compiler_fence}; | ||
| 3 | |||
| 4 | use crate::consts::TlPacketType; | ||
| 5 | use crate::wb55::PacketHeader; | ||
| 6 | |||
| 7 | #[derive(Copy, Clone)] | ||
| 8 | #[repr(C, packed)] | ||
| 9 | pub struct Cmd { | ||
| 10 | pub cmd_code: u16, | ||
| 11 | pub payload_len: u8, | ||
| 12 | pub payload: [u8; 255], | ||
| 13 | } | ||
| 14 | |||
| 15 | impl Default for Cmd { | ||
| 16 | fn default() -> Self { | ||
| 17 | Self { | ||
| 18 | cmd_code: 0, | ||
| 19 | payload_len: 0, | ||
| 20 | payload: [0u8; 255], | ||
| 21 | } | ||
| 22 | } | ||
| 23 | } | ||
| 24 | |||
| 25 | #[derive(Copy, Clone, Default)] | ||
| 26 | #[repr(C, packed)] | ||
| 27 | pub struct CmdSerial { | ||
| 28 | pub ty: u8, | ||
| 29 | pub cmd: Cmd, | ||
| 30 | } | ||
| 31 | |||
| 32 | #[derive(Copy, Clone, Default)] | ||
| 33 | #[repr(C, packed)] | ||
| 34 | pub struct CmdSerialStub { | ||
| 35 | pub ty: u8, | ||
| 36 | pub cmd_code: u16, | ||
| 37 | pub payload_len: u8, | ||
| 38 | } | ||
| 39 | |||
| 40 | #[derive(Copy, Clone, Default)] | ||
| 41 | #[repr(C, packed)] | ||
| 42 | pub struct CmdPacket { | ||
| 43 | pub header: PacketHeader, | ||
| 44 | pub cmdserial: CmdSerial, | ||
| 45 | } | ||
| 46 | |||
| 47 | impl CmdPacket { | ||
| 48 | pub unsafe fn write_into(cmd_buf: *mut CmdPacket, packet_type: TlPacketType, cmd_code: u16, payload: &[u8]) { | ||
| 49 | let p_cmd_serial = (cmd_buf as *mut u8).add(size_of::<PacketHeader>()); | ||
| 50 | let p_payload = p_cmd_serial.add(size_of::<CmdSerialStub>()); | ||
| 51 | |||
| 52 | ptr::write_unaligned( | ||
| 53 | p_cmd_serial as *mut _, | ||
| 54 | CmdSerialStub { | ||
| 55 | ty: packet_type as u8, | ||
| 56 | cmd_code, | ||
| 57 | payload_len: payload.len() as u8, | ||
| 58 | }, | ||
| 59 | ); | ||
| 60 | |||
| 61 | ptr::copy_nonoverlapping(payload as *const _ as *const u8, p_payload, payload.len()); | ||
| 62 | |||
| 63 | compiler_fence(Ordering::Release); | ||
| 64 | } | ||
| 65 | } | ||
| 66 | |||
| 67 | #[derive(Copy, Clone)] | ||
| 68 | #[repr(C, packed)] | ||
| 69 | pub struct AclDataSerial { | ||
| 70 | pub ty: u8, | ||
| 71 | pub handle: u16, | ||
| 72 | pub length: u16, | ||
| 73 | pub acl_data: [u8; 1], | ||
| 74 | } | ||
| 75 | |||
| 76 | #[derive(Copy, Clone)] | ||
| 77 | #[repr(C, packed)] | ||
| 78 | pub struct AclDataSerialStub { | ||
| 79 | pub ty: u8, | ||
| 80 | pub handle: u16, | ||
| 81 | pub length: u16, | ||
| 82 | } | ||
| 83 | |||
| 84 | #[derive(Copy, Clone)] | ||
| 85 | #[repr(C, packed)] | ||
| 86 | pub struct AclDataPacket { | ||
| 87 | pub header: PacketHeader, | ||
| 88 | pub acl_data_serial: AclDataSerial, | ||
| 89 | } | ||
| 90 | |||
| 91 | impl AclDataPacket { | ||
| 92 | pub unsafe fn write_into(cmd_buf: *mut AclDataPacket, packet_type: TlPacketType, handle: u16, payload: &[u8]) { | ||
| 93 | let p_cmd_serial = (cmd_buf as *mut u8).add(size_of::<PacketHeader>()); | ||
| 94 | let p_payload = p_cmd_serial.add(size_of::<AclDataSerialStub>()); | ||
| 95 | |||
| 96 | ptr::write_unaligned( | ||
| 97 | p_cmd_serial as *mut _, | ||
| 98 | AclDataSerialStub { | ||
| 99 | ty: packet_type as u8, | ||
| 100 | handle: handle, | ||
| 101 | length: payload.len() as u16, | ||
| 102 | }, | ||
| 103 | ); | ||
| 104 | |||
| 105 | ptr::copy_nonoverlapping(payload as *const _ as *const u8, p_payload, payload.len()); | ||
| 106 | |||
| 107 | compiler_fence(Ordering::Release); | ||
| 108 | } | ||
| 109 | } | ||
