linux/Documentation/usb/gadget_serial.txt
<<
>>
Prefs
   1
   2                 Linux Gadget Serial Driver v2.0
   3                           11/20/2004
   4                  (updated 8-May-2008 for v2.3)
   5
   6
   7License and Disclaimer
   8----------------------
   9This program is free software; you can redistribute it and/or
  10modify it under the terms of the GNU General Public License as
  11published by the Free Software Foundation; either version 2 of
  12the License, or (at your option) any later version.
  13
  14This program is distributed in the hope that it will be useful,
  15but WITHOUT ANY WARRANTY; without even the implied warranty of
  16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17GNU General Public License for more details.
  18
  19You should have received a copy of the GNU General Public
  20License along with this program; if not, write to the Free
  21Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  22MA 02111-1307 USA.
  23
  24This document and the gadget serial driver itself are
  25Copyright (C) 2004 by Al Borchers (alborchers@steinerpoint.com).
  26
  27If you have questions, problems, or suggestions for this driver
  28please contact Al Borchers at alborchers@steinerpoint.com.
  29
  30
  31Prerequisites
  32-------------
  33Versions of the gadget serial driver are available for the
  342.4 Linux kernels, but this document assumes you are using
  35version 2.3 or later of the gadget serial driver in a 2.6
  36Linux kernel.
  37
  38This document assumes that you are familiar with Linux and
  39Windows and know how to configure and build Linux kernels, run
  40standard utilities, use minicom and HyperTerminal, and work with
  41USB and serial devices.  It also assumes you configure the Linux
  42gadget and usb drivers as modules.
  43
  44With version 2.3 of the driver, major and minor device nodes are
  45no longer statically defined.  Your Linux based system should mount
  46sysfs in /sys, and use "mdev" (in Busybox) or "udev" to make the
  47/dev nodes matching the sysfs /sys/class/tty files.
  48
  49
  50
  51Overview
  52--------
  53The gadget serial driver is a Linux USB gadget driver, a USB device
  54side driver.  It runs on a Linux system that has USB device side
  55hardware; for example, a PDA, an embedded Linux system, or a PC
  56with a USB development card.
  57
  58The gadget serial driver talks over USB to either a CDC ACM driver
  59or a generic USB serial driver running on a host PC.
  60
  61   Host
  62   --------------------------------------
  63  | Host-Side   CDC ACM       USB Host   |
  64  | Operating |   or        | Controller |   USB
  65  | System    | Generic USB | Driver     |--------
  66  | (Linux or | Serial      | and        |        |
  67  | Windows)    Driver        USB Stack  |        |
  68   --------------------------------------         |
  69                                                  |
  70                                                  |
  71                                                  |
  72   Gadget                                         |
  73   --------------------------------------         |
  74  | Gadget                   USB Periph. |        |
  75  | Device-Side |  Gadget  | Controller  |        |
  76  | Linux       |  Serial  | Driver      |--------
  77  | Operating   |  Driver  | and         |
  78  | System                   USB Stack   |
  79   --------------------------------------
  80
  81On the device-side Linux system, the gadget serial driver looks
  82like a serial device.
  83
  84On the host-side system, the gadget serial device looks like a
  85CDC ACM compliant class device or a simple vendor specific device
  86with bulk in and bulk out endpoints, and it is treated similarly
  87to other serial devices.
  88
  89The host side driver can potentially be any ACM compliant driver
  90or any driver that can talk to a device with a simple bulk in/out
  91interface.  Gadget serial has been tested with the Linux ACM driver,
  92the Windows usbser.sys ACM driver, and the Linux USB generic serial
  93driver.
  94
  95With the gadget serial driver and the host side ACM or generic
  96serial driver running, you should be able to communicate between
  97the host and the gadget side systems as if they were connected by a
  98serial cable.
  99
 100The gadget serial driver only provides simple unreliable data
 101communication.  It does not yet handle flow control or many other
 102features of normal serial devices.
 103
 104
 105Installing the Gadget Serial Driver
 106-----------------------------------
 107To use the gadget serial driver you must configure the Linux gadget
 108side kernel for "Support for USB Gadgets", for a "USB Peripheral
 109Controller" (for example, net2280), and for the "Serial Gadget"
 110driver.  All this are listed under "USB Gadget Support" when
 111configuring the kernel.  Then rebuild and install the kernel or
 112modules.
 113
 114Then you must load the gadget serial driver.  To load it as an
 115ACM device (recommended for interoperability), do this:
 116
 117  modprobe g_serial
 118
 119To load it as a vendor specific bulk in/out device, do this:
 120
 121  modprobe g_serial use_acm=0
 122
 123This will also automatically load the underlying gadget peripheral
 124controller driver.  This must be done each time you reboot the gadget
 125side Linux system.  You can add this to the start up scripts, if
 126desired.
 127
 128Your system should use mdev (from busybox) or udev to make the
 129device nodes.  After this gadget driver has been set up you should
 130then see a /dev/ttyGS0 node:
 131
 132  # ls -l /dev/ttyGS0 | cat
 133  crw-rw----    1 root     root     253,   0 May  8 14:10 /dev/ttyGS0
 134  #
 135
 136Note that the major number (253, above) is system-specific.  If
 137you need to create /dev nodes by hand, the right numbers to use
 138will be in the /sys/class/tty/ttyGS0/dev file.
 139
 140When you link this gadget driver early, perhaps even statically,
 141you may want to set up an /etc/inittab entry to run "getty" on it.
 142The /dev/ttyGS0 line should work like most any other serial port.
 143
 144
 145If gadget serial is loaded as an ACM device you will want to use
 146either the Windows or Linux ACM driver on the host side.  If gadget
 147serial is loaded as a bulk in/out device, you will want to use the
 148Linux generic serial driver on the host side.  Follow the appropriate
 149instructions below to install the host side driver.
 150
 151
 152Installing the Windows Host ACM Driver
 153--------------------------------------
 154To use the Windows ACM driver you must have the files "gserial.inf"
 155and "usbser.sys" together in a folder on the Windows machine.
 156
 157The "gserial.inf" file is given here.
 158
 159-------------------- CUT HERE --------------------
 160[Version]
 161Signature="$Windows NT$"
 162Class=Ports
 163ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
 164Provider=%LINUX%
 165DriverVer=08/17/2004,0.0.2.0
 166; Copyright (C) 2004 Al Borchers (alborchers@steinerpoint.com)
 167
 168[Manufacturer]
 169%LINUX%=GSerialDeviceList
 170
 171[GSerialDeviceList]
 172%GSERIAL%=GSerialInstall, USB\VID_0525&PID_A4A7
 173
 174[DestinationDirs]
 175DefaultDestDir=10,System32\Drivers
 176
 177[GSerialInstall]
 178CopyFiles=GSerialCopyFiles
 179AddReg=GSerialAddReg
 180
 181[GSerialCopyFiles]
 182usbser.sys
 183
 184[GSerialAddReg]
 185HKR,,DevLoader,,*ntkern
 186HKR,,NTMPDriver,,usbser.sys
 187HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"
 188
 189[GSerialInstall.Services]
 190AddService = usbser,0x0002,GSerialService
 191
 192[GSerialService]
 193DisplayName = %GSERIAL_DISPLAY_NAME%
 194ServiceType = 1                  ; SERVICE_KERNEL_DRIVER
 195StartType = 3                    ; SERVICE_DEMAND_START
 196ErrorControl = 1                 ; SERVICE_ERROR_NORMAL
 197ServiceBinary = %10%\System32\Drivers\usbser.sys
 198LoadOrderGroup = Base
 199
 200[Strings]
 201LINUX = "Linux"
 202GSERIAL = "Gadget Serial"
 203GSERIAL_DISPLAY_NAME = "USB Gadget Serial Driver"
 204-------------------- CUT HERE --------------------
 205
 206The "usbser.sys" file comes with various versions of Windows.
 207For example, it can be found on Windows XP typically in
 208
 209  C:\WINDOWS\Driver Cache\i386\driver.cab
 210
 211Or it can be found on the Windows 98SE CD in the "win98" folder
 212in the "DRIVER11.CAB" through "DRIVER20.CAB" cab files.  You will
 213need the DOS "expand" program, the Cygwin "cabextract" program, or
 214a similar program to unpack these cab files and extract "usbser.sys".
 215
 216For example, to extract "usbser.sys" into the current directory
 217on Windows XP, open a DOS window and run a command like
 218
 219  expand C:\WINDOWS\Driver~1\i386\driver.cab -F:usbser.sys .
 220
 221(Thanks to Nishant Kamat for pointing out this DOS command.)
 222
 223When the gadget serial driver is loaded and the USB device connected
 224to the Windows host with a USB cable, Windows should recognize the
 225gadget serial device and ask for a driver.  Tell Windows to find the
 226driver in the folder that contains "gserial.inf" and "usbser.sys".
 227
 228For example, on Windows XP, when the gadget serial device is first
 229plugged in, the "Found New Hardware Wizard" starts up.  Select
 230"Install from a list or specific location (Advanced)", then on
 231the next screen select "Include this location in the search" and
 232enter the path or browse to the folder containing "gserial.inf" and
 233"usbser.sys".  Windows will complain that the Gadget Serial driver
 234has not passed Windows Logo testing, but select "Continue anyway"
 235and finish the driver installation.
 236
 237On Windows XP, in the "Device Manager" (under "Control Panel",
 238"System", "Hardware") expand the "Ports (COM & LPT)" entry and you
 239should see "Gadget Serial" listed as the driver for one of the COM
 240ports.
 241
 242To uninstall the Windows XP driver for "Gadget Serial", right click
 243on the "Gadget Serial" entry in the "Device Manager" and select
 244"Uninstall".
 245
 246
 247Installing the Linux Host ACM Driver
 248------------------------------------
 249To use the Linux ACM driver you must configure the Linux host side
 250kernel for "Support for Host-side USB" and for "USB Modem (CDC ACM)
 251support".
 252
 253Once the gadget serial driver is loaded and the USB device connected
 254to the Linux host with a USB cable, the host system should recognize
 255the gadget serial device.  For example, the command
 256
 257  cat /proc/bus/usb/devices
 258
 259should show something like this:
 260
 261T:  Bus=01 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#=  5 Spd=480 MxCh= 0
 262D:  Ver= 2.00 Cls=02(comm.) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
 263P:  Vendor=0525 ProdID=a4a7 Rev= 2.01
 264S:  Manufacturer=Linux 2.6.8.1 with net2280
 265S:  Product=Gadget Serial
 266S:  SerialNumber=0
 267C:* #Ifs= 2 Cfg#= 2 Atr=c0 MxPwr=  2mA
 268I:  If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=02 Prot=01 Driver=acm
 269E:  Ad=83(I) Atr=03(Int.) MxPS=   8 Ivl=32ms
 270I:  If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=acm
 271E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
 272E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
 273
 274If the host side Linux system is configured properly, the ACM driver
 275should be loaded automatically.  The command "lsmod" should show the
 276"acm" module is loaded.
 277
 278
 279Installing the Linux Host Generic USB Serial Driver
 280---------------------------------------------------
 281To use the Linux generic USB serial driver you must configure the
 282Linux host side kernel for "Support for Host-side USB", for "USB
 283Serial Converter support", and for the "USB Generic Serial Driver".
 284
 285Once the gadget serial driver is loaded and the USB device connected
 286to the Linux host with a USB cable, the host system should recognize
 287the gadget serial device.  For example, the command
 288
 289  cat /proc/bus/usb/devices
 290
 291should show something like this:
 292
 293T:  Bus=01 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#=  6 Spd=480 MxCh= 0
 294D:  Ver= 2.00 Cls=ff(vend.) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
 295P:  Vendor=0525 ProdID=a4a6 Rev= 2.01
 296S:  Manufacturer=Linux 2.6.8.1 with net2280
 297S:  Product=Gadget Serial
 298S:  SerialNumber=0
 299C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=  2mA
 300I:  If#= 0 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=serial
 301E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
 302E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
 303
 304You must explicitly load the usbserial driver with parameters to
 305configure it to recognize the gadget serial device, like this:
 306
 307  modprobe usbserial vendor=0x0525 product=0xA4A6
 308
 309If everything is working, usbserial will print a message in the
 310system log saying something like "Gadget Serial converter now
 311attached to ttyUSB0".
 312
 313
 314Testing with Minicom or HyperTerminal
 315-------------------------------------
 316Once the gadget serial driver and the host driver are both installed,
 317and a USB cable connects the gadget device to the host, you should
 318be able to communicate over USB between the gadget and host systems.
 319You can use minicom or HyperTerminal to try this out.
 320
 321On the gadget side run "minicom -s" to configure a new minicom
 322session.  Under "Serial port setup" set "/dev/ttygserial" as the
 323"Serial Device".  Set baud rate, data bits, parity, and stop bits,
 324to 9600, 8, none, and 1--these settings mostly do not matter.
 325Under "Modem and dialing" erase all the modem and dialing strings.
 326
 327On a Linux host running the ACM driver, configure minicom similarly
 328but use "/dev/ttyACM0" as the "Serial Device".  (If you have other
 329ACM devices connected, change the device name appropriately.)
 330
 331On a Linux host running the USB generic serial driver, configure
 332minicom similarly, but use "/dev/ttyUSB0" as the "Serial Device".
 333(If you have other USB serial devices connected, change the device
 334name appropriately.)
 335
 336On a Windows host configure a new HyperTerminal session to use the
 337COM port assigned to Gadget Serial.  The "Port Settings" will be
 338set automatically when HyperTerminal connects to the gadget serial
 339device, so you can leave them set to the default values--these
 340settings mostly do not matter.
 341
 342With minicom configured and running on the gadget side and with
 343minicom or HyperTerminal configured and running on the host side,
 344you should be able to send data back and forth between the gadget
 345side and host side systems.  Anything you type on the terminal
 346window on the gadget side should appear in the terminal window on
 347the host side and vice versa.
 348
 349
 350
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.