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 串行驱动本身由 Al Borchers ( alborchers@steinerpoint.com ) 版权所有 (C) 2004。
如果您对本驱动程序有疑问、问题或建议,请通过 alborchers@steinerpoint.com 联系 Al Borchers。
先决条件¶
gadget 串行驱动程序有适用于 2.4 Linux 内核的版本,但本文档假设您正在 2.6 Linux 内核中使用 gadget 串行驱动程序的 2.3 或更高版本。
本文档假设您熟悉 Linux 和 Windows,并且知道如何配置和构建 Linux 内核、运行标准实用程序、使用 minicom 和 HyperTerminal 以及使用 USB 和串行设备。它还假设您将 Linux gadget 和 USB 驱动程序配置为模块。
对于驱动程序的 2.3 版本,不再静态定义主次设备节点。您的基于 Linux 的系统应在 /sys 中挂载 sysfs,并使用“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 串行驱动程序已使用 Linux ACM 驱动程序、Windows usbser.sys ACM 驱动程序和 Linux USB 通用串行驱动程序进行了测试。
在 gadget 串行驱动程序和主机端 ACM 或通用串行驱动程序运行的情况下,您应该能够像通过串行电缆连接一样在主机和 gadget 端系统之间进行通信。
gadget 串行驱动程序仅提供简单的不可靠数据通信。它尚未处理流量控制或普通串行设备的许多其他功能。
安装 Gadget 串行驱动程序¶
要使用 gadget 串行驱动程序,您必须为“支持 USB Gadgets”、“USB 外围控制器”(例如,net2280)和“串行 Gadget”驱动程序配置 Linux 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 串行驱动程序作为 ACM 设备加载,您将希望在主机端使用 Windows 或 Linux ACM 驱动程序。如果 gadget 串行驱动程序作为批量输入/输出设备加载,您将希望在主机端使用 Linux 通用串行驱动程序。请按照下面的相应说明安装主机端驱动程序。
安装 Windows 主机 ACM 驱动程序¶
要使用 Windows ACM 驱动程序,您必须拥有支持所有最新 Windows 版本的“linux-cdc-acm.inf”文件(与本文档一起提供)。
加载 gadget 串行驱动程序并将 USB 设备通过 USB 电缆连接到 Windows 主机后,Windows 应识别 gadget 串行设备并要求驱动程序。告诉 Windows 在包含“linux-cdc-acm.inf”文件的文件夹中查找驱动程序。
例如,在 Windows XP 上,首次插入 gadget 串行设备时,“发现新硬件向导”启动。选择“从列表或指定位置安装(高级)”,然后在下一个屏幕上选择“在搜索中包含此位置”并输入路径或浏览到包含“linux-cdc-acm.inf”文件的文件夹。Windows 将会抱怨 Gadget 串行驱动程序未通过 Windows 徽标测试,但选择“仍然继续”并完成驱动程序安装。
在 Windows XP 上,在“设备管理器”(在“控制面板”、“系统”、“硬件”下)中展开“端口 (COM & LPT)”项,您应该会看到“Gadget Serial”列为其中一个 COM 端口的驱动程序。
要卸载 Windows XP 的“Gadget Serial”驱动程序,请在“设备管理器”中右键单击“Gadget Serial”项,然后选择“卸载”。
安装 Linux 主机 ACM 驱动程序¶
要使用 Linux ACM 驱动程序,您必须为“支持主机端 USB”和“USB 调制解调器 (CDC ACM) 支持”配置 Linux 主机端内核。
加载 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 串行驱动程序,您必须为“支持主机端 USB”、“USB 串行转换器支持”和“USB 通用串行驱动程序”配置 Linux 主机端内核。
加载 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 会话。在“串行端口设置”下,将“/dev/ttygserial”设置为“串行设备”。将波特率、数据位、奇偶校验位和停止位设置为 9600、8、无和 1 - 这些设置大多数无关紧要。在“调制解调器和拨号”下,擦除所有调制解调器和拨号字符串。
在运行 ACM 驱动程序的 Linux 主机上,类似地配置 minicom,但使用“/dev/ttyACM0”作为“串行设备”。(如果您连接了其他 ACM 设备,请适当更改设备名称。)
在运行 USB 通用串行驱动程序的 Linux 主机上,类似地配置 minicom,但使用“/dev/ttyUSB0”作为“串行设备”。(如果您连接了其他 USB 串行设备,请适当更改设备名称。)
在 Windows 主机上,配置一个新的 HyperTerminal 会话以使用分配给 Gadget Serial 的 COM 端口。当 HyperTerminal 连接到 gadget 串行设备时,将自动设置“端口设置”,因此您可以将其设置为默认值 - 这些设置大多数无关紧要。
当微型终端 (minicom) 在设备端配置并运行,并且微型终端 (minicom) 或超级终端 (HyperTerminal) 在主机端配置并运行时,您应该能够在设备端和主机端系统之间来回发送数据。您在设备端终端窗口中键入的任何内容都应该会出现在主机端的终端窗口中,反之亦然。