购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第11章
趣谈设备、配置、接口与端点

假设现在有一个能够给 多家独立运营超市 智能配货的仓库,它不仅能够根据需求将货物送达超市并且完成上架工作,还能够根据不同货物的销售情况进行清点、下架、退货等工作,甚至对于可能出现的货物摆放位置错误也能够进行纠正,作为超市老板的你只需要负责收银的工作即可,真是太方便了。

我们可以将仓库当作USB主机,那么每家独立运营的超市就相当于一个USB设备,而这个仓库最多可以给127家超市提供智能配货(相当于一个主机最多可以扩展127个USB设备),购物的顾客就相当于设备固件,管理仓库的负责人则属于主机端客户程序(Client Software),仓库与超市之间的关系如图11.1所示。

图11.1 仓库与超市之间的关系

超市通常会包含多个货架,每个货架通常分为几层(以下简称“货架层”),每一层都拥有能够容纳一定数量货物的空间。仓库为某超市的货架摆放货物时,通常会一次性在某货架层摆放若干件。如果把货物当作主机给设备发送的数据,那么货架层就相当于 端点 。也就是说,主机(仓库)发送的数据(货物)最终会保存在端点(货架层)。

我们从货架层的特点可以总结出 端点 物理方面 的两个特点。其一,每个 端点 (货架层)都能够存储一定的数据(货物)。存储空间的大小决定主机可以一次性发送给 端点 的最大数据长度(货物数量)。我们把 端点 的数据存储空间称为缓冲区(Buffer),设备固件(顾客)如果需要获得主机(仓库)发送给端点的数据(货物),就必须从端点的缓冲区获得,所以说, 端点 是USB通信最基本的形式。

其二,每个 端点 都有唯一的地址,因为每一个货架层可以被唯一定位。 端点 地址与主机给USB设备分配的地址不一样,我们可以理解后者为超市地址,属于一个大范围地址,而 端点 地址则是超市里的某个货架层。我们把 端点 地址用 端点号 来标记,那么每一个端点就相当于货架的某一层。USB规范定义的有效端点号(Endpoint Number)数量为16(端点0~15),相当于货架的最大层数为16。8层货架与端点的对应关系如图11.2所示。

USB规范还定义了管道(Pipe),它是描述“设备端点与主机软件之间联系”的抽象通道,相当于仓库中的货物从出库到上架(或货物下架到入库)之间的路径。 管道属于逻辑上的定义 ,体现了主机缓冲区(相当于仓库的货架)与 端点 之间传输数据的能力。设备的不同端点与主机缓冲区之间属于不同的管道,但是在物理上还是经过同一条传输线缆。管道定义了 (Stream)与 消息 (Message)两种不同且互斥的通信模式,前者代表不具有USB规范定义结构的数据,后者代表具有某种USB规范定义结构的数据,这是什么意思呢?

图11.2 8层货架与端点的对应关系

例如,仓库只是单纯性地对超市中的货架进行货物上架操作,这就是 通信模式,它只负责将货物上架,至于货物几时上架、需不需要上架、需不需要调整等,那就不是它所能做到的了。 消息 通信模式可以做的事情很多。例如,进行货物上架时,查询一下货架是否有富余的容纳空间,有则上架,没有则不上架;查询货物是否被用户不小心损坏了,如果是就更换货物,如图11.3所示。

图11.3 流与消息管道

简单地说, 消息 通信模式的能力更强一些, 通信模式能够做的事情, 消息 通信模式也能做,只不过如果单纯进行数据传输时,使用 通信模式的效率更高一些。你可以理解消息就是 主机与设备互动的一种方式 ,它传输的数据有特定格式,所以 消息 通信模式比 通信模式更复杂,而且消息通信模式允许双向数据传输。例如,在总线枚举过程中,主机使用默认端点0与设备通信,对应的就是一个 消息 管道。主机向USB设备发送一个命令,然后进行必要的数据传输,最后再进行状态确认,这可以保证数据能够被可靠地传输。

很明显,不同的货架层中摆放的货物是不同的,相应的容纳空间也不一样,对于一些体积较小的货物,不大的空间已然足够容纳。相反,体积很大的货物则需要更大的容纳空间。当然,即便货物的体积很小,由于经营理念的不同,有些负责人也可能会为其分配较大的容纳空间。也就是说,缓冲区的大小具体怎么分配取决于设计者(你)。

同样的道理, 端点 类型不同,一次性能够接收的最大数据包长度也是不同的。例如,端点0的数据包大小的有效值只能是8字节、16字节、32字节、64字节,而其他非0端点可以接受更大的数据包,这取决于 端点 类型,同时也决定了 传输类型

那什么是传输类型呢?我们知道,由于货物本身的特点不一样,每一层货架中货物的销售情况也会不同,有些货物(如时令蔬菜)可能每天都会脱销,仓库每天都需要重新清点并上架新货物。当然,也有些货物(如定价不合理的大件货物)可能几个月都卖不出一件,仓库查询这些货架的时间就会非常少。也就是说,对于不同的货架层,仓库给它分配的资源是不一样的。如果某件货物实在卖不出去,可能还会将其下架退回到仓库。

端点在 使用方面 也有与货架层相似的特点。其一, 每个端点都会有特定的方向 。要么下行(上架),要么上行(下架)。当然,也可以是双向(上下架)的。前面我们提过,USB设备的端点号范围为0~15,但所有USB设备都需要实现默认的控制方法(货架必然至少有一层,如果某个货物没有指定的货架层,就约定上架到最底层),它使用端点0作为输入与输出端点(双向),USB主机使用端点0对USB设备进行初始化,因为USB设备刚与主机连接时(还没有完成总线枚举之前),主机还并不清楚该USB设备支持哪些端点。换句话说,其他(非0)端点只有在USB设备被初始化后才可以使用,如图11.4所示。

图11.4 端点的方向

其二,主机会给每个 端点 分配一定的资源。我们已经提过,一个仓库可以给多家超市配货,但一天24小时却是有限的,仓库对货架的操作有很多,不可能对所有货架都会花费相同的时间。如果货物销量非常好,仓库就花更多的时间对所在的货架。换个角度来讲,销量好的货物所在的货架也需要更多的时间去打理,而其他销量不太好或很差的货物所在的货架,一个月只需要打理一次就已然足够了。

端点 使用也是同样的道理,不同应用场合对 端点 的要求也会不一样。例如,有时关注数据传输是否正确,有时侧重数据处理的及时性,有些可能更关注传输速度,另外有些可能需要同步传输,这些对 端点 传输数据的要求就是 传输类型 ,而主机给不同类型的端点(对应不同的传输类型)分配的带宽是不一样的,如图11.5所示。

假设主机连接了多个设备,并且都在同时进行数据传输,如果你要求传输的数据延迟不可超过一定时间,那么主机就会每隔一段固定的时间对 端点 进行查询与操作,即便多个设备的端点都有数据传输的需求,但主机仍会优先将总线带宽分配给你。相反,如果你只要求传输完大量数据,对时间与速度都没有要求,那么主机则会在带宽不够用的情况下降低你的传输优先级,优先满足对传输时间有特殊要求的数据,这就是定义传输类型的意义所在,具体细节将在端点描述符中详细讨论。

图11.5 给端点分配的资源

总体上, 端点 的特性决定了其与主机进行传输的类型。一个端点具有 总线访问频率的要求(Bus Access Frequency/Latency Requirement) 总线延迟要求 带宽要求(Bandwidth Requirement) 端点号 对错误处理的要求(Error Handling Behavior Requirements) 能接收或发送的包的最大长度 端点的传输类型、端点与主机的数据传输方向 等特性。你(USB设备的设计者)可以决定设备中每个端点的能力,一旦为该端点建立了一个通信管道,那么这个管道的绝大多数特性通常也就固定下来了,一直到该管道被取消为止。

有些人可能会想:为什么要使用多个端点呢?所有的项目都使用一个端点不也可以完成更多端点实现的功能,相当于一个8层货架展示的8种货物,使用一个更大的货架层同样也可以实现。你的想法并没有错,只不过使用多个端点能够更方便地进行通信管理。

好的,端点的讨论至此已经结束,我们再来讨论一下接口,其实很简单,每一个货架就相当于一个“接口”,它可以包含一个或多个货架层。换句话说,多个端点的集合就是“接口”。这里的“接口”也是逻辑上的概念(不是指物理上看得见的接插件),将“接口”视为功能会更容易理解一些。例如,货架A用来展示货物A,货架B用来展示货物B,这就是功能的不同。从USB主机的角度来看,USB设备接口就是多个端点的集合,图11.6清晰展示了USB通信流。

图11.6 USB通信流

最后讨论一下超市的货架规划。通常负责人会按照不同类别的货物将超市空间进行规划,每个空间都包含若干个货架(以下简称为“货架群”)。超市负责人的经营理念不一样,每个空间的货架群配置也会不尽相同。同样的道理,USB规范定义的“配置”就是一个或多个“接口”的集合,功能复杂的USB设备可以具有多个接口。例如,USB扬声器可以包含一个音频接口以及旋钮和按钮对应的接口。仅使用一个接口可以实现多个接口完成的功能吗?理论上也是可以的,关键取决于具体的实现方法。

我们可以用图11.7来表示超市与设备的关系。

图11.7 超市与设备的关系

很明显,一家超市可以包含多个货架群,每个货架群都可以包含一个或多个货架,每个货架又可以包含一个或多个货架层,所以超市、货架群、货架、货架层之间属于包含关系。同样,设备通常包含一个或多个配置,配置通常包含一个或多个接口,而接口又包含一个或多个端点,图11.8给出了设备、配置、接口与端点之间的关系。

图11.8 设备、配置、接口与端点之间的关系 zZrVV9wIGniUlAOmU/vgi4FXm2NpwH05fLDdguIb1ea5yNgwXIr8ZbqizZmhJ0hB

点击中间区域
呼出菜单
上一章
目录
下一章
×