usb/host/
messages.rs

1// SPDX-FileCopyrightText: 2023 Foundation Devices, Inc. <hello@foundation.xyz>
2// SPDX-License-Identifier: GPL-3.0-or-later
3
4use ehci::{descriptors, EndpointDirection};
5use server::{AsScalar, FromScalar};
6use xous::MemoryRange;
7
8use crate::error::UsbError;
9
10#[derive(Debug, server::Message, Clone, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
11#[event(UsbEvent)]
12pub struct Subscribe;
13
14#[derive(Debug, server::Message, Clone)]
15#[response(Result<(), UsbError>)]
16pub struct Claim(pub usize);
17
18#[derive(Debug, server::Message, Clone)]
19#[response(Result<(), UsbError>)]
20pub struct OpenEndpoint {
21    pub handle: usize,
22    pub endpoint: u8,
23    pub max_packet_length: u16,
24    pub direction: EndpointDirection,
25}
26
27impl AsScalar<4> for OpenEndpoint {
28    fn as_scalar(&self) -> [u32; 4] {
29        [
30            self.handle as u32,
31            self.endpoint as u32,
32            self.max_packet_length as u32,
33            if self.direction == EndpointDirection::In { 0 } else { 1 },
34        ]
35    }
36}
37
38impl FromScalar<4> for OpenEndpoint {
39    fn from_scalar(value: [u32; 4]) -> Self {
40        Self {
41            handle: value[0] as usize,
42            endpoint: value[1] as u8,
43            max_packet_length: value[2] as u16,
44            direction: if value[3] == 0 { EndpointDirection::In } else { EndpointDirection::Out },
45        }
46    }
47}
48
49#[derive(Debug, server::Message)]
50#[response(Result<usize, UsbError>)]
51pub struct BulkOut {
52    pub buffer: MemoryRange,
53    pub handle: usize,
54    pub endpoint: u8,
55    pub length: usize,
56}
57
58impl From<server::SimpleMemoryMessage> for BulkOut {
59    fn from(msg: server::SimpleMemoryMessage) -> Self {
60        Self { buffer: msg.buf, endpoint: msg.arg1 as u8, length: msg.arg2, handle: msg.arg1 >> 8 }
61    }
62}
63
64impl From<BulkOut> for server::SimpleMemoryMessage {
65    fn from(val: BulkOut) -> Self {
66        Self { buf: val.buffer, arg1: val.endpoint as usize | (val.handle << 8), arg2: val.length }
67    }
68}
69
70#[derive(Debug, server::Message)]
71#[response(Result<usize, UsbError>)]
72pub struct BulkIn {
73    pub buffer: MemoryRange,
74    pub handle: usize,
75    pub endpoint: u8,
76    pub length: usize,
77}
78
79impl From<server::SimpleMemoryMessage> for BulkIn {
80    fn from(msg: server::SimpleMemoryMessage) -> Self {
81        Self { buffer: msg.buf, endpoint: msg.arg1 as u8, length: msg.arg2, handle: msg.arg1 >> 8 }
82    }
83}
84
85impl From<BulkIn> for server::SimpleMemoryMessage {
86    fn from(val: BulkIn) -> Self {
87        Self { buf: val.buffer, arg1: val.endpoint as usize | (val.handle << 8), arg2: val.length }
88    }
89}
90
91#[derive(Debug, server::Message, Clone)]
92pub struct SetEnabled(pub bool);
93
94#[derive(Debug, Clone, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
95pub enum UsbEvent {
96    Connect { handle: usize, descriptors: descriptors::DescriptorSet },
97    Disconnect { handle: usize },
98}
99
100#[derive(Debug, server::Message)]
101#[response(bool)]
102pub struct IsEnabled;
103
104#[derive(Debug, server::Message)]
105#[response(bool)]
106pub struct IsConnected;