int g_dnl_bind_fixup(struct usb_device_descriptor *dev, const char *name) { debug("%s\n", __func__); if (!getenv("serial#")) g_dnl_set_serialnumber(CONFIG_USB_SERIALNO); return 0; }
static int g_dnl_bind(struct usb_composite_dev *cdev) { struct usb_gadget *gadget = cdev->gadget; int id, ret; int gcnum; char *s=NULL; debug("%s: gadget: 0x%p cdev: 0x%p\n", __func__, gadget, cdev); id = usb_string_id(cdev); if (id < 0) return id; g_dnl_string_defs[0].id = id; device_desc.iManufacturer = id; id = usb_string_id(cdev); if (id < 0) return id; g_dnl_string_defs[1].id = id; device_desc.iProduct = id; id = usb_string_id(cdev); if (id < 0) return id; g_dnl_string_defs[2].id = id; device_desc.iSerialNumber = id; s = get_usid_string(); if (s) g_dnl_set_serialnumber(s); g_dnl_bind_fixup(&device_desc, cdev->driver->name); ret = g_dnl_config_register(cdev); if (ret) goto error; gcnum = g_dnl_get_bcd_device_number(cdev); if (gcnum >= 0) device_desc.bcdDevice = cpu_to_le16(gcnum); else { debug("%s: controller '%s' not recognized\n", __func__, gadget->name); device_desc.bcdDevice = __constant_cpu_to_le16(0x9999); } debug("%s: calling usb_gadget_connect for " "controller '%s'\n", __func__, gadget->name); usb_gadget_connect(gadget); return 0; error: g_dnl_unbind(cdev); return -ENOMEM; }
/* config the rockusb device*/ static int rockusb_bind(struct usb_configuration *c, struct usb_function *f) { int id; struct usb_gadget *gadget = c->cdev->gadget; struct f_rockusb *f_rkusb = func_to_rockusb(f); const char *s; id = usb_interface_id(c, f); if (id < 0) return id; interface_desc.bInterfaceNumber = id; id = usb_string_id(c->cdev); if (id < 0) return id; rkusb_string_defs[0].id = id; interface_desc.iInterface = id; f_rkusb->in_ep = usb_ep_autoconfig(gadget, &fs_ep_in); if (!f_rkusb->in_ep) return -ENODEV; f_rkusb->in_ep->driver_data = c->cdev; f_rkusb->out_ep = usb_ep_autoconfig(gadget, &fs_ep_out); if (!f_rkusb->out_ep) return -ENODEV; f_rkusb->out_ep->driver_data = c->cdev; f->descriptors = rkusb_fs_function; if (gadget_is_dualspeed(gadget)) { hs_ep_in.bEndpointAddress = fs_ep_in.bEndpointAddress; hs_ep_out.bEndpointAddress = fs_ep_out.bEndpointAddress; f->hs_descriptors = rkusb_hs_function; } s = env_get("serial#"); if (s) g_dnl_set_serialnumber((char *)s); return 0; }
/* * NOTICE: * Registering via USB function name won't be necessary after rewriting * g_dnl to support multiple USB functions. */ int g_dnl_register(const char *name) { int ret; char *s; printf("%s: g_dnl_driver.name = %s\n", __func__, name); g_dnl_driver.name = name; ret = usb_composite_register(&g_dnl_driver); if (ret) { printf("%s: failed!, error: %d\n", __func__, ret); return ret; } s = getenv("serial"); if (s) { g_dnl_set_serialnumber(s); } return 0; }
/** * Update internal serial number variable when the "serial#" env var changes. * * Handle all cases, even when flags == H_PROGRAMMATIC or op == env_op_delete. */ static int on_serialno(const char *name, const char *value, enum env_op op, int flags) { g_dnl_set_serialnumber((char *)value); return 0; }