]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | |
2 | Linux Gadget Serial Driver v2.0 | |
3 | 11/20/2004 | |
4 | ||
5 | ||
6 | License and Disclaimer | |
7 | ---------------------- | |
8 | This program is free software; you can redistribute it and/or | |
9 | modify it under the terms of the GNU General Public License as | |
10 | published by the Free Software Foundation; either version 2 of | |
11 | the License, or (at your option) any later version. | |
12 | ||
13 | This program is distributed in the hope that it will be useful, | |
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | GNU General Public License for more details. | |
17 | ||
18 | You should have received a copy of the GNU General Public | |
19 | License along with this program; if not, write to the Free | |
20 | Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, | |
21 | MA 02111-1307 USA. | |
22 | ||
d533f671 | 23 | This document and the gadget serial driver itself are |
1da177e4 LT |
24 | Copyright (C) 2004 by Al Borchers ([email protected]). |
25 | ||
26 | If you have questions, problems, or suggestions for this driver | |
27 | please contact Al Borchers at [email protected]. | |
28 | ||
29 | ||
30 | Prerequisites | |
31 | ------------- | |
32 | Versions of the gadget serial driver are available for the | |
33 | 2.4 Linux kernels, but this document assumes you are using | |
34 | version 2.0 or later of the gadget serial driver in a 2.6 | |
35 | Linux kernel. | |
36 | ||
37 | This document assumes that you are familiar with Linux and | |
38 | Windows and know how to configure and build Linux kernels, run | |
39 | standard utilities, use minicom and HyperTerminal, and work with | |
40 | USB and serial devices. It also assumes you configure the Linux | |
41 | gadget and usb drivers as modules. | |
42 | ||
43 | ||
44 | Overview | |
45 | -------- | |
46 | The gadget serial driver is a Linux USB gadget driver, a USB device | |
47 | side driver. It runs on a Linux system that has USB device side | |
48 | hardware; for example, a PDA, an embedded Linux system, or a PC | |
49 | with a USB development card. | |
50 | ||
51 | The gadget serial driver talks over USB to either a CDC ACM driver | |
52 | or a generic USB serial driver running on a host PC. | |
53 | ||
54 | Host | |
55 | -------------------------------------- | |
56 | | Host-Side CDC ACM USB Host | | |
57 | | Operating | or | Controller | USB | |
58 | | System | Generic USB | Driver |-------- | |
59 | | (Linux or | Serial | and | | | |
60 | | Windows) Driver USB Stack | | | |
61 | -------------------------------------- | | |
62 | | | |
63 | | | |
64 | | | |
65 | Gadget | | |
66 | -------------------------------------- | | |
67 | | Gadget USB Periph. | | | |
68 | | Device-Side | Gadget | Controller | | | |
69 | | Linux | Serial | Driver |-------- | |
70 | | Operating | Driver | and | | |
71 | | System USB Stack | | |
72 | -------------------------------------- | |
73 | ||
74 | On the device-side Linux system, the gadget serial driver looks | |
75 | like a serial device. | |
76 | ||
77 | On the host-side system, the gadget serial device looks like a | |
78 | CDC ACM compliant class device or a simple vendor specific device | |
79 | with bulk in and bulk out endpoints, and it is treated similarly | |
80 | to other serial devices. | |
81 | ||
82 | The host side driver can potentially be any ACM compliant driver | |
83 | or any driver that can talk to a device with a simple bulk in/out | |
84 | interface. Gadget serial has been tested with the Linux ACM driver, | |
85 | the Windows usbser.sys ACM driver, and the Linux USB generic serial | |
86 | driver. | |
87 | ||
88 | With the gadget serial driver and the host side ACM or generic | |
89 | serial driver running, you should be able to communicate between | |
90 | the host and the gadget side systems as if they were connected by a | |
91 | serial cable. | |
92 | ||
93 | The gadget serial driver only provides simple unreliable data | |
94 | communication. It does not yet handle flow control or many other | |
95 | features of normal serial devices. | |
96 | ||
97 | ||
98 | Installing the Gadget Serial Driver | |
99 | ----------------------------------- | |
100 | To use the gadget serial driver you must configure the Linux gadget | |
101 | side kernel for "Support for USB Gadgets", for a "USB Peripheral | |
102 | Controller" (for example, net2280), and for the "Serial Gadget" | |
103 | driver. All this are listed under "USB Gadget Support" when | |
104 | configuring the kernel. Then rebuild and install the kernel or | |
105 | modules. | |
106 | ||
107 | The gadget serial driver uses major number 127, for now. So you | |
108 | will need to create a device node for it, like this: | |
109 | ||
110 | mknod /dev/ttygserial c 127 0 | |
111 | ||
112 | You only need to do this once. | |
113 | ||
114 | Then you must load the gadget serial driver. To load it as an | |
115 | ACM device, do this: | |
116 | ||
117 | modprobe g_serial use_acm=1 | |
118 | ||
119 | To load it as a vendor specific bulk in/out device, do this: | |
120 | ||
121 | modprobe g_serial | |
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 | If gadget serial is loaded as an ACM device you will want to use | |
129 | either the Windows or Linux ACM driver on the host side. If gadget | |
130 | serial is loaded as a bulk in/out device, you will want to use the | |
131 | Linux generic serial driver on the host side. Follow the appropriate | |
132 | instructions below to install the host side driver. | |
133 | ||
134 | ||
135 | Installing the Windows Host ACM Driver | |
136 | -------------------------------------- | |
137 | To use the Windows ACM driver you must have the files "gserial.inf" | |
138 | and "usbser.sys" together in a folder on the Windows machine. | |
139 | ||
140 | The "gserial.inf" file is given here. | |
141 | ||
142 | -------------------- CUT HERE -------------------- | |
143 | [Version] | |
144 | Signature="$Windows NT$" | |
145 | Class=Ports | |
146 | ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} | |
147 | Provider=%LINUX% | |
148 | DriverVer=08/17/2004,0.0.2.0 | |
149 | ; Copyright (C) 2004 Al Borchers ([email protected]) | |
150 | ||
151 | [Manufacturer] | |
152 | %LINUX%=GSerialDeviceList | |
153 | ||
154 | [GSerialDeviceList] | |
155 | %GSERIAL%=GSerialInstall, USB\VID_0525&PID_A4A7 | |
156 | ||
157 | [DestinationDirs] | |
158 | DefaultDestDir=10,System32\Drivers | |
159 | ||
160 | [GSerialInstall] | |
161 | CopyFiles=GSerialCopyFiles | |
162 | AddReg=GSerialAddReg | |
163 | ||
164 | [GSerialCopyFiles] | |
165 | usbser.sys | |
166 | ||
167 | [GSerialAddReg] | |
168 | HKR,,DevLoader,,*ntkern | |
169 | HKR,,NTMPDriver,,usbser.sys | |
170 | HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" | |
171 | ||
172 | [GSerialInstall.Services] | |
173 | AddService = usbser,0x0002,GSerialService | |
174 | ||
175 | [GSerialService] | |
176 | DisplayName = %GSERIAL_DISPLAY_NAME% | |
177 | ServiceType = 1 ; SERVICE_KERNEL_DRIVER | |
178 | StartType = 3 ; SERVICE_DEMAND_START | |
179 | ErrorControl = 1 ; SERVICE_ERROR_NORMAL | |
180 | ServiceBinary = %10%\System32\Drivers\usbser.sys | |
181 | LoadOrderGroup = Base | |
182 | ||
183 | [Strings] | |
184 | LINUX = "Linux" | |
185 | GSERIAL = "Gadget Serial" | |
186 | GSERIAL_DISPLAY_NAME = "USB Gadget Serial Driver" | |
187 | -------------------- CUT HERE -------------------- | |
188 | ||
189 | The "usbser.sys" file comes with various versions of Windows. | |
190 | For example, it can be found on Windows XP typically in | |
191 | ||
192 | C:\WINDOWS\Driver Cache\i386\driver.cab | |
193 | ||
194 | Or it can be found on the Windows 98SE CD in the "win98" folder | |
195 | in the "DRIVER11.CAB" through "DRIVER20.CAB" cab files. You will | |
196 | need the DOS "expand" program, the Cygwin "cabextract" program, or | |
197 | a similar program to unpack these cab files and extract "usbser.sys". | |
198 | ||
199 | For example, to extract "usbser.sys" into the current directory | |
200 | on Windows XP, open a DOS window and run a command like | |
201 | ||
202 | expand C:\WINDOWS\Driver~1\i386\driver.cab -F:usbser.sys . | |
203 | ||
204 | (Thanks to Nishant Kamat for pointing out this DOS command.) | |
205 | ||
206 | When the gadget serial driver is loaded and the USB device connected | |
207 | to the Windows host with a USB cable, Windows should recognize the | |
208 | gadget serial device and ask for a driver. Tell Windows to find the | |
209 | driver in the folder that contains "gserial.inf" and "usbser.sys". | |
210 | ||
211 | For example, on Windows XP, when the gadget serial device is first | |
212 | plugged in, the "Found New Hardware Wizard" starts up. Select | |
213 | "Install from a list or specific location (Advanced)", then on | |
214 | the next screen select "Include this location in the search" and | |
215 | enter the path or browse to the folder containing "gserial.inf" and | |
216 | "usbser.sys". Windows will complain that the Gadget Serial driver | |
217 | has not passed Windows Logo testing, but select "Continue anyway" | |
218 | and finish the driver installation. | |
219 | ||
220 | On Windows XP, in the "Device Manager" (under "Control Panel", | |
221 | "System", "Hardware") expand the "Ports (COM & LPT)" entry and you | |
222 | should see "Gadget Serial" listed as the driver for one of the COM | |
223 | ports. | |
224 | ||
225 | To uninstall the Windows XP driver for "Gadget Serial", right click | |
226 | on the "Gadget Serial" entry in the "Device Manager" and select | |
227 | "Uninstall". | |
228 | ||
229 | ||
230 | Installing the Linux Host ACM Driver | |
231 | ------------------------------------ | |
232 | To use the Linux ACM driver you must configure the Linux host side | |
233 | kernel for "Support for Host-side USB" and for "USB Modem (CDC ACM) | |
234 | support". | |
235 | ||
236 | Once the gadget serial driver is loaded and the USB device connected | |
237 | to the Linux host with a USB cable, the host system should recognize | |
238 | the gadget serial device. For example, the command | |
239 | ||
240 | cat /proc/bus/usb/devices | |
241 | ||
242 | should show something like this: | |
243 | ||
244 | T: Bus=01 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#= 5 Spd=480 MxCh= 0 | |
245 | D: Ver= 2.00 Cls=02(comm.) Sub=00 Prot=00 MxPS=64 #Cfgs= 1 | |
246 | P: Vendor=0525 ProdID=a4a7 Rev= 2.01 | |
247 | S: Manufacturer=Linux 2.6.8.1 with net2280 | |
248 | S: Product=Gadget Serial | |
249 | S: SerialNumber=0 | |
250 | C:* #Ifs= 2 Cfg#= 2 Atr=c0 MxPwr= 2mA | |
251 | I: If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=02 Prot=01 Driver=acm | |
252 | E: Ad=83(I) Atr=03(Int.) MxPS= 8 Ivl=32ms | |
253 | I: If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=acm | |
254 | E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms | |
255 | E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms | |
256 | ||
257 | If the host side Linux system is configured properly, the ACM driver | |
258 | should be loaded automatically. The command "lsmod" should show the | |
259 | "acm" module is loaded. | |
260 | ||
261 | ||
262 | Installing the Linux Host Generic USB Serial Driver | |
263 | --------------------------------------------------- | |
264 | To use the Linux generic USB serial driver you must configure the | |
265 | Linux host side kernel for "Support for Host-side USB", for "USB | |
266 | Serial Converter support", and for the "USB Generic Serial Driver". | |
267 | ||
268 | Once the gadget serial driver is loaded and the USB device connected | |
269 | to the Linux host with a USB cable, the host system should recognize | |
270 | the gadget serial device. For example, the command | |
271 | ||
272 | cat /proc/bus/usb/devices | |
273 | ||
274 | should show something like this: | |
275 | ||
276 | T: Bus=01 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#= 6 Spd=480 MxCh= 0 | |
277 | D: Ver= 2.00 Cls=ff(vend.) Sub=00 Prot=00 MxPS=64 #Cfgs= 1 | |
278 | P: Vendor=0525 ProdID=a4a6 Rev= 2.01 | |
279 | S: Manufacturer=Linux 2.6.8.1 with net2280 | |
280 | S: Product=Gadget Serial | |
281 | S: SerialNumber=0 | |
282 | C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr= 2mA | |
283 | I: If#= 0 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=serial | |
284 | E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms | |
285 | E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms | |
286 | ||
287 | You must explicitly load the usbserial driver with parameters to | |
288 | configure it to recognize the gadget serial device, like this: | |
289 | ||
290 | modprobe usbserial vendor=0x0525 product=0xA4A6 | |
291 | ||
292 | If everything is working, usbserial will print a message in the | |
293 | system log saying something like "Gadget Serial converter now | |
294 | attached to ttyUSB0". | |
295 | ||
296 | ||
297 | Testing with Minicom or HyperTerminal | |
298 | ------------------------------------- | |
299 | Once the gadget serial driver and the host driver are both installed, | |
300 | and a USB cable connects the gadget device to the host, you should | |
301 | be able to communicate over USB between the gadget and host systems. | |
302 | You can use minicom or HyperTerminal to try this out. | |
303 | ||
304 | On the gadget side run "minicom -s" to configure a new minicom | |
305 | session. Under "Serial port setup" set "/dev/ttygserial" as the | |
306 | "Serial Device". Set baud rate, data bits, parity, and stop bits, | |
307 | to 9600, 8, none, and 1--these settings mostly do not matter. | |
308 | Under "Modem and dialing" erase all the modem and dialing strings. | |
309 | ||
310 | On a Linux host running the ACM driver, configure minicom similarly | |
311 | but use "/dev/ttyACM0" as the "Serial Device". (If you have other | |
312 | ACM devices connected, change the device name appropriately.) | |
313 | ||
314 | On a Linux host running the USB generic serial driver, configure | |
315 | minicom similarly, but use "/dev/ttyUSB0" as the "Serial Device". | |
316 | (If you have other USB serial devices connected, change the device | |
317 | name appropriately.) | |
318 | ||
319 | On a Windows host configure a new HyperTerminal session to use the | |
320 | COM port assigned to Gadget Serial. The "Port Settings" will be | |
321 | set automatically when HyperTerminal connects to the gadget serial | |
322 | device, so you can leave them set to the default values--these | |
323 | settings mostly do not matter. | |
324 | ||
325 | With minicom configured and running on the gadget side and with | |
326 | minicom or HyperTerminal configured and running on the host side, | |
327 | you should be able to send data back and forth between the gadget | |
328 | side and host side systems. Anything you type on the terminal | |
329 | window on the gadget side should appear in the terminal window on | |
330 | the host side and vice versa. | |
331 | ||
332 |