| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 |  | 
 | 2 |                  Linux Gadget Serial Driver v2.0 | 
 | 3 |                            11/20/2004 | 
| David Brownell | a7707ad | 2008-06-19 17:52:07 -0700 | [diff] [blame] | 4 |                   (updated 8-May-2008 for v2.3) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 5 |  | 
 | 6 |  | 
 | 7 | License and Disclaimer | 
 | 8 | ---------------------- | 
 | 9 | This program is free software; you can redistribute it and/or | 
 | 10 | modify it under the terms of the GNU General Public License as | 
 | 11 | published by the Free Software Foundation; either version 2 of | 
 | 12 | the License, or (at your option) any later version. | 
 | 13 |  | 
 | 14 | This program is distributed in the hope that it will be useful, | 
 | 15 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 | 16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 | 17 | GNU General Public License for more details. | 
 | 18 |  | 
 | 19 | You should have received a copy of the GNU General Public | 
 | 20 | License along with this program; if not, write to the Free | 
 | 21 | Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, | 
 | 22 | MA 02111-1307 USA. | 
 | 23 |  | 
| Tobias Klauser | d533f67 | 2005-09-10 00:26:46 -0700 | [diff] [blame] | 24 | This document and the gadget serial driver itself are | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 25 | Copyright (C) 2004 by Al Borchers (alborchers@steinerpoint.com). | 
 | 26 |  | 
 | 27 | If you have questions, problems, or suggestions for this driver | 
 | 28 | please contact Al Borchers at alborchers@steinerpoint.com. | 
 | 29 |  | 
 | 30 |  | 
 | 31 | Prerequisites | 
 | 32 | ------------- | 
 | 33 | Versions of the gadget serial driver are available for the | 
 | 34 | 2.4 Linux kernels, but this document assumes you are using | 
| David Brownell | a7707ad | 2008-06-19 17:52:07 -0700 | [diff] [blame] | 35 | version 2.3 or later of the gadget serial driver in a 2.6 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 36 | Linux kernel. | 
 | 37 |  | 
 | 38 | This document assumes that you are familiar with Linux and | 
 | 39 | Windows and know how to configure and build Linux kernels, run | 
 | 40 | standard utilities, use minicom and HyperTerminal, and work with | 
 | 41 | USB and serial devices.  It also assumes you configure the Linux | 
 | 42 | gadget and usb drivers as modules. | 
 | 43 |  | 
| David Brownell | a7707ad | 2008-06-19 17:52:07 -0700 | [diff] [blame] | 44 | With version 2.3 of the driver, major and minor device nodes are | 
 | 45 | no longer statically defined.  Your Linux based system should mount | 
 | 46 | sysfs in /sys, and use "mdev" (in Busybox) or "udev" to make the | 
 | 47 | /dev nodes matching the sysfs /sys/class/tty files. | 
 | 48 |  | 
 | 49 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 50 |  | 
 | 51 | Overview | 
 | 52 | -------- | 
 | 53 | The gadget serial driver is a Linux USB gadget driver, a USB device | 
 | 54 | side driver.  It runs on a Linux system that has USB device side | 
 | 55 | hardware; for example, a PDA, an embedded Linux system, or a PC | 
 | 56 | with a USB development card. | 
 | 57 |  | 
 | 58 | The gadget serial driver talks over USB to either a CDC ACM driver | 
 | 59 | or 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 |  | 
 | 81 | On the device-side Linux system, the gadget serial driver looks | 
 | 82 | like a serial device. | 
 | 83 |  | 
 | 84 | On the host-side system, the gadget serial device looks like a | 
 | 85 | CDC ACM compliant class device or a simple vendor specific device | 
 | 86 | with bulk in and bulk out endpoints, and it is treated similarly | 
 | 87 | to other serial devices. | 
 | 88 |  | 
 | 89 | The host side driver can potentially be any ACM compliant driver | 
 | 90 | or any driver that can talk to a device with a simple bulk in/out | 
 | 91 | interface.  Gadget serial has been tested with the Linux ACM driver, | 
 | 92 | the Windows usbser.sys ACM driver, and the Linux USB generic serial | 
 | 93 | driver. | 
 | 94 |  | 
 | 95 | With the gadget serial driver and the host side ACM or generic | 
 | 96 | serial driver running, you should be able to communicate between | 
 | 97 | the host and the gadget side systems as if they were connected by a | 
 | 98 | serial cable. | 
 | 99 |  | 
 | 100 | The gadget serial driver only provides simple unreliable data | 
 | 101 | communication.  It does not yet handle flow control or many other | 
 | 102 | features of normal serial devices. | 
 | 103 |  | 
 | 104 |  | 
 | 105 | Installing the Gadget Serial Driver | 
 | 106 | ----------------------------------- | 
 | 107 | To use the gadget serial driver you must configure the Linux gadget | 
 | 108 | side kernel for "Support for USB Gadgets", for a "USB Peripheral | 
 | 109 | Controller" (for example, net2280), and for the "Serial Gadget" | 
 | 110 | driver.  All this are listed under "USB Gadget Support" when | 
 | 111 | configuring the kernel.  Then rebuild and install the kernel or | 
 | 112 | modules. | 
 | 113 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 114 | Then you must load the gadget serial driver.  To load it as an | 
| David Brownell | a7707ad | 2008-06-19 17:52:07 -0700 | [diff] [blame] | 115 | ACM device (recommended for interoperability), do this: | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 116 |  | 
| Peter Korsgaard | c33ba39 | 2008-12-04 16:30:53 +0100 | [diff] [blame] | 117 |   modprobe g_serial | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 118 |  | 
 | 119 | To load it as a vendor specific bulk in/out device, do this: | 
 | 120 |  | 
| Peter Korsgaard | c33ba39 | 2008-12-04 16:30:53 +0100 | [diff] [blame] | 121 |   modprobe g_serial use_acm=0 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 122 |  | 
 | 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 | 
 | 126 | desired. | 
 | 127 |  | 
| David Brownell | a7707ad | 2008-06-19 17:52:07 -0700 | [diff] [blame] | 128 | Your system should use mdev (from busybox) or udev to make the | 
 | 129 | device nodes.  After this gadget driver has been set up you should | 
 | 130 | then 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 |  | 
 | 136 | Note that the major number (253, above) is system-specific.  If | 
 | 137 | you need to create /dev nodes by hand, the right numbers to use | 
 | 138 | will be in the /sys/class/tty/ttyGS0/dev file. | 
 | 139 |  | 
 | 140 | When you link this gadget driver early, perhaps even statically, | 
 | 141 | you may want to set up an /etc/inittab entry to run "getty" on it. | 
 | 142 | The /dev/ttyGS0 line should work like most any other serial port. | 
 | 143 |  | 
 | 144 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 145 | If gadget serial is loaded as an ACM device you will want to use | 
 | 146 | either the Windows or Linux ACM driver on the host side.  If gadget | 
 | 147 | serial is loaded as a bulk in/out device, you will want to use the | 
 | 148 | Linux generic serial driver on the host side.  Follow the appropriate | 
 | 149 | instructions below to install the host side driver. | 
 | 150 |  | 
 | 151 |  | 
 | 152 | Installing the Windows Host ACM Driver | 
 | 153 | -------------------------------------- | 
| Michal Nazarewicz | e41e134 | 2010-06-21 13:57:06 +0200 | [diff] [blame] | 154 | To use the Windows ACM driver you must have the "linux-cdc-acm.inf" | 
 | 155 | file (provided along this document) which supports all recent versions | 
 | 156 | of Windows. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 157 |  | 
 | 158 | When the gadget serial driver is loaded and the USB device connected | 
 | 159 | to the Windows host with a USB cable, Windows should recognize the | 
 | 160 | gadget serial device and ask for a driver.  Tell Windows to find the | 
| Michal Nazarewicz | e41e134 | 2010-06-21 13:57:06 +0200 | [diff] [blame] | 161 | driver in the folder that contains the "linux-cdc-acm.inf" file. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 162 |  | 
 | 163 | For example, on Windows XP, when the gadget serial device is first | 
 | 164 | plugged in, the "Found New Hardware Wizard" starts up.  Select | 
| Michal Nazarewicz | e41e134 | 2010-06-21 13:57:06 +0200 | [diff] [blame] | 165 | "Install from a list or specific location (Advanced)", then on the | 
 | 166 | next screen select "Include this location in the search" and enter the | 
 | 167 | path or browse to the folder containing the "linux-cdc-acm.inf" file. | 
 | 168 | Windows will complain that the Gadget Serial driver has not passed | 
 | 169 | Windows Logo testing, but select "Continue anyway" and finish the | 
 | 170 | driver installation. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 171 |  | 
 | 172 | On Windows XP, in the "Device Manager" (under "Control Panel", | 
 | 173 | "System", "Hardware") expand the "Ports (COM & LPT)" entry and you | 
 | 174 | should see "Gadget Serial" listed as the driver for one of the COM | 
 | 175 | ports. | 
 | 176 |  | 
 | 177 | To uninstall the Windows XP driver for "Gadget Serial", right click | 
 | 178 | on the "Gadget Serial" entry in the "Device Manager" and select | 
 | 179 | "Uninstall". | 
 | 180 |  | 
 | 181 |  | 
 | 182 | Installing the Linux Host ACM Driver | 
 | 183 | ------------------------------------ | 
 | 184 | To use the Linux ACM driver you must configure the Linux host side | 
 | 185 | kernel for "Support for Host-side USB" and for "USB Modem (CDC ACM) | 
 | 186 | support". | 
 | 187 |  | 
 | 188 | Once the gadget serial driver is loaded and the USB device connected | 
 | 189 | to the Linux host with a USB cable, the host system should recognize | 
 | 190 | the gadget serial device.  For example, the command | 
 | 191 |  | 
 | 192 |   cat /proc/bus/usb/devices | 
 | 193 |  | 
 | 194 | should show something like this: | 
 | 195 |  | 
 | 196 | T:  Bus=01 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#=  5 Spd=480 MxCh= 0 | 
 | 197 | D:  Ver= 2.00 Cls=02(comm.) Sub=00 Prot=00 MxPS=64 #Cfgs=  1 | 
 | 198 | P:  Vendor=0525 ProdID=a4a7 Rev= 2.01 | 
 | 199 | S:  Manufacturer=Linux 2.6.8.1 with net2280 | 
 | 200 | S:  Product=Gadget Serial | 
 | 201 | S:  SerialNumber=0 | 
 | 202 | C:* #Ifs= 2 Cfg#= 2 Atr=c0 MxPwr=  2mA | 
 | 203 | I:  If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=02 Prot=01 Driver=acm | 
 | 204 | E:  Ad=83(I) Atr=03(Int.) MxPS=   8 Ivl=32ms | 
 | 205 | I:  If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=acm | 
 | 206 | E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms | 
 | 207 | E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms | 
 | 208 |  | 
 | 209 | If the host side Linux system is configured properly, the ACM driver | 
 | 210 | should be loaded automatically.  The command "lsmod" should show the | 
 | 211 | "acm" module is loaded. | 
 | 212 |  | 
 | 213 |  | 
 | 214 | Installing the Linux Host Generic USB Serial Driver | 
 | 215 | --------------------------------------------------- | 
 | 216 | To use the Linux generic USB serial driver you must configure the | 
 | 217 | Linux host side kernel for "Support for Host-side USB", for "USB | 
 | 218 | Serial Converter support", and for the "USB Generic Serial Driver". | 
 | 219 |  | 
 | 220 | Once the gadget serial driver is loaded and the USB device connected | 
 | 221 | to the Linux host with a USB cable, the host system should recognize | 
 | 222 | the gadget serial device.  For example, the command | 
 | 223 |  | 
 | 224 |   cat /proc/bus/usb/devices | 
 | 225 |  | 
 | 226 | should show something like this: | 
 | 227 |  | 
 | 228 | T:  Bus=01 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#=  6 Spd=480 MxCh= 0 | 
 | 229 | D:  Ver= 2.00 Cls=ff(vend.) Sub=00 Prot=00 MxPS=64 #Cfgs=  1 | 
 | 230 | P:  Vendor=0525 ProdID=a4a6 Rev= 2.01 | 
 | 231 | S:  Manufacturer=Linux 2.6.8.1 with net2280 | 
 | 232 | S:  Product=Gadget Serial | 
 | 233 | S:  SerialNumber=0 | 
 | 234 | C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=  2mA | 
 | 235 | I:  If#= 0 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=serial | 
 | 236 | E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms | 
 | 237 | E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms | 
 | 238 |  | 
 | 239 | You must explicitly load the usbserial driver with parameters to | 
 | 240 | configure it to recognize the gadget serial device, like this: | 
 | 241 |  | 
 | 242 |   modprobe usbserial vendor=0x0525 product=0xA4A6 | 
 | 243 |  | 
 | 244 | If everything is working, usbserial will print a message in the | 
 | 245 | system log saying something like "Gadget Serial converter now | 
 | 246 | attached to ttyUSB0". | 
 | 247 |  | 
 | 248 |  | 
 | 249 | Testing with Minicom or HyperTerminal | 
 | 250 | ------------------------------------- | 
 | 251 | Once the gadget serial driver and the host driver are both installed, | 
 | 252 | and a USB cable connects the gadget device to the host, you should | 
 | 253 | be able to communicate over USB between the gadget and host systems. | 
 | 254 | You can use minicom or HyperTerminal to try this out. | 
 | 255 |  | 
 | 256 | On the gadget side run "minicom -s" to configure a new minicom | 
 | 257 | session.  Under "Serial port setup" set "/dev/ttygserial" as the | 
 | 258 | "Serial Device".  Set baud rate, data bits, parity, and stop bits, | 
 | 259 | to 9600, 8, none, and 1--these settings mostly do not matter. | 
 | 260 | Under "Modem and dialing" erase all the modem and dialing strings. | 
 | 261 |  | 
 | 262 | On a Linux host running the ACM driver, configure minicom similarly | 
 | 263 | but use "/dev/ttyACM0" as the "Serial Device".  (If you have other | 
 | 264 | ACM devices connected, change the device name appropriately.) | 
 | 265 |  | 
 | 266 | On a Linux host running the USB generic serial driver, configure | 
 | 267 | minicom similarly, but use "/dev/ttyUSB0" as the "Serial Device". | 
 | 268 | (If you have other USB serial devices connected, change the device | 
 | 269 | name appropriately.) | 
 | 270 |  | 
 | 271 | On a Windows host configure a new HyperTerminal session to use the | 
 | 272 | COM port assigned to Gadget Serial.  The "Port Settings" will be | 
 | 273 | set automatically when HyperTerminal connects to the gadget serial | 
 | 274 | device, so you can leave them set to the default values--these | 
 | 275 | settings mostly do not matter. | 
 | 276 |  | 
 | 277 | With minicom configured and running on the gadget side and with | 
 | 278 | minicom or HyperTerminal configured and running on the host side, | 
 | 279 | you should be able to send data back and forth between the gadget | 
 | 280 | side and host side systems.  Anything you type on the terminal | 
 | 281 | window on the gadget side should appear in the terminal window on | 
 | 282 | the host side and vice versa. |