`
dato0123
  • 浏览: 914754 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

公元312年一天夜里,罗马附近的米尔维亚桥,忧思<personname w:st="on" productid="满腹的">满腹的</personname>君士坦丁正在对第二天即将到来的大战感到发愁,当他眺望星空之际,突然看到苍茫的天空中突然出现了四个硕大无朋的火红色的十字架,伴随着这样的字样:依靠此,你将大获全胜。

前几天看碟看到欧洲历史部分的君士坦丁,就google到了这么一段。当然这太玄乎了,介于宗教信仰自由,我还是持保留意见吧。不过真有这样的好事,我希望是这样情景:在公元20079月的一天夜里,上海的徐家汇,忧心忡忡的我正在为股市被套而发愁,当我眺望夜空之际,插句题外话,上海几乎没有星空,所有只好将就用夜空代替了,突然看到苍茫的天空中出现了6个硕大无朋的数字,伴随着这样的字样:依靠此,你将有43个涨停。

为什么说43个涨停,这不是刚好比那个金泰多一个么,好不容易碰到这种好事,怎么地也得来个吉尼斯吧,咱别的不多就是吉尼斯多,谁让人多那,找几千个人一块弹弹琴,甩甩头什么的不就有了。

君士坦丁的统治离不开基督教。咱们的USB大树要想茁长成长也离不开USB协议。USB总线是一个单主方式的实现,是一种轮询方式的总线。协议规定所有的数据传输都必须由主机发起,host controller初始化所有的数据传输,各种设备紧紧围绕在主机周围。基督教说了,君士坦丁是上帝的第多少个儿子,所有罗马人都要围绕在君士坦丁周围,他不说话,谁都不能出声。

USB通信最基本的形式是通过USB设备里一个叫endpoint的东东,而主机和endpoint之间的数据传输是通过pipe。有关endpointpipe复旦人甲同样也有精辟的见解,没办法,我是他忠实的fansendpoint就是通信的发送或者接收点,你要发送数据,那你只要把数据发送到正确的端点那里就可以了。之所以U盘有两个bulk端点,是因为端点也是有方向的,一个叫做Bulk in,一个叫做Bulk out,从usb主机到设备称为out,从设备到主机称为in。而管道,实际上只是为了让我们能够找到端点,就相当于我们日常说的邮编地址,比如一个国家,为了通信,我们必须给各个地方取名,完了给各条大大小小的路取名,比如你要揭发你们那里的,你要去上访,你从某偏僻的小县城出发,要到北京来上访,那你的这个端点(endpoint)就是北京,而你得知道你来北京的路线,那这个从你们县城到北京的路线就算一条管道。有人好奇的问了,管道应该有两端吧,一个端点是北京,那另一个端点呢?答案是,这条管道有些特殊,就比如上访,我们只需要知道一端是北京,而另一端是哪里无所谓,因为不管你在哪里你都得到北京来上访。没听说过你在山西你可以上访,你要在宁夏还不能上访了,没这事对吧。严格来说,管道的另一端应该是usb主机,即前面说的那个hostusb协议里边也是这么说的,协议里边说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使用它在设备插入时进行设备的配置。这么说吧,君士坦丁旁边有非常信赖的这么一个人,往往通过他来对其它人做些监控什么的,虽然他最后被判了君士坦丁,但我们的endpoint 0不会,它会一直在那里等待着USB core发送控制命令。最不忠诚的往往是人心,不是么。

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

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

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics