linux那些事之我是usb(一)

原文地址:http://hi.baidu.com/yypaubqokmcptyr/item/eeb04018ae0cc8fd64eabf2e


所有与USB 相关的代码都在drivers/usb 目录下面。上面的Kconfig 文件说的很清楚,ehci-hcd 模块支持的是USB2.0 控制器的高速模式,它本身并不支持全速或低速模式,对连接上的USB1.1 设备的支持,是通过ohci-hcd 或 uhci-hcd 模块。如果我们只配置了EHCI,就没有办法使用usb 的鼠标键盘。如果你碰到了usb 键盘或鼠标不能用的情况,很可能就是因为配置EHCI 的同时没有去配置OHCI 或 UHCI。

USB 总线是一种轮询方式的总线。协议规定所有的数据传输都必须由主机发起,host controller 初始化所有的数据传输,各种设备紧紧围绕在主机周围。

USB 通信最基本的形式是通过USB 设备里一个叫endpoint 的东东,而主机和endpoint 之间的数据传输是通过pipe。endpoint 就是通信的发送或者接收点,你要发送数据,那你只要把数据发送到正确的端点那里就可以了。端点也是有方向的,从usb 主机到设备称为 out 端点,从设备到主机称为in 端点。

严格来说,管道的一端应该是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 DataTransfers),等时传输(Isochronous Data Transfers)。控制传输用来控制对USB 设备不同部分的访问,通常用于配置设备,获取设备信息,发送命令到设备,或者获取设备的状态报告。总之就是用来传送控制信息的,每个USB 设备都会有一个endpoint 0 的控制端点,内核里的USB core 使用它在设备插入时进行设备的配置。

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

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

等时传输同样用来传输大量的数据,但并不保证数据是否到达,以稳定的速率发送和接收实时的信息,对传送延迟非常敏感。显然是用于音频和视频一类的设备,这类设备期望能够有个比较稳定的数据流。



图里主要显示了四个层次,USB 物理设备(USB Physical Device)、客户软件(Client SW)、USB 系统软件(USB System SW)以及USB Host Controller。Host Controller 已经说过了,系统软件就是操作系统里用来支持USB 的部分,像咱们的usb core,还有各种设备驱动等等,客户软件么,就是上层应用了。

只是现在,作为一个读了协议的普通人,我要说并不完全是这样。上面的系统软件,只表示了系统里支持USB 的部分,也就是系统相关设备无关的部分,相对于咱们的linux 来说,就是usb core,并不包括所谓的各种设备驱动。而客户软件则指设备相关,也就是对应于特定设备的部分,你的USB 键盘驱动、触摸屏驱动什么的都在这儿。

主机这边就分这三层,Host Controller 看似在最低层,却掌控着整个USB 的通信,你的USB 设备要想发挥作用,首先得获得它的批准。
USB 物理设备这边看着好像也分了三层,其实我们可以把它们看成一样的东东,只是为了对应了主机这边的不同层次,Host Controller 看到的是一个个hub 还有hub 上的USB device,而在系统软件的眼里没那么多道道儿,hub 还有各种设备什么的都是一个个的 usb 逻辑设备,客户软件看到的是设备提供的功能。

真实的数据流只发生在Host Controller 和设备的Bus Interface 之间,其它的都是逻辑上的,也就说是虚的,如果谁对我们说什么什么是逻辑上存在的,那它肯定就是虚的。各种 USB 设备提供的功能是不同的,但是面向主机的Bus Interface 却是一致的,所以,那些设备本身还必须要提供用来确认自己身份的信息,这些信息里有些是共有的,有些是个别设备特有的。

在USB 的世界里,不仅仅有compound device,还有composite device。compound device 是那些将hub 和连在hub 上的设备封装在一起所组成的设备,而composite device 是包含彼此独立的多个接口的设备。从主机的角度看,一个compound device 和单独的一个hub 然后连接了多个USB 设备是一样的,它里面包含的hub 和各个设备都会有自己独立的地址,而一个composite device 里不管具有多少接口,它都只有一个地址。

上面都是站在 host controller 的层次上,说的是实实在在的物理拓扑,对于系统软件来说,没有这么复杂,所有的hub 和设备都被看作是一个个的逻辑设备,好像它们本来就直接连接在root hub 上一样。

一个 USB 逻辑设备就是一群端点(endpoint)的集合,它与主机之间的通信发生在主机上的一个缓冲区和设备上的一个端点之间,通过管道来传输数据。意思就是管道的一端是主机上的一个缓冲区,一端是设备上的端点。



图里的 Interface 是怎么回事?这里先简单说说吧,反正代码里会不停的遇到再遇到。USB端点被捆绑为接口(Interface),一个接口代表一个基本功能。有的设备具有多个接口,像USB 扬声器就包括一个键盘接口和一个音频流接口。在内核里一个接口要对应一个驱动程序,USB 扬声器在linux 里就需要两个不同的驱动程序。到目前为止,可以这么说,一个设备可以包括多个接口,一个接口可以具有多个端点,当然以后我们会发现并不仅仅止于此。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值