1use 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;