Linux Gadget Serial Driver v2.0

https://www.kernel.org/doc/html/latest/usb/gadget_serial.html

# 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.

gadget serial driverは、2.4 Linux kernelから有効でした、しかしこのドキュメントでは、2.6 Linux Kernelで、version 2.3以降のgadget serial driverを使っている前提とします。

> 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.

このドキュメントでは、LinuxやWindowsが身近であり、Linux Kernelの設定や構築方法を知っており、標準的なユーティリティを動かせ、miniconやHyperTerminalが利用でき、更に、USB とserial deviceを扱える、という前提にも届きます。また、あなたは、Linux gadgetとusb driverをmoduleとして設定している前提です。

> 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.

driverのバージョン2.3では、major / minor device nodeが静的に定まっていませんでした。Linux based systemにおいてsysfsを/sysでmountし、(BusyBoxであれば)mbev, そうでなければ"udev"によって、sysfs /sys/class/tty filesを/dev nodeを一致させてください。

# 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.

Gadget serial driverは、Linux USB gadget driverであり、USB dervice sid driverです。これは、hardwareの横に位置するUSB deviceを有するLinux system上で動作します：例えば、PDA, 組み込みLinux system あるいは、USB開発カード(訳注：要するに、ArduinoやmbedのようなUSB接続マイコン)を備えたPC。

> The gadget serial driver talks over USB to either a CDC ACM driver or a generic USB serial driver running on a host PC:

Gadget serial driverは、USBを介して、hos PC上で動作するCDC ACM driverあるいはgeneric USB serial driverのいずれと通信をします。


```plaintext

 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.

device-side linux systemから見ると、gadget serial driverは、seirla 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.

host-side systemから見ると、gadget serial device は、CDC ACM compliant class deviceあるいは、bulk in で bulk outするendpointを有する、単純なvender specific deviceに見え、他のserial deviceと同じように使われます。

> 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.

host side driverは、ACM compliant driverあるいはsimple bulk in/out interfaceと通信できるドライバである可能性があります。Gadget serial は、Linux ACM driver、Windows usbser.sys ACM driverあるいは、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.

Gadget serial driverとhost side ACM / generic serial driverを動かしているとき、serial cableで接続されているならば、hostとgadget side system間でコミュニケーションをとることができます。

> 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.

Gadget serial driverは、信頼性の低いデータ通信のみを提供するものです。これは、flow制御やそのほかの一般的なserial deviceの多くのほか機能を処理しません。

# 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.

Gadget serial driverを使うには、"Support for USB Gadgets" , “USB Peripheral Controller"(例えば、net2280)、そして、"Serial Gadget" driverをLinux gadget side kernelに設定する必要があります。これらすべてはKernel設定をする時に、"USB Gadget Support"の下にリストされています。そして、kernelとmoduleの再構築とインストールをしてください。

> Then you must load the gadget serial driver. To load it as an ACM device (recommended for interoperability), do this:

そして、gadget srial driverをloadしなければなりません。CM deviceとしてLoadするにはこのようにしてください（相互運用性のために推奨）。

`modprobe g_serial`

> To load it as a vendor specific bulk in/out device, do this:

vendor specific bulk in/out deviceとしてloadする場合には、以下のようにしてください。

`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.

これにより、元になるgadget peripheral controller driverも自動的に読み出されます。これは、gadget side Linux systemが再起動したとき毎回行う必要があります。必要に応じて、start up scriptに追加してください。

> 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:

mdev(busyboxから)あるいはudevを使い、device nodeを作る必要があります。このgadget driverをセットアップされたら、/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.

major number(上記の253）は、システム固有であることに注意してください。もし、/dev nodeを手で作る必要がある場合、/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.

gadget driverを早期につなぎたい時には、あるいは、静的にしたい場合、/etc/inittab entryで、"getty"を実行することができます。/dev/ttyGS0行は、他のシリアルドライバと同じように動くはずです。

> 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.

Gadget serialがACM deviceとしてloadされている場合、host sideのWindowsあるいはLinux ACM driverのいずれかを使う必要があります。Gadget serialがbulk in/out deviceつsite
loadされている場合、host sideのLinux generial serial driverを使う必要ああ取ります。以下の手順に従って、host side driverをインストールしてください。

# Installing the Windows Host ACM Driver

> To use the Windows ACM driver you must have the “linux-cdc-acm.inf” file (provided along this document) which supports all recent versions of Windows.

Windows ACM driverを使うには、全ての最新バージョンのWindowsでサポートしている、"linux-cdc-acm.inf" file(このドキュメントで提供)を有する必要があります。

> 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 the “linux-cdc-acm.inf” file.

gadget serial driverがloadされ、USB deviceがWindows hostにUSBケーブルで接続されたとき、Windowsはdadget serial deviceを認識し、driverに質問します。 Windowsに対して"linux-cdc-acm.inf" fileを含むフォルダー内のドライバを発見するように指示ます。

> 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 the “linux-cdc-acm.inf” file. Windows will complain that the Gadget Serial driver has not passed Windows Logo testing, but select “Continue anyway” and finish the driver installation.

例えば、Windows XPであれば、gadget serial deviceが初めて装着されたときに、 "Found New Hardware Wizard"が起動します。　"Install from a list or specific location (Adcanced)"を選択させます。ｓｐそて次の画面では、"Include this location in the search"を選択させ、pathを入力するか、"linux-cdc-acn.inf" fileを含むパスを発見させます。Windowsは、Gadget Serial driverがWindows Logo 認証を通っていないことを警告しますが、"Continue anyway"を選択し、ドライバーのインストールを完了させます。

> 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.

Windows XPでは、"Device Manager" ("Control Panel" , "System", "Hardware" の下にあります)の中から、"Ports(COM & LPT) entryを開くと、"Gadget Serial"がCOM portの１つのドライバとして発見することができます。

> To uninstall the Windows XP driver for “Gadget Serial”, right click on the “Gadget Serial” entry in the “Device Manager” and select “Uninstall”.

"Gadget Serial" のWindows XP drviverをアンインストールするには、"Device Manager"の中の"Gadget Serial" entryの上で右クリックをし、"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”.

Linux ACM driverを使うためには、Linux host side kernelで、"Support for Host-side USB"と"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:

Gadget serial driverがロードされ、USB deviceとLinux hostがUSBケーブルで一度接続されたら、host systemはgadget serial deviceを認識します。例えば、コマンド：

`cat /sys/kernel/debug/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.

host side Linux systemが適切に設定されているならば、ACM driverは自動的にloadされるはずです。コマンド"lsmod"は、"acm" moduleがloadされていることを示します。

# 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”.

Linux ACM driverを使うためには、Linux host side kernelで、"Support for Host-side USB"、"USB Serial Converter Support"と"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:

Gadget serial driverがロードされ、USB deviceとLinux hostがUSBケーブルで一度接続されたら、host systemはgadget serial deviceを認識します。例えば、コマンド：

`cat /sys/kernel/debug/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 load the usbserial driver and explicitly set its parameters to configure it to recognize the gadget serial device, like this:

usbserial driverをロードし明示的にgadget serial deviceを認識するようにパラメータを設定してください。例えば以下のように。

` echo 0x0525 0xA4A6 >/sys/bus/usb-serial/drivers/generic/new_id `

The legacy way is to use module parameters:

従来の方法では、module paramterを使います。

`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”.

全てが動いているならば、usbserialはsystem logにおいて、“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.

Gadget serial driverとhost driverの両方がインストールされ、USB cableによってgadget deviceとhostが一度接続されたら、gadgetとhost system間でUSBを介して通信する事が可能になります。miniconやHyperTerminalを試すことができます。

> 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.

Gadget sizeで"minicon -s"を実行する事で、新しいminicon sessionが設定されます。"Serial port setup"の下で、"/dev/ttygserial"を"Serial Device"に設定してください。baud rate, data bits, parity そしてstop bitsをそれぞれ、9600, 8, none 1-these settingに設定してください。これらの設定はほとんど関係ありません。"Modem and dialing"では、全部のmodemとdialing stringを削除してください。

> 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.)

ACM driverを動かしているLinux host において、minicon を同様に設定してください。この時、"/dev/ttyACM0"を"Serial Device"で使ってください。（他のACM deviceを接続している場合には、デバイスの名称はおそらく変更になります）。

> 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.)

USB generic serial driverを動かしているLinux host では、同様にminicom の設定をしてください。ただし、"/dev/ttyUSB0"を"Serial Device"として使ってください。（他のUSB serial deviceを接続している場合には、デバイスの名称はおそらく変更になります）。

> 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.

Windows host では、新しいHyperTerminal session を設定し、Gadget Serialを割り当てたCOM portを利用してください。"Port Settings"では、HyperTerminalがgadget serial deviceするときに、自動的に設定するので、デフォルトの設定から離れられます。これらは、そこまで重要ではありません。

> 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.

gadget sizeでminiconを構成して実行し、そして、ホスト側でminiconあるいはHypertTerminalを構成して実行したら、Gadget sideとHost sideのシステムの間で、データの送受信ができるようになっています。ガジェット側のターミナルウィンドウで入力したものは、ホスト側のターミナルウィンドウに表示されます。逆もまた同様です。、

---
もともと、Linux Kernelのソースコードの一部なので、GPLv2扱いになる（はずの認識）。

> https://www.kernel.org/doc/html/latest/index.html
> 
> Licensing documentation
> 
> The following describes the license of the Linux kernel source code (GPLv2), how to properly mark the license of individual files in the source tree, as well as links to the full license text.
> 
> https://www.kernel.org/doc/html/latest/process/license-rules.html#kernel-licensing