stm32/wpan: reorg modules
This commit is contained in:
		
							parent
							
								
									748d1ea89d
								
							
						
					
					
						commit
						9f63158aad
					
				| @ -1,5 +1,8 @@ | |||||||
| use core::convert::TryFrom; | use core::convert::TryFrom; | ||||||
| 
 | 
 | ||||||
|  | use crate::evt::CsEvt; | ||||||
|  | use crate::PacketHeader; | ||||||
|  | 
 | ||||||
| #[derive(Debug)] | #[derive(Debug)] | ||||||
| #[repr(C)] | #[repr(C)] | ||||||
| pub enum TlPacketType { | pub enum TlPacketType { | ||||||
| @ -53,3 +56,34 @@ impl TryFrom<u8> for TlPacketType { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | pub const TL_PACKET_HEADER_SIZE: usize = core::mem::size_of::<PacketHeader>(); | ||||||
|  | pub const TL_EVT_HEADER_SIZE: usize = 3; | ||||||
|  | pub const TL_CS_EVT_SIZE: usize = core::mem::size_of::<CsEvt>(); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Queue length of BLE Event | ||||||
|  |  * This parameter defines the number of asynchronous events that can be stored in the HCI layer before | ||||||
|  |  * being reported to the application. When a command is sent to the BLE core coprocessor, the HCI layer | ||||||
|  |  * is waiting for the event with the Num_HCI_Command_Packets set to 1. The receive queue shall be large | ||||||
|  |  * enough to store all asynchronous events received in between. | ||||||
|  |  * When CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE is set to 27, this allow to store three 255 bytes long asynchronous events | ||||||
|  |  * between the HCI command and its event. | ||||||
|  |  * This parameter depends on the value given to CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE. When the queue size is to small, | ||||||
|  |  * the system may hang if the queue is full with asynchronous events and the HCI layer is still waiting | ||||||
|  |  * for a CC/CS event, In that case, the notification TL_BLE_HCI_ToNot() is called to indicate | ||||||
|  |  * to the application a HCI command did not receive its command event within 30s (Default HCI Timeout). | ||||||
|  |  */ | ||||||
|  | pub const CFG_TL_BLE_EVT_QUEUE_LENGTH: usize = 5; | ||||||
|  | pub const CFG_TL_BLE_MOST_EVENT_PAYLOAD_SIZE: usize = 255; | ||||||
|  | pub const TL_BLE_EVENT_FRAME_SIZE: usize = TL_EVT_HEADER_SIZE + CFG_TL_BLE_MOST_EVENT_PAYLOAD_SIZE; | ||||||
|  | 
 | ||||||
|  | pub const POOL_SIZE: usize = CFG_TL_BLE_EVT_QUEUE_LENGTH * 4 * divc(TL_PACKET_HEADER_SIZE + TL_BLE_EVENT_FRAME_SIZE, 4); | ||||||
|  | 
 | ||||||
|  | pub const fn divc(x: usize, y: usize) -> usize { | ||||||
|  |     (x + y - 1) / y | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub const TL_BLE_EVT_CS_PACKET_SIZE: usize = TL_EVT_HEADER_SIZE + TL_CS_EVT_SIZE; | ||||||
|  | #[allow(dead_code)] | ||||||
|  | pub const TL_BLE_EVT_CS_BUFFER_SIZE: usize = TL_PACKET_HEADER_SIZE + TL_BLE_EVT_CS_PACKET_SIZE; | ||||||
|  | |||||||
| @ -7,16 +7,13 @@ use core::mem::MaybeUninit; | |||||||
| use core::sync::atomic::{compiler_fence, Ordering}; | use core::sync::atomic::{compiler_fence, Ordering}; | ||||||
| 
 | 
 | ||||||
| use ble::Ble; | use ble::Ble; | ||||||
| use cmd::CmdPacket; |  | ||||||
| use embassy_hal_common::{into_ref, Peripheral, PeripheralRef}; | use embassy_hal_common::{into_ref, Peripheral, PeripheralRef}; | ||||||
| use embassy_stm32::interrupt; | use embassy_stm32::interrupt; | ||||||
| use embassy_stm32::ipcc::{Config, Ipcc, ReceiveInterruptHandler, TransmitInterruptHandler}; | use embassy_stm32::ipcc::{Config, Ipcc, ReceiveInterruptHandler, TransmitInterruptHandler}; | ||||||
| use embassy_stm32::peripherals::IPCC; | use embassy_stm32::peripherals::IPCC; | ||||||
| use mm::MemoryManager; | use mm::MemoryManager; | ||||||
| use sys::Sys; | use sys::Sys; | ||||||
| use tables::{ | use tables::*; | ||||||
|     BleTable, DeviceInfoTable, Mac802_15_4Table, MemManagerTable, RefTable, SysTable, ThreadTable, TracesTable, |  | ||||||
| }; |  | ||||||
| use unsafe_linked_list::LinkedListNode; | use unsafe_linked_list::LinkedListNode; | ||||||
| 
 | 
 | ||||||
| pub mod ble; | pub mod ble; | ||||||
| @ -30,100 +27,8 @@ pub mod sys; | |||||||
| pub mod tables; | pub mod tables; | ||||||
| pub mod unsafe_linked_list; | pub mod unsafe_linked_list; | ||||||
| 
 | 
 | ||||||
| #[link_section = "TL_REF_TABLE"] |  | ||||||
| pub static mut TL_REF_TABLE: MaybeUninit<RefTable> = MaybeUninit::uninit(); |  | ||||||
| 
 |  | ||||||
| #[link_section = "MB_MEM1"] |  | ||||||
| static mut TL_DEVICE_INFO_TABLE: MaybeUninit<DeviceInfoTable> = MaybeUninit::uninit(); |  | ||||||
| 
 |  | ||||||
| #[link_section = "MB_MEM1"] |  | ||||||
| static mut TL_BLE_TABLE: MaybeUninit<BleTable> = MaybeUninit::uninit(); |  | ||||||
| 
 |  | ||||||
| #[link_section = "MB_MEM1"] |  | ||||||
| static mut TL_THREAD_TABLE: MaybeUninit<ThreadTable> = MaybeUninit::uninit(); |  | ||||||
| 
 |  | ||||||
| #[link_section = "MB_MEM1"] |  | ||||||
| static mut TL_SYS_TABLE: MaybeUninit<SysTable> = MaybeUninit::uninit(); |  | ||||||
| 
 |  | ||||||
| #[link_section = "MB_MEM1"] |  | ||||||
| static mut TL_MEM_MANAGER_TABLE: MaybeUninit<MemManagerTable> = MaybeUninit::uninit(); |  | ||||||
| 
 |  | ||||||
| #[link_section = "MB_MEM1"] |  | ||||||
| static mut TL_TRACES_TABLE: MaybeUninit<TracesTable> = MaybeUninit::uninit(); |  | ||||||
| 
 |  | ||||||
| #[link_section = "MB_MEM1"] |  | ||||||
| static mut TL_MAC_802_15_4_TABLE: MaybeUninit<Mac802_15_4Table> = MaybeUninit::uninit(); |  | ||||||
| 
 |  | ||||||
| #[link_section = "MB_MEM2"] |  | ||||||
| static mut FREE_BUF_QUEUE: MaybeUninit<LinkedListNode> = MaybeUninit::uninit(); |  | ||||||
| 
 |  | ||||||
| // Not in shared RAM
 |  | ||||||
| static mut LOCAL_FREE_BUF_QUEUE: MaybeUninit<LinkedListNode> = MaybeUninit::uninit(); |  | ||||||
| 
 |  | ||||||
| #[allow(dead_code)] // Not used currently but reserved
 |  | ||||||
| #[link_section = "MB_MEM2"] |  | ||||||
| static mut TRACES_EVT_QUEUE: MaybeUninit<LinkedListNode> = MaybeUninit::uninit(); |  | ||||||
| 
 |  | ||||||
| type PacketHeader = LinkedListNode; | type PacketHeader = LinkedListNode; | ||||||
| 
 | 
 | ||||||
| const TL_PACKET_HEADER_SIZE: usize = core::mem::size_of::<PacketHeader>(); |  | ||||||
| const TL_EVT_HEADER_SIZE: usize = 3; |  | ||||||
| const TL_CS_EVT_SIZE: usize = core::mem::size_of::<evt::CsEvt>(); |  | ||||||
| 
 |  | ||||||
| #[link_section = "MB_MEM2"] |  | ||||||
| static mut CS_BUFFER: MaybeUninit<[u8; TL_PACKET_HEADER_SIZE + TL_EVT_HEADER_SIZE + TL_CS_EVT_SIZE]> = |  | ||||||
|     MaybeUninit::uninit(); |  | ||||||
| 
 |  | ||||||
| #[link_section = "MB_MEM2"] |  | ||||||
| static mut EVT_QUEUE: MaybeUninit<LinkedListNode> = MaybeUninit::uninit(); |  | ||||||
| 
 |  | ||||||
| #[link_section = "MB_MEM2"] |  | ||||||
| static mut SYSTEM_EVT_QUEUE: MaybeUninit<LinkedListNode> = MaybeUninit::uninit(); |  | ||||||
| 
 |  | ||||||
| #[link_section = "MB_MEM2"] |  | ||||||
| pub static mut SYS_CMD_BUF: MaybeUninit<CmdPacket> = MaybeUninit::uninit(); |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * Queue length of BLE Event |  | ||||||
|  * This parameter defines the number of asynchronous events that can be stored in the HCI layer before |  | ||||||
|  * being reported to the application. When a command is sent to the BLE core coprocessor, the HCI layer |  | ||||||
|  * is waiting for the event with the Num_HCI_Command_Packets set to 1. The receive queue shall be large |  | ||||||
|  * enough to store all asynchronous events received in between. |  | ||||||
|  * When CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE is set to 27, this allow to store three 255 bytes long asynchronous events |  | ||||||
|  * between the HCI command and its event. |  | ||||||
|  * This parameter depends on the value given to CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE. When the queue size is to small, |  | ||||||
|  * the system may hang if the queue is full with asynchronous events and the HCI layer is still waiting |  | ||||||
|  * for a CC/CS event, In that case, the notification TL_BLE_HCI_ToNot() is called to indicate |  | ||||||
|  * to the application a HCI command did not receive its command event within 30s (Default HCI Timeout). |  | ||||||
|  */ |  | ||||||
| const CFG_TLBLE_EVT_QUEUE_LENGTH: usize = 5; |  | ||||||
| const CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE: usize = 255; |  | ||||||
| const TL_BLE_EVENT_FRAME_SIZE: usize = TL_EVT_HEADER_SIZE + CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE; |  | ||||||
| 
 |  | ||||||
| const fn divc(x: usize, y: usize) -> usize { |  | ||||||
|     ((x) + (y) - 1) / (y) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const POOL_SIZE: usize = CFG_TLBLE_EVT_QUEUE_LENGTH * 4 * divc(TL_PACKET_HEADER_SIZE + TL_BLE_EVENT_FRAME_SIZE, 4); |  | ||||||
| 
 |  | ||||||
| #[link_section = "MB_MEM2"] |  | ||||||
| static mut EVT_POOL: MaybeUninit<[u8; POOL_SIZE]> = MaybeUninit::uninit(); |  | ||||||
| 
 |  | ||||||
| #[link_section = "MB_MEM2"] |  | ||||||
| static mut SYS_SPARE_EVT_BUF: MaybeUninit<[u8; TL_PACKET_HEADER_SIZE + TL_EVT_HEADER_SIZE + 255]> = |  | ||||||
|     MaybeUninit::uninit(); |  | ||||||
| 
 |  | ||||||
| #[link_section = "MB_MEM2"] |  | ||||||
| static mut BLE_SPARE_EVT_BUF: MaybeUninit<[u8; TL_PACKET_HEADER_SIZE + TL_EVT_HEADER_SIZE + 255]> = |  | ||||||
|     MaybeUninit::uninit(); |  | ||||||
| 
 |  | ||||||
| #[link_section = "MB_MEM2"] |  | ||||||
| static mut BLE_CMD_BUFFER: MaybeUninit<CmdPacket> = MaybeUninit::uninit(); |  | ||||||
| 
 |  | ||||||
| #[link_section = "MB_MEM2"] |  | ||||||
| //                                 fuck these "magic" numbers from ST ---v---v
 |  | ||||||
| static mut HCI_ACL_DATA_BUFFER: MaybeUninit<[u8; TL_PACKET_HEADER_SIZE + 5 + 251]> = MaybeUninit::uninit(); |  | ||||||
| 
 |  | ||||||
| pub struct TlMbox<'d> { | pub struct TlMbox<'d> { | ||||||
|     _ipcc: PeripheralRef<'d, IPCC>, |     _ipcc: PeripheralRef<'d, IPCC>, | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,22 +1,23 @@ | |||||||
| //! Memory manager routines
 | //! Memory manager routines
 | ||||||
| 
 |  | ||||||
| use core::future::poll_fn; | use core::future::poll_fn; | ||||||
| use core::marker::PhantomData; | use core::marker::PhantomData; | ||||||
|  | use core::mem::MaybeUninit; | ||||||
| use core::task::Poll; | use core::task::Poll; | ||||||
| 
 | 
 | ||||||
| use cortex_m::interrupt; | use cortex_m::interrupt; | ||||||
| use embassy_stm32::ipcc::Ipcc; | use embassy_stm32::ipcc::Ipcc; | ||||||
| use embassy_sync::waitqueue::AtomicWaker; | use embassy_sync::waitqueue::AtomicWaker; | ||||||
| 
 | 
 | ||||||
|  | use crate::channels; | ||||||
|  | use crate::consts::POOL_SIZE; | ||||||
| use crate::evt::EvtPacket; | use crate::evt::EvtPacket; | ||||||
| use crate::tables::MemManagerTable; | use crate::tables::{ | ||||||
| use crate::unsafe_linked_list::LinkedListNode; |     MemManagerTable, BLE_SPARE_EVT_BUF, EVT_POOL, FREE_BUF_QUEUE, SYS_SPARE_EVT_BUF, TL_MEM_MANAGER_TABLE, | ||||||
| use crate::{ |  | ||||||
|     channels, BLE_SPARE_EVT_BUF, EVT_POOL, FREE_BUF_QUEUE, LOCAL_FREE_BUF_QUEUE, POOL_SIZE, SYS_SPARE_EVT_BUF, |  | ||||||
|     TL_MEM_MANAGER_TABLE, |  | ||||||
| }; | }; | ||||||
|  | use crate::unsafe_linked_list::LinkedListNode; | ||||||
| 
 | 
 | ||||||
| static MM_WAKER: AtomicWaker = AtomicWaker::new(); | static MM_WAKER: AtomicWaker = AtomicWaker::new(); | ||||||
|  | static mut LOCAL_FREE_BUF_QUEUE: MaybeUninit<LinkedListNode> = MaybeUninit::uninit(); | ||||||
| 
 | 
 | ||||||
| pub struct MemoryManager { | pub struct MemoryManager { | ||||||
|     phantom: PhantomData<MemoryManager>, |     phantom: PhantomData<MemoryManager>, | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| use core::{mem, slice}; | use core::{mem, slice}; | ||||||
| 
 | 
 | ||||||
| use super::{TL_CS_EVT_SIZE, TL_EVT_HEADER_SIZE, TL_PACKET_HEADER_SIZE}; | use crate::consts::{TL_CS_EVT_SIZE, TL_EVT_HEADER_SIZE, TL_PACKET_HEADER_SIZE}; | ||||||
| 
 | 
 | ||||||
| const SHCI_OGF: u16 = 0x3F; | const SHCI_OGF: u16 = 0x3F; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,6 +1,9 @@ | |||||||
|  | use core::mem::MaybeUninit; | ||||||
|  | 
 | ||||||
| use bit_field::BitField; | use bit_field::BitField; | ||||||
| 
 | 
 | ||||||
| use crate::cmd::{AclDataPacket, CmdPacket}; | use crate::cmd::{AclDataPacket, CmdPacket}; | ||||||
|  | use crate::consts::{POOL_SIZE, TL_CS_EVT_SIZE, TL_EVT_HEADER_SIZE, TL_PACKET_HEADER_SIZE}; | ||||||
| use crate::unsafe_linked_list::LinkedListNode; | use crate::unsafe_linked_list::LinkedListNode; | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Copy, Clone)] | #[derive(Debug, Copy, Clone)] | ||||||
| @ -173,3 +176,77 @@ pub struct RefTable { | |||||||
|     pub traces_table: *const TracesTable, |     pub traces_table: *const TracesTable, | ||||||
|     pub mac_802_15_4_table: *const Mac802_15_4Table, |     pub mac_802_15_4_table: *const Mac802_15_4Table, | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // --------------------- ref table ---------------------
 | ||||||
|  | #[link_section = "TL_REF_TABLE"] | ||||||
|  | pub static mut TL_REF_TABLE: MaybeUninit<RefTable> = MaybeUninit::uninit(); | ||||||
|  | 
 | ||||||
|  | #[link_section = "MB_MEM1"] | ||||||
|  | pub static mut TL_DEVICE_INFO_TABLE: MaybeUninit<DeviceInfoTable> = MaybeUninit::uninit(); | ||||||
|  | 
 | ||||||
|  | #[link_section = "MB_MEM1"] | ||||||
|  | pub static mut TL_BLE_TABLE: MaybeUninit<BleTable> = MaybeUninit::uninit(); | ||||||
|  | 
 | ||||||
|  | #[link_section = "MB_MEM1"] | ||||||
|  | pub static mut TL_THREAD_TABLE: MaybeUninit<ThreadTable> = MaybeUninit::uninit(); | ||||||
|  | 
 | ||||||
|  | // #[link_section = "MB_MEM1"]
 | ||||||
|  | // pub static mut TL_LLD_TESTS_TABLE: MaybeUninit<LldTestTable> = MaybeUninit::uninit();
 | ||||||
|  | 
 | ||||||
|  | // #[link_section = "MB_MEM1"]
 | ||||||
|  | // pub static mut TL_BLE_LLD_TABLE: MaybeUninit<BleLldTable> = MaybeUninit::uninit();
 | ||||||
|  | 
 | ||||||
|  | #[link_section = "MB_MEM1"] | ||||||
|  | pub static mut TL_SYS_TABLE: MaybeUninit<SysTable> = MaybeUninit::uninit(); | ||||||
|  | 
 | ||||||
|  | #[link_section = "MB_MEM1"] | ||||||
|  | pub static mut TL_MEM_MANAGER_TABLE: MaybeUninit<MemManagerTable> = MaybeUninit::uninit(); | ||||||
|  | 
 | ||||||
|  | #[link_section = "MB_MEM1"] | ||||||
|  | pub static mut TL_TRACES_TABLE: MaybeUninit<TracesTable> = MaybeUninit::uninit(); | ||||||
|  | 
 | ||||||
|  | #[link_section = "MB_MEM1"] | ||||||
|  | pub static mut TL_MAC_802_15_4_TABLE: MaybeUninit<Mac802_15_4Table> = MaybeUninit::uninit(); | ||||||
|  | 
 | ||||||
|  | // #[link_section = "MB_MEM1"]
 | ||||||
|  | // pub static mut TL_ZIGBEE_TABLE: MaybeUninit<ZigbeeTable> = MaybeUninit::uninit();
 | ||||||
|  | 
 | ||||||
|  | // --------------------- tables ---------------------
 | ||||||
|  | #[link_section = "MB_MEM1"] | ||||||
|  | pub static mut FREE_BUF_QUEUE: MaybeUninit<LinkedListNode> = MaybeUninit::uninit(); | ||||||
|  | 
 | ||||||
|  | #[allow(dead_code)] | ||||||
|  | #[link_section = "MB_MEM1"] | ||||||
|  | pub static mut TRACES_EVT_QUEUE: MaybeUninit<LinkedListNode> = MaybeUninit::uninit(); | ||||||
|  | 
 | ||||||
|  | #[link_section = "MB_MEM2"] | ||||||
|  | pub static mut CS_BUFFER: MaybeUninit<[u8; TL_PACKET_HEADER_SIZE + TL_EVT_HEADER_SIZE + TL_CS_EVT_SIZE]> = | ||||||
|  |     MaybeUninit::uninit(); | ||||||
|  | 
 | ||||||
|  | #[link_section = "MB_MEM2"] | ||||||
|  | pub static mut EVT_QUEUE: MaybeUninit<LinkedListNode> = MaybeUninit::uninit(); | ||||||
|  | 
 | ||||||
|  | #[link_section = "MB_MEM2"] | ||||||
|  | pub static mut SYSTEM_EVT_QUEUE: MaybeUninit<LinkedListNode> = MaybeUninit::uninit(); | ||||||
|  | 
 | ||||||
|  | // --------------------- app tables ---------------------
 | ||||||
|  | #[link_section = "MB_MEM2"] | ||||||
|  | pub static mut EVT_POOL: MaybeUninit<[u8; POOL_SIZE]> = MaybeUninit::uninit(); | ||||||
|  | 
 | ||||||
|  | #[link_section = "MB_MEM2"] | ||||||
|  | pub static mut SYS_CMD_BUF: MaybeUninit<CmdPacket> = MaybeUninit::uninit(); | ||||||
|  | 
 | ||||||
|  | #[link_section = "MB_MEM2"] | ||||||
|  | pub static mut SYS_SPARE_EVT_BUF: MaybeUninit<[u8; TL_PACKET_HEADER_SIZE + TL_EVT_HEADER_SIZE + 255]> = | ||||||
|  |     MaybeUninit::uninit(); | ||||||
|  | 
 | ||||||
|  | #[link_section = "MB_MEM1"] | ||||||
|  | pub static mut BLE_CMD_BUFFER: MaybeUninit<CmdPacket> = MaybeUninit::uninit(); | ||||||
|  | 
 | ||||||
|  | #[link_section = "MB_MEM2"] | ||||||
|  | pub static mut BLE_SPARE_EVT_BUF: MaybeUninit<[u8; TL_PACKET_HEADER_SIZE + TL_EVT_HEADER_SIZE + 255]> = | ||||||
|  |     MaybeUninit::uninit(); | ||||||
|  | 
 | ||||||
|  | #[link_section = "MB_MEM2"] | ||||||
|  | //                                 fuck these "magic" numbers from ST ---v---v
 | ||||||
|  | pub static mut HCI_ACL_DATA_BUFFER: MaybeUninit<[u8; TL_PACKET_HEADER_SIZE + 5 + 251]> = MaybeUninit::uninit(); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user