《带你遨游USB世界》中,咱们已经初步介绍了USB的总体架构,本文将从如下几个方面继续介绍USB的内容。java
USB3.0有什么新特性?linux
TYPEC介绍android
otg识别流程数据结构
USB是史上定义出的最成功的PC外围互连技术,而且已经迅猛地被引入到CE和Mobile领域。仅仅在2006年,就有超过20亿USB设备出产,而如今已经有超过60亿的USB产品被安装。架构
而随着技术创新的不断前进,新式设备,媒体格式,以及便宜的大容量存储在不断涌现。他们都要求更高的带宽来维护用户指望的用户体验。高清摄像机将会具备上百GB的存储内容须要迁移到PC端供用户编辑,查看以及打包存储。现有的设备,如数码相机继续创新并增长其容量来容纳更多的非压缩图像。从数码相机里下载上百甚至上千个10MB或者更大的原始图片将会是一个十分耗时的过程,除非传输速率获得提升。此外,用户应用要求在PC和这些不断复杂化的外设之间更高的链接带宽。USB 3.0经过增长更高的传输速率来匹配这些新式应用和设备,从而解决这些需求。框架
目前市场上有大量在使用的我的电脑只支持USB 2.0。还有USB 2.0外围设备使用数量较多。USB3.0须要保持向后兼容性。从硬件上来看,实际usb3.0和usb2.0已是两种设备,在A型座的usb口上,咱们能明显看到,usb2.0仍旧使用的是GND,D+,D-,VBUS。在3.0中则使用的是一对USB3_TX差分线,USB3_RX差分线,GND,BUS。因此在物理上咱们要明确,实际上USB2.0和USB3.0已经不是一个设备。虽然USB3.0仍然延续了大部分2.0的概念。异步
Usb3.0在框架层级是向后兼容USB 2.0的。在传输的类型上,仍旧是控制传输,中断传输,批量传输,同步传输四种。然而,USB 2.0和超高速协议仍是有一些根本性的差别:大数据
1)USB 2.0使用三部分事务交易(令牌,数据和握手),而超高速对这相同的三部分的使用是不相同的。对于输出(OUTs),令牌被列入数据包;而对于输入(INs),令牌则被握手所取代。编码
2)USB 2.0不支持突发(bursting)而超高速支持连续突发(continuous bursting)。视频
3)USB 2.0是一个半双工广播(broadcast)总线,而超高速是双重单工(dual-simplex)单播(unicast)总线,这就容许同时进行IN和OUT事务交易。
4)USB 2.0使用轮询模型,而超高速使用异步通知。
5)USB 2.0没有流(Streaming)的能力,而超高速支持对批量端点的流(Streaming)。
咱们来看一次IN传输:
主机和设备应遵照传输类型和端点特性的限制。主机经过发送一个确认包(IN)到设备发起一次传输。这个确认包包含了将包路由到预想的端点的寻址信息。主机告诉设备它能够发送的数据包的数量,以及预计从设备接收到的第一个数据包的序列号。做为回应,端点会以适当的序列号发送数据包回主机。确认包还暗含地确认,之前的数据包被成功收到。
请注意,即便主机须要为每一个接收到的数据包发送确认包,设备仍然能够发送被请求数量的数据包,而没必要等待任何确认包。
超高速输入(IN)事务交易协议中以下图所示。一个超高速总线上的输入(IN)传输由一个或多个IN事务交易组成,并在出现下列任何状况之一时完成:
1)全部的传输数据成功被接收。
2)端点用比端点的最大数据包大小要小的数据包响应。
3)端点回应一个错误。
Out 传输也相似:
从上面的模型咱们能够看出,相比于usb2.0的轮询式的发包,一方面usb3.0的异步发包模式明显效率提升不少,能够没必要等待设备回应,连续发包。另外一方面因为usb3.0是点对点的发送数据,因此处在空闲的其余usb设备能够一直保持低功耗状态,直到有数据到来。而在usb2.0的轮询模式上,因为每个设备都须要对总线上的地址作判断,因此空闲设备没法进入低功耗模式。
超高速USB协议容许主机连续发送数据到设备,或者从设备连续接收数据,只要设备能够接收或者发送数据。设备在无需中间确认包(intermediate acknowledgement packet)的状况下能够发送或者接收的包的个数,在该端点的端点伴侣描述符(endpoint companion descriptor)中报告。报告端点的maximum burst size多于一个包的端点被认为是支持"突发"事务。
在进行突发传送时,适用于下面的规则:
1)在接收一个确认包以前,一个突发中能够发送的包个数的最大值,被限制为:端点的最大突发的大小【maximum burst size】(和上一个被端点或主机接收到的ACK TP或ERDY的NumP字段值的最小值,减去端点或主机在被上一个ACK TP确认过的包以后已经发送的包的个数。注意,每当端点被初始化时,主机能够从新将可以发送/接收的最大DPs的个数初始化为端点最大突发的大小【maximum burst size】。
2)突发传送中,每个独立的包应该有数据包负载长度为maximum packet size。只有突发的最后一个包能够小于报告的maximum packet size。若是最后一个小一些,那么对于短包的规则适用于在突发末尾的短包。
3)突发事务只要ACK TP的NumP字段没被设为0而且每一个包都有最大包大小的数据负载,就能够继续。
流传输是bulk中的一种特殊模式,当设备的配置描述符在配置了 MaxStreams后,就表明设备可支持流传输。
上图表明一个输入批量管道,这里创建起了大量的流(Streams)。在主机内存中与每一个流(Stream)相关的是一个或者多个端点缓冲区(Endpoint Buffers)来接收流数据(Stream data)。在设备端,也有一个相应的特定于命令或者功能的数据,会被传输到主机。
当设备有对特定的流可用的数据时(如图中的G),它就用发送ERDY加上CStream ID做为标签,而且主机会开始发送加有CStream ID标签的IN ACK TP到设备。设备会经过返回与CStream ID相关的功能数据,而且也是加上CStream ID为标签。当主机接收到数据,就用CStream ID来选择一组端点缓冲区(Endpoint Buffers)用来接收数据。
当数据被耗尽,设备终结该流。主机也被容许终结流,若是它用完了端点缓冲区的话。流能够被用来,例如,支持大容量设备(mass storage device)所须要的乱序(out-of-order)数据传输。
一个标准的批量端点有单组端点缓冲区(Endpoint Buffers)与之相关联。流扩展了一个端点能够访问的主机缓冲区个数,从1直到65533。在主机缓冲区和Stream ID之间有一个1:1的映射。
因为流是基于一个标准的批量管道运行,一个错误就会让管道暂停(halt),中止全部的活动。
USB3.0描述符与USB2.0基本相同,最主要的区别是每一个EP描述符后新增了一个伴侣描述符,用以代表上面所说的设备的“突发事务”和“流传输”的能力:
总结来讲USB3.0的最主要的新特性有这几种:
总线速度提升到5Gbps(gen2中提升到10Gbps)
异步的传输模式
突发事务,依赖于异步传输的模式,无需等待设备回应
流传输,依赖于忽然事务传输,能够多对一的大量传输
这几种新特性使得USB3.0的传输速率远远高于USB2.0
Typec是在usb3.0推出后,为了兼容正反插,高功率充电,以及更强的兼容性而推出的新的硬件接口,最主要的特性为
USB Power Delivery技术,最高可支持到20V5A的充电
可集成DisplayPort,可外接屏幕与喇叭(例如能够接入hdmi设备)
抗干扰性,可靠性更强
母头以下图所示:
公头以下图所示:
能够看到相比于普通的usb3.0 A座,typec多出了一组tx,rx,以及vconn和cc。其中具体使用状况:
1)多出的tx,rx能够在gen1或gen2中作usb多路输出,可实现数据吞吐量翻倍,同时也能够复用为DisplayPort接口,使得typec能够作视频输出
2)vconn为typec有源线缆的e-mark供电,进一步能够识别线材的供电能力
3)cc pin为typec的核心功能,usb的主机和设备端能够经过cc pin通信,以实现pd,dp以及主从模式的切换等各类功能
目前市面上有多种typec的实现方案,如高通是经过自带的typec phy实现,也有独立的typec芯片方案,如fusb302等,可是流程基本相似。
编码格式:
pd3.0开始使用Biphase Mark Coding (BMC)编码格式,这种编码的特色就是,每个bit周期开始时电平会切换一次,在这个周期内电平若是不切换则表示bit0,若是电平切换了一次,则表明bit1
目前市场上pd主要分为两种,一种是pd2.0,这种只提供几个固定的电压电流档位,如常见的5V3A,9V3A,12V3A,15V3A,20V3A。另外一种是pd3.0,也就是pps,这种除了提供pd2.0的几个电压档位以外,还会提供一个或多个电压电流可调的档位,如:可调电压范围3V~21V,可调电流0A~6.3A
其流程大概以下:
如下做为一个例子:
如前文中所述,typec拥有4对差分信号,上/下行各2对。USB-IF推出了一个Alternate Mode交替模式,支持将USB Type-C线缆转化为其余用途,而DP交替模式就是第一个应用,它能够将其中一些或者所有差分信号通道转化为DisplayPort信号通道,若是还有剩余的差分信号,则能够继续用于USB 3.1高速数据传输。
有了DP交替模式,USB Type-C的实力将会大增,由于它让平板电脑、笔记本产品经过一个迷你接口实现高速数据传输、视频输出、电力供应等功能,带来相似手机那样的“单接口、多功能”的可能性,这比以前经过USB接口输出视频信号的方案更增强大。
如下做为一个例子:
在usb2.0时代,为了知足移动设备单usb口既能够为主也能够为从的需求,出现了otg功能。Usb2.0的otg是经过micro或miniusb座子上的第5个id pin上的电平来完成识别,当id pin的电平为高,则为从机,当该电平为低时,则为主机。
咱们市面上买的otg线,内部电路就是把id pin与GND线相接,以实现otg线插入后,手机能够做为host端
在usb3.0中,id pin的功能一样被强大的typec所取代,主从的识别将经过cc来识别。同时主从双方也能够经过cc的通信来切换角色。
在usb2.0中,供电方与受电方和设备的主从关系是绑定的,只有host能够给devices供电。usb3.0中则彻底不一样,二者彻底独立,在作host的同时,依旧能够接受供电。解决了“手机没电时,就没法插usb设备”的问题
同时在硬件上,咱们须要明确usb 3.0 otg的组成部分
控制器负责将处理通信中,数据的校验,分发,异常处理等主要工做。在usb2.0中咱们有诸如“ehci,uhci,ohci,dwc2”等多个不一样的控制器ip。其中ehci是同时兼容usb1.0,usb1.1,usb2.0等功能,而uhci,ohci则只能支持到1.1 。dwc2则是拥有otg功能的控制器
在usb3.0中,控制器则只剩了xhci,与dwc3,一样的dwc3也是拥有otg功能。
Usb phy主要负责实际的物理信号。将串行的usb数据转换成控制器所须要的数据格式。同时,咱们usb信号质量也与phy有关,在必定程度上phy能够改善usb眼图,但主要仍是靠usb走线
与usb phy功能相似,只不过处理的是cc pin上的信号。cc信号也能够用独立的芯片,如fusb302等芯片来处理。
External Connectors是usb用于状态通知的驱动,当phy收到中断,处理完usb状态后,经过extcon驱动,广播到已监听该extcon的全部驱动
使用devm_extcon_register_notifier来注册监听usb状态变化
使用devm_extcon_dev_register来注册管理usb的状态变化
如下host的识别做为一个例子:
Usb3.0相比于usb2.0,在usb core层,驱动并无太大变化,仍旧与原来的流程相同,usb代码的核心数据结构仍然是URB,URB的使用方法也与原来相同:
区别在于usb hcd以后的代码,xhci中,核心的数据结构为TRB,每一笔数据以一个trb来作交换,在xhci.c中xhci_urb_enqueue进一步判断数据类型,并对stream id以及burst作判断,并提交到控制器中
在《带你遨游USB世界》中,咱们介绍了android.c的gadget配置方式,在早期时,linux的gadget驱动都是固定功能,即开机后usb功能就已固定,没法改变。而这样的功能,明显没法知足移动设备对于otg功能的需求,所以android推出了android.c和composite.c的复合功能的gadget驱动。
再此以后,android.c的方式沿用了好久,直到linux更新了新的gadget驱动----configfs子系统,知足了移动端的全部需求。相比于android.c,configfs更加灵活,所以替代了android.c。
在新的linux代码中,configfs基本替代了android.c,所以咱们对configfs作必定的介绍
启动流程:
启动后,上层UsbDeviceManager.java经过setprop sys.usb.config的属性来控制gadget功能,例如:
这其中每一个绑定的功能都应gadget中的一个驱动,如mtp对应drivers/usb/gadget/function/f_mtp.c
流程图以下
Configfs子系统与控制器之间的数据交换是经过struct usb_request *request结构体,一次完整的流程以下: