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