2 Linux Gadget Serial Driver v2.0
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License as
10 published by the Free Software Foundation; either version 2 of
11 the License, or (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public
19 License along with this program; if not, write to the Free
20 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
23 This document and the gadget serial driver itself are
24 Copyright (C) 2004 by Al Borchers (alborchers@steinerpoint.com).
26 If you have questions, problems, or suggestions for this driver
27 please contact Al Borchers at alborchers@steinerpoint.com.
32 Versions of the gadget serial driver are available for the
33 2.4 Linux kernels, but this document assumes you are using
34 version 2.0 or later of the gadget serial driver in a 2.6
37 This document assumes that you are familiar with Linux and
38 Windows and know how to configure and build Linux kernels, run
39 standard utilities, use minicom and HyperTerminal, and work with
40 USB and serial devices. It also assumes you configure the Linux
41 gadget and usb drivers as modules.
46 The gadget serial driver is a Linux USB gadget driver, a USB device
47 side driver. It runs on a Linux system that has USB device side
48 hardware; for example, a PDA, an embedded Linux system, or a PC
49 with a USB development card.
51 The gadget serial driver talks over USB to either a CDC ACM driver
52 or a generic USB serial driver running on a host PC.
55 --------------------------------------
56 | Host-Side CDC ACM USB Host |
57 | Operating | or | Controller | USB
58 | System | Generic USB | Driver |--------
59 | (Linux or | Serial | and | |
60 | Windows) Driver USB Stack | |
61 -------------------------------------- |
66 -------------------------------------- |
67 | Gadget USB Periph. | |
68 | Device-Side | Gadget | Controller | |
69 | Linux | Serial | Driver |--------
70 | Operating | Driver | and |
72 --------------------------------------
74 On the device-side Linux system, the gadget serial driver looks
77 On the host-side system, the gadget serial device looks like a
78 CDC ACM compliant class device or a simple vendor specific device
79 with bulk in and bulk out endpoints, and it is treated similarly
80 to other serial devices.
82 The host side driver can potentially be any ACM compliant driver
83 or any driver that can talk to a device with a simple bulk in/out
84 interface. Gadget serial has been tested with the Linux ACM driver,
85 the Windows usbser.sys ACM driver, and the Linux USB generic serial
88 With the gadget serial driver and the host side ACM or generic
89 serial driver running, you should be able to communicate between
90 the host and the gadget side systems as if they were connected by a
93 The gadget serial driver only provides simple unreliable data
94 communication. It does not yet handle flow control or many other
95 features of normal serial devices.
98 Installing the Gadget Serial Driver
99 -----------------------------------
100 To use the gadget serial driver you must configure the Linux gadget
101 side kernel for "Support for USB Gadgets", for a "USB Peripheral
102 Controller" (for example, net2280), and for the "Serial Gadget"
103 driver. All this are listed under "USB Gadget Support" when
104 configuring the kernel. Then rebuild and install the kernel or
107 The gadget serial driver uses major number 127, for now. So you
108 will need to create a device node for it, like this:
110 mknod /dev/ttygserial c 127 0
112 You only need to do this once.
114 Then you must load the gadget serial driver. To load it as an
117 modprobe g_serial use_acm=1
119 To load it as a vendor specific bulk in/out device, do this:
123 This will also automatically load the underlying gadget peripheral
124 controller driver. This must be done each time you reboot the gadget
125 side Linux system. You can add this to the start up scripts, if
128 If gadget serial is loaded as an ACM device you will want to use
129 either the Windows or Linux ACM driver on the host side. If gadget
130 serial is loaded as a bulk in/out device, you will want to use the
131 Linux generic serial driver on the host side. Follow the appropriate
132 instructions below to install the host side driver.
135 Installing the Windows Host ACM Driver
136 --------------------------------------
137 To use the Windows ACM driver you must have the files "gserial.inf"
138 and "usbser.sys" together in a folder on the Windows machine.
140 The "gserial.inf" file is given here.
142 -------------------- CUT HERE --------------------
144 Signature="$Windows NT$"
146 ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
148 DriverVer=08/17/2004,0.0.2.0
149 ; Copyright (C) 2004 Al Borchers (alborchers@steinerpoint.com)
152 %LINUX%=GSerialDeviceList
155 %GSERIAL%=GSerialInstall, USB\VID_0525&PID_A4A7
158 DefaultDestDir=10,System32\Drivers
161 CopyFiles=GSerialCopyFiles
168 HKR,,DevLoader,,*ntkern
169 HKR,,NTMPDriver,,usbser.sys
170 HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"
172 [GSerialInstall.Services]
173 AddService = usbser,0x0002,GSerialService
176 DisplayName = %GSERIAL_DISPLAY_NAME%
177 ServiceType = 1 ; SERVICE_KERNEL_DRIVER
178 StartType = 3 ; SERVICE_DEMAND_START
179 ErrorControl = 1 ; SERVICE_ERROR_NORMAL
180 ServiceBinary = %10%\System32\Drivers\usbser.sys
181 LoadOrderGroup = Base
185 GSERIAL = "Gadget Serial"
186 GSERIAL_DISPLAY_NAME = "USB Gadget Serial Driver"
187 -------------------- CUT HERE --------------------
189 The "usbser.sys" file comes with various versions of Windows.
190 For example, it can be found on Windows XP typically in
192 C:\WINDOWS\Driver Cache\i386\driver.cab
194 Or it can be found on the Windows 98SE CD in the "win98" folder
195 in the "DRIVER11.CAB" through "DRIVER20.CAB" cab files. You will
196 need the DOS "expand" program, the Cygwin "cabextract" program, or
197 a similar program to unpack these cab files and extract "usbser.sys".
199 For example, to extract "usbser.sys" into the current directory
200 on Windows XP, open a DOS window and run a command like
202 expand C:\WINDOWS\Driver~1\i386\driver.cab -F:usbser.sys .
204 (Thanks to Nishant Kamat for pointing out this DOS command.)
206 When the gadget serial driver is loaded and the USB device connected
207 to the Windows host with a USB cable, Windows should recognize the
208 gadget serial device and ask for a driver. Tell Windows to find the
209 driver in the folder that contains "gserial.inf" and "usbser.sys".
211 For example, on Windows XP, when the gadget serial device is first
212 plugged in, the "Found New Hardware Wizard" starts up. Select
213 "Install from a list or specific location (Advanced)", then on
214 the next screen select "Include this location in the search" and
215 enter the path or browse to the folder containing "gserial.inf" and
216 "usbser.sys". Windows will complain that the Gadget Serial driver
217 has not passed Windows Logo testing, but select "Continue anyway"
218 and finish the driver installation.
220 On Windows XP, in the "Device Manager" (under "Control Panel",
221 "System", "Hardware") expand the "Ports (COM & LPT)" entry and you
222 should see "Gadget Serial" listed as the driver for one of the COM
225 To uninstall the Windows XP driver for "Gadget Serial", right click
226 on the "Gadget Serial" entry in the "Device Manager" and select
230 Installing the Linux Host ACM Driver
231 ------------------------------------
232 To use the Linux ACM driver you must configure the Linux host side
233 kernel for "Support for Host-side USB" and for "USB Modem (CDC ACM)
236 Once the gadget serial driver is loaded and the USB device connected
237 to the Linux host with a USB cable, the host system should recognize
238 the gadget serial device. For example, the command
240 cat /proc/bus/usb/devices
242 should show something like this:
244 T: Bus=01 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#= 5 Spd=480 MxCh= 0
245 D: Ver= 2.00 Cls=02(comm.) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
246 P: Vendor=0525 ProdID=a4a7 Rev= 2.01
247 S: Manufacturer=Linux 2.6.8.1 with net2280
248 S: Product=Gadget Serial
250 C:* #Ifs= 2 Cfg#= 2 Atr=c0 MxPwr= 2mA
251 I: If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=02 Prot=01 Driver=acm
252 E: Ad=83(I) Atr=03(Int.) MxPS= 8 Ivl=32ms
253 I: If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=acm
254 E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
255 E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
257 If the host side Linux system is configured properly, the ACM driver
258 should be loaded automatically. The command "lsmod" should show the
259 "acm" module is loaded.
262 Installing the Linux Host Generic USB Serial Driver
263 ---------------------------------------------------
264 To use the Linux generic USB serial driver you must configure the
265 Linux host side kernel for "Support for Host-side USB", for "USB
266 Serial Converter support", and for the "USB Generic Serial Driver".
268 Once the gadget serial driver is loaded and the USB device connected
269 to the Linux host with a USB cable, the host system should recognize
270 the gadget serial device. For example, the command
272 cat /proc/bus/usb/devices
274 should show something like this:
276 T: Bus=01 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#= 6 Spd=480 MxCh= 0
277 D: Ver= 2.00 Cls=ff(vend.) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
278 P: Vendor=0525 ProdID=a4a6 Rev= 2.01
279 S: Manufacturer=Linux 2.6.8.1 with net2280
280 S: Product=Gadget Serial
282 C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr= 2mA
283 I: If#= 0 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=serial
284 E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
285 E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
287 You must explicitly load the usbserial driver with parameters to
288 configure it to recognize the gadget serial device, like this:
290 modprobe usbserial vendor=0x0525 product=0xA4A6
292 If everything is working, usbserial will print a message in the
293 system log saying something like "Gadget Serial converter now
294 attached to ttyUSB0".
297 Testing with Minicom or HyperTerminal
298 -------------------------------------
299 Once the gadget serial driver and the host driver are both installed,
300 and a USB cable connects the gadget device to the host, you should
301 be able to communicate over USB between the gadget and host systems.
302 You can use minicom or HyperTerminal to try this out.
304 On the gadget side run "minicom -s" to configure a new minicom
305 session. Under "Serial port setup" set "/dev/ttygserial" as the
306 "Serial Device". Set baud rate, data bits, parity, and stop bits,
307 to 9600, 8, none, and 1--these settings mostly do not matter.
308 Under "Modem and dialing" erase all the modem and dialing strings.
310 On a Linux host running the ACM driver, configure minicom similarly
311 but use "/dev/ttyACM0" as the "Serial Device". (If you have other
312 ACM devices connected, change the device name appropriately.)
314 On a Linux host running the USB generic serial driver, configure
315 minicom similarly, but use "/dev/ttyUSB0" as the "Serial Device".
316 (If you have other USB serial devices connected, change the device
319 On a Windows host configure a new HyperTerminal session to use the
320 COM port assigned to Gadget Serial. The "Port Settings" will be
321 set automatically when HyperTerminal connects to the gadget serial
322 device, so you can leave them set to the default values--these
323 settings mostly do not matter.
325 With minicom configured and running on the gadget side and with
326 minicom or HyperTerminal configured and running on the host side,
327 you should be able to send data back and forth between the gadget
328 side and host side systems. Anything you type on the terminal
329 window on the gadget side should appear in the terminal window on
330 the host side and vice versa.