summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2014-07-17 07:53:09 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2014-07-22 08:09:28 +0200
commit62735eec55c5fbe5609d3f0d2217e941d49277be (patch)
tree18adf87dcfd056128e69df56ff4a030b624b9422 /drivers
parent32f4bd130c9c46ad7404a3e600dcea8d05008d32 (diff)
downloadbarebox-62735eec55c5fbe5609d3f0d2217e941d49277be.tar.gz
barebox-62735eec55c5fbe5609d3f0d2217e941d49277be.tar.xz
USB: gadget: specify vendor/product id with device parameters
This introduces the device parameters: usbgadget.product usbgadget.vendor usbgadget.manufacturer usbgadget.productname These variables are used to configure the USB vendor id, product id, manufacturer name and product name. Previously these were configured with arguments to the usbserial and dfu command. The parameters are device static, so it's nice to configure it somewhere in the environment instead of when calling dfu/usbserial. Also when other gadget drivers are added we do not have to duplicate the option parsing further. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/gadget/dfu.c16
-rw-r--r--drivers/usb/gadget/serial.c27
-rw-r--r--drivers/usb/gadget/udc-core.c15
3 files changed, 40 insertions, 18 deletions
diff --git a/drivers/usb/gadget/dfu.c b/drivers/usb/gadget/dfu.c
index a2b4c0d658..85d99e9c99 100644
--- a/drivers/usb/gadget/dfu.c
+++ b/drivers/usb/gadget/dfu.c
@@ -655,8 +655,20 @@ static struct usb_device_descriptor dfu_dev_descriptor = {
static int dfu_driver_bind(struct usb_composite_dev *cdev)
{
+ struct usb_gadget *gadget = cdev->gadget;
int status;
+ if (gadget->vendor_id && gadget->product_id) {
+ dfu_dev_descriptor.idVendor = cpu_to_le16(gadget->vendor_id);
+ dfu_dev_descriptor.idProduct = cpu_to_le16(gadget->product_id);
+ } else {
+ dfu_dev_descriptor.idVendor = cpu_to_le16(0x1d50); /* Openmoko, Inc */
+ dfu_dev_descriptor.idProduct = cpu_to_le16(0x60a2); /* barebox bootloader USB DFU Mode */
+ }
+
+ strings_dev[STRING_MANUFACTURER_IDX].s = gadget->manufacturer;
+ strings_dev[STRING_PRODUCT_IDX].s = gadget->productname;
+
status = usb_string_id(cdev);
if (status < 0)
goto fail;
@@ -698,10 +710,6 @@ int usb_dfu_register(struct usb_dfu_pdata *pdata)
dfu_devs = pdata->alts;
dfu_num_alt = pdata->num_alts;
- dfu_dev_descriptor.idVendor = pdata->idVendor;
- dfu_dev_descriptor.idProduct = pdata->idProduct;
- strings_dev[STRING_MANUFACTURER_IDX].s = pdata->manufacturer;
- strings_dev[STRING_PRODUCT_IDX].s = pdata->productname;
ret = usb_composite_probe(&dfu_driver);
if (ret)
diff --git a/drivers/usb/gadget/serial.c b/drivers/usb/gadget/serial.c
index b3314a356a..f1d98b7a39 100644
--- a/drivers/usb/gadget/serial.c
+++ b/drivers/usb/gadget/serial.c
@@ -75,7 +75,6 @@ static struct usb_device_descriptor device_desc = {
.bDeviceSubClass = 0,
.bDeviceProtocol = 0,
/* .bMaxPacketSize0 = f(hardware) */
- .idVendor = cpu_to_le16(GS_VENDOR_ID),
/* .idProduct = f(use_acm) */
.bcdDevice = cpu_to_le16(GS_VERSION_NUM),
/* .iManufacturer = DYNAMIC */
@@ -175,11 +174,26 @@ out:
static int __init gs_bind(struct usb_composite_dev *cdev)
{
int status;
+ struct usb_gadget *gadget = cdev->gadget;
/* Allocate string descriptor numbers ... note that string
* contents can be overridden by the composite_dev glue.
*/
+ if (gadget->vendor_id && gadget->product_id) {
+ device_desc.idVendor = cpu_to_le16(gadget->vendor_id);
+ device_desc.idProduct = cpu_to_le16(gadget->product_id);
+ } else {
+ device_desc.idVendor = cpu_to_le16(GS_VENDOR_ID);
+ if (use_acm)
+ device_desc.idProduct = cpu_to_le16(GS_CDC_PRODUCT_ID);
+ else
+ device_desc.idProduct = cpu_to_le16(GS_PRODUCT_ID);
+ }
+
+ strings_dev[USB_GADGET_MANUFACTURER_IDX].s = gadget->manufacturer;
+ strings_dev[USB_GADGET_PRODUCT_IDX].s = gadget->productname;
+
status = usb_string_ids_tab(cdev, strings_dev);
if (status < 0)
goto fail;
@@ -257,23 +271,12 @@ int usb_serial_register(struct usb_serial_pdata *pdata)
serial_config_driver.label = "CDC ACM config";
serial_config_driver.bConfigurationValue = 2;
device_desc.bDeviceClass = USB_CLASS_COMM;
- device_desc.idProduct =
- cpu_to_le16(GS_CDC_PRODUCT_ID);
} else {
serial_config_driver.label = "Generic Serial config";
serial_config_driver.bConfigurationValue = 1;
device_desc.bDeviceClass = USB_CLASS_VENDOR_SPEC;
- device_desc.idProduct =
- cpu_to_le16(GS_PRODUCT_ID);
}
- if (pdata->idVendor)
- device_desc.idVendor = pdata->idVendor;
- if (pdata->idProduct)
- device_desc.idProduct = pdata->idProduct;
- strings_dev[USB_GADGET_MANUFACTURER_IDX].s = pdata->manufacturer;
- strings_dev[USB_GADGET_PRODUCT_IDX].s = pdata->productname;
-
return usb_composite_probe(&gserial_driver);
}
diff --git a/drivers/usb/gadget/udc-core.c b/drivers/usb/gadget/udc-core.c
index fc931aa971..95efd50eb8 100644
--- a/drivers/usb/gadget/udc-core.c
+++ b/drivers/usb/gadget/udc-core.c
@@ -165,14 +165,25 @@ int usb_add_gadget_udc_release(struct device_d *parent, struct usb_gadget *gadge
if (!udc)
goto err1;
- strcpy(gadget->dev.name, "gadget");
- gadget->dev.id = DEVICE_ID_DYNAMIC;
+ strcpy(gadget->dev.name, "usbgadget");
+ gadget->dev.id = DEVICE_ID_SINGLE;
gadget->dev.parent = parent;
ret = register_device(&gadget->dev);
if (ret)
goto err2;
+ dev_add_param_int(&gadget->dev, "product", NULL, NULL,
+ &gadget->product_id, "0x%04x", NULL);
+ dev_add_param_int(&gadget->dev, "vendor", NULL, NULL,
+ &gadget->vendor_id, "0x%04x", NULL);
+ gadget->manufacturer = xstrdup("barebox");
+ dev_add_param_string(&gadget->dev, "manufacturer", NULL, NULL,
+ &gadget->manufacturer, NULL);
+ gadget->productname = xstrdup(barebox_get_model());
+ dev_add_param_string(&gadget->dev, "productname", NULL, NULL,
+ &gadget->productname, NULL);
+
strcpy(udc->dev.name, "udc");
udc->dev.id = DEVICE_ID_DYNAMIC;