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
ncm.c
Go to the documentation of this file.
1
/*
2
* ncm.c -- NCM gadget driver
3
*
4
* Copyright (C) 2010 Nokia Corporation
5
* Contact: Yauheni Kaliuta <
[email protected]
>
6
*
7
* The driver borrows from ether.c which is:
8
*
9
* Copyright (C) 2003-2005,2008 David Brownell
10
* Copyright (C) 2003-2004 Robert Schwebel, Benedikt Spranger
11
* Copyright (C) 2008 Nokia Corporation
12
*
13
* This program is free software; you can redistribute it and/or modify
14
* it under the terms of the GNU General Public License as published by
15
* the Free Software Foundation; either version 2 of the License, or
16
* (at your option) any later version.
17
*/
18
19
/* #define DEBUG */
20
/* #define VERBOSE_DEBUG */
21
22
#include <linux/kernel.h>
23
#include <linux/module.h>
24
#include <
linux/usb/composite.h
>
25
26
#include "
u_ether.h
"
27
28
#define DRIVER_DESC "NCM Gadget"
29
30
/*-------------------------------------------------------------------------*/
31
32
/*
33
* Kbuild is not very cooperative with respect to linking separately
34
* compiled library objects into one module. So for now we won't use
35
* separate compilation ... ensuring init/exit sections work to shrink
36
* the runtime footprint, and giving us at least some parts of what
37
* a "gcc --combine ... part1.c part2.c part3.c ... " build would.
38
*/
39
#include "
f_ncm.c
"
40
#include "
u_ether.c
"
41
42
/*-------------------------------------------------------------------------*/
43
44
/* DO NOT REUSE THESE IDs with a protocol-incompatible driver!! Ever!!
45
* Instead: allocate your own, using normal USB-IF procedures.
46
*/
47
48
/* Thanks to NetChip Technologies for donating this product ID.
49
* It's for devices with only CDC Ethernet configurations.
50
*/
51
#define CDC_VENDOR_NUM 0x0525
/* NetChip */
52
#define CDC_PRODUCT_NUM 0xa4a1
/* Linux-USB Ethernet Gadget */
53
54
/*-------------------------------------------------------------------------*/
55
USB_GADGET_COMPOSITE_OPTIONS
();
56
57
static
struct
usb_device_descriptor
device_desc = {
58
.bLength =
sizeof
device_desc,
59
.
bDescriptorType
=
USB_DT_DEVICE
,
60
61
.bcdUSB =
cpu_to_le16
(0x0200),
62
63
.bDeviceClass =
USB_CLASS_COMM
,
64
.bDeviceSubClass = 0,
65
.bDeviceProtocol = 0,
66
/* .bMaxPacketSize0 = f(hardware) */
67
68
/* Vendor and product id defaults change according to what configs
69
* we support. (As does bNumConfigurations.) These values can
70
* also be overridden by module parameters.
71
*/
72
.idVendor =
cpu_to_le16
(
CDC_VENDOR_NUM
),
73
.idProduct =
cpu_to_le16
(
CDC_PRODUCT_NUM
),
74
/* .bcdDevice = f(hardware) */
75
/* .iManufacturer = DYNAMIC */
76
/* .iProduct = DYNAMIC */
77
/* NO SERIAL NUMBER */
78
.bNumConfigurations = 1,
79
};
80
81
static
struct
usb_otg_descriptor
otg_descriptor = {
82
.bLength =
sizeof
otg_descriptor,
83
.
bDescriptorType
=
USB_DT_OTG
,
84
85
/* REVISIT SRP-only hardware is possible, although
86
* it would not be called "OTG" ...
87
*/
88
.bmAttributes =
USB_OTG_SRP
|
USB_OTG_HNP
,
89
};
90
91
static
const
struct
usb_descriptor_header
*
otg_desc
[] = {
92
(
struct
usb_descriptor_header
*) &otg_descriptor,
93
NULL
,
94
};
95
96
/* string IDs are assigned dynamically */
97
static
struct
usb_string
strings_dev[] = {
98
[
USB_GADGET_MANUFACTURER_IDX
].s =
""
,
99
[
USB_GADGET_PRODUCT_IDX
].s =
DRIVER_DESC
,
100
[
USB_GADGET_SERIAL_IDX
].s =
""
,
101
{ }
/* end of list */
102
};
103
104
static
struct
usb_gadget_strings
stringtab_dev = {
105
.language = 0x0409,
/* en-us */
106
.strings = strings_dev,
107
};
108
109
static
struct
usb_gadget_strings
*dev_strings[] = {
110
&stringtab_dev,
111
NULL
,
112
};
113
114
static
u8
hostaddr[
ETH_ALEN
];
115
116
/*-------------------------------------------------------------------------*/
117
118
static
int
__init
ncm_do_config(
struct
usb_configuration
*
c
)
119
{
120
/* FIXME alloc iConfiguration string, set it in c->strings */
121
122
if
(gadget_is_otg(c->
cdev
->gadget)) {
123
c->
descriptors
= otg_desc;
124
c->
bmAttributes
|=
USB_CONFIG_ATT_WAKEUP
;
125
}
126
127
return
ncm_bind_config
(c, hostaddr);
128
}
129
130
static
struct
usb_configuration
ncm_config_driver = {
131
/* .label = f(hardware) */
132
.label =
"CDC Ethernet (NCM)"
,
133
.bConfigurationValue = 1,
134
/* .iConfiguration = DYNAMIC */
135
.bmAttributes =
USB_CONFIG_ATT_SELFPOWER
,
136
};
137
138
/*-------------------------------------------------------------------------*/
139
140
static
int
__init
gncm_bind(
struct
usb_composite_dev
*
cdev
)
141
{
142
struct
usb_gadget
*gadget = cdev->
gadget
;
143
int
status
;
144
145
/* set up network link layer */
146
status =
gether_setup
(cdev->
gadget
, hostaddr);
147
if
(status < 0)
148
return
status
;
149
150
/* Allocate string descriptor numbers ... note that string
151
* contents can be overridden by the composite_dev glue.
152
*/
153
154
status =
usb_string_ids_tab
(cdev, strings_dev);
155
if
(status < 0)
156
goto
fail;
157
device_desc.
iManufacturer
= strings_dev[
USB_GADGET_MANUFACTURER_IDX
].
id
;
158
device_desc.
iProduct
= strings_dev[
USB_GADGET_PRODUCT_IDX
].
id
;
159
160
status =
usb_add_config
(cdev, &ncm_config_driver,
161
ncm_do_config);
162
if
(status < 0)
163
goto
fail;
164
165
usb_composite_overwrite_options
(cdev, &coverwrite);
166
dev_info
(&gadget->
dev
,
"%s\n"
,
DRIVER_DESC
);
167
168
return
0;
169
170
fail:
171
gether_cleanup
();
172
return
status
;
173
}
174
175
static
int
__exit
gncm_unbind(
struct
usb_composite_dev
*cdev)
176
{
177
gether_cleanup
();
178
return
0;
179
}
180
181
static
__refdata
struct
usb_composite_driver
ncm_driver = {
182
.name =
"g_ncm"
,
183
.dev = &device_desc,
184
.strings = dev_strings,
185
.max_speed =
USB_SPEED_HIGH
,
186
.bind = gncm_bind,
187
.unbind =
__exit_p
(gncm_unbind),
188
};
189
190
MODULE_DESCRIPTION
(
DRIVER_DESC
);
191
MODULE_AUTHOR
(
"Yauheni Kaliuta"
);
192
MODULE_LICENSE
(
"GPL"
);
193
194
static
int
__init
init
(
void
)
195
{
196
return
usb_composite_probe
(&ncm_driver);
197
}
198
module_init
(
init
);
199
200
static
void
__exit
cleanup(
void
)
201
{
202
usb_composite_unregister
(&ncm_driver);
203
}
204
module_exit
(cleanup);
Generated on Thu Jan 10 2013 14:36:29 for Linux Kernel by
1.8.2