Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
usb
gadget
cdc2.c
Go to the documentation of this file.
1
/*
2
* cdc2.c -- CDC Composite driver, with ECM and ACM support
3
*
4
* Copyright (C) 2008 David Brownell
5
* Copyright (C) 2008 Nokia Corporation
6
*
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License as published by
9
* the Free Software Foundation; either version 2 of the License, or
10
* (at your option) any later version.
11
*/
12
13
#include <linux/kernel.h>
14
#include <linux/module.h>
15
16
#include "
u_ether.h
"
17
#include "
u_serial.h
"
18
19
20
#define DRIVER_DESC "CDC Composite Gadget"
21
#define DRIVER_VERSION "King Kamehameha Day 2008"
22
23
/*-------------------------------------------------------------------------*/
24
25
/* DO NOT REUSE THESE IDs with a protocol-incompatible driver!! Ever!!
26
* Instead: allocate your own, using normal USB-IF procedures.
27
*/
28
29
/* Thanks to NetChip Technologies for donating this product ID.
30
* It's for devices with only this composite CDC configuration.
31
*/
32
#define CDC_VENDOR_NUM 0x0525
/* NetChip */
33
#define CDC_PRODUCT_NUM 0xa4aa
/* CDC Composite: ECM + ACM */
34
35
/*-------------------------------------------------------------------------*/
36
USB_GADGET_COMPOSITE_OPTIONS
();
37
38
/*
39
* Kbuild is not very cooperative with respect to linking separately
40
* compiled library objects into one module. So for now we won't use
41
* separate compilation ... ensuring init/exit sections work to shrink
42
* the runtime footprint, and giving us at least some parts of what
43
* a "gcc --combine ... part1.c part2.c part3.c ... " build would.
44
*/
45
46
#include "
u_serial.c
"
47
#include "
f_acm.c
"
48
#include "
f_ecm.c
"
49
#include "
u_ether.c
"
50
51
/*-------------------------------------------------------------------------*/
52
53
static
struct
usb_device_descriptor
device_desc = {
54
.bLength =
sizeof
device_desc,
55
.
bDescriptorType
=
USB_DT_DEVICE
,
56
57
.bcdUSB =
cpu_to_le16
(0x0200),
58
59
.bDeviceClass =
USB_CLASS_COMM
,
60
.bDeviceSubClass = 0,
61
.bDeviceProtocol = 0,
62
/* .bMaxPacketSize0 = f(hardware) */
63
64
/* Vendor and product id can be overridden by module parameters. */
65
.idVendor =
cpu_to_le16
(
CDC_VENDOR_NUM
),
66
.idProduct =
cpu_to_le16
(
CDC_PRODUCT_NUM
),
67
/* .bcdDevice = f(hardware) */
68
/* .iManufacturer = DYNAMIC */
69
/* .iProduct = DYNAMIC */
70
/* NO SERIAL NUMBER */
71
.bNumConfigurations = 1,
72
};
73
74
static
struct
usb_otg_descriptor
otg_descriptor = {
75
.bLength =
sizeof
otg_descriptor,
76
.
bDescriptorType
=
USB_DT_OTG
,
77
78
/* REVISIT SRP-only hardware is possible, although
79
* it would not be called "OTG" ...
80
*/
81
.bmAttributes =
USB_OTG_SRP
|
USB_OTG_HNP
,
82
};
83
84
static
const
struct
usb_descriptor_header
*otg_desc[] = {
85
(
struct
usb_descriptor_header
*) &otg_descriptor,
86
NULL
,
87
};
88
89
90
/* string IDs are assigned dynamically */
91
static
struct
usb_string
strings_dev[] = {
92
[
USB_GADGET_MANUFACTURER_IDX
].s =
""
,
93
[
USB_GADGET_PRODUCT_IDX
].s =
DRIVER_DESC
,
94
[
USB_GADGET_SERIAL_IDX
].s =
""
,
95
{ }
/* end of list */
96
};
97
98
static
struct
usb_gadget_strings
stringtab_dev = {
99
.language = 0x0409,
/* en-us */
100
.strings = strings_dev,
101
};
102
103
static
struct
usb_gadget_strings
*dev_strings[] = {
104
&stringtab_dev,
105
NULL
,
106
};
107
108
static
u8
hostaddr[
ETH_ALEN
];
109
110
/*-------------------------------------------------------------------------*/
111
112
/*
113
* We _always_ have both CDC ECM and CDC ACM functions.
114
*/
115
static
int
__init
cdc_do_config(
struct
usb_configuration
*
c
)
116
{
117
int
status
;
118
119
if
(gadget_is_otg(c->
cdev
->gadget)) {
120
c->
descriptors
= otg_desc;
121
c->
bmAttributes
|=
USB_CONFIG_ATT_WAKEUP
;
122
}
123
124
status =
ecm_bind_config
(c, hostaddr);
125
if
(status < 0)
126
return
status
;
127
128
status =
acm_bind_config
(c, 0);
129
if
(status < 0)
130
return
status
;
131
132
return
0;
133
}
134
135
static
struct
usb_configuration
cdc_config_driver = {
136
.label =
"CDC Composite (ECM + ACM)"
,
137
.bConfigurationValue = 1,
138
/* .iConfiguration = DYNAMIC */
139
.bmAttributes =
USB_CONFIG_ATT_SELFPOWER
,
140
};
141
142
/*-------------------------------------------------------------------------*/
143
144
static
int
__init
cdc_bind(
struct
usb_composite_dev
*
cdev
)
145
{
146
struct
usb_gadget
*gadget = cdev->
gadget
;
147
int
status
;
148
149
if
(!can_support_ecm(cdev->
gadget
)) {
150
dev_err
(&gadget->
dev
,
"controller '%s' not usable\n"
,
151
gadget->
name
);
152
return
-
EINVAL
;
153
}
154
155
/* set up network link layer */
156
status =
gether_setup
(cdev->
gadget
, hostaddr);
157
if
(status < 0)
158
return
status
;
159
160
/* set up serial link layer */
161
status =
gserial_setup
(cdev->
gadget
, 1);
162
if
(status < 0)
163
goto
fail0;
164
165
/* Allocate string descriptor numbers ... note that string
166
* contents can be overridden by the composite_dev glue.
167
*/
168
169
status =
usb_string_ids_tab
(cdev, strings_dev);
170
if
(status < 0)
171
goto
fail1;
172
device_desc.
iManufacturer
= strings_dev[
USB_GADGET_MANUFACTURER_IDX
].
id
;
173
device_desc.
iProduct
= strings_dev[
USB_GADGET_PRODUCT_IDX
].
id
;
174
175
/* register our configuration */
176
status =
usb_add_config
(cdev, &cdc_config_driver, cdc_do_config);
177
if
(status < 0)
178
goto
fail1;
179
180
usb_composite_overwrite_options
(cdev, &coverwrite);
181
dev_info
(&gadget->
dev
,
"%s, version: "
DRIVER_VERSION
"\n"
,
182
DRIVER_DESC
);
183
184
return
0;
185
186
fail1:
187
gserial_cleanup
();
188
fail0:
189
gether_cleanup
();
190
return
status
;
191
}
192
193
static
int
__exit
cdc_unbind(
struct
usb_composite_dev
*cdev)
194
{
195
gserial_cleanup
();
196
gether_cleanup
();
197
return
0;
198
}
199
200
static
__refdata
struct
usb_composite_driver
cdc_driver = {
201
.name =
"g_cdc"
,
202
.dev = &device_desc,
203
.strings = dev_strings,
204
.max_speed =
USB_SPEED_HIGH
,
205
.bind = cdc_bind,
206
.unbind =
__exit_p
(cdc_unbind),
207
};
208
209
MODULE_DESCRIPTION
(
DRIVER_DESC
);
210
MODULE_AUTHOR
(
"David Brownell"
);
211
MODULE_LICENSE
(
"GPL"
);
212
213
static
int
__init
init
(
void
)
214
{
215
return
usb_composite_probe
(&cdc_driver);
216
}
217
module_init
(
init
);
218
219
static
void
__exit
cleanup(
void
)
220
{
221
usb_composite_unregister
(&cdc_driver);
222
}
223
module_exit
(cleanup);
Generated on Thu Jan 10 2013 14:36:05 for Linux Kernel by
1.8.2