Linux Gadget 序列埠驅動 v2.0

11/20/2004

(於 2008 年 5 月 8 日更新至 v2.3)

許可和免責宣告

本程式是自由軟體;您可以根據自由軟體基金會發布的 GNU 通用公共許可證的條款重新分發和/或修改它;許可證的第 2 版,或(由您選擇)任何更高版本。

本程式旨在提供實用性,但不提供任何擔保;不提供適銷性或特定用途適用性的默示擔保。詳見 GNU 通用公共許可證。

您應該已經隨本程式收到了一份 GNU 通用公共許可證副本;如果沒有,請致信 Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA。

本文件和 gadget 序列埠驅動本身版權所有 (C) 2004,作者 Al Borchers (alborchers@steinerpoint.com)。

如果您對此驅動有任何疑問、問題或建議,請聯絡 Al Borchers:alborchers@steinerpoint.com

前提條件

gadget 序列埠驅動的版本適用於 2.4 Linux 核心,但本文件假設您正在 2.6 Linux 核心中使用 2.3 或更高版本的 gadget 序列埠驅動。

本文件假定您熟悉 Linux 和 Windows,並瞭解如何配置和構建 Linux 核心、執行標準實用程式、使用 minicom 和 HyperTerminal,以及使用 USB 和序列裝置。它還假定您將 Linux gadget 和 USB 驅動程式配置為模組。

對於 2.3 版的驅動程式,主次裝置節點不再是靜態定義的。您的 Linux 系統應該將 sysfs 掛載到 /sys,並使用“mdev”(在 Busybox 中)或“udev”來建立與 sysfs /sys/class/tty 檔案匹配的 /dev 節點。

概述

gadget 序列埠驅動是一個 Linux USB gadget 驅動,一個 USB 裝置側驅動。它執行在具有 USB 裝置側硬體的 Linux 系統上;例如,一臺 PDA、一個嵌入式 Linux 系統,或一臺帶有 USB 開發卡的 PC。

gadget 序列埠驅動透過 USB 與執行在主機 PC 上的 CDC ACM 驅動或通用 USB 序列埠驅動通訊。

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

在裝置側的 Linux 系統上,gadget 序列埠驅動看起來像一個序列埠裝置。

在主機側系統上,gadget 序列埠裝置看起來像一個相容 CDC ACM 的類裝置,或者一個具有批次輸入和批次輸出端點的簡單廠商特定裝置,並且它被視為與其他序列埠裝置類似。

主機側驅動程式可以是任何相容 ACM 的驅動程式,或者任何可以與具有簡單批次輸入/輸出介面的裝置通訊的驅動程式。Gadget serial 已在 Linux ACM 驅動程式、Windows usbser.sys ACM 驅動程式和 Linux USB 通用序列埠驅動程式上進行過測試。

在執行 gadget 序列埠驅動和主機側 ACM 或通用序列埠驅動的情況下,您應該能夠像透過序列埠電纜連線一樣,在主機和 gadget 側系統之間進行通訊。

gadget 序列埠驅動僅提供簡單不可靠的資料通訊。它尚未處理流控制或普通序列埠裝置的許多其他功能。

安裝 Gadget 序列埠驅動

要使用 gadget 序列埠驅動,您必須將 Linux gadget 側核心配置為“Support for USB Gadgets”、“USB Peripheral Controller”(例如 net2280)以及“Serial Gadget”驅動。所有這些都列在核心配置時的“USB Gadget Support”下。然後重新構建並安裝核心或模組。

然後您必須載入 gadget 序列埠驅動。要將其載入為 ACM 裝置(建議用於互操作性),請執行以下操作:

modprobe g_serial

要將其載入為廠商特定的批次輸入/輸出裝置,請執行以下操作:

modprobe g_serial use_acm=0

這將自動載入底層的 gadget 外設控制器驅動。每次重啟 gadget 側的 Linux 系統時都必須執行此操作。如果需要,您可以將其新增到啟動指令碼中。

您的系統應該使用 mdev(來自 busybox)或 udev 來建立裝置節點。設定好此 gadget 驅動程式後,您應該會看到一個 /dev/ttyGS0 節點

# ls -l /dev/ttyGS0 | cat
crw-rw----    1 root     root     253,   0 May  8 14:10 /dev/ttyGS0
#

請注意,主編號(上文中的 253)是系統特定的。如果您需要手動建立 /dev 節點,正確的編號將在 /sys/class/tty/ttyGS0/dev 檔案中。

當您儘早(甚至靜態地)連結此 gadget 驅動程式時,您可能希望設定一個 /etc/inittab 條目來在其上執行“getty”。/dev/ttyGS0 行應該像大多數其他序列埠一樣工作。

如果 gadget serial 被載入為 ACM 裝置,您將需要在主機側使用 Windows 或 Linux ACM 驅動。如果 gadget serial 被載入為批次輸入/輸出裝置,您將需要在主機側使用 Linux 通用序列埠驅動。按照以下相應說明安裝主機側驅動程式。

安裝 Windows 主機 ACM 驅動

要使用 Windows ACM 驅動程式,您必須擁有“linux-cdc-acm.inf”檔案(隨本文件提供),該檔案支援所有最新版本的 Windows。

當 gadget 序列埠驅動載入完畢,並且 USB 裝置透過 USB 資料線連線到 Windows 主機時,Windows 應該會識別 gadget 序列埠裝置並要求安裝驅動。告訴 Windows 在包含“linux-cdc-acm.inf”檔案的資料夾中查詢驅動程式。

例如,在 Windows XP 上,當 gadget 序列埠裝置首次插入時,“發現新硬體嚮導”會啟動。選擇“從列表或指定位置安裝(高階)”,然後在下一個螢幕上選擇“在搜尋中包括這個位置”並輸入路徑或瀏覽到包含“linux-cdc-acm.inf”檔案的資料夾。Windows 會抱怨 Gadget Serial 驅動程式未透過 Windows 徽標測試,但請選擇“繼續安裝”並完成驅動程式安裝。

在 Windows XP 中,在“裝置管理器”(在“控制面板”、“系統”、“硬體”下)中展開“埠 (COM & LPT)”條目,您應該會看到“Gadget Serial”被列為其中一個 COM 埠的驅動程式。

要解除安裝 Windows XP 中“Gadget Serial”的驅動程式,請在“裝置管理器”中右鍵單擊“Gadget Serial”條目並選擇“解除安裝”。

安裝 Linux 主機 ACM 驅動

要使用 Linux ACM 驅動,您必須將 Linux 主機側核心配置為“Support for Host-side USB”和“USB Modem (CDC ACM) support”。

一旦 gadget 序列埠驅動載入完畢,並且 USB 裝置透過 USB 線纜連線到 Linux 主機,主機系統應該會識別 gadget 序列埠裝置。例如,命令

cat /sys/kernel/debug/usb/devices

應該顯示如下內容:

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

如果主機側 Linux 系統配置正確,ACM 驅動應該會自動載入。“lsmod”命令應該顯示“acm”模組已載入。

安裝 Linux 主機通用 USB 序列埠驅動

要使用 Linux 通用 USB 序列埠驅動,您必須將 Linux 主機側核心配置為“Support for Host-side USB”、“USB Serial Converter support”和“USB Generic Serial Driver”。

一旦 gadget 序列埠驅動載入完畢,並且 USB 裝置透過 USB 線纜連線到 Linux 主機,主機系統應該會識別 gadget 序列埠裝置。例如,命令

cat /sys/kernel/debug/usb/devices

應該顯示如下內容:

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

您必須載入 usbserial 驅動程式並明確設定其引數以配置它來識別 gadget 序列埠裝置,如下所示

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

傳統方式是使用模組引數

modprobe usbserial vendor=0x0525 product=0xA4A6

如果一切正常,usbserial 會在系統日誌中列印一條訊息,內容類似於“Gadget Serial converter now attached to ttyUSB0”。

使用 Minicom 或 HyperTerminal 進行測試

一旦 gadget 序列埠驅動和主機驅動都已安裝,並且 USB 資料線連線了 gadget 裝置和主機,您就應該能夠透過 USB 在 gadget 和主機系統之間進行通訊。您可以使用 minicom 或 HyperTerminal 來嘗試此操作。

在 gadget 側執行“minicom -s”配置一個新的 minicom 會話。在“Serial port setup”下,將“/dev/ttygserial”設定為“Serial Device”。將波特率、資料位、奇偶校驗和停止位設定為 9600、8、無和 1——這些設定大多不重要。在“Modem and dialing”下,擦除所有調變解調器和撥號字串。

在執行 ACM 驅動的 Linux 主機上,以類似方式配置 minicom,但使用“/dev/ttyACM0”作為“Serial Device”。(如果您連線了其他 ACM 裝置,請相應地更改裝置名稱。)

在執行 USB 通用序列埠驅動程式的 Linux 主機上,類似地配置 minicom,但使用“/dev/ttyUSB0”作為“Serial Device”。(如果您連線了其他 USB 序列埠裝置,請相應地更改裝置名稱。)

在 Windows 主機上配置一個新的 HyperTerminal 會話,使其使用分配給 Gadget Serial 的 COM 埠。“埠設定”將在 HyperTerminal 連線到 gadget 序列埠裝置時自動設定,因此您可以將其保留為預設值——這些設定大多不重要。

在 gadget 側配置並執行 minicom,並在主機側配置並執行 minicom 或 HyperTerminal 後,您應該能夠在 gadget 側和主機側系統之間來回傳送資料。您在 gadget 側終端視窗中輸入的任何內容都應出現在主機側終端視窗中,反之亦然。