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 "linux-cdc-acm.inf" 155file (provided along this document) which supports all recent versions 156of Windows. 157 158When the gadget serial driver is loaded and the USB device connected 159to the Windows host with a USB cable, Windows should recognize the 160gadget serial device and ask for a driver. Tell Windows to find the 161driver in the folder that contains the "linux-cdc-acm.inf" file. 162 163For example, on Windows XP, when the gadget serial device is first 164plugged in, the "Found New Hardware Wizard" starts up. Select 165"Install from a list or specific location (Advanced)", then on the 166next screen select "Include this location in the search" and enter the 167path or browse to the folder containing the "linux-cdc-acm.inf" file. 168Windows will complain that the Gadget Serial driver has not passed 169Windows Logo testing, but select "Continue anyway" and finish the 170driver installation. 171 172On Windows XP, in the "Device Manager" (under "Control Panel", 173"System", "Hardware") expand the "Ports (COM & LPT)" entry and you 174should see "Gadget Serial" listed as the driver for one of the COM 175ports. 176 177To uninstall the Windows XP driver for "Gadget Serial", right click 178on the "Gadget Serial" entry in the "Device Manager" and select 179"Uninstall". 180 181 182Installing the Linux Host ACM Driver 183------------------------------------ 184To use the Linux ACM driver you must configure the Linux host side 185kernel for "Support for Host-side USB" and for "USB Modem (CDC ACM) 186support". 187 188Once the gadget serial driver is loaded and the USB device connected 189to the Linux host with a USB cable, the host system should recognize 190the gadget serial device. For example, the command 191 192 cat /proc/bus/usb/devices 193 194should show something like this: 195 196T: Bus=01 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#= 5 Spd=480 MxCh= 0 197D: Ver= 2.00 Cls=02(comm.) Sub=00 Prot=00 MxPS=64 #Cfgs= 1 198P: Vendor=0525 ProdID=a4a7 Rev= 2.01 199S: Manufacturer=Linux 2.6.8.1 with net2280 200S: Product=Gadget Serial 201S: SerialNumber=0 202C:* #Ifs= 2 Cfg#= 2 Atr=c0 MxPwr= 2mA 203I: If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=02 Prot=01 Driver=acm 204E: Ad=83(I) Atr=03(Int.) MxPS= 8 Ivl=32ms 205I: If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=acm 206E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms 207E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms 208 209If the host side Linux system is configured properly, the ACM driver 210should be loaded automatically. The command "lsmod" should show the 211"acm" module is loaded. 212 213 214Installing the Linux Host Generic USB Serial Driver 215--------------------------------------------------- 216To use the Linux generic USB serial driver you must configure the 217Linux host side kernel for "Support for Host-side USB", for "USB 218Serial Converter support", and for the "USB Generic Serial Driver". 219 220Once the gadget serial driver is loaded and the USB device connected 221to the Linux host with a USB cable, the host system should recognize 222the gadget serial device. For example, the command 223 224 cat /proc/bus/usb/devices 225 226should show something like this: 227 228T: Bus=01 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#= 6 Spd=480 MxCh= 0 229D: Ver= 2.00 Cls=ff(vend.) Sub=00 Prot=00 MxPS=64 #Cfgs= 1 230P: Vendor=0525 ProdID=a4a6 Rev= 2.01 231S: Manufacturer=Linux 2.6.8.1 with net2280 232S: Product=Gadget Serial 233S: SerialNumber=0 234C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr= 2mA 235I: If#= 0 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=serial 236E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms 237E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms 238 239You must explicitly load the usbserial driver with parameters to 240configure it to recognize the gadget serial device, like this: 241 242 modprobe usbserial vendor=0x0525 product=0xA4A6 243 244If everything is working, usbserial will print a message in the 245system log saying something like "Gadget Serial converter now 246attached to ttyUSB0". 247 248 249Testing with Minicom or HyperTerminal 250------------------------------------- 251Once the gadget serial driver and the host driver are both installed, 252and a USB cable connects the gadget device to the host, you should 253be able to communicate over USB between the gadget and host systems. 254You can use minicom or HyperTerminal to try this out. 255 256On the gadget side run "minicom -s" to configure a new minicom 257session. Under "Serial port setup" set "/dev/ttygserial" as the 258"Serial Device". Set baud rate, data bits, parity, and stop bits, 259to 9600, 8, none, and 1--these settings mostly do not matter. 260Under "Modem and dialing" erase all the modem and dialing strings. 261 262On a Linux host running the ACM driver, configure minicom similarly 263but use "/dev/ttyACM0" as the "Serial Device". (If you have other 264ACM devices connected, change the device name appropriately.) 265 266On a Linux host running the USB generic serial driver, configure 267minicom similarly, but use "/dev/ttyUSB0" as the "Serial Device". 268(If you have other USB serial devices connected, change the device 269name appropriately.) 270 271On a Windows host configure a new HyperTerminal session to use the 272COM port assigned to Gadget Serial. The "Port Settings" will be 273set automatically when HyperTerminal connects to the gadget serial 274device, so you can leave them set to the default values--these 275settings mostly do not matter. 276 277With minicom configured and running on the gadget side and with 278minicom or HyperTerminal configured and running on the host side, 279you should be able to send data back and forth between the gadget 280side and host side systems. Anything you type on the terminal 281window on the gadget side should appear in the terminal window on 282the host side and vice versa. 283