- 论坛徽章:
- 0
|
输油管道,更没有输卵管道.但是相同的是,所有的管道都是用来传输东西的,只不过有些管道传输的是实实
在在的物质,而有些管道传输的是数据.
眼下我们在usb 代码中看到的管道就是用来传输数据,用来通信. 通信是双方的,不可能自言自语对吧.而在
usb 的通信中,一方肯定是主机,即host,另一方是什么?是设备吗?在你少不更事的岁月里,你可以说是设备,
你可以说主机和设备进行通信.但是,现在,当你已经长大,当你已经成熟,在这样一个激情燃烧的岁月里,你
应该说得更确切一点.真正和主机进行通信的是设备内的端点.关于端点,我们也可以专业一点说,从硬件上
来看它是实实在在存在的,它被实现为一种FIFO,支持多少个端点是接口芯片的一个重要指标.而从概念上
来说,端点是主机和usb 设备之间通信流的终点.主机和设备可以进行不同种类的通信,或者说数据传输,首
先,设备连接在usb 总线上,usb 总线为了分辨每一个设备,给每一个设备编上号,然后为了实现多种通信,设
备方于是提供了端点,端点多了,自然也要编上号,而让主机最终和端点去联系.
鲁迅先生说得好,世上本没有管道,端点多了,也就有了管道.
这句话说得相当好,非常有道理,两个字,犀利!没错,我们知道,usb 的世界里,有四种管道,它们对应usb 世界
中的四种传输方式,控制传输对应控制管道,中断传输对应中断管道,批量传输对应批量管道,等时传输对应
等时管道.每一个usb 世界中的设备要在usb 世界里生存,就得有它生存的管道.而管道的出现,正是为了让
我们分辨端点,或者说连接端点.记得网友唐伯虎点蚊香曾经说过,主机与端点之间的数据链接就称为管道.
比如说,复旦大学,有一个主校区,也可以说是教学区,(当然也包括一些实验室),上课什么的都得去教学区,把
教学区看作主机,那么与其相对的是,另外有很多学生宿舍楼,宿舍楼多了,就给每个楼编上号,比如1 号楼,2
号楼,...,36 号楼,.., 每幢楼算一个设备,比如说你在淘宝网上买了一套阿玛尼外套(当然,肯定是假的,也就
一两百的那种),你让人家给你快递过来,人家问你你住哪?你说你住复旦大学,但如果你只说你在复旦大学,
那么送快递那哥们可能先得赶到复旦大学正门,或者学生宿舍区的正门,然后人家肯定就得问,你是哪幢楼哪
间房?比如你说你是36 号楼201,好,那么像201 这么一个数字呢,就对应端点号,最终那套外套要到达的就
是端点201,而不仅仅是36 号楼,对吧,假如人家要是送到36 号楼下就把外套给扔地上了你肯定得跟他急.
那么在这个例子里,复旦主校区是主机,每幢宿舍楼算一个设备,你住的那间宿舍就算端点.那么pipe
呢?pipe 很难与现实中的某一实物对应,不能说她是复旦正门通往宿舍的某条路,而应该按别的方式理解.她
包含很多东西,你可以把她比作快递的货物上面贴得那张标签,比如她上面写了收货人的地址,包括多少号楼
多少号房,在usb 里面,就是设备号和端点号,知道了这两个号,货物就能确定它的目的地,而usb 主机就能知
道和她通信的是哪个端点.而pipe 除了包含着两个号以外,还包含其它一些信息,比如她包含了通信的方向,
也就是说,你能从那张标签上得知36 号楼201 这个是收件人呢还是寄件人,虽然现实中不需要写明,因为快
递员肯定知道你是收件人,他没事才不会和寄件人联系呢.再比如,pipe 里还包含了pipe 的类型,比如你快递
是从深圳递过来,那么怎么递就得看了,快递公司肯定提供不同类型的服务,有的快有的慢,有的可能还有保
险什么的,看你出多少钱,让你选择不同的服务类型,同样pipe 也如此,因为usb 设备的端点有不同的类型,
所以pipe 里就包含了一个字段来记录这一点,这个字段称为pipe type. 好,让我们来看看实际的pipe 吧.
来看这些宏,头一个闪亮登场的是usb_sndctrlpipe, 定义于include/linux/usb.h 中,咱们先把这一堆冬
冬相关的代码给列出来.
1104 static inline unsigned int __create_pipe(struct usb_device *dev, unsigned int
endpoint)
1105 {
1106 return (dev->devnum << | (endpoint << 15);
1107 } |
|