这节分析loopback具体功能是怎么实现的。
loopback功能的入口在这里。
首先,在枚举的时候,有这样一段:
switch (ctrl->bRequest) {
case USB_REQ_SET_INTERFACE:
if (ctrl->bRequestType != USB_RECIP_INTERFACE)
goto unknown;
if (!cdev->config || w_index >= MAX_CONFIG_INTERFACES)
break;
f = cdev->config->interface[intf];
if (!f)
break;
if (w_value && !f->set_alt)
break;
value = f->set_alt(f, w_index, w_value);
break;
在set interface阶段,会调用f->set_alt函数。对应于loopback的function,调用的就是loopback_set_alt,在这个函数中会调用enable_loopback。也就是说loopback是在set interface 时候使能的。
static int
enable_loopback(struct usb_composite_dev *cdev, struct f_loopback *loop)
{
int result = 0;
co