stm32/wpan: move schi command into sys
This commit is contained in:
parent
64e3310e64
commit
af451b5462
@ -48,11 +48,11 @@ impl Ble {
|
|||||||
// TODO: ACL data ack to the user
|
// TODO: ACL data ack to the user
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn ble_send_cmd(buf: &[u8]) {
|
pub fn send_cmd(buf: &[u8]) {
|
||||||
debug!("writing ble cmd");
|
debug!("writing ble cmd");
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
let pcmd_buffer: *mut CmdPacket = (*TL_REF_TABLE.assume_init().ble_table).pcmd_buffer;
|
let pcmd_buffer: *mut CmdPacket = BLE_CMD_BUFFER.as_mut_ptr();
|
||||||
let pcmd_serial: *mut CmdSerial = &mut (*pcmd_buffer).cmdserial;
|
let pcmd_serial: *mut CmdSerial = &mut (*pcmd_buffer).cmdserial;
|
||||||
let pcmd_serial_buf: *mut u8 = pcmd_serial.cast();
|
let pcmd_serial_buf: *mut u8 = pcmd_serial.cast();
|
||||||
|
|
||||||
|
@ -26,6 +26,14 @@ pub struct CmdSerial {
|
|||||||
pub cmd: Cmd,
|
pub cmd: Cmd,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, Default)]
|
||||||
|
#[repr(C, packed)]
|
||||||
|
pub struct CmdSerialStub {
|
||||||
|
pub ty: u8,
|
||||||
|
pub cmd_code: u16,
|
||||||
|
pub payload_len: u8,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Default)]
|
#[derive(Copy, Clone, Default)]
|
||||||
#[repr(C, packed)]
|
#[repr(C, packed)]
|
||||||
pub struct CmdPacket {
|
pub struct CmdPacket {
|
||||||
|
@ -20,7 +20,7 @@ impl<'d> RadioCoprocessor<'d> {
|
|||||||
let cmd = TlPacketType::try_from(cmd_code).unwrap();
|
let cmd = TlPacketType::try_from(cmd_code).unwrap();
|
||||||
|
|
||||||
match &cmd {
|
match &cmd {
|
||||||
TlPacketType::BleCmd => Ble::ble_send_cmd(buf),
|
TlPacketType::BleCmd => Ble::send_cmd(buf),
|
||||||
_ => todo!(),
|
_ => todo!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -33,11 +33,6 @@ impl<'d> RadioCoprocessor<'d> {
|
|||||||
let event = evt.evt();
|
let event = evt.evt();
|
||||||
|
|
||||||
evt.write(&mut self.rx_buf).unwrap();
|
evt.write(&mut self.rx_buf).unwrap();
|
||||||
|
|
||||||
if event.kind() == 18 {
|
|
||||||
shci::shci_ble_init(Default::default());
|
|
||||||
self.rx_buf[0] = 0x04;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.mbox.pop_last_cc_evt().is_some() {
|
if self.mbox.pop_last_cc_evt().is_some() {
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
|
use core::{mem, slice};
|
||||||
|
|
||||||
use super::cmd::CmdPacket;
|
use super::cmd::CmdPacket;
|
||||||
use super::consts::TlPacketType;
|
use super::consts::TlPacketType;
|
||||||
use super::{sys, TL_CS_EVT_SIZE, TL_EVT_HEADER_SIZE, TL_PACKET_HEADER_SIZE, TL_SYS_TABLE};
|
use super::{sys, TL_CS_EVT_SIZE, TL_EVT_HEADER_SIZE, TL_PACKET_HEADER_SIZE, TL_SYS_TABLE};
|
||||||
|
|
||||||
const SCHI_OPCODE_BLE_INIT: u16 = 0xfc66;
|
pub const SCHI_OPCODE_BLE_INIT: u16 = 0xfc66;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
#[repr(C, packed)]
|
#[repr(C, packed)]
|
||||||
@ -32,6 +34,12 @@ pub struct ShciBleInitCmdParam {
|
|||||||
pub hw_version: u8,
|
pub hw_version: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ShciBleInitCmdParam {
|
||||||
|
pub fn payload<'a>(&self) -> &'a [u8] {
|
||||||
|
unsafe { slice::from_raw_parts(self as *const _ as *const u8, mem::size_of::<Self>()) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Default for ShciBleInitCmdParam {
|
impl Default for ShciBleInitCmdParam {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
@ -66,35 +74,10 @@ pub struct ShciHeader {
|
|||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
#[repr(C, packed)]
|
#[repr(C, packed)]
|
||||||
pub struct ShciBleInitCmdPacket {
|
pub struct ShciBleInitCmdPacket {
|
||||||
header: ShciHeader,
|
pub header: ShciHeader,
|
||||||
param: ShciBleInitCmdParam,
|
pub param: ShciBleInitCmdParam,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const TL_BLE_EVT_CS_PACKET_SIZE: usize = TL_EVT_HEADER_SIZE + TL_CS_EVT_SIZE;
|
pub const TL_BLE_EVT_CS_PACKET_SIZE: usize = TL_EVT_HEADER_SIZE + TL_CS_EVT_SIZE;
|
||||||
#[allow(dead_code)] // Not used currently but reserved
|
#[allow(dead_code)] // Not used currently but reserved
|
||||||
const TL_BLE_EVT_CS_BUFFER_SIZE: usize = TL_PACKET_HEADER_SIZE + TL_BLE_EVT_CS_PACKET_SIZE;
|
const TL_BLE_EVT_CS_BUFFER_SIZE: usize = TL_PACKET_HEADER_SIZE + TL_BLE_EVT_CS_PACKET_SIZE;
|
||||||
|
|
||||||
pub fn shci_ble_init(param: ShciBleInitCmdParam) {
|
|
||||||
debug!("sending SHCI");
|
|
||||||
|
|
||||||
let mut packet = ShciBleInitCmdPacket {
|
|
||||||
header: ShciHeader::default(),
|
|
||||||
param,
|
|
||||||
};
|
|
||||||
|
|
||||||
let packet_ptr: *mut _ = &mut packet;
|
|
||||||
|
|
||||||
unsafe {
|
|
||||||
let cmd_ptr: *mut CmdPacket = packet_ptr.cast();
|
|
||||||
|
|
||||||
(*cmd_ptr).cmdserial.cmd.cmd_code = SCHI_OPCODE_BLE_INIT;
|
|
||||||
(*cmd_ptr).cmdserial.cmd.payload_len = core::mem::size_of::<ShciBleInitCmdParam>() as u8;
|
|
||||||
|
|
||||||
let p_cmd_buffer = &mut *(*TL_SYS_TABLE.as_mut_ptr()).pcmd_buffer;
|
|
||||||
core::ptr::write(p_cmd_buffer, *cmd_ptr);
|
|
||||||
|
|
||||||
p_cmd_buffer.cmdserial.ty = TlPacketType::SysCmd as u8;
|
|
||||||
|
|
||||||
sys::Sys::send_cmd();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -1,7 +1,12 @@
|
|||||||
|
use core::ptr;
|
||||||
|
use core::sync::atomic::{compiler_fence, Ordering};
|
||||||
|
|
||||||
use embassy_stm32::ipcc::Ipcc;
|
use embassy_stm32::ipcc::Ipcc;
|
||||||
|
|
||||||
use crate::cmd::{CmdPacket, CmdSerial};
|
use crate::cmd::{CmdPacket, CmdSerial, CmdSerialStub};
|
||||||
|
use crate::consts::TlPacketType;
|
||||||
use crate::evt::{CcEvt, EvtBox, EvtSerial};
|
use crate::evt::{CcEvt, EvtBox, EvtSerial};
|
||||||
|
use crate::shci::{ShciBleInitCmdParam, SCHI_OPCODE_BLE_INIT};
|
||||||
use crate::tables::SysTable;
|
use crate::tables::SysTable;
|
||||||
use crate::unsafe_linked_list::LinkedListNode;
|
use crate::unsafe_linked_list::LinkedListNode;
|
||||||
use crate::{channels, EVT_CHANNEL, SYSTEM_EVT_QUEUE, SYS_CMD_BUF, TL_SYS_TABLE};
|
use crate::{channels, EVT_CHANNEL, SYSTEM_EVT_QUEUE, SYS_CMD_BUF, TL_SYS_TABLE};
|
||||||
@ -58,7 +63,31 @@ impl Sys {
|
|||||||
Ipcc::c1_clear_flag_channel(channels::cpu2::IPCC_SYSTEM_EVENT_CHANNEL);
|
Ipcc::c1_clear_flag_channel(channels::cpu2::IPCC_SYSTEM_EVENT_CHANNEL);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn send_cmd() {
|
pub fn shci_ble_init(param: ShciBleInitCmdParam) {
|
||||||
|
debug!("sending SHCI");
|
||||||
|
|
||||||
|
Self::send_cmd(SCHI_OPCODE_BLE_INIT, param.payload());
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn send_cmd(opcode: u16, payload: &[u8]) {
|
||||||
|
unsafe {
|
||||||
|
let p_cmd_serial = &mut (*SYS_CMD_BUF.as_mut_ptr()).cmdserial as *mut _ as *mut CmdSerialStub;
|
||||||
|
let p_payload = &mut (*SYS_CMD_BUF.as_mut_ptr()).cmdserial.cmd.payload as *mut _;
|
||||||
|
|
||||||
|
ptr::write_volatile(
|
||||||
|
p_cmd_serial,
|
||||||
|
CmdSerialStub {
|
||||||
|
ty: TlPacketType::SysCmd as u8,
|
||||||
|
cmd_code: opcode,
|
||||||
|
payload_len: payload.len() as u8,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
ptr::copy_nonoverlapping(payload as *const _ as *const u8, p_payload, payload.len());
|
||||||
|
}
|
||||||
|
|
||||||
|
compiler_fence(Ordering::SeqCst);
|
||||||
|
|
||||||
Ipcc::c1_set_flag_channel(channels::cpu1::IPCC_SYSTEM_CMD_RSP_CHANNEL);
|
Ipcc::c1_set_flag_channel(channels::cpu1::IPCC_SYSTEM_CMD_RSP_CHANNEL);
|
||||||
Ipcc::c1_set_tx_channel(channels::cpu1::IPCC_SYSTEM_CMD_RSP_CHANNEL, true);
|
Ipcc::c1_set_tx_channel(channels::cpu1::IPCC_SYSTEM_CMD_RSP_CHANNEL, true);
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ use embassy_executor::Spawner;
|
|||||||
use embassy_stm32::bind_interrupts;
|
use embassy_stm32::bind_interrupts;
|
||||||
use embassy_stm32::ipcc::Config;
|
use embassy_stm32::ipcc::Config;
|
||||||
use embassy_stm32_wpan::rc::RadioCoprocessor;
|
use embassy_stm32_wpan::rc::RadioCoprocessor;
|
||||||
|
use embassy_stm32_wpan::sys::Sys;
|
||||||
use embassy_stm32_wpan::TlMbox;
|
use embassy_stm32_wpan::TlMbox;
|
||||||
use embassy_time::{Duration, Timer};
|
use embassy_time::{Duration, Timer};
|
||||||
|
|
||||||
@ -56,6 +57,8 @@ async fn main(_spawner: Spawner) {
|
|||||||
let response = rc.read().await;
|
let response = rc.read().await;
|
||||||
info!("coprocessor ready {}", response);
|
info!("coprocessor ready {}", response);
|
||||||
|
|
||||||
|
Sys::shci_ble_init(Default::default());
|
||||||
|
|
||||||
rc.write(&[0x01, 0x03, 0x0c, 0x00, 0x00]);
|
rc.write(&[0x01, 0x03, 0x0c, 0x00, 0x00]);
|
||||||
let response = rc.read().await;
|
let response = rc.read().await;
|
||||||
info!("ble reset rsp {}", response);
|
info!("ble reset rsp {}", response);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user