Skip to main content

esp_hosted/
transport.rs

1//! From `esp_hosted_transport.h`
2
3use defmt::Format;
4
5use crate::{EspError, ble::HciPkt};
6
7const PRIO_Q_SERIAL: u8 = 0;
8const PRIO_Q_BT: u8 = 1;
9const PRIO_Q_OTHERS: u8 = 2;
10const MAX_PRIORITY_QUEUES: u8 = 3;
11const MAC_SIZE_BYTES: u8 = 6;
12
13/* Serial interface */
14const SERIAL_IF_FILE: &str = "/dev/esps0";
15
16/* Protobuf related info */
17/* Endpoints registered must have same string length */
18pub(crate) const RPC_EP_NAME_RSP: &str = "RPCRsp";
19pub(crate) const RPC_EP_NAME_EVT: &str = "RPCEvt";
20
21#[derive(Clone, Copy, PartialEq, Default, Format)]
22pub enum PacketType {
23    #[default]
24    None,
25    /// It appears that this is only used from the Slave
26    ESP_PACKET_TYPE_EVENT,
27    /// It appears that this is always the type sent by the host.
28    ESP_PRIV_EVENT_INIT,
29    Hci(HciPkt),
30}
31
32impl PacketType {
33    pub fn val(&self) -> u8 {
34        match self {
35            Self::None => 0,
36            Self::ESP_PACKET_TYPE_EVENT => 0x33,
37            Self::ESP_PRIV_EVENT_INIT => 0x22,
38            Self::Hci(v) => *v as u8,
39        }
40    }
41
42    pub fn from_byte(b: u8) -> Result<Self, EspError> {
43        Ok(match b {
44            0 => Self::None,
45            0x33 => Self::ESP_PACKET_TYPE_EVENT,
46            0x22 => Self::ESP_PRIV_EVENT_INIT,
47            _ => Self::Hci(HciPkt::try_from(b).map_err(|_| EspError::InvalidData)?),
48        })
49    }
50}
51
52#[repr(u8)]
53pub(crate) enum SLAVE_CONFIG_PRIV_TAG_TYPE {
54    HOST_CAPABILITIES = 0x44,
55    RCVD_ESP_FIRMWARE_CHIP_ID,
56    SLV_CONFIG_TEST_RAW_TP,
57    SLV_CONFIG_THROTTLE_HIGH_THRESHOLD,
58    SLV_CONFIG_THROTTLE_LOW_THRESHOLD,
59}
60
61pub(crate) const ESP_TRANSPORT_SDIO_MAX_BUF_SIZE: u16 = 1536;
62pub(crate) const ESP_TRANSPORT_SPI_MAX_BUF_SIZE: u16 = 1600;
63pub(crate) const ESP_TRANSPORT_SPI_HD_MAX_BUF_SIZE: u16 = 1600;
64pub(crate) const ESP_TRANSPORT_UART_MAX_BUF_SIZE: u16 = 1600;
65
66pub(crate) struct esp_priv_event {
67    event_type: u8,
68    event_len: u8,
69    event_data: u8, // ([0]??) Is this an arary?
70}
71
72/// `System_design_with_rps_as_focus.md`, section 3.3: Checksum Calculation
73pub(crate) fn compute_checksum(buf: &[u8]) -> u16 {
74    let mut checksum = 0;
75    let mut i = 0;
76
77    while i < buf.len() {
78        checksum += buf[i] as u16;
79        i += 1;
80    }
81
82    checksum
83}