第 28 章 USB 设备模式 /USB OTG

如果发现翻译错误,请直接 发起PR修改

28.1. 简介

本章介绍了在 FreeBSD 中使用 USB 设备模式和 USB On The Go ( USB OTG )。这包括虚拟串行控制台、虚拟网络接口和虚拟 USB 驱动器的使用。

当在支持 USB 设备模式或 USB OTG 的硬件上运行时,例如许多嵌入式板上内置的硬件, FreeBSD USB 堆栈可以运行在“设备模式”下。设备模式使得计算机能够以不同种类的 USB 设备类别呈现自身,包括串口、网络适配器、大容量存储设备,或者它们的组合。像笔记本电脑或台式电脑这样的 USB 主机可以像访问物理 USB 设备一样访问它们。设备模式有时也被称为“ USB 小工具模式”。

硬件可以通过两种基本方式提供设备模式功能:一种是使用单独的“客户端端口”,该端口仅支持设备模式;另一种是使用 USB OTG ( On-The-Go )端口,该端口可以同时提供设备模式和主机模式。对于 USB OTG 端口, USB 堆栈会根据连接到端口的设备自动切换主机端和设备端。将 USB 设备(如存储设备)连接到端口会导致 FreeBSD 切换到主机模式。将 USB 主机(如计算机)连接到端口会导致 FreeBSD 切换到设备模式。而单用途的“客户端端口”始终以设备模式工作。

FreeBSD 向 USB 主机呈现的内容取决于 hw.usb.template sysctl 。一些模板提供单个设备,例如串行终端;其他模板提供多个设备,可以同时使用。一个例子是模板 10 ,它提供了一个大容量存储设备、一个串行控制台和一个网络接口。请参阅 usb_template(4) 以获取可用值的列表。

请注意,在某些情况下,根据硬件和主机操作系统的不同,为了使主机注意到配置更改,必须要么物理断开并重新连接,要么以特定于系统的方式强制重新扫描 USB 总线。当主机上运行 FreeBSD 时,可以使用 usbconfig(8) reset 命令。如果 USB 主机已经连接到 USBOTG 插座,则还必须在加载 usb_template.ko 之后执行此操作。

阅读完本章后,您将了解:

  • 在 FreeBSD 上如何设置 USB 设备模式功能。

  • 如何在 FreeBSD 上配置虚拟串口。

  • 如何从不同的操作系统连接到虚拟串口。

  • 如何配置 FreeBSD 以提供虚拟 USB 网络接口。

  • 如何配置 FreeBSD 以提供虚拟 USB 存储设备。

28.2. USB 虚拟串口

28.2.1. 配置 USB 设备模式串口

虚拟串口支持由模板 3 、 8 和 10 提供。请注意,模板 3 可以在 Microsoft Windows 10 上使用,无需特殊驱动程序和 INF 文件。其他主机操作系统可以与这三个模板一起使用。必须加载 usb_template(4)umodem(4) 内核模块。

要启用 USB 设备模式的串口,请将以下行添加到 [/etc/ttys] 文件中:

ttyU0	"/usr/libexec/getty 3wire"	vt100	onifconsole secure
ttyU1	"/usr/libexec/getty 3wire"	vt100	onifconsole secure

然后将以下行添加到 [/etc/devd.conf] 文件中:

notify 100 {
	match "system"		"DEVFS";
	match "subsystem"	"CDEV";
	match "type"		"CREATE";
	match "cdev"		"ttyU[0-9]+";
	action "/sbin/init q";
};

如果 devd(8) 已经在运行,请重新加载配置。

# service devd restart

确保所需的模块已加载并在启动时设置正确的模板,通过将这些行添加到 [/boot/loader.conf]# 文件中,如果该文件不存在,则创建它:

umodem_load="YES"
hw.usb.template=3

要在不重新启动的情况下加载模块并设置模板,请使用以下命令:

# kldload umodem
# sysctl hw.usb.template=3

28.2.2. 从 FreeBSD 连接到 USB 设备模式串口

要连接到配置为提供 USB 设备模式串行端口的板子,将 USB 主机(例如笔记本电脑)连接到板子的 USB OTG 或 USB 客户端端口。在主机上使用 pstat -t 命令列出终端线路。在列表的末尾附近,您应该会看到一个 USB 串行端口,例如"ttyU0"。要打开连接,请使用:

# cu -l /dev/ttyU0

按下 Enter 键几次后,您将看到一个登录提示符。

28.2.3. 在 macOS 上连接 USB 设备模式串口

要连接到配置为提供 USB 设备模式串行端口的板子,将 USB 主机(例如笔记本电脑)连接到板子的 USB OTG 或 USB 客户端端口。要打开连接,请使用:

# cu -l /dev/cu.usbmodemFreeBSD1

28.2.4. 在 Linux 上连接 USB 设备模式串口

要连接到配置为提供 USB 设备模式串行端口的板子,将 USB 主机(例如笔记本电脑)连接到板子的 USB OTG 或 USB 客户端端口。要打开连接,请使用:

# minicom -D /dev/ttyACM0

28.2.5. 在 Microsoft Windows 10 上连接 USB 设备模式串口

要连接到配置为提供 USB 设备模式串口的板子,需要将 USB 主机(例如笔记本电脑)连接到板子的 USB OTG 或 USB 客户端端口。要打开连接,您需要一个串口终端程序,例如 PuTTY 。要检查 Windows 使用的 COM 端口名称,请运行设备管理器,展开“端口( COM 和 LPT )”。您将看到一个类似于“ USB 串行设备( COM4 )”的名称。运行您选择的串口终端程序,例如 PuTTY 。在 PuTTY 对话框中将“连接类型”设置为“串行”,在“串行线路”对话框中输入从设备管理器获取的 COMx ,并点击打开。

28.3. USB 设备模式网络接口

虚拟网络接口的支持由模板 1 、 8 和 10 提供。请注意,它们都不适用于 Microsoft Windows 。其他主机操作系统都适用于这三个模板。必须加载 usb_template(4)if_cdce(4) 内核模块。

确保所需的模块已加载并在启动时设置正确的模板,通过将这些行添加到 [/boot/loader.conf]# 文件中,如果该文件不存在,则创建它:

if_cdce_load="YES"
hw.usb.template=1

要在不重新启动的情况下加载模块并设置模板,请使用以下命令:

# kldload if_cdce
# sysctl hw.usb.template=1

28.4. USB 虚拟存储设备

cfumass(4) 驱动程序是一个 USB 设备模式驱动程序,首次在 FreeBSD 12.0 中可用。

模板 0 和 10 提供了大容量存储目标。必须加载 usb_template(4)cfumass(4) 内核模块。 cfumass(4) 与 CTL 子系统进行接口交互,该子系统也用于 iSCSI 或光纤通道目标。在主机端, USB 大容量存储发起器只能访问一个逻辑单元( LUN ),即 LUN 0 。

28.4.1. 使用 cfumass 启动脚本配置 USB 大容量存储目标

设置只读 USB 存储目标的最简单方法是使用 cfumass rc 脚本。要以这种方式配置它,将要呈现给 USB 主机机器的文件复制到 /var/cfumass 目录,并将以下行添加到 /etc/rc.conf 文件中:

cfumass_enable="YES"

要在不重新启动的情况下配置目标,请运行以下命令:

# service cfumass start

与串行和网络功能不同,模板不应在 /boot/loader.conf 中设置为 0 或 10 。这是因为在设置模板之前必须设置 LUN 。当启动时, cfumass 启动脚本会自动设置正确的模板编号。

28.4.2. 使用其他方法配置 USB 大容量存储设备

本章的其余部分提供了在不使用 cfumass rc 文件的情况下设置目标的详细描述。如果想要提供可写的逻辑单元( LUN ),这是必要的。

USB Mass Storage 不需要运行 ctld(8) 守护进程,尽管如果需要可以使用它。这与 iSCSI 不同。因此,有两种配置目标的方式: ctladm(8)ctld(8) 。两者都需要加载 cfumass.ko 内核模块。可以手动加载该模块:

# kldload cfumass

如果 cfumass.ko 没有被编译进内核中,可以在 /boot/loader.conf 中设置在启动时加载该模块:

cfumass_load="YES"

可以在没有 ctld(8) 守护进程的情况下创建一个 LUN 。

# ctladm create -b block -o file=/data/target0

这将把图像文件 /data/target0 的内容作为 LUN 提供给 USB 主机。在执行命令之前,文件必须存在。要在系统启动时配置 LUN ,请将该命令添加到 /etc/rc.local 中。

ctld(8) 也可以用来管理逻辑单元( LUNs )。创建 /etc/ctl.conf 文件,添加一行到 /etc/rc.conf 文件中,以确保在启动时自动启动 ctld(8) ,然后启动守护进程。

这是一个简单的 /etc/ctl.conf 配置文件的示例。有关选项的更完整描述,请参考 ctl.conf(5)

target naa.50015178f369f092 {
	lun 0 {
		path /data/target0
		size 4G
	}
}

该示例创建了一个具有单个 LUN 的单个目标。 naa.50015178f369f092 是由 32 个随机十六进制数字组成的设备标识符。 path 行定义了指向支持 LUN 的文件或 zvol 的完整路径。在启动 ctld(8) 之前,该文件必须存在。第二行是可选的,用于指定 LUN 的大小。

为了确保 ctld(8) 守护进程在启动时自动启动,请将以下行添加到 .filename#/etc/rc.conf#:

ctld_enable="YES"

要启动 ctld(8) ,请运行以下命令:

# service ctld start

当启动 ctld(8) 守护进程时,它会读取 .filename#/etc/ctl.conf# 文件。如果在守护进程启动后编辑了此文件,则重新加载更改以立即生效:

# service ctld reload

上次修改时间: September 18, 2024 by fiercex