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 侧终端窗口中输入的任何内容都应出现在主机侧终端窗口中,反之亦然。