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
include
linux
usb
composite.h
Go to the documentation of this file.
1
/*
2
* composite.h -- framework for usb gadgets which are composite devices
3
*
4
* Copyright (C) 2006-2008 David Brownell
5
*
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
10
*
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
15
*
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
*/
20
21
#ifndef __LINUX_USB_COMPOSITE_H
22
#define __LINUX_USB_COMPOSITE_H
23
24
/*
25
* This framework is an optional layer on top of the USB Gadget interface,
26
* making it easier to build (a) Composite devices, supporting multiple
27
* functions within any single configuration, and (b) Multi-configuration
28
* devices, also supporting multiple functions but without necessarily
29
* having more than one function per configuration.
30
*
31
* Example: a device with a single configuration supporting both network
32
* link and mass storage functions is a composite device. Those functions
33
* might alternatively be packaged in individual configurations, but in
34
* the composite model the host can use both functions at the same time.
35
*/
36
37
#include <
linux/bcd.h
>
38
#include <linux/version.h>
39
#include <linux/usb/ch9.h>
40
#include <
linux/usb/gadget.h
>
41
42
/*
43
* USB function drivers should return USB_GADGET_DELAYED_STATUS if they
44
* wish to delay the data/status stages of the control transfer till they
45
* are ready. The control transfer will then be kept from completing till
46
* all the function drivers that requested for USB_GADGET_DELAYED_STAUS
47
* invoke usb_composite_setup_continue().
48
*/
49
#define USB_GADGET_DELAYED_STATUS 0x7fff
/* Impossibly large value */
50
51
/* big enough to hold our biggest descriptor */
52
#define USB_COMP_EP0_BUFSIZ 1024
53
54
struct
usb_configuration
;
55
117
struct
usb_function
{
118
const
char
*
name
;
119
struct
usb_gadget_strings
**
strings
;
120
struct
usb_descriptor_header
**
descriptors
;
121
struct
usb_descriptor_header
**
hs_descriptors
;
122
struct
usb_descriptor_header
**
ss_descriptors
;
123
124
struct
usb_configuration
*
config
;
125
126
/* REVISIT: bind() functions can be marked __init, which
127
* makes trouble for section mismatch analysis. See if
128
* we can't restructure things to avoid mismatching.
129
* Related: unbind() may kfree() but bind() won't...
130
*/
131
132
/* configuration management: bind/unbind */
133
int
(*
bind
)(
struct
usb_configuration
*,
134
struct
usb_function
*);
135
void
(*
unbind
)(
struct
usb_configuration
*,
136
struct
usb_function
*);
137
138
/* runtime state management */
139
int
(*
set_alt
)(
struct
usb_function
*,
140
unsigned
interface
,
unsigned
alt);
141
int
(*
get_alt
)(
struct
usb_function
*,
142
unsigned
interface
);
143
void
(*
disable
)(
struct
usb_function
*);
144
int
(*
setup
)(
struct
usb_function
*,
145
const
struct
usb_ctrlrequest
*);
146
void
(*
suspend
)(
struct
usb_function
*);
147
void
(*
resume
)(
struct
usb_function
*);
148
149
/* USB 3.0 additions */
150
int
(*
get_status
)(
struct
usb_function
*);
151
int
(*
func_suspend
)(
struct
usb_function
*,
152
u8
suspend_opt);
153
/* private: */
154
/* internals */
155
struct
list_head
list
;
156
DECLARE_BITMAP
(
endpoints
, 32);
157
};
158
159
int
usb_add_function
(
struct
usb_configuration
*,
struct
usb_function
*);
160
161
int
usb_function_deactivate
(
struct
usb_function
*);
162
int
usb_function_activate
(
struct
usb_function
*);
163
164
int
usb_interface_id
(
struct
usb_configuration
*,
struct
usb_function
*);
165
166
int
config_ep_by_speed
(
struct
usb_gadget
*g,
struct
usb_function
*
f
,
167
struct
usb_ep
*_ep);
168
169
#define MAX_CONFIG_INTERFACES 16
/* arbitrary; max 255 */
170
212
struct
usb_configuration
{
213
const
char
*
label
;
214
struct
usb_gadget_strings
**
strings
;
215
const
struct
usb_descriptor_header
**
descriptors
;
216
217
/* REVISIT: bind() functions can be marked __init, which
218
* makes trouble for section mismatch analysis. See if
219
* we can't restructure things to avoid mismatching...
220
*/
221
222
/* configuration management: unbind/setup */
223
void
(*
unbind
)(
struct
usb_configuration
*);
224
int
(*
setup
)(
struct
usb_configuration
*,
225
const
struct
usb_ctrlrequest
*);
226
227
/* fields in the config descriptor */
228
u8
bConfigurationValue
;
229
u8
iConfiguration
;
230
u8
bmAttributes
;
231
u8
bMaxPower
;
232
233
struct
usb_composite_dev
*
cdev
;
234
235
/* private: */
236
/* internals */
237
struct
list_head
list;
238
struct
list_head
functions;
239
u8
next_interface_id
;
240
unsigned
superspeed
:1;
241
unsigned
highspeed
:1;
242
unsigned
fullspeed
:1;
243
struct
usb_function
*
interface
[
MAX_CONFIG_INTERFACES
];
244
};
245
246
int
usb_add_config
(
struct
usb_composite_dev
*,
247
struct
usb_configuration
*,
248
int
(*)(
struct
usb_configuration
*));
249
250
void
usb_remove_config
(
struct
usb_composite_dev
*,
251
struct
usb_configuration
*);
252
253
/* predefined index for usb_composite_driver */
254
enum
{
255
USB_GADGET_MANUFACTURER_IDX
= 0,
256
USB_GADGET_PRODUCT_IDX
,
257
USB_GADGET_SERIAL_IDX
,
258
USB_GADGET_FIRST_AVAIL_IDX
,
259
};
260
296
struct
usb_composite_driver
{
297
const
char
*
name
;
298
const
struct
usb_device_descriptor
*
dev
;
299
struct
usb_gadget_strings
**
strings
;
300
enum
usb_device_speed
max_speed
;
301
unsigned
needs_serial
:1;
302
303
int
(*
bind
)(
struct
usb_composite_dev
*
cdev
);
304
int
(*
unbind
)(
struct
usb_composite_dev
*);
305
306
void
(*
disconnect
)(
struct
usb_composite_dev
*);
307
308
/* global suspend hooks */
309
void
(*
suspend
)(
struct
usb_composite_dev
*);
310
void
(*
resume
)(
struct
usb_composite_dev
*);
311
struct
usb_gadget_driver
gadget_driver
;
312
};
313
314
extern
int
usb_composite_probe
(
struct
usb_composite_driver
*
driver
);
315
extern
void
usb_composite_unregister
(
struct
usb_composite_driver
*
driver
);
316
extern
void
usb_composite_setup_continue
(
struct
usb_composite_dev
*
cdev
);
317
318
350
struct
usb_composite_dev
{
351
struct
usb_gadget
*
gadget
;
352
struct
usb_request
*
req
;
353
354
struct
usb_configuration
*
config
;
355
356
/* private: */
357
/* internals */
358
unsigned
int
suspended
:1;
359
struct
usb_device_descriptor
desc
;
360
struct
list_head
configs
;
361
struct
usb_composite_driver
*
driver
;
362
u8
next_string_id
;
363
char
*
def_manufacturer
;
364
365
/* the gadget driver won't enable the data pullup
366
* while the deactivation count is nonzero.
367
*/
368
unsigned
deactivations
;
369
370
/* the composite driver won't complete the control transfer's
371
* data/status stages till delayed_status is zero.
372
*/
373
int
delayed_status
;
374
375
/* protects deactivations and delayed_status counts*/
376
spinlock_t
lock
;
377
};
378
379
extern
int
usb_string_id
(
struct
usb_composite_dev
*
c
);
380
extern
int
usb_string_ids_tab
(
struct
usb_composite_dev
*
c
,
381
struct
usb_string
*
str
);
382
extern
int
usb_string_ids_n
(
struct
usb_composite_dev
*
c
,
unsigned
n
);
383
384
/*
385
* Some systems will need runtime overrides for the product identifiers
386
* published in the device descriptor, either numbers or strings or both.
387
* String parameters are in UTF-8 (superset of ASCII's 7 bit characters).
388
*/
389
struct
usb_composite_overwrite
{
390
u16
idVendor
;
391
u16
idProduct
;
392
u16
bcdDevice
;
393
char
*
serial_number
;
394
char
*
manufacturer
;
395
char
*
product
;
396
};
397
#define USB_GADGET_COMPOSITE_OPTIONS() \
398
static struct usb_composite_overwrite coverwrite; \
399
\
400
module_param_named(idVendor, coverwrite.idVendor, ushort, S_IRUGO); \
401
MODULE_PARM_DESC(idVendor, "USB Vendor ID"); \
402
\
403
module_param_named(idProduct, coverwrite.idProduct, ushort, S_IRUGO); \
404
MODULE_PARM_DESC(idProduct, "USB Product ID"); \
405
\
406
module_param_named(bcdDevice, coverwrite.bcdDevice, ushort, S_IRUGO); \
407
MODULE_PARM_DESC(bcdDevice, "USB Device version (BCD)"); \
408
\
409
module_param_named(iSerialNumber, coverwrite.serial_number, charp, \
410
S_IRUGO); \
411
MODULE_PARM_DESC(iSerialNumber, "SerialNumber string"); \
412
\
413
module_param_named(iManufacturer, coverwrite.manufacturer, charp, \
414
S_IRUGO); \
415
MODULE_PARM_DESC(iManufacturer, "USB Manufacturer string"); \
416
\
417
module_param_named(iProduct, coverwrite.product, charp, S_IRUGO); \
418
MODULE_PARM_DESC(iProduct, "USB Product string")
419
420
void
usb_composite_overwrite_options
(
struct
usb_composite_dev
*
cdev
,
421
struct
usb_composite_overwrite
*covr);
422
423
static
inline
u16
get_default_bcdDevice(
void
)
424
{
425
u16
bcdDevice
;
426
427
bcdDevice =
bin2bcd
((LINUX_VERSION_CODE >> 16 & 0xff)) << 8;
428
bcdDevice |=
bin2bcd
((LINUX_VERSION_CODE >> 8 & 0xff));
429
return
bcdDevice;
430
}
431
432
/* messaging utils */
433
#define DBG(d, fmt, args...) \
434
dev_dbg(&(d)->gadget->dev , fmt , ## args)
435
#define VDBG(d, fmt, args...) \
436
dev_vdbg(&(d)->gadget->dev , fmt , ## args)
437
#define ERROR(d, fmt, args...) \
438
dev_err(&(d)->gadget->dev , fmt , ## args)
439
#define WARNING(d, fmt, args...) \
440
dev_warn(&(d)->gadget->dev , fmt , ## args)
441
#define INFO(d, fmt, args...) \
442
dev_info(&(d)->gadget->dev , fmt , ## args)
443
444
#endif
/* __LINUX_USB_COMPOSITE_H */
Generated on Thu Jan 10 2013 14:26:08 for Linux Kernel by
1.8.2