Linux内核移植 part4:USB系统介绍

1. 历史

USB,是英文Universal Serial Bus(通用串行总线)的缩写,而其中文简称为“通串线”,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术。USB接口支持设备的即插即用和热插拔功能。USB是在1994年底由英特尔、康柏、IBM、Microsoft等多家公司联合提出的。

下一代USB接口将会有改动方向,下一代的Type-C USB接口,可支持正反两面插,并且传输数据信号强,但目前(2014年)生产商有限。

目前全球‍‍有超过100亿台设备使用USB。但是,作为USB技术的发明人,阿杰伊·巴特(Ajay Bhatt)没有用它赚过一分钱,而且他坦然接受这个事实。
2015年USB技术迎来二十周岁生日。英特尔首席系统技师巴特在接受采访时表示:“开发这项技术不是为了赚钱。我是为了带来变化,带来大变化的机遇并不常见。”实际上,USB技术没有让任何人赚钱。作为巴特的USB想法的首个资助方,英特尔拥有USB技术的全部专利,但英特尔最终决定免费开放这项技术。kqiu案:但是当前IC开发模式以及市场需求,已经足够让一些厂商和个人通过USB技术获利。
协议发展:1.1->2.0->3.0

2. USB系统组成

2.1 控制器

负责和总线交互,提供I/O接口(向上支持编程,向下连接物理层),协议层支持(添加包头,产生握手信号),dma数据传输。分为host,device和otg。和大多数串行总线一样,usb也是工作在master/slave模式下,每次数据/控制传输的发起者 只能 是master(host),而且由master(host)端负责管理设备,分配带宽。

2.2 集线器hub

用来管理各个物理端口,每个端口可以挂接usb功能设备或者hub,实现usb设备集群。

2.3 物理层接口

也就是usb phy,有ulpi和utmi,这是个数模混合模块,主要是模拟部分为主,数字部分通常提供一些接口,和控制器通信,可以显示当前phy工作模式等信息,用来辅助调试,但是这一层的调试就是硬件调试了,主要就是一些电气特性,通常我们对此并不是很关心。

2.4 hcd & udc driver

hcd(Host Controller Driver) 和 udc(Usb Device Controller) driver是直接和控制器打交道的代码,和我们常说的usb驱动还有些许差别。

app->usb driver->hcd/udc driver->controller

可见usb驱动工作于hcd或者udc driver之上,而且usb驱动是相对于设备来讲的,例如我有个usb键盘,对应的usb驱动就是该键盘的驱动,而hcd和udc driver则始终都是指 主机端控制器的驱动 ,这一点是要分清楚的,否则看驱动代码容易混淆。

2.5 usb驱动

用来控制特定设备的数据传输,向应用提供操作接口。例如usb摄像头驱动。后面会结合代码详细介绍。

3. USB数据传输

众所周知,usb一大便利之处就是支持热插拔,设备支持可扩展性强。那这个特点是怎么实现的呢?这里就涉及到usb的传输过程了。

首先是热插拔,这是纯粹的物理规范,通常usb设备接口四根信号线:gnd,D-,D+,Vcc。

1.1协议的设备我们现在叫全速(full speed)设备,理论传输速度12Mbps,常见的鼠标,键盘都是属于这类设备;2.0的为高速(high speed)设备,理论传输速度480Mbps;3.0的称为超速(super speed),理论传输速度为5Gbps。1.1和2.0的识别靠不同数据pin脚上的上拉电阻区分(1.1对应D-,2.0对应D+),3.0向下兼容2.0,但是多了一些管脚用于super speed,这里不再细述。

usb传输的通用特点: 所有的数据传输都是通过端点(endpoint)进行的,端点并不是一个具体的物理实现,而只是一种抽象[1],这种抽象是软硬件配合完成的:首先控制器要提供几种传输的方式和寄存器入口,一旦入口使能以后控制器 就要(必须要) 根据特定的传输方式(例如bulk)对应的寻址要求(规范)结合 驱动配置 去存储单元中寻找需要传输的数据,其中的 驱动配置 通常就是和软件抽象出来的usb端点[2]相关联,而控制器的寄存器使能入口就是硬件抽象出来的usb端点了,譬如以bulk传输方式管理数据的就是bulk端点,如果使能了多个端点,几个端点的数据传输优先级和带宽控制也是一大问题,这是纯粹的硬件实现,在这里我们并不关心。在后续的章节中可以通过代码可以进一步了解usb端点相关内容。在kqiu看来,端点与其理解为usb设备端点,不如理解成数据交换的节点更为合理。端点的区分:编号,从0开始往上增长,至于哪个编号对应哪种传输,也就是什么类型的端点,是硬件IP做的事情。

3.1 控制传输

上面我们说了usb传输的通用之处,控制传输自然也是这样一个过程了。首先有个控制端点,这个端点比较特殊,所有usb设备都必须实现,而且必须一直处于工作状态,因为就是通过它来告知host(作为device的时候)或者获取(作为host的时候)设备的信息。这些信息包括设备ID(PID/VID),设备名字,配置,接口类型等,通常可以划分为两部分:usb协议部分和类协议部分,类协议就是不同功能的设备所遵循的协议规范,例如mass storage,uvc,uac。整个获取信息的过程称为 枚举 。因为要识别不同的设备,自然就需要握手,所以控制传输必定是双向的,整个过程如下:

  • 第一次握手
    host发送setup包,如果device成功接受,返回ack,然后device做好准备进行下一次传输,否则返回nak或者stall。setup包中指定了下一次transaction的方向,如果是host->device,则device准备好接收数据的缓冲区;如果是device->host,那么准备好要发送数据。
  • 第二次握手
    如果从setup包传输中返回ack,那么继续第二次传输,这次传输的为control transfer所要传达的实际信息,数据传输方向及内容由前面发的setup包指定。
    传输方向是data in,则host发起data in请求,然后device返回接收setup包之后准备好的数据。host如果成功接收,则返回ack给device,否则nak;
    传输方向是data out,则host向device传输数据,device将数据存入自己的buffer中,成功则返回ack,否则nak,数据传输还涉及到长度问题,也是通过setup包指定的,这里不再细述,下文会 ~实例分析~ 。
  • 第三次握手
    host controller发起data in请求,获取此次传输完成后device端点状态,device返回ack,nak或stall。
    其他传输
    除了端点0的控制传输,设备还能通过其他端点进行bulk传输,interrupt传输和isochronous传输,对应的典型设备有U盘(bulk传输),usb键盘(interrupt传输),usb摄像头/usb声卡(isochronous传输),需要注意的是之所以不同设备要以不同的方式传输数据,是由该类传输的特点决定的,实际上如果没有什么特别的限制或者需要,可以采用任何一种传输方式,只要能工作都是可以的,甚至可以利用控制传输传数据,当然了,这得软硬件支持。

4. USB通信过程范例

  • 枚举 enumerate
    (1) U盘

    (2) usb摄像头

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值