[patch 5/8] Serial Gadget Suppor

Felipe Balbi <[email protected]>
Newsgroups gmane.linux.usb.devel
Message-ID <[email protected]>
patch-composite-device-serial-ifdef.diff (text/plain, 14.8 KB)
	This patch adds some ifdefs to make the serial gadget work
	as a usb_function module.

Signed-off-by: Felipe Balbi <[email protected]>
Signed-off-by: Ragner Magalhes <[email protected]>
---

Index: linux-2.6/drivers/usb/gadget/serial.c
===================================================================
--- linux-2.6.orig/drivers/usb/gadget/serial.c
+++ linux-2.6/drivers/usb/gadget/serial.c
@@ -47,2 +47,3 @@
 #include <linux/usb_gadget.h>
+#include <linux/usb/composite.h>
 
@@ -220,3 +221,2 @@ static int gs_setup_class(struct usb_gad
 	const struct usb_ctrlrequest *ctrl);
-static void gs_setup_complete(struct usb_ep *ep, struct usb_request *req);
 static void gs_disconnect(struct usb_gadget *gadget);
@@ -224,4 +224,7 @@ static int gs_set_config(struct gs_dev *
 static void gs_reset_config(struct gs_dev *dev);
+#ifndef USB_COMPOSITE_DEVICE
+static void gs_setup_complete(struct usb_ep *ep, struct usb_request *req);
 static int gs_build_config_buf(u8 *buf, enum usb_device_speed speed,
 		u8 type, unsigned int index, int is_otg);
+#endif /* !USB_COMPOSITE_DEVICE */
 
@@ -287,3 +290,15 @@ static const struct tty_operations gs_tt
 static struct tty_driver *gs_tty_driver;
+static struct usb_gadget_strings gs_string_table;
 
+#ifdef USB_COMPOSITE_DEVICE
+/* USB_FUNCTION */
+struct usb_function gs_usb_function = {
+	.name		= GS_LONG_NAME,
+	.strings	= &gs_string_table,
+	.bind		= gs_bind,
+	.unbind		= gs_unbind,
+	.setup		= gs_setup,
+	.disconnect	= gs_disconnect,
+};
+#else
 /* gadget driver struct */
@@ -304,2 +319,3 @@ static struct usb_gadget_driver gs_gadge
 };
+#endif /* USB_COMPOSITE_DEVICE */
 
@@ -308,2 +324,6 @@ static struct usb_gadget_driver gs_gadge
 
+#ifdef USB_COMPOSITE_DEVICE
+#define GS_CONTROL_STR_ID	1
+#define GS_DATA_STR_ID		2
+#else
 #define GS_MANUFACTURER_STR_ID	1
@@ -315,2 +335,3 @@ static struct usb_gadget_driver gs_gadge
 #define GS_DATA_STR_ID		7
+#endif /* USB_COMPOSITE_DEVICE */
 
@@ -318,3 +339,8 @@ static struct usb_gadget_driver gs_gadge
 static char manufacturer[50];
+
 static struct usb_string gs_strings[] = {
+#ifdef USB_COMPOSITE_DEVICE
+	{ GS_CONTROL_STR_ID, "Serial Control" },
+	{ GS_DATA_STR_ID, "Serial Data" },
+#else
 	{ GS_MANUFACTURER_STR_ID, manufacturer },
@@ -326,2 +352,3 @@ static struct usb_string gs_strings[] = 
 	{ GS_DATA_STR_ID, "Gadget Serial Data" },
+#endif /* USB_COMPOSITE_DEVICE */
 	{  } /* end of list */
@@ -333,3 +360,6 @@ static struct usb_gadget_strings gs_stri
 };
-
+#ifndef USB_COMPOSITE_DEVICE
+/* if defined composite, use the device descriptor
+ * from composite for all gadgets.
+ */
 static struct usb_device_descriptor gs_device_desc = {
@@ -347,2 +377,3 @@ static struct usb_device_descriptor gs_d
 };
+#endif /* !USB_COMPOSITE_DEVICE */
 
@@ -354,2 +385,6 @@ static struct usb_otg_descriptor gs_otg_
 
+#ifndef USB_COMPOSITE_DEVICE
+/* if defined composite, use the config descriptor
+ * from composite for all gadgets.
+ */
 static struct usb_config_descriptor gs_bulk_config_desc = {
@@ -375,4 +410,5 @@ static struct usb_config_descriptor gs_a
 };
+#endif /* !USB_COMPOSITE_DEVICE */
 
-static const struct usb_interface_descriptor gs_bulk_interface_desc = {
+struct usb_interface_descriptor gs_bulk_interface_desc = {
 	.bLength =		USB_DT_INTERFACE_SIZE,
@@ -387,3 +423,3 @@ static const struct usb_interface_descri
 
-static const struct usb_interface_descriptor gs_control_interface_desc = {
+struct usb_interface_descriptor gs_control_interface_desc = {
 	.bLength =		USB_DT_INTERFACE_SIZE,
@@ -398,3 +434,3 @@ static const struct usb_interface_descri
 
-static const struct usb_interface_descriptor gs_data_interface_desc = {
+struct usb_interface_descriptor gs_data_interface_desc = {
 	.bLength =		USB_DT_INTERFACE_SIZE,
@@ -431,3 +467,3 @@ static struct usb_cdc_acm_descriptor gs_
 
-static const struct usb_cdc_union_desc gs_union_desc = {
+static struct usb_cdc_union_desc gs_union_desc = {
 	.bLength =		sizeof(gs_union_desc),
@@ -462,3 +498,3 @@ static struct usb_endpoint_descriptor gs
 
-static const struct usb_descriptor_header *gs_bulk_fullspeed_function[] = {
+static struct usb_descriptor_header *gs_bulk_fullspeed_function[] = {
 	(struct usb_descriptor_header *) &gs_otg_descriptor,
@@ -470,3 +506,3 @@ static const struct usb_descriptor_heade
 
-static const struct usb_descriptor_header *gs_acm_fullspeed_function[] = {
+struct usb_descriptor_header *gs_acm_fullspeed_function[] = {
 	(struct usb_descriptor_header *) &gs_otg_descriptor,
@@ -508,2 +544,3 @@ static struct usb_endpoint_descriptor gs
 
+#ifndef USB_COMPOSITE_DEVICE
 static struct usb_qualifier_descriptor gs_qualifier_desc = {
@@ -515,4 +552,5 @@ static struct usb_qualifier_descriptor g
 };
+#endif /* !USB_COMPOSITE_DEVICE */
 
-static const struct usb_descriptor_header *gs_bulk_highspeed_function[] = {
+static struct usb_descriptor_header *gs_bulk_highspeed_function[] = {
 	(struct usb_descriptor_header *) &gs_otg_descriptor,
@@ -524,3 +562,3 @@ static const struct usb_descriptor_heade
 
-static const struct usb_descriptor_header *gs_acm_highspeed_function[] = {
+struct usb_descriptor_header *gs_acm_highspeed_function[] = {
 	(struct usb_descriptor_header *) &gs_otg_descriptor,
@@ -576,5 +614,10 @@ static int __init gs_module_init(void)
 
+#ifdef USB_COMPOSITE_DEVICE
+	retval = usb_function_register(&gs_usb_function);
+#else
 	retval = usb_gadget_register_driver(&gs_gadget_driver);
+#endif /* USB_COMPOSITE_DEVICE */
 	if (retval) {
-		printk(KERN_ERR "gs_module_init: cannot register gadget driver, ret=%d\n", retval);
+		printk(KERN_ERR "gs_module_init: cannot register gadget"
+						" driver, ret=%d\n", retval);
 		return retval;
@@ -602,5 +645,10 @@ static int __init gs_module_init(void)
 	if (retval) {
+#ifdef USB_COMPOSITE_DEVICE
+		usb_function_unregister(&gs_usb_function);
+#else
 		usb_gadget_unregister_driver(&gs_gadget_driver);
+#endif /* USB_COMPOSITE_DEVICE */
 		put_tty_driver(gs_tty_driver);
-		printk(KERN_ERR "gs_module_init: cannot register tty driver, ret=%d\n", retval);
+		printk(KERN_ERR "gs_module_init: cannot register tty driver,"
+							" ret=%d\n", retval);
 		return retval;
@@ -608,3 +656,4 @@ static int __init gs_module_init(void)
 
-	printk(KERN_INFO "gs_module_init: %s %s loaded\n", GS_LONG_NAME, GS_VERSION_STR);
+	printk(KERN_INFO "gs_module_init: %s %s loaded\n",
+					GS_LONG_NAME, GS_VERSION_STR);
 	return 0;
@@ -621,3 +670,7 @@ static void __exit gs_module_exit(void)
 	put_tty_driver(gs_tty_driver);
+#ifdef USB_COMPOSITE_DEVICE
+	usb_function_unregister(&gs_usb_function);
+#else
 	usb_gadget_unregister_driver(&gs_gadget_driver);
+#endif /* USB_COMPOSITE_DEVICE */
 
@@ -1352,4 +1405,9 @@ requeue:
  */
-static int __init gs_bind(struct usb_gadget *gadget)
+static int __devinit gs_bind(struct usb_gadget *gadget)
 {
+#ifdef USB_COMPOSITE_DEVICE
+	struct usb_composite_dev *cdev = get_gadget_data(gadget);
+#else
+	int gcnum;
+#endif /* USB_COMPOSITE_DEVICE */
 	int ret;
@@ -1357,3 +1415,2 @@ static int __init gs_bind(struct usb_gad
 	struct gs_dev *dev;
-	int gcnum;
 
@@ -1366,2 +1423,10 @@ static int __init gs_bind(struct usb_gad
 
+#ifdef USB_COMPOSITE_DEVICE
+	gs_usb_function.descriptors = use_acm ?
+		gs_acm_fullspeed_function : gs_bulk_fullspeed_function;
+#ifdef CONFIG_USB_GADGET_DUALSPEED
+	gs_usb_function.hs_descriptors = use_acm ?
+		gs_acm_highspeed_function : gs_bulk_highspeed_function;
+#endif
+#else
 	gcnum = usb_gadget_controller_number(gadget);
@@ -1379,2 +1444,3 @@ static int __init gs_bind(struct usb_gad
 	usb_ep_autoconfig_reset(gadget);
+#endif /* USB_COMPOSITE_DEVICE */
 
@@ -1398,4 +1464,6 @@ static int __init gs_bind(struct usb_gad
 		}
+#ifndef USB_COMPOSITE_DEVICE
 		gs_device_desc.idProduct = __constant_cpu_to_le16(
 						GS_CDC_PRODUCT_ID),
+#endif /* !USB_COMPOSITE_DEVICE */
 		EP_NOTIFY_NAME = ep->name;
@@ -1404,2 +1472,3 @@ static int __init gs_bind(struct usb_gad
 
+#ifndef USB_COMPOSITE_DEVICE
 	gs_device_desc.bDeviceClass = use_acm
@@ -1407,4 +1476,6 @@ static int __init gs_bind(struct usb_gad
 	gs_device_desc.bMaxPacketSize0 = gadget->ep0->maxpacket;
+#endif /* !USB_COMPOSITE_DEVICE */
 
 #ifdef CONFIG_USB_GADGET_DUALSPEED
+#ifndef USB_COMPOSITE_DEVICE
 	gs_qualifier_desc.bDeviceClass = use_acm
@@ -1413,2 +1484,3 @@ static int __init gs_bind(struct usb_gad
 	gs_qualifier_desc.bMaxPacketSize0 = gs_device_desc.bMaxPacketSize0;
+#endif /* !USB_COMPOSITE_DEVICE */
 	/* assume endpoints are dual-speed */
@@ -1422,5 +1494,10 @@ static int __init gs_bind(struct usb_gad
 
+#ifndef USB_COMPOSITE_DEVICE
 	usb_gadget_set_selfpowered(gadget);
+#endif /* !USB_COMPOSITE_DEVICE */
 
 	if (gadget->is_otg) {
+#ifdef USB_COMPOSITE_DEVICE
+		gs_otg_descriptor.bmAttributes |= USB_OTG_HNP;
+#else
 		gs_otg_descriptor.bmAttributes |= USB_OTG_HNP,
@@ -1428,2 +1505,3 @@ static int __init gs_bind(struct usb_gad
 		gs_acm_config_desc.bmAttributes |= USB_CONFIG_ATT_WAKEUP;
+#endif /* !USB_COMPOSITE_DEVICE */
 	}
@@ -1442,3 +1520,7 @@ static int __init gs_bind(struct usb_gad
 	INIT_LIST_HEAD(&dev->dev_req_list);
+#ifdef USB_COMPOSITE_DEVICE
+	set_composite_data(cdev, dev);
+#else
 	set_gadget_data(gadget, dev);
+#endif /* USB_COMPOSITE_DEVICE */
 
@@ -1451,2 +1533,5 @@ static int __init gs_bind(struct usb_gad
 	/* preallocate control response and buffer */
+#ifdef USB_COMPOSITE_DEVICE
+	dev->dev_ctrl_req = cdev->req;
+#else
 	dev->dev_ctrl_req = gs_alloc_req(gadget->ep0, GS_MAX_DESC_LEN,
@@ -1460,2 +1545,4 @@ static int __init gs_bind(struct usb_gad
 	gadget->ep0->driver_data = dev;
+#endif /* USB_COMPOSITE_DEVICE */
+
 
@@ -1479,4 +1566,9 @@ static void /* __init_or_exit */ gs_unbi
 {
+#ifdef USB_COMPOSITE_DEVICE
+	struct usb_composite_dev *cdev = get_gadget_data(gadget);
+	struct gs_dev *dev = get_composite_data(cdev);
+#else
 	struct gs_dev *dev = get_gadget_data(gadget);
 
+#endif /* USB_COMPOSITE_DEVICE */
 	gs_device = NULL;
@@ -1485,2 +1577,12 @@ static void /* __init_or_exit */ gs_unbi
 	if (dev != NULL) {
+#ifdef USB_COMPOSITE_DEVICE
+		usb_composite_ep_reset(dev->dev_notify_ep);
+		usb_composite_ep_reset(dev->dev_in_ep);
+		usb_composite_ep_reset(dev->dev_out_ep);
+		gs_reset_config(dev);
+
+		gs_free_ports(dev);
+		kfree(dev);
+		set_composite_data(cdev, NULL);
+#else
 		if (dev->dev_ctrl_req != NULL) {
@@ -1492,2 +1594,3 @@ static void /* __init_or_exit */ gs_unbi
 		set_gadget_data(gadget, NULL);
+#endif /* USB_COMPOSITE_DEVICE */
 	}
@@ -1511,4 +1614,6 @@ static int gs_setup(struct usb_gadget *g
 	int ret = -EOPNOTSUPP;
+#ifndef USB_COMPOSITE_DEVICE
 	struct gs_dev *dev = get_gadget_data(gadget);
 	struct usb_request *req = dev->dev_ctrl_req;
+#endif /* USB_COMPOSITE_DEVICE */
 	u16 wIndex = le16_to_cpu(ctrl->wIndex);
@@ -1533,2 +1638,3 @@ static int gs_setup(struct usb_gadget *g
 
+#ifndef USB_COMPOSITE_DEVICE
 	/* respond with data transfer before status phase? */
@@ -1546,2 +1652,3 @@ static int gs_setup(struct usb_gadget *g
 	}
+#endif /* !USB_COMPOSITE_DEVICE */
 
@@ -1555,3 +1662,8 @@ static int gs_setup_standard(struct usb_
 	int ret = -EOPNOTSUPP;
+#ifdef USB_COMPOSITE_DEVICE
+	struct usb_composite_dev *cdev = get_gadget_data(gadget);
+	struct gs_dev *dev = get_composite_data(cdev);
+#else
 	struct gs_dev *dev = get_gadget_data(gadget);
+#endif
 	struct usb_request *req = dev->dev_ctrl_req;
@@ -1562,2 +1674,4 @@ static int gs_setup_standard(struct usb_
 	switch (ctrl->bRequest) {
+
+#ifndef USB_COMPOSITE_DEVICE
 	case USB_REQ_GET_DESCRIPTOR:
@@ -1604,2 +1718,3 @@ static int gs_setup_standard(struct usb_
 		break;
+#endif /* !USB_COMPOSITE_DEVICE */
 
@@ -1608,2 +1723,8 @@ static int gs_setup_standard(struct usb_
 			break;
+#ifdef USB_COMPOSITE_DEVICE
+		if (wValue == COMPOSITE_CONFIG_VALUE) {
+			wValue = use_acm ?
+				GS_ACM_CONFIG_ID : GS_BULK_CONFIG_ID;
+		}
+#endif /* USB_COMPOSITE_DEVICE */
 		spin_lock(&dev->dev_lock);
@@ -1613,2 +1734,3 @@ static int gs_setup_standard(struct usb_
 
+#ifndef USB_COMPOSITE_DEVICE
 	case USB_REQ_GET_CONFIGURATION:
@@ -1619,4 +1741,8 @@ static int gs_setup_standard(struct usb_
 		break;
+#endif /* !USB_COMPOSITE_DEVICE */
 
 	case USB_REQ_SET_INTERFACE:
+#ifdef USB_COMPOSITE_DEVICE
+		wIndex -= cdev->current_func->interface_shift;
+#endif /* USB_COMPOSITE_DEVICE */
 		if (ctrl->bRequestType != USB_RECIP_INTERFACE
@@ -1657,2 +1783,5 @@ set_interface_done:
 	case USB_REQ_GET_INTERFACE:
+#ifdef USB_COMPOSITE_DEVICE
+		wIndex -= cdev->current_func->interface_shift;
+#endif /* USB_COMPOSITE_DEVICE */
 		if (ctrl->bRequestType != (USB_DIR_IN|USB_RECIP_INTERFACE)
@@ -1685,3 +1814,8 @@ static int gs_setup_class(struct usb_gad
 	int ret = -EOPNOTSUPP;
+#ifdef USB_COMPOSITE_DEVICE
+	struct usb_composite_dev *cdev = get_gadget_data(gadget);
+	struct gs_dev *dev = get_composite_data(cdev);
+#else
 	struct gs_dev *dev = get_gadget_data(gadget);
+#endif
 	struct gs_port *port = dev->dev_port[0];	/* ACM only has one port */
@@ -1692,2 +1826,6 @@ static int gs_setup_class(struct usb_gad
 
+#ifdef USB_COMPOSITE_DEVICE
+		wIndex -= cdev->current_func->interface_shift;
+#endif /* USB_COMPOSITE_DEVICE */
+
 	switch (ctrl->bRequest) {
@@ -1729,2 +1867,3 @@ static int gs_setup_class(struct usb_gad
 
+#ifndef USB_COMPOSITE_DEVICE
 /*
@@ -1739,2 +1878,3 @@ static void gs_setup_complete(struct usb
 }
+#endif /* !USB_COMPOSITE_DEVICE */
 
@@ -1749,4 +1889,9 @@ static void gs_disconnect(struct usb_gad
 {
-	unsigned long flags;
+#ifdef USB_COMPOSITE_DEVICE
+	struct usb_composite_dev *cdev = get_gadget_data(gadget);
+	struct gs_dev *dev = get_composite_data(cdev);
+#else
 	struct gs_dev *dev = get_gadget_data(gadget);
+#endif /* USB_COMPOSITE_DEVICE */
+	unsigned long flags;
 
@@ -1912,3 +2057,3 @@ static int gs_set_config(struct gs_dev *
 	}
-
+#ifndef USB_COMPOSITE_DEVICE
 	printk(KERN_INFO "gs_set_config: %s configured, %s speed %s config\n",
@@ -1917,3 +2062,3 @@ static int gs_set_config(struct gs_dev *
 		config == GS_BULK_CONFIG_ID ? "BULK" : "CDC-ACM");
-
+#endif /* !USB_COMPOSITE_DEVICE */
 	return 0;
@@ -1972,3 +2117,6 @@ static void gs_reset_config(struct gs_de
 }
-
+/* if defined composite, build the config
+ * buf for all gadgets in the composite.
+ */
+#ifndef USB_COMPOSITE_DEVICE
 /*
@@ -1985,3 +2133,3 @@ static int gs_build_config_buf(u8 *buf, 
 	const struct usb_config_descriptor *config_desc;
-	const struct usb_descriptor_header **function;
+	struct usb_descriptor_header **function;
 
@@ -2019,2 +2167,3 @@ static int gs_build_config_buf(u8 *buf, 
 }
+#endif /* !USB_COMPOSITE_DEVICE */
 

--
Best Regards,

Felipe Balbi
[email protected]

Nokia Institute of Technology - INdT
Kernel Developers Team

+55 92 2126 1003


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.