Linux那些事儿 之 戏说USB(3)我是一棵树

从拓扑上来看,USB子系统并不以总线的方式来部署,它是一颗由几个点对点的连接构成的树。




它主要包括了USB连接、USB host controller和USB device三个部分。而USB device还包括了hub和功能设备等。下面还是逐个说说吧。

什么是USB controller?在一个USB系统中只能有一个host,其实说白了就是咱们的主机,而USB和主机的接口就是host controller,你的主机总不可能只能有一个USB host controller吧,所以说一个主机可以支持多个host controller,比如分别属于不同厂商的。那么USB host controller本身是做什么的?这个问题复旦人甲兄弟说的太精彩了,我还是直接拿来吧。controller,控制器,顾名思义,用于控制,控制什么,控制所有的usb设备的通信。通常计算机的cpu并不是直接和usb设备打交道,而是和控制器打交道,他要对设备做什么,他会告诉控制器,而不是直接把指令发给设备,然后控制器再去负责处理这件事情,他会去指挥设备执行命令,而cpu就不用管剩下的事情,他还是该干嘛干嘛去,控制器替他去完成剩下的事情,事情办完了再通知cpu。否则让cpu去盯着每一个设备做每一件事情,那是不现实的,那就好比让一个学院的院长去盯着我们每一个本科生上课,去管理我们的出勤,只能说,不现实。所以我们就被分成了几个系,通常院长有什么指示直接跟各系领导说就可以了,而系主任就会去安排下面的人去执行具体的任务,完了之后他们就会像院长汇报。

那么hub是什么?还是拿复旦人甲现成的答案吧,不能怪我不努力,只是复旦人甲说的太精彩了。在大学里,有的宿舍里网口有限,但是我们这一代人上大学基本上是每人一台电脑,所以网口不够,于是有人会使用hub,让多个人共用一个网口,这是以太网上的hub,而usb的世界里同样有hub,其实原理是一样的,任何支持usb的电脑不会说只允许你只能一个时刻使用一个usb设备,比如你插入了u盘,你同样还可以插入usb键盘,还可以再插一个usb鼠标,因为你会发现你的电脑里并不只是一个usb接口。这些口实际上就是所谓的hub口。而现实中经常是让一个usb控制器和一个hub绑定在一起,专业一点说叫集成,而这个hub也被称作root hub,换言之,和usb控制器绑定在一起的hub就是系统中最根本的hub,其它的hub可以连接到她这里,然后可以延伸出去,外接别的设备,当然也可以不用别的hub,让usb设备直接接到root hub上。

而USB连接指的就是连接device和host(或hub)的四线电缆。电缆中包括的VBUS(电源线)、GND(地线)还有两根信号线。USB系统就是通过VBUS和GND向设备提供电源的。主机对连接的USB设备提供电源供其使用,而每个USB设备也能够有自己的电源。


咱们的USB大树要想茁长成长也离不开USB协议。USB总线是一个单主方式的实现,是一种轮询方式的总线。2.0协议规定所有的数据传输都必须由主机发起,host controller初始化所有的数据传输,各种设备紧紧围绕在主机周围。

USB通信最基本的形式是通过USB设备里一个叫 endpoint 的东东,而主机和endpoint之间的数据传输是通过 pipe 。有关 endpoint 和 pipe ,复旦人甲同样也有精辟的见解:endpoint就是通信的发送或者接收点,你要发送数据,那你只要把数据发送到正确的端点那里就可以了。之所以U盘有两个 bulk 端点,是因为端点也是有方向的,一个叫做 Bulk  in,一个叫做 Bulk  out,从usb主机到设备称为out,从设备到主机称为in。而管道,实际上只是为了让我们能够找到端点,就相当于我们日常说的邮编地址,比如一个国家,为了通信,我们必须给各个地方取名,完了给各条大大小小的路取名,比如你要揭发你们那里的官员腐败,你要去上访,你从某偏僻的小县城出发,要到北京来上访,那你的这个端点(endpoint)就是北京,而你得知道你来北京的路线,那这个从你们县城到北京的路线就算一条管道。有人好奇的问了,管道应该有两端吧,一个端点是北京,那另一个端点呢?答案是,这条管道有些特殊,就比如上访,我们只需要知道一端是北京,而另一端是哪里无所谓,因为不管你在哪里你都得到北京来上访。没听说过你在山西你可以上访,你要在宁夏还不能上访了,没这事对吧。严格来说,管道的另一端应该是usb主机,即前面说的那个host,usb协议里边也是这么说的,协议里边说pipes代表着一种能力,怎样一种能力呢,在主机和设备上的端点之间移动数据,听上去挺玄的。

端点不但是有方向的,而且这个方向还是确定的,或者in,或者out,没有又是in又是out的。你到北京就叫上访,北京的下来就叫慰问。有没有特殊的呢,看你怎么去理解0号端点了,协议里规定了,所有的USB设备必须具有端点0,它可以作为in端点,也可以作为out端点,USB系统软件利用它来实现缺省的控制管道,从而控制设备。端点也是限量供应的,不是想有多少就有多少的,除了端点0,低速设备最多只能拥有2个端点,高速设备也最多只能拥有15个in端点和15个out端点。这些端点在设备内部都有唯一的端点号,这个端点号是在设备设计时就已经指定的。

为什么端点0就非要那么的个性那?这还是有内在原因的。管道的通信方式其实有两种,一种是stream的,一种是message的,message管道要求从它那儿过的数据必须具有一定的格式,不是随便传的,因为它主要就是用于主机向设备请求信息的,必须得让设备明白请求的是什么。而stream管道就没这么苛刻,要随和多了,它对数据没有特殊的要求。协议里说,message管道必须对应两个相同号码的端点,一个用来in,一个用来out,咱们的缺省管道就是message管道,当然,与缺省管道对应的端点0就必须是两个具有同样端点号0的端点。

USB endpoint有四种类型,分别对应了四种不同的数据传输方式。它们是控制传输(Control Transfers),中断传输(Interrupt Data Transfers),批量传输(Bulk Data Transfers),等时传输(Isochronous Data Transfers)。控制传输用来控制对USB设备不同部分的访问,通常用于配置设备,获取设备信息,发送命令到设备,或者获取设备的状态报告。总之就是用来传送控制信息的,每个USB设备都会有一个endpoint 0的控制端点,内核里的USB core使用它在设备插入时进行设备的配置。

中断传输用来以一个固定的速率传送少量的数据,USB键盘和USB鼠标使用的就是这种方式,USB的触摸屏也是,传输的数据包含了坐标信息。

批量传输用来传输大量的数据,确保没有数据丢失,并不保证在特定的时间内完成。U盘使用的就是批量传输,咱们用它备份数据时需要确保数据不能丢,而且也不能指望它能在一个固定的比较快的时间内拷贝完。

等时传输同样用来传输大量的数据,但并不保证数据是否到达,以稳定的速率发送和接收实时的信息,对传送延迟非常敏感。显然是用于音频和视频一类的设备,这类设备期望能够有个比较稳定的数据流,比如你在网上QQ视频聊天,肯定希望每分钟传输的图像/声音速率是比较稳定的,不能说这一分钟对方看到你在向她向你深情表白,可是下一分钟却看见画面停滞在那里,只能看到你那傻样一动不动,你说这不浪费感情嘛。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值