Blame view

Documentation/usb/gadget_serial.txt 11.2 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
  
                   Linux Gadget Serial Driver v2.0
                             11/20/2004
a7707adf9   David Brownell   usb gadget: use n...
4
                    (updated 8-May-2008 for v2.3)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  
  
  License and Disclaimer
  ----------------------
  This program is free software; you can redistribute it and/or
  modify it under the terms of the GNU General Public License as
  published by the Free Software Foundation; either version 2 of
  the License, or (at your option) any later version.
  
  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.
  
  You should have received a copy of the GNU General Public
  License along with this program; if not, write to the Free
  Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  MA 02111-1307 USA.
d533f6718   Tobias Klauser   [PATCH] Spelling ...
23
  This document and the gadget serial driver itself are
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
25
26
27
28
29
30
31
32
33
  Copyright (C) 2004 by Al Borchers (alborchers@steinerpoint.com).
  
  If you have questions, problems, or suggestions for this driver
  please contact Al Borchers at alborchers@steinerpoint.com.
  
  
  Prerequisites
  -------------
  Versions of the gadget serial driver are available for the
  2.4 Linux kernels, but this document assumes you are using
a7707adf9   David Brownell   usb gadget: use n...
34
  version 2.3 or later of the gadget serial driver in a 2.6
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
36
37
38
39
40
41
  Linux kernel.
  
  This document assumes that you are familiar with Linux and
  Windows and know how to configure and build Linux kernels, run
  standard utilities, use minicom and HyperTerminal, and work with
  USB and serial devices.  It also assumes you configure the Linux
  gadget and usb drivers as modules.
a7707adf9   David Brownell   usb gadget: use n...
42
43
44
45
  With version 2.3 of the driver, major and minor device nodes are
  no longer statically defined.  Your Linux based system should mount
  sysfs in /sys, and use "mdev" (in Busybox) or "udev" to make the
  /dev nodes matching the sysfs /sys/class/tty files.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
  
  Overview
  --------
  The gadget serial driver is a Linux USB gadget driver, a USB device
  side driver.  It runs on a Linux system that has USB device side
  hardware; for example, a PDA, an embedded Linux system, or a PC
  with a USB development card.
  
  The gadget serial driver talks over USB to either a CDC ACM driver
  or a generic USB serial driver running on a host PC.
  
     Host
     --------------------------------------
    | Host-Side   CDC ACM       USB Host   |
    | Operating |   or        | Controller |   USB
    | System    | Generic USB | Driver     |--------
    | (Linux or | Serial      | and        |        |
    | Windows)    Driver        USB Stack  |        |
     --------------------------------------         |
                                                    |
                                                    |
                                                    |
     Gadget                                         |
     --------------------------------------         |
    | Gadget                   USB Periph. |        |
    | Device-Side |  Gadget  | Controller  |        |
    | Linux       |  Serial  | Driver      |--------
    | Operating   |  Driver  | and         |
    | System                   USB Stack   |
     --------------------------------------
  
  On the device-side Linux system, the gadget serial driver looks
  like a serial device.
  
  On the host-side system, the gadget serial device looks like a
  CDC ACM compliant class device or a simple vendor specific device
  with bulk in and bulk out endpoints, and it is treated similarly
  to other serial devices.
  
  The host side driver can potentially be any ACM compliant driver
  or any driver that can talk to a device with a simple bulk in/out
  interface.  Gadget serial has been tested with the Linux ACM driver,
  the Windows usbser.sys ACM driver, and the Linux USB generic serial
  driver.
  
  With the gadget serial driver and the host side ACM or generic
  serial driver running, you should be able to communicate between
  the host and the gadget side systems as if they were connected by a
  serial cable.
  
  The gadget serial driver only provides simple unreliable data
  communication.  It does not yet handle flow control or many other
  features of normal serial devices.
  
  
  Installing the Gadget Serial Driver
  -----------------------------------
  To use the gadget serial driver you must configure the Linux gadget
  side kernel for "Support for USB Gadgets", for a "USB Peripheral
  Controller" (for example, net2280), and for the "Serial Gadget"
  driver.  All this are listed under "USB Gadget Support" when
  configuring the kernel.  Then rebuild and install the kernel or
  modules.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
109
  Then you must load the gadget serial driver.  To load it as an
a7707adf9   David Brownell   usb gadget: use n...
110
  ACM device (recommended for interoperability), do this:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
111

c33ba3921   Peter Korsgaard   USB: Documentatio...
112
    modprobe g_serial
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
113
114
  
  To load it as a vendor specific bulk in/out device, do this:
c33ba3921   Peter Korsgaard   USB: Documentatio...
115
    modprobe g_serial use_acm=0
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
116
117
118
119
120
  
  This will also automatically load the underlying gadget peripheral
  controller driver.  This must be done each time you reboot the gadget
  side Linux system.  You can add this to the start up scripts, if
  desired.
a7707adf9   David Brownell   usb gadget: use n...
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
  Your system should use mdev (from busybox) or udev to make the
  device nodes.  After this gadget driver has been set up you should
  then see a /dev/ttyGS0 node:
  
    # ls -l /dev/ttyGS0 | cat
    crw-rw----    1 root     root     253,   0 May  8 14:10 /dev/ttyGS0
    #
  
  Note that the major number (253, above) is system-specific.  If
  you need to create /dev nodes by hand, the right numbers to use
  will be in the /sys/class/tty/ttyGS0/dev file.
  
  When you link this gadget driver early, perhaps even statically,
  you may want to set up an /etc/inittab entry to run "getty" on it.
  The /dev/ttyGS0 line should work like most any other serial port.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
136
137
138
139
140
141
142
143
144
  If gadget serial is loaded as an ACM device you will want to use
  either the Windows or Linux ACM driver on the host side.  If gadget
  serial is loaded as a bulk in/out device, you will want to use the
  Linux generic serial driver on the host side.  Follow the appropriate
  instructions below to install the host side driver.
  
  
  Installing the Windows Host ACM Driver
  --------------------------------------
e41e134e3   Michal Nazarewicz   USB: gadget: g_se...
145
146
147
  To use the Windows ACM driver you must have the "linux-cdc-acm.inf"
  file (provided along this document) which supports all recent versions
  of Windows.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
148
149
150
151
  
  When the gadget serial driver is loaded and the USB device connected
  to the Windows host with a USB cable, Windows should recognize the
  gadget serial device and ask for a driver.  Tell Windows to find the
e41e134e3   Michal Nazarewicz   USB: gadget: g_se...
152
  driver in the folder that contains the "linux-cdc-acm.inf" file.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
153
154
155
  
  For example, on Windows XP, when the gadget serial device is first
  plugged in, the "Found New Hardware Wizard" starts up.  Select
e41e134e3   Michal Nazarewicz   USB: gadget: g_se...
156
157
158
159
160
161
  "Install from a list or specific location (Advanced)", then on the
  next screen select "Include this location in the search" and enter the
  path or browse to the folder containing the "linux-cdc-acm.inf" file.
  Windows will complain that the Gadget Serial driver has not passed
  Windows Logo testing, but select "Continue anyway" and finish the
  driver installation.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
  
  On Windows XP, in the "Device Manager" (under "Control Panel",
  "System", "Hardware") expand the "Ports (COM & LPT)" entry and you
  should see "Gadget Serial" listed as the driver for one of the COM
  ports.
  
  To uninstall the Windows XP driver for "Gadget Serial", right click
  on the "Gadget Serial" entry in the "Device Manager" and select
  "Uninstall".
  
  
  Installing the Linux Host ACM Driver
  ------------------------------------
  To use the Linux ACM driver you must configure the Linux host side
  kernel for "Support for Host-side USB" and for "USB Modem (CDC ACM)
  support".
  
  Once the gadget serial driver is loaded and the USB device connected
  to the Linux host with a USB cable, the host system should recognize
  the gadget serial device.  For example, the command
  
    cat /proc/bus/usb/devices
  
  should show something like this:
  
  T:  Bus=01 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#=  5 Spd=480 MxCh= 0
  D:  Ver= 2.00 Cls=02(comm.) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
  P:  Vendor=0525 ProdID=a4a7 Rev= 2.01
  S:  Manufacturer=Linux 2.6.8.1 with net2280
  S:  Product=Gadget Serial
  S:  SerialNumber=0
  C:* #Ifs= 2 Cfg#= 2 Atr=c0 MxPwr=  2mA
  I:  If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=02 Prot=01 Driver=acm
  E:  Ad=83(I) Atr=03(Int.) MxPS=   8 Ivl=32ms
  I:  If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=acm
  E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
  E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
  
  If the host side Linux system is configured properly, the ACM driver
  should be loaded automatically.  The command "lsmod" should show the
  "acm" module is loaded.
  
  
  Installing the Linux Host Generic USB Serial Driver
  ---------------------------------------------------
  To use the Linux generic USB serial driver you must configure the
  Linux host side kernel for "Support for Host-side USB", for "USB
  Serial Converter support", and for the "USB Generic Serial Driver".
  
  Once the gadget serial driver is loaded and the USB device connected
  to the Linux host with a USB cable, the host system should recognize
  the gadget serial device.  For example, the command
  
    cat /proc/bus/usb/devices
  
  should show something like this:
  
  T:  Bus=01 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#=  6 Spd=480 MxCh= 0
  D:  Ver= 2.00 Cls=ff(vend.) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
  P:  Vendor=0525 ProdID=a4a6 Rev= 2.01
  S:  Manufacturer=Linux 2.6.8.1 with net2280
  S:  Product=Gadget Serial
  S:  SerialNumber=0
  C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=  2mA
  I:  If#= 0 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=serial
  E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
  E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
  
  You must explicitly load the usbserial driver with parameters to
  configure it to recognize the gadget serial device, like this:
  
    modprobe usbserial vendor=0x0525 product=0xA4A6
  
  If everything is working, usbserial will print a message in the
  system log saying something like "Gadget Serial converter now
  attached to ttyUSB0".
  
  
  Testing with Minicom or HyperTerminal
  -------------------------------------
  Once the gadget serial driver and the host driver are both installed,
  and a USB cable connects the gadget device to the host, you should
  be able to communicate over USB between the gadget and host systems.
  You can use minicom or HyperTerminal to try this out.
  
  On the gadget side run "minicom -s" to configure a new minicom
  session.  Under "Serial port setup" set "/dev/ttygserial" as the
  "Serial Device".  Set baud rate, data bits, parity, and stop bits,
  to 9600, 8, none, and 1--these settings mostly do not matter.
  Under "Modem and dialing" erase all the modem and dialing strings.
  
  On a Linux host running the ACM driver, configure minicom similarly
  but use "/dev/ttyACM0" as the "Serial Device".  (If you have other
  ACM devices connected, change the device name appropriately.)
  
  On a Linux host running the USB generic serial driver, configure
  minicom similarly, but use "/dev/ttyUSB0" as the "Serial Device".
  (If you have other USB serial devices connected, change the device
  name appropriately.)
  
  On a Windows host configure a new HyperTerminal session to use the
  COM port assigned to Gadget Serial.  The "Port Settings" will be
  set automatically when HyperTerminal connects to the gadget serial
  device, so you can leave them set to the default values--these
  settings mostly do not matter.
  
  With minicom configured and running on the gadget side and with
  minicom or HyperTerminal configured and running on the host side,
  you should be able to send data back and forth between the gadget
  side and host side systems.  Anything you type on the terminal
  window on the gadget side should appear in the terminal window on
  the host side and vice versa.