Skip to content

Commit 073f9fb

Browse files
committed
update
1 parent fa24ef4 commit 073f9fb

10 files changed

Lines changed: 254 additions & 298 deletions

File tree

test_crates/test_libusb/tests/test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ async fn test() {
1313
let ls = host.probe().await.unwrap();
1414

1515
println!("Found {} devices", ls.len());
16-
16+
1717
for device in &ls {
1818
println!("Device: {:?}", device.descriptor());
1919
}

usb-host/src/err.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@ impl ConvertXhciError for CompletionCode {
1414
match self {
1515
CompletionCode::Success => Ok(()),
1616
CompletionCode::StallError => Err(TransferError::Stall),
17-
_ => Err(TransferError::Other(
18-
format!("XHCI error: {:?}", self).into(),
19-
)),
17+
_ => Err(TransferError::Other(format!("XHCI error: {self:?}").into())),
2018
}
2119
}
2220
}

usb-host/src/host/xhci/context.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
use alloc::vec::Vec;
22
use dma_api::{DBox, DVec};
3-
use xhci::context::{
4-
Device32Byte, Device64Byte, DeviceHandler, Input32Byte, Input64Byte, InputHandler,
5-
};
3+
use xhci::context::{Device32Byte, Device64Byte, Input32Byte, Input64Byte, InputHandler};
64

75
use crate::{err::*, xhci::SlotId};
86

usb-host/src/host/xhci/device.rs

Lines changed: 13 additions & 162 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use usb_if::{
1414
InterfaceDescriptor, decode_string_descriptor,
1515
},
1616
host::{ControlSetup, ResultTransfer},
17-
transfer::{Direction, Recipient, Request, RequestType},
17+
transfer::{Recipient, Request, RequestType},
1818
};
1919
use xhci::{registers::doorbell, ring::trb::command};
2020

@@ -150,9 +150,18 @@ impl usb_if::host::Device for Device {
150150
fn claim_interface(
151151
&mut self,
152152
interface: u8,
153+
alternate: u8,
153154
) -> futures::future::LocalBoxFuture<'_, Result<Box<dyn usb_if::host::Interface>, USBError>>
154155
{
155-
todo!()
156+
async move {
157+
trace!("Claiming interface {interface}, alternate {alternate}");
158+
self.set_interface(interface, alternate);
159+
let ep_map = self.set_interface(interface, alternate).await?;
160+
let desc = self.find_interface_desc(interface, alternate)?;
161+
let interface = Interface::new(desc, ep_map, self.ctrl_ep.clone());
162+
Ok(Box::new(interface) as Box<dyn usb_if::host::Interface>)
163+
}
164+
.boxed_local()
156165
}
157166

158167
fn configuration_descriptors(
@@ -307,132 +316,13 @@ impl Device {
307316
param: ControlSetup,
308317
buff: &'a mut [u8],
309318
) -> ResultTransfer<'a> {
310-
// self.control_transfer(ControlRaw {
311-
// request_type: RequestType {
312-
// direction: Direction::In,
313-
// control_type: param.transfer_type,
314-
// recipient: param.recipient,
315-
// },
316-
// request: param.request,
317-
// index: param.index,
318-
// value: param.value,
319-
// data: if buff.is_empty() {
320-
// None
321-
// } else {
322-
// Some((buff.as_mut_ptr() as usize, buff.len() as _))
323-
// },
324-
// })
325-
// .await
326-
self.control_transfer(
327-
param,
328-
Direction::In,
329-
if buff.is_empty() {
330-
None
331-
} else {
332-
Some((buff.as_ptr() as usize, buff.len() as _))
333-
},
334-
)
319+
self.ctrl_ep.control_in(param, buff)
335320
}
336321

337322
pub fn control_out<'a>(&mut self, param: ControlSetup, buff: &'a [u8]) -> ResultTransfer<'a> {
338-
self.control_transfer(
339-
param,
340-
Direction::Out,
341-
if buff.is_empty() {
342-
None
343-
} else {
344-
Some((buff.as_ptr() as usize, buff.len() as _))
345-
},
346-
)
347-
348-
// self.control_transfer(ControlRaw {
349-
// request_type: RequestType {
350-
// direction: Direction::Out,
351-
// control_type: param.transfer_type,
352-
// recipient: param.recipient,
353-
// },
354-
// request: param.request,
355-
// index: param.index,
356-
// value: param.value,
357-
// data: if buff.is_empty() {
358-
// None
359-
// } else {
360-
// Some((buff.as_ptr() as usize, buff.len() as _))
361-
// },
362-
// })
363-
// .await
323+
self.ctrl_ep.control_out(param, buff)
364324
}
365325

366-
// async fn control_transfer(&mut self, urb: ControlRaw) -> Result<usize, USBError> {
367-
// let mut trbs: Vec<transfer::Allowed> = Vec::new();
368-
// let mut setup = transfer::SetupStage::default();
369-
// let mut buff_data = 0;
370-
// let mut buff_len = 0;
371-
372-
// setup
373-
// .set_request_type(urb.request_type.clone().into())
374-
// .set_request(urb.request.into())
375-
// .set_value(urb.value)
376-
// .set_index(urb.index)
377-
// .set_transfer_type(transfer::TransferType::No);
378-
379-
// let mut data = None;
380-
381-
// if let Some((addr, len)) = urb.data {
382-
// buff_data = addr;
383-
// buff_len = len as usize;
384-
// let data_slice =
385-
// unsafe { core::slice::from_raw_parts_mut(addr as *mut u8, len as usize) };
386-
387-
// let dm = DSliceMut::from(data_slice, dma_api::Direction::Bidirectional);
388-
389-
// if matches!(urb.request_type.direction, Direction::Out) {
390-
// dm.confirm_write_all();
391-
// }
392-
393-
// setup
394-
// .set_transfer_type(urb.request_type.direction.to_xhci_transfer_type())
395-
// .set_length(len);
396-
397-
// let mut raw_data = transfer::DataStage::default();
398-
// raw_data
399-
// .set_data_buffer_pointer(dm.bus_addr() as _)
400-
// .set_trb_transfer_length(len as _)
401-
// .set_direction(urb.request_type.direction.to_xhci_direction());
402-
403-
// data = Some(raw_data)
404-
// }
405-
406-
// let mut status = transfer::StatusStage::default();
407-
// status.set_interrupt_on_completion();
408-
409-
// if matches!(urb.request_type.direction, Direction::In) {
410-
// status.set_direction();
411-
// }
412-
413-
// trbs.push(setup.into());
414-
// if let Some(data) = data {
415-
// trbs.push(data.into());
416-
// }
417-
// trbs.push(status.into());
418-
419-
// self.ctrl_ep
420-
// .enque(
421-
// trbs.into_iter(),
422-
// urb.request_type.direction,
423-
// buff_data,
424-
// buff_len,
425-
// )
426-
// .await
427-
// }
428-
fn control_transfer<'a>(
429-
&mut self,
430-
urb: ControlSetup,
431-
dir: Direction,
432-
buff: Option<(usize, u16)>,
433-
) -> ResultTransfer<'a> {
434-
self.ctrl_ep.transfer(urb, dir, buff)
435-
}
436326
async fn control_max_packet_size(&mut self) -> Result<u16, USBError> {
437327
trace!("control_fetch_control_point_packet_size");
438328

@@ -546,39 +436,6 @@ impl Device {
546436
Ok(full_data)
547437
}
548438

549-
// async fn set_configuration(&mut self, config_value: u8) -> Result<(), USBError> {
550-
// trace!("Setting device configuration to {config_value}");
551-
552-
// self.control_out(
553-
// ControlSetup {
554-
// request_type: RequestType::Standard,
555-
// recipient: Recipient::Device,
556-
// request: Request::SetConfiguration,
557-
// value: config_value as u16,
558-
// index: 0,
559-
// },
560-
// // Control {
561-
// // request: Request::SetConfiguration,
562-
// // index: 0,
563-
// // value: config_value as u16,
564-
// // transfer_type: ControlType::Standard,
565-
// // recipient: Recipient::Device,
566-
// // },
567-
// &[],
568-
// )?
569-
// .await?;
570-
571-
// self.current_config_value = Some(config_value);
572-
573-
// self.ctx.with_input(|input| {
574-
// let c = input.control_mut();
575-
// c.set_configuration_value(config_value);
576-
// });
577-
578-
// debug!("Device configuration set to {config_value}");
579-
// Ok(())
580-
// }
581-
582439
/// 配置端点(为指定配置设置端点上下文)
583440
async fn configure_endpoints_internal(
584441
&mut self,
@@ -697,12 +554,6 @@ impl Device {
697554
value: interface as _,
698555
index: alternate as _,
699556
},
700-
// request: Request::SetInterface,
701-
// index: interface as _,
702-
// value: alternate as _,
703-
// transfer_type: ControlType::Standard,
704-
// recipient: Recipient::Interface,
705-
// },
706557
&[],
707558
)?
708559
.await?;

0 commit comments

Comments
 (0)