@@ -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} ;
1919use 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