Linux : 如何从用户空间通过 cdc-adm 驱动程序的 USB 批量端点传输数据

Linux : how to transfer data through USB bulk endpoint of cdc-adm driver from userspace

我是 Linux 驱动程序的初学者,我开始在 linux 中为基于 cdc-acm 的 USB 设备编写应用程序。因此,我使用了 cdc_acm 驱动程序。我使用的 USB 设备有 2 个批量端点(读取和写入)和一个中断端点。

现在,我的问题是所有这些端点是否都在同一个 /dev/ttyACM0 文件上运行,以及对这个 tty 文件的写入调用如何转换为 acm_write_bulk fops 调用?

如果我将触发 USB 功能的数据写入 ttyACM0 文件,数据是否会通过批量输出端点发送?或者我应该如何将数据直接从用户 space 发送到批量端点。我应该在内核 space 中编写任何支持驱动程序吗? 同样,如何从用户space?

中的中断端点读取数据

在此先感谢您的帮助。

无需编写内核space驱动程序。您可以使用 open 系统调用打开 /dev/ttyACM0,使用 termios(可选)为其设置参数,然后使用 readwrite 系统调用来从您的设备读取和写入批量数据。这些系统调用最容易从 C 和 C++ 访问,但大多数语言都有可用于访问串行端口的库。

我不知道从 Linux 中的中断端点读取数据的好方法,但您至少可以查看 TIOCMGET、TIOCGICOUNT 和 TIOCMIWAIT ioctls,您确实需要这样做。

Linux 串口接口抽象出所有关于 USB、端点和批量传输的细节,因此您可以使用更简单、更抽象的 API 与串口通信。事实上,您可以在任何类型的串行端口上使用相同的代码,而不管哪个内核驱动程序实现了串行端口。它可能会帮助您在 Internet 上搜索 "linux serial port programming" 或 "posix serial port programming" 之类的内容,以了解有关如何执行此操作的更多信息。

如果你真的很好奇Linux CDC ACM 驱动程序是如何工作的,以及它如何将一个write系统调用转换成相应的USB传输,你可以阅读source of the cdc-acm driver .但是,这方式超出了您仅使用串行端口所需要做的事情。