mirror of
				https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
				synced 2025-10-31 14:30:50 +00:00 
			
		
		
		
	 c33ba39214
			
		
	
	
		c33ba39214
		
	
	
	
	
		
			
			Commit 7bb5ea54 (usb gadget serial: use composite gadget framework)
changed the default for the use_acm parameter from 0 to 1.
Update the documentation to match.
Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
Acked-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
		
	
			
		
			
				
	
	
		
			350 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			350 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
 | |
|                  Linux Gadget Serial Driver v2.0
 | |
|                            11/20/2004
 | |
|                   (updated 8-May-2008 for v2.3)
 | |
| 
 | |
| 
 | |
| License and Disclaimer
 | |
| ----------------------
 | |
| This program is free software; you can redistribute it and/or
 | |
| modify it under the terms of the GNU General Public License as
 | |
| published by the Free Software Foundation; either version 2 of
 | |
| the License, or (at your option) any later version.
 | |
| 
 | |
| This program is distributed in the hope that it will be useful,
 | |
| but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| GNU General Public License for more details.
 | |
| 
 | |
| You should have received a copy of the GNU General Public
 | |
| License along with this program; if not, write to the Free
 | |
| Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 | |
| MA 02111-1307 USA.
 | |
| 
 | |
| This document and the gadget serial driver itself are
 | |
| Copyright (C) 2004 by Al Borchers (alborchers@steinerpoint.com).
 | |
| 
 | |
| If you have questions, problems, or suggestions for this driver
 | |
| please contact Al Borchers at alborchers@steinerpoint.com.
 | |
| 
 | |
| 
 | |
| Prerequisites
 | |
| -------------
 | |
| Versions of the gadget serial driver are available for the
 | |
| 2.4 Linux kernels, but this document assumes you are using
 | |
| version 2.3 or later of the gadget serial driver in a 2.6
 | |
| Linux kernel.
 | |
| 
 | |
| This document assumes that you are familiar with Linux and
 | |
| Windows and know how to configure and build Linux kernels, run
 | |
| standard utilities, use minicom and HyperTerminal, and work with
 | |
| USB and serial devices.  It also assumes you configure the Linux
 | |
| gadget and usb drivers as modules.
 | |
| 
 | |
| With version 2.3 of the driver, major and minor device nodes are
 | |
| no longer statically defined.  Your Linux based system should mount
 | |
| sysfs in /sys, and use "mdev" (in Busybox) or "udev" to make the
 | |
| /dev nodes matching the sysfs /sys/class/tty files.
 | |
| 
 | |
| 
 | |
| 
 | |
| Overview
 | |
| --------
 | |
| The gadget serial driver is a Linux USB gadget driver, a USB device
 | |
| side driver.  It runs on a Linux system that has USB device side
 | |
| hardware; for example, a PDA, an embedded Linux system, or a PC
 | |
| with a USB development card.
 | |
| 
 | |
| The gadget serial driver talks over USB to either a CDC ACM driver
 | |
| or a generic USB serial driver running on a host PC.
 | |
| 
 | |
|    Host
 | |
|    --------------------------------------
 | |
|   | Host-Side   CDC ACM       USB Host   |
 | |
|   | Operating |   or        | Controller |   USB
 | |
|   | System    | Generic USB | Driver     |--------
 | |
|   | (Linux or | Serial      | and        |        |
 | |
|   | Windows)    Driver        USB Stack  |        |
 | |
|    --------------------------------------         |
 | |
|                                                   |
 | |
|                                                   |
 | |
|                                                   |
 | |
|    Gadget                                         |
 | |
|    --------------------------------------         |
 | |
|   | Gadget                   USB Periph. |        |
 | |
|   | Device-Side |  Gadget  | Controller  |        |
 | |
|   | Linux       |  Serial  | Driver      |--------
 | |
|   | Operating   |  Driver  | and         |
 | |
|   | System                   USB Stack   |
 | |
|    --------------------------------------
 | |
| 
 | |
| On the device-side Linux system, the gadget serial driver looks
 | |
| like a serial device.
 | |
| 
 | |
| On the host-side system, the gadget serial device looks like a
 | |
| CDC ACM compliant class device or a simple vendor specific device
 | |
| with bulk in and bulk out endpoints, and it is treated similarly
 | |
| to other serial devices.
 | |
| 
 | |
| The host side driver can potentially be any ACM compliant driver
 | |
| or any driver that can talk to a device with a simple bulk in/out
 | |
| interface.  Gadget serial has been tested with the Linux ACM driver,
 | |
| the Windows usbser.sys ACM driver, and the Linux USB generic serial
 | |
| driver.
 | |
| 
 | |
| With the gadget serial driver and the host side ACM or generic
 | |
| serial driver running, you should be able to communicate between
 | |
| the host and the gadget side systems as if they were connected by a
 | |
| serial cable.
 | |
| 
 | |
| The gadget serial driver only provides simple unreliable data
 | |
| communication.  It does not yet handle flow control or many other
 | |
| features of normal serial devices.
 | |
| 
 | |
| 
 | |
| Installing the Gadget Serial Driver
 | |
| -----------------------------------
 | |
| To use the gadget serial driver you must configure the Linux gadget
 | |
| side kernel for "Support for USB Gadgets", for a "USB Peripheral
 | |
| Controller" (for example, net2280), and for the "Serial Gadget"
 | |
| driver.  All this are listed under "USB Gadget Support" when
 | |
| configuring the kernel.  Then rebuild and install the kernel or
 | |
| modules.
 | |
| 
 | |
| Then you must load the gadget serial driver.  To load it as an
 | |
| ACM device (recommended for interoperability), do this:
 | |
| 
 | |
|   modprobe g_serial
 | |
| 
 | |
| To load it as a vendor specific bulk in/out device, do this:
 | |
| 
 | |
|   modprobe g_serial use_acm=0
 | |
| 
 | |
| This will also automatically load the underlying gadget peripheral
 | |
| controller driver.  This must be done each time you reboot the gadget
 | |
| side Linux system.  You can add this to the start up scripts, if
 | |
| desired.
 | |
| 
 | |
| Your system should use mdev (from busybox) or udev to make the
 | |
| device nodes.  After this gadget driver has been set up you should
 | |
| then see a /dev/ttyGS0 node:
 | |
| 
 | |
|   # ls -l /dev/ttyGS0 | cat
 | |
|   crw-rw----    1 root     root     253,   0 May  8 14:10 /dev/ttyGS0
 | |
|   #
 | |
| 
 | |
| Note that the major number (253, above) is system-specific.  If
 | |
| you need to create /dev nodes by hand, the right numbers to use
 | |
| will be in the /sys/class/tty/ttyGS0/dev file.
 | |
| 
 | |
| When you link this gadget driver early, perhaps even statically,
 | |
| you may want to set up an /etc/inittab entry to run "getty" on it.
 | |
| The /dev/ttyGS0 line should work like most any other serial port.
 | |
| 
 | |
| 
 | |
| If gadget serial is loaded as an ACM device you will want to use
 | |
| either the Windows or Linux ACM driver on the host side.  If gadget
 | |
| serial is loaded as a bulk in/out device, you will want to use the
 | |
| Linux generic serial driver on the host side.  Follow the appropriate
 | |
| instructions below to install the host side driver.
 | |
| 
 | |
| 
 | |
| Installing the Windows Host ACM Driver
 | |
| --------------------------------------
 | |
| To use the Windows ACM driver you must have the files "gserial.inf"
 | |
| and "usbser.sys" together in a folder on the Windows machine.
 | |
| 
 | |
| The "gserial.inf" file is given here.
 | |
| 
 | |
| -------------------- CUT HERE --------------------
 | |
| [Version]
 | |
| Signature="$Windows NT$"
 | |
| Class=Ports
 | |
| ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
 | |
| Provider=%LINUX%
 | |
| DriverVer=08/17/2004,0.0.2.0
 | |
| ; Copyright (C) 2004 Al Borchers (alborchers@steinerpoint.com)
 | |
| 
 | |
| [Manufacturer]
 | |
| %LINUX%=GSerialDeviceList
 | |
| 
 | |
| [GSerialDeviceList]
 | |
| %GSERIAL%=GSerialInstall, USB\VID_0525&PID_A4A7
 | |
| 
 | |
| [DestinationDirs]
 | |
| DefaultDestDir=10,System32\Drivers
 | |
| 
 | |
| [GSerialInstall]
 | |
| CopyFiles=GSerialCopyFiles
 | |
| AddReg=GSerialAddReg
 | |
| 
 | |
| [GSerialCopyFiles]
 | |
| usbser.sys
 | |
| 
 | |
| [GSerialAddReg]
 | |
| HKR,,DevLoader,,*ntkern
 | |
| HKR,,NTMPDriver,,usbser.sys
 | |
| HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"
 | |
| 
 | |
| [GSerialInstall.Services]
 | |
| AddService = usbser,0x0002,GSerialService
 | |
| 
 | |
| [GSerialService]
 | |
| DisplayName = %GSERIAL_DISPLAY_NAME%
 | |
| ServiceType = 1                  ; SERVICE_KERNEL_DRIVER
 | |
| StartType = 3                    ; SERVICE_DEMAND_START
 | |
| ErrorControl = 1                 ; SERVICE_ERROR_NORMAL
 | |
| ServiceBinary = %10%\System32\Drivers\usbser.sys
 | |
| LoadOrderGroup = Base
 | |
| 
 | |
| [Strings]
 | |
| LINUX = "Linux"
 | |
| GSERIAL = "Gadget Serial"
 | |
| GSERIAL_DISPLAY_NAME = "USB Gadget Serial Driver"
 | |
| -------------------- CUT HERE --------------------
 | |
| 
 | |
| The "usbser.sys" file comes with various versions of Windows.
 | |
| For example, it can be found on Windows XP typically in
 | |
| 
 | |
|   C:\WINDOWS\Driver Cache\i386\driver.cab
 | |
| 
 | |
| Or it can be found on the Windows 98SE CD in the "win98" folder
 | |
| in the "DRIVER11.CAB" through "DRIVER20.CAB" cab files.  You will
 | |
| need the DOS "expand" program, the Cygwin "cabextract" program, or
 | |
| a similar program to unpack these cab files and extract "usbser.sys".
 | |
| 
 | |
| For example, to extract "usbser.sys" into the current directory
 | |
| on Windows XP, open a DOS window and run a command like
 | |
| 
 | |
|   expand C:\WINDOWS\Driver~1\i386\driver.cab -F:usbser.sys .
 | |
| 
 | |
| (Thanks to Nishant Kamat for pointing out this DOS command.)
 | |
| 
 | |
| When the gadget serial driver is loaded and the USB device connected
 | |
| to the Windows host with a USB cable, Windows should recognize the
 | |
| gadget serial device and ask for a driver.  Tell Windows to find the
 | |
| driver in the folder that contains "gserial.inf" and "usbser.sys".
 | |
| 
 | |
| For example, on Windows XP, when the gadget serial device is first
 | |
| plugged in, the "Found New Hardware Wizard" starts up.  Select
 | |
| "Install from a list or specific location (Advanced)", then on
 | |
| the next screen select "Include this location in the search" and
 | |
| enter the path or browse to the folder containing "gserial.inf" and
 | |
| "usbser.sys".  Windows will complain that the Gadget Serial driver
 | |
| has not passed Windows Logo testing, but select "Continue anyway"
 | |
| and finish the driver installation.
 | |
| 
 | |
| On Windows XP, in the "Device Manager" (under "Control Panel",
 | |
| "System", "Hardware") expand the "Ports (COM & LPT)" entry and you
 | |
| should see "Gadget Serial" listed as the driver for one of the COM
 | |
| ports.
 | |
| 
 | |
| To uninstall the Windows XP driver for "Gadget Serial", right click
 | |
| on the "Gadget Serial" entry in the "Device Manager" and select
 | |
| "Uninstall".
 | |
| 
 | |
| 
 | |
| Installing the Linux Host ACM Driver
 | |
| ------------------------------------
 | |
| To use the Linux ACM driver you must configure the Linux host side
 | |
| kernel for "Support for Host-side USB" and for "USB Modem (CDC ACM)
 | |
| support".
 | |
| 
 | |
| Once the gadget serial driver is loaded and the USB device connected
 | |
| to the Linux host with a USB cable, the host system should recognize
 | |
| the gadget serial device.  For example, the command
 | |
| 
 | |
|   cat /proc/bus/usb/devices
 | |
| 
 | |
| should show something like this:
 | |
| 
 | |
| T:  Bus=01 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#=  5 Spd=480 MxCh= 0
 | |
| D:  Ver= 2.00 Cls=02(comm.) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
 | |
| P:  Vendor=0525 ProdID=a4a7 Rev= 2.01
 | |
| S:  Manufacturer=Linux 2.6.8.1 with net2280
 | |
| S:  Product=Gadget Serial
 | |
| S:  SerialNumber=0
 | |
| C:* #Ifs= 2 Cfg#= 2 Atr=c0 MxPwr=  2mA
 | |
| I:  If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=02 Prot=01 Driver=acm
 | |
| E:  Ad=83(I) Atr=03(Int.) MxPS=   8 Ivl=32ms
 | |
| I:  If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=acm
 | |
| E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
 | |
| E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
 | |
| 
 | |
| If the host side Linux system is configured properly, the ACM driver
 | |
| should be loaded automatically.  The command "lsmod" should show the
 | |
| "acm" module is loaded.
 | |
| 
 | |
| 
 | |
| Installing the Linux Host Generic USB Serial Driver
 | |
| ---------------------------------------------------
 | |
| To use the Linux generic USB serial driver you must configure the
 | |
| Linux host side kernel for "Support for Host-side USB", for "USB
 | |
| Serial Converter support", and for the "USB Generic Serial Driver".
 | |
| 
 | |
| Once the gadget serial driver is loaded and the USB device connected
 | |
| to the Linux host with a USB cable, the host system should recognize
 | |
| the gadget serial device.  For example, the command
 | |
| 
 | |
|   cat /proc/bus/usb/devices
 | |
| 
 | |
| should show something like this:
 | |
| 
 | |
| T:  Bus=01 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#=  6 Spd=480 MxCh= 0
 | |
| D:  Ver= 2.00 Cls=ff(vend.) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
 | |
| P:  Vendor=0525 ProdID=a4a6 Rev= 2.01
 | |
| S:  Manufacturer=Linux 2.6.8.1 with net2280
 | |
| S:  Product=Gadget Serial
 | |
| S:  SerialNumber=0
 | |
| C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=  2mA
 | |
| I:  If#= 0 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=serial
 | |
| E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
 | |
| E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
 | |
| 
 | |
| You must explicitly load the usbserial driver with parameters to
 | |
| configure it to recognize the gadget serial device, like this:
 | |
| 
 | |
|   modprobe usbserial vendor=0x0525 product=0xA4A6
 | |
| 
 | |
| If everything is working, usbserial will print a message in the
 | |
| system log saying something like "Gadget Serial converter now
 | |
| attached to ttyUSB0".
 | |
| 
 | |
| 
 | |
| Testing with Minicom or HyperTerminal
 | |
| -------------------------------------
 | |
| Once the gadget serial driver and the host driver are both installed,
 | |
| and a USB cable connects the gadget device to the host, you should
 | |
| be able to communicate over USB between the gadget and host systems.
 | |
| You can use minicom or HyperTerminal to try this out.
 | |
| 
 | |
| On the gadget side run "minicom -s" to configure a new minicom
 | |
| session.  Under "Serial port setup" set "/dev/ttygserial" as the
 | |
| "Serial Device".  Set baud rate, data bits, parity, and stop bits,
 | |
| to 9600, 8, none, and 1--these settings mostly do not matter.
 | |
| Under "Modem and dialing" erase all the modem and dialing strings.
 | |
| 
 | |
| On a Linux host running the ACM driver, configure minicom similarly
 | |
| but use "/dev/ttyACM0" as the "Serial Device".  (If you have other
 | |
| ACM devices connected, change the device name appropriately.)
 | |
| 
 | |
| On a Linux host running the USB generic serial driver, configure
 | |
| minicom similarly, but use "/dev/ttyUSB0" as the "Serial Device".
 | |
| (If you have other USB serial devices connected, change the device
 | |
| name appropriately.)
 | |
| 
 | |
| On a Windows host configure a new HyperTerminal session to use the
 | |
| COM port assigned to Gadget Serial.  The "Port Settings" will be
 | |
| set automatically when HyperTerminal connects to the gadget serial
 | |
| device, so you can leave them set to the default values--these
 | |
| settings mostly do not matter.
 | |
| 
 | |
| With minicom configured and running on the gadget side and with
 | |
| minicom or HyperTerminal configured and running on the host side,
 | |
| you should be able to send data back and forth between the gadget
 | |
| side and host side systems.  Anything you type on the terminal
 | |
| window on the gadget side should appear in the terminal window on
 | |
| the host side and vice versa.
 | |
| 
 | |
| 
 |