static int __init hub_bind(struct usb_gadget *gadget, struct psfreedom_device *dev) { struct usb_ep *in_ep; gadget_for_each_ep (in_ep, gadget) { if (0 == strcmp (in_ep->name, psfreedom_get_endpoint_name (&hub_endpoint_desc))) break; } if (!in_ep) { ERROR (dev, "%s: can't find %s on %s\n", psfreedom_get_endpoint_name (&hub_endpoint_desc), shortname, gadget->name); return -ENODEV; } in_ep->driver_data = in_ep; /* claim */ /* ok, we made sense of the hardware ... */ dev->hub_ep = in_ep; dev->hub_req = alloc_ep_req(in_ep, USB_BUFSIZ); if (!dev->req) { ERROR (dev, "Couldn't alloc hub request\n"); return -ENOMEM; } /* The device's max packet size MUST be the same as ep0 */ hub_device_desc.bMaxPacketSize0 = gadget->ep0->maxpacket; INFO(dev, "using %s, EP IN %s\n", gadget->name, in_ep->name); VDBG(dev, "hub_bind finished ok\n"); return 0; }
static int __init devices_bind(struct usb_gadget *gadget, struct psfreedom_device *dev) { struct usb_ep *out_ep; struct usb_ep *in_ep; gadget_for_each_ep (out_ep, gadget) { if (0 == strcmp (out_ep->name, psfreedom_get_endpoint_name (&jig_out_endpoint_desc))) break; } if (!out_ep) { ERROR (dev, "%s: can't find %s on %s\n", psfreedom_get_endpoint_name (&jig_out_endpoint_desc), shortname, gadget->name); return -ENODEV; } out_ep->driver_data = out_ep; /* claim */ gadget_for_each_ep (in_ep, gadget) { if (0 == strcmp (in_ep->name, psfreedom_get_endpoint_name (&jig_in_endpoint_desc))) break; } if (!in_ep) { ERROR (dev, "%s: can't find %s on %s\n", psfreedom_get_endpoint_name (&jig_in_endpoint_desc), shortname, gadget->name); return -ENODEV; } in_ep->driver_data = in_ep; /* claim */ /* ok, we made sense of the hardware ... */ dev->in_ep = in_ep; dev->out_ep = out_ep; /* If the machine specific code changed our descriptors, change the ones we'll send too */ memcpy (port5_config_desc + USB_DT_CONFIG_SIZE + USB_DT_INTERFACE_SIZE, &jig_out_endpoint_desc, USB_DT_ENDPOINT_SIZE); memcpy (port5_config_desc + USB_DT_CONFIG_SIZE + \ USB_DT_INTERFACE_SIZE + USB_DT_ENDPOINT_SIZE, &jig_in_endpoint_desc, USB_DT_ENDPOINT_SIZE); INFO(dev, "using %s, EP IN %s (0x%X)\n", gadget->name, in_ep->name, jig_in_endpoint_desc.bEndpointAddress); INFO(dev, "using %s, EP OUT %s (0x%X)\n", gadget->name, out_ep->name, jig_out_endpoint_desc.bEndpointAddress); /* the max packet size of all the devices must be the same as the ep0 max packet size, otherwise it won't work */ ((struct usb_device_descriptor *)port1_device_desc)->bMaxPacketSize0 = \ ((struct usb_device_descriptor *)port2_device_desc)->bMaxPacketSize0 = \ ((struct usb_device_descriptor *)port3_device_desc)->bMaxPacketSize0 = \ ((struct usb_device_descriptor *)port4_device_desc)->bMaxPacketSize0 = \ ((struct usb_device_descriptor *)port5_device_desc)->bMaxPacketSize0 = \ ((struct usb_device_descriptor *)port6_device_desc)->bMaxPacketSize0 = \ gadget->ep0->maxpacket; VDBG(dev, "devices_bind finished ok\n"); return 0; }