📄 gadget_serial.txt
字号:
Linux Gadget Serial Driver v2.0 11/20/2004License and Disclaimer----------------------This program is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public License aspublished by the Free Software Foundation; either version 2 ofthe 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 ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General PublicLicense along with this program; if not, write to the FreeSoftware Foundation, Inc., 59 Temple Place, Suite 330, Boston,MA 02111-1307 USA.This document and the gadget serial driver itself areCopyright (C) 2004 by Al Borchers (alborchers@steinerpoint.com).If you have questions, problems, or suggestions for this driverplease contact Al Borchers at alborchers@steinerpoint.com.Prerequisites-------------Versions of the gadget serial driver are available for the2.4 Linux kernels, but this document assumes you are usingversion 2.0 or later of the gadget serial driver in a 2.6Linux kernel.This document assumes that you are familiar with Linux andWindows and know how to configure and build Linux kernels, runstandard utilities, use minicom and HyperTerminal, and work withUSB and serial devices. It also assumes you configure the Linuxgadget and usb drivers as modules.Overview--------The gadget serial driver is a Linux USB gadget driver, a USB deviceside driver. It runs on a Linux system that has USB device sidehardware; for example, a PDA, an embedded Linux system, or a PCwith a USB development card.The gadget serial driver talks over USB to either a CDC ACM driveror 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 lookslike a serial device.On the host-side system, the gadget serial device looks like aCDC ACM compliant class device or a simple vendor specific devicewith bulk in and bulk out endpoints, and it is treated similarlyto other serial devices.The host side driver can potentially be any ACM compliant driveror any driver that can talk to a device with a simple bulk in/outinterface. Gadget serial has been tested with the Linux ACM driver,the Windows usbser.sys ACM driver, and the Linux USB generic serialdriver.With the gadget serial driver and the host side ACM or genericserial driver running, you should be able to communicate betweenthe host and the gadget side systems as if they were connected by aserial cable.The gadget serial driver only provides simple unreliable datacommunication. It does not yet handle flow control or many otherfeatures of normal serial devices.Installing the Gadget Serial Driver-----------------------------------To use the gadget serial driver you must configure the Linux gadgetside kernel for "Support for USB Gadgets", for a "USB PeripheralController" (for example, net2280), and for the "Serial Gadget"driver. All this are listed under "USB Gadget Support" whenconfiguring the kernel. Then rebuild and install the kernel ormodules.The gadget serial driver uses major number 127, for now. So youwill need to create a device node for it, like this: mknod /dev/ttygserial c 127 0You only need to do this once.Then you must load the gadget serial driver. To load it as anACM device, do this: modprobe g_serial use_acm=1To load it as a vendor specific bulk in/out device, do this: modprobe g_serialThis will also automatically load the underlying gadget peripheralcontroller driver. This must be done each time you reboot the gadgetside Linux system. You can add this to the start up scripts, ifdesired.If gadget serial is loaded as an ACM device you will want to useeither the Windows or Linux ACM driver on the host side. If gadgetserial is loaded as a bulk in/out device, you will want to use theLinux generic serial driver on the host side. Follow the appropriateinstructions 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=PortsClassGuid={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=GSerialCopyFilesAddReg=GSerialAddReg[GSerialCopyFiles]usbser.sys[GSerialAddReg]HKR,,DevLoader,,*ntkernHKR,,NTMPDriver,,usbser.sysHKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"[GSerialInstall.Services]AddService = usbser,0x0002,GSerialService[GSerialService]DisplayName = %GSERIAL_DISPLAY_NAME%ServiceType = 1 ; SERVICE_KERNEL_DRIVERStartType = 3 ; SERVICE_DEMAND_STARTErrorControl = 1 ; SERVICE_ERROR_NORMALServiceBinary = %10%\System32\Drivers\usbser.sysLoadOrderGroup = 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.cabOr it can be found on the Windows 98SE CD in the "win98" folderin the "DRIVER11.CAB" through "DRIVER20.CAB" cab files. You willneed the DOS "expand" program, the Cygwin "cabextract" program, ora similar program to unpack these cab files and extract "usbser.sys".For example, to extract "usbser.sys" into the current directoryon 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 connectedto the Windows host with a USB cable, Windows should recognize thegadget serial device and ask for a driver. Tell Windows to find thedriver in the folder that contains "gserial.inf" and "usbser.sys".For example, on Windows XP, when the gadget serial device is firstplugged in, the "Found New Hardware Wizard" starts up. Select"Install from a list or specific location (Advanced)", then onthe next screen select "Include this location in the search" andenter the path or browse to the folder containing "gserial.inf" and"usbser.sys". Windows will complain that the Gadget Serial driverhas 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 youshould see "Gadget Serial" listed as the driver for one of the COMports.To uninstall the Windows XP driver for "Gadget Serial", right clickon 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 sidekernel for "Support for Host-side USB" and for "USB Modem (CDC ACM)support".Once the gadget serial driver is loaded and the USB device connectedto the Linux host with a USB cable, the host system should recognizethe gadget serial device. For example, the command cat /proc/bus/usb/devicesshould show something like this:T: Bus=01 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#= 5 Spd=480 MxCh= 0D: Ver= 2.00 Cls=02(comm.) Sub=00 Prot=00 MxPS=64 #Cfgs= 1P: Vendor=0525 ProdID=a4a7 Rev= 2.01S: Manufacturer=Linux 2.6.8.1 with net2280S: Product=Gadget SerialS: SerialNumber=0C:* #Ifs= 2 Cfg#= 2 Atr=c0 MxPwr= 2mAI: If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=02 Prot=01 Driver=acmE: Ad=83(I) Atr=03(Int.) MxPS= 8 Ivl=32msI: If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=acmE: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0msE: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0msIf the host side Linux system is configured properly, the ACM drivershould 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 theLinux host side kernel for "Support for Host-side USB", for "USBSerial Converter support", and for the "USB Generic Serial Driver".Once the gadget serial driver is loaded and the USB device connectedto the Linux host with a USB cable, the host system should recognizethe gadget serial device. For example, the command cat /proc/bus/usb/devicesshould show something like this:T: Bus=01 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#= 6 Spd=480 MxCh= 0D: Ver= 2.00 Cls=ff(vend.) Sub=00 Prot=00 MxPS=64 #Cfgs= 1P: Vendor=0525 ProdID=a4a6 Rev= 2.01S: Manufacturer=Linux 2.6.8.1 with net2280S: Product=Gadget SerialS: SerialNumber=0C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr= 2mAI: If#= 0 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=serialE: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0msE: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0msYou must explicitly load the usbserial driver with parameters toconfigure it to recognize the gadget serial device, like this: modprobe usbserial vendor=0x0525 product=0xA4A6If everything is working, usbserial will print a message in thesystem log saying something like "Gadget Serial converter nowattached 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 shouldbe 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 minicomsession. 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 similarlybut use "/dev/ttyACM0" as the "Serial Device". (If you have otherACM devices connected, change the device name appropriately.)On a Linux host running the USB generic serial driver, configureminicom similarly, but use "/dev/ttyUSB0" as the "Serial Device".(If you have other USB serial devices connected, change the devicename appropriately.)On a Windows host configure a new HyperTerminal session to use theCOM port assigned to Gadget Serial. The "Port Settings" will beset automatically when HyperTerminal connects to the gadget serialdevice, so you can leave them set to the default values--thesesettings mostly do not matter.With minicom configured and running on the gadget side and withminicom or HyperTerminal configured and running on the host side,you should be able to send data back and forth between the gadgetside and host side systems. Anything you type on the terminalwindow on the gadget side should appear in the terminal window onthe host side and vice versa.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -