1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
use super::*;
#[derive(Clone)]
pub struct UsbHostHandler {
handle: Arc<Mutex<DeviceHandle<GlobalContext>>>,
}
impl UsbHostHandler {
pub fn new(handle: Arc<Mutex<DeviceHandle<GlobalContext>>>) -> Self {
Self { handle }
}
}
impl UsbInterfaceHandler for UsbHostHandler {
fn handle_urb(
&mut self,
_interface: &UsbInterface,
ep: UsbEndpoint,
setup: SetupPacket,
req: &[u8],
) -> Result<Vec<u8>> {
debug!(
"To host device: ep={:?} setup={:?} req={:?}",
ep, setup, req
);
let mut buffer = [0u8; 1024];
let timeout = std::time::Duration::new(1, 0);
let handle = self.handle.lock().unwrap();
if ep.attributes == EndpointAttributes::Control as u8 {
if let Direction::In = ep.direction() {
if let Ok(len) = handle.read_control(
setup.request_type,
setup.request,
setup.value,
setup.index,
&mut buffer,
timeout,
) {
return Ok(Vec::from(&buffer[..len]));
}
} else {
handle
.write_control(
setup.request_type,
setup.request,
setup.value,
setup.index,
req,
timeout,
)
.ok();
}
} else if ep.attributes == EndpointAttributes::Interrupt as u8 {
if let Direction::In = ep.direction() {
if let Ok(len) = handle.read_interrupt(ep.address, &mut buffer, timeout) {
info!("intr in {:?}", &buffer[..len]);
return Ok(Vec::from(&buffer[..len]));
}
} else {
handle.write_interrupt(ep.address, req, timeout).ok();
}
} else if ep.attributes == EndpointAttributes::Bulk as u8 {
if let Direction::In = ep.direction() {
if let Ok(len) = handle.read_bulk(ep.address, &mut buffer, timeout) {
return Ok(Vec::from(&buffer[..len]));
}
} else {
handle.write_bulk(ep.address, req, timeout).ok();
}
}
Ok(vec![])
}
fn get_class_specific_descriptor(&self) -> Vec<u8> {
return vec![];
}
fn as_any(&mut self) -> &mut dyn Any {
self
}
}