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
gmidi.c
Go to the documentation of this file.
1
/*
2
* gmidi.c -- USB MIDI Gadget Driver
3
*
4
* Copyright (C) 2006 Thumtronics Pty Ltd.
5
* Developed for Thumtronics by Grey Innovation
6
* Ben Williamson <
[email protected]
>
7
*
8
* This software is distributed under the terms of the GNU General Public
9
* License ("GPL") version 2, as published by the Free Software Foundation.
10
*
11
* This code is based in part on:
12
*
13
* Gadget Zero driver, Copyright (C) 2003-2004 David Brownell.
14
* USB Audio driver, Copyright (C) 2002 by Takashi Iwai.
15
* USB MIDI driver, Copyright (C) 2002-2005 Clemens Ladisch.
16
*
17
* Refer to the USB Device Class Definition for MIDI Devices:
18
* http://www.usb.org/developers/devclass_docs/midi10.pdf
19
*/
20
21
/* #define VERBOSE_DEBUG */
22
23
#include <linux/kernel.h>
24
#include <linux/slab.h>
25
#include <linux/module.h>
26
#include <linux/device.h>
27
28
#include <
sound/core.h
>
29
#include <
sound/initval.h
>
30
#include <
sound/rawmidi.h
>
31
32
#include <linux/usb/ch9.h>
33
#include <
linux/usb/composite.h
>
34
#include <
linux/usb/gadget.h
>
35
#include <linux/usb/audio.h>
36
#include <
linux/usb/midi.h
>
37
38
#include "
gadget_chips.h
"
39
40
#include "
f_midi.c
"
41
42
/*-------------------------------------------------------------------------*/
43
44
MODULE_AUTHOR
(
"Ben Williamson"
);
45
MODULE_LICENSE
(
"GPL v2"
);
46
47
static
const
char
shortname[] =
"g_midi"
;
48
static
const
char
longname[] =
"MIDI Gadget"
;
49
50
USB_GADGET_COMPOSITE_OPTIONS
();
51
52
static
int
index
=
SNDRV_DEFAULT_IDX1
;
53
module_param
(
index
,
int
,
S_IRUGO
);
54
MODULE_PARM_DESC
(
index
,
"Index value for the USB MIDI Gadget adapter."
);
55
56
static
char
*
id
=
SNDRV_DEFAULT_STR1
;
57
module_param
(
id
, charp,
S_IRUGO
);
58
MODULE_PARM_DESC
(
id
,
"ID string for the USB MIDI Gadget adapter."
);
59
60
static
unsigned
int
buflen
= 256;
61
module_param
(
buflen
,
uint
,
S_IRUGO
);
62
MODULE_PARM_DESC
(
buflen
,
"MIDI buffer length"
);
63
64
static
unsigned
int
qlen = 32;
65
module_param
(qlen,
uint
,
S_IRUGO
);
66
MODULE_PARM_DESC
(qlen,
"USB read request queue length"
);
67
68
static
unsigned
int
in_ports = 1;
69
module_param
(in_ports,
uint
,
S_IRUGO
);
70
MODULE_PARM_DESC
(in_ports,
"Number of MIDI input ports"
);
71
72
static
unsigned
int
out_ports = 1;
73
module_param
(out_ports,
uint
,
S_IRUGO
);
74
MODULE_PARM_DESC
(out_ports,
"Number of MIDI output ports"
);
75
76
/* Thanks to Grey Innovation for donating this product ID.
77
*
78
* DO NOT REUSE THESE IDs with a protocol-incompatible driver!! Ever!!
79
* Instead: allocate your own, using normal USB-IF procedures.
80
*/
81
#define DRIVER_VENDOR_NUM 0x17b3
/* Grey Innovation */
82
#define DRIVER_PRODUCT_NUM 0x0004
/* Linux-USB "MIDI Gadget" */
83
84
/* string IDs are assigned dynamically */
85
86
#define STRING_DESCRIPTION_IDX USB_GADGET_FIRST_AVAIL_IDX
87
88
static
struct
usb_device_descriptor
device_desc = {
89
.bLength =
USB_DT_DEVICE_SIZE
,
90
.bDescriptorType =
USB_DT_DEVICE
,
91
.bcdUSB =
__constant_cpu_to_le16
(0x0200),
92
.bDeviceClass =
USB_CLASS_PER_INTERFACE
,
93
.idVendor =
__constant_cpu_to_le16
(
DRIVER_VENDOR_NUM
),
94
.idProduct =
__constant_cpu_to_le16
(
DRIVER_PRODUCT_NUM
),
95
/* .iManufacturer = DYNAMIC */
96
/* .iProduct = DYNAMIC */
97
.bNumConfigurations = 1,
98
};
99
100
static
struct
usb_string
strings_dev[] = {
101
[
USB_GADGET_MANUFACTURER_IDX
].s =
"Grey Innovation"
,
102
[
USB_GADGET_PRODUCT_IDX
].s =
"MIDI Gadget"
,
103
[
USB_GADGET_SERIAL_IDX
].s =
""
,
104
[
STRING_DESCRIPTION_IDX
].s =
"MIDI"
,
105
{ }
/* end of list */
106
};
107
108
static
struct
usb_gadget_strings
stringtab_dev = {
109
.language = 0x0409,
/* en-us */
110
.strings = strings_dev,
111
};
112
113
static
struct
usb_gadget_strings
*dev_strings[] = {
114
&stringtab_dev,
115
NULL
,
116
};
117
118
static
int
__exit
midi_unbind(
struct
usb_composite_dev
*
dev
)
119
{
120
return
0;
121
}
122
123
static
struct
usb_configuration
midi_config = {
124
.label =
"MIDI Gadget"
,
125
.bConfigurationValue = 1,
126
/* .iConfiguration = DYNAMIC */
127
.bmAttributes =
USB_CONFIG_ATT_ONE
,
128
.bMaxPower = CONFIG_USB_GADGET_VBUS_DRAW / 2,
129
};
130
131
static
int
__init
midi_bind_config(
struct
usb_configuration
*
c
)
132
{
133
return
f_midi_bind_config
(c,
index
,
id
,
134
in_ports, out_ports,
135
buflen
, qlen);
136
}
137
138
static
int
__init
midi_bind(
struct
usb_composite_dev
*
cdev
)
139
{
140
int
status
;
141
142
status =
usb_string_ids_tab
(cdev, strings_dev);
143
if
(status < 0)
144
return
status
;
145
device_desc.
iManufacturer
= strings_dev[
USB_GADGET_MANUFACTURER_IDX
].
id
;
146
device_desc.
iProduct
= strings_dev[
USB_GADGET_PRODUCT_IDX
].
id
;
147
midi_config.
iConfiguration
= strings_dev[
STRING_DESCRIPTION_IDX
].
id
;
148
149
status =
usb_add_config
(cdev, &midi_config, midi_bind_config);
150
if
(status < 0)
151
return
status
;
152
usb_composite_overwrite_options
(cdev, &coverwrite);
153
pr_info
(
"%s\n"
, longname);
154
return
0;
155
}
156
157
static
__refdata
struct
usb_composite_driver
midi_driver = {
158
.name = (
char
*) longname,
159
.
dev
= &device_desc,
160
.
strings
= dev_strings,
161
.
max_speed
=
USB_SPEED_HIGH
,
162
.
bind
= midi_bind,
163
.
unbind
=
__exit_p
(midi_unbind),
164
};
165
166
static
int
__init
midi_init(
void
)
167
{
168
return
usb_composite_probe
(&midi_driver);
169
}
170
module_init
(midi_init);
171
172
static
void
__exit
midi_cleanup(
void
)
173
{
174
usb_composite_unregister
(&midi_driver);
175
}
176
module_exit
(midi_cleanup);
177
Generated on Thu Jan 10 2013 14:36:20 for Linux Kernel by
1.8.2