Based on kernel version 4.16.1. Page generated on 2018-04-09 11:53 EST.
1 2 Linux Gadget Serial Driver v2.0 3 11/20/2004 4 (updated 8-May-2008 for v2.3) 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 24 This document and the gadget serial driver itself are 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 35 version 2.3 or later of the gadget serial driver in a 2.6 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 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 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 114 Then you must load the gadget serial driver. To load it as an 115 ACM device (recommended for interoperability), do this: 116 117 modprobe g_serial 118 119 To load it as a vendor specific bulk in/out device, do this: 120 121 modprobe g_serial use_acm=0 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 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 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 -------------------------------------- 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. 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 161 driver in the folder that contains the "linux-cdc-acm.inf" file. 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 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. 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 /sys/kernel/debug/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 /sys/kernel/debug/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 load the usbserial driver and explicitly set its parameters 240 to configure it to recognize the gadget serial device, like this: 241 242 echo 0x0525 0xA4A6 >/sys/bus/usb-serial/drivers/generic/new_id 243 244 The legacy way is to use module parameters: 245 246 modprobe usbserial vendor=0x0525 product=0xA4A6 247 248 If everything is working, usbserial will print a message in the 249 system log saying something like "Gadget Serial converter now 250 attached to ttyUSB0". 251 252 253 Testing with Minicom or HyperTerminal 254 ------------------------------------- 255 Once the gadget serial driver and the host driver are both installed, 256 and a USB cable connects the gadget device to the host, you should 257 be able to communicate over USB between the gadget and host systems. 258 You can use minicom or HyperTerminal to try this out. 259 260 On the gadget side run "minicom -s" to configure a new minicom 261 session. Under "Serial port setup" set "/dev/ttygserial" as the 262 "Serial Device". Set baud rate, data bits, parity, and stop bits, 263 to 9600, 8, none, and 1--these settings mostly do not matter. 264 Under "Modem and dialing" erase all the modem and dialing strings. 265 266 On a Linux host running the ACM driver, configure minicom similarly 267 but use "/dev/ttyACM0" as the "Serial Device". (If you have other 268 ACM devices connected, change the device name appropriately.) 269 270 On a Linux host running the USB generic serial driver, configure 271 minicom similarly, but use "/dev/ttyUSB0" as the "Serial Device". 272 (If you have other USB serial devices connected, change the device 273 name appropriately.) 274 275 On a Windows host configure a new HyperTerminal session to use the 276 COM port assigned to Gadget Serial. The "Port Settings" will be 277 set automatically when HyperTerminal connects to the gadget serial 278 device, so you can leave them set to the default values--these 279 settings mostly do not matter. 280 281 With minicom configured and running on the gadget side and with 282 minicom or HyperTerminal configured and running on the host side, 283 you should be able to send data back and forth between the gadget 284 side and host side systems. Anything you type on the terminal 285 window on the gadget side should appear in the terminal window on 286 the host side and vice versa.