About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Documentation / usb / gadget_serial.txt


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.
Hide Line Numbers


About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog