xhci_urb_enqueue()如何知道在Linux USB堆栈中向哪个端点发送控制请求?

时间:2019-01-15 05:45:42

标签: linux-kernel usb libusb usb-drive

我试图了解xhci_urb_enqueue()如何弄清楚转发控制请求的端点地址是什么。从代码中,它调用ep_index = xhci_get_endpoint_index(&urb->ep->desc)来获得ep_index,它最终使用epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK来确定端点地址。

我的理解是,获得device/configuration/interface /endpoint descriptors的控制请求仅由ep0应答,并且在主机向设备发出Set_Address/Set_configuration之后,从那一点起,所有控制请求都应发送到实际的端点地址在端点描述符中提到。

我的问题是:

  1. 在收到Set_configuration请求后,USB设备是否应该启动端点?

  2. 在上述设置阶段如何设置epd->bEndpointAddress?何时设置?

1 个答案:

答案 0 :(得分:0)

我发现ep_index是根据从描述符读取的设备驱动程序/ XHCI进行更改的。在设置阶段,仅将控制请求传递到USB设备,因此ep_index始终为0 (urb_pipetype(urb) == PIPE_CONTROL),这基于USB协议设计。设置阶段完成后,ep_index始终会为批量/整数传输请求(urb_pipetype(urb) == PIPE_BULK | PIPE_INTERRUPT返回正确的端点索引。