资讯详情

Linux下使用USB模拟ACM串口设备【转】

本文转载:https://www.cnblogs.com/pied/p/4549614.html

我以前脑子里有过这个想法,最近公司的产品要用了,所以多了解一下。

1. USB 简介

USB 是 Universal Serial Bus 从字面上看,缩写意味着一般串行总线。从物理上讲,它实际上是一对差分线。连接两个设备后,它们相互传输数据。加上另外两个电源( 5V 和 GND)线,一共是 4 根线。

那么,既然是只有一对差分线,那么该如何决定由谁传给谁呢(如果两边同时在线上建立电平,线路上的电平会是不确定态的,以致无法通信)?这就要说到 USB 一个重要的传输基础:问答 机制—— Device(slave) 只有设备通常处于等待状态 HOST 侧设备发起询问和请求,然后在下一个时间片中使用数据线 HOST 发送数据。

那么,谁是 HOST,谁是 SLAVE 是什么决定的?答案是硬件。换句话说,你 USB 后面的那块驱动芯片如果是 HOST,那么,这个 USB 只能做 HOST 使用它。相反,使用它。SLAVE 也是。例如,我们经常看到,PC 上的 USB HOST 连接到 U盘、鼠标、键盘等 SLAVE 设备。

后来有人认为这样的设备只能是 HOST 或者只能是 SLAVE 太死板了,又发明了 USB OTG。USB OTG(on-the-go,大意是在使用时切换身份。 4 在根线的基础上,又加了一条线,ID。那块 USB 后面的驱动芯片可以根据这条线选择自己应该玩 HOST 还是 SLAVE 的角色。我们以后单独介绍。

此外,由于使用一对差分线传输数据,USB 又采用了基础 HUB 的星形拓扑结构(包括根控制器,最多7 层拓扑,7层没有吊载 HUB 能力,只能是功能设备)。因此,更准确地说,HOST-SLAVE“ 是在由 HUB 物理链路上支持的传输机制。同时,HUB 也是一个 USB SLAVE 设备。

2. USB 概述连接过程

下图解释得很好 USB 连接过程。需要注意的是,1)如上图所示,每个网络只能有一个拓扑结构 HOST。2) HOST 和 SLAVE 可以一对一连接,也可以通过 HUB ,一个 HOST 对应多个 SLAVE。

基本状态包括:。下面稍微解释一下。

:HOST 侧(可能是在 HUB 也许是直接的 host controller 上)根据 D 和 D- 判断口的阻抗变化是否存在 device 并判断插入设备的速度类型。

:因为 USB 口有供电功能(5)V DC,多为 500-1000 mA ),因此,设备又分为 Bus powered 和 self powerd。当然,即使设备本身供电,我们也认为只有当设备连接时,它才会进入powered 状态。一旦设备重新启动,应重新执行后续连接操作。

:因为只有一对差分线,如果双方同时操作,线路上的电平将不确定,根本无法通信。因此,上电后,USB device(slave)默认为等待状态,直到没有行动 HOST 发给它一个 Reset 请求。复位完成意味着已经建立了低速/全速/高速的物理通道。

:设备复位成功后,将获得一个理由 HOST 分配地址。对于分配地址的对话,对话 endpoint0 上完成。

:握手?配置?反正这个阶段完成了,说明设备已经完成了 ready了。

:所有 USB Device(slave)闲暇一段时间后,无论设备是分配地址还是没有分配地址,都必须把自己挂起来,保持自己的状态。

3. OTG

OTG 增加一个动态配置 HOST 或者 DEVICE(slave)数据线,以 micro USB 以接头为例,引脚分布如下:

因为传统的 USB 线缆为 4 根线,所以,要把 OTG 设备接入需要配置(硬件短接):

1. 当配置 OTG 设备为 USB Device(slave) 时,将 ID 脚悬空。

2. 当配置 OTG 设备为 USB HOST时,将 ID 脚接地。

因此,我们需要在这里OTG将脚悬空配置为 Slave 设备。硬件上,买的 OTG 默认转接线 OTG USB 设备设置为 HOST,他们 ID 脚是接地的。我们需要把它放在地上 OTG 设备当作 Device(slave)因此,我最终选择在板上使用它 ID 切断线,使其悬空。

4. 一般实现结构

在我们讨论硬件部分之前,作为一个通信接口,不需要系统和软件层面的合作是不可能的。首先给出一个更常见的 USB 然后我们解释通信模型图:

对于整个 USB 在通信过程中,我们可以大致分为三个层次:总线层、功能层和设备层。这三个层次的划分主要是为了集中解决问题。

a. 总线层负责解决点到点的问题,主要是确保上一层能够与相邻的端点对话 buffer 上层使用;

b. 设备层有设备的概念,HOST 通过 Device(Slave)的 Endpoint0 配置,为上一层准备数据管;

c.功能层在是 Device(Slave)只有实现功能,才能看到新鲜的设备,才能看到我们能看到的 U盘、鼠标等设备。

以某安装 Linux 的 PC 为例,作为 HOST,这三部分由控制器工作(如 EHCI 、UHCI 、OHCI),USB CORE (内核支持前控制器、设备管理功能等。 USB 上层驱动(usbmouse、usbkbd、usb-storge)。

要实现的 USB 串口,属于 USB 实现上层驱动部分。然而,我们在这里类似 HOST 实现了一个结构 Device(Slave)。

5. g_serial.ko

当前内核 3.0.8 支持 Gadget Serial 接口。也就是说,如果我们有硬件的话 USB SLAVE(可以是由 OTG 支持的), 这个驱动程序可以支持我们实现一个软件 USB 串口;就像由 PL2303 或者 HM340 硬件实现的 USB Serial 一样。 只有 HOST 控制器不好。不管是对 HOST 侧的PC,还是我们加 Gadget Serial 驱动支持的 PC,这条链路看起来都只是一个普通的串口连接。其源代码在 /drivers/usb/gadget/serial.c,还有文档 Documentation/usb/gadget_serial.txt。可自行阅读。(实际上,谷歌 ADB 工具和这个差不多,甚至只有驱动号不一样。)

在具体应用中,我们不需要做太多的修改。。。编译就足够了。我把它编译成 module,因此,文件系统启动后需要再次进行 modprobe。

至于 HOST 侧面,据说不需要驱动,但是,我在 Windows 使用时,仍安装 gadget serial v2.4 的(据说不支持 64 位系统,未验证),UBUNTU 即插即用。

—————— 无论你在哪里做什么,只要你坚持服务、创新和创造价值,其他事情自然会到来。

标签: 脚侧插usb连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台