版权信息:
版权归smilestone322所有,保留所有权利,仅用来学习,请勿用于商业用途,欢迎转载,转载请注明出处。谢谢!
1 Usb通信协议
Usb驱动程序是PC中最主要的设备驱动程序,usb总线协议比PCI总线协议复杂,但是对于我们usb驱动开发者来说,并需要对usb通信协议每个东东都搞清楚,比如usb物理层协议,usb传输层协议等等,只要了解即可。
1.1)usb总线协议
USB最多支持127个外设,但是考虑到Hub的情况,连接的外设没有这么多,因为Hub也当成了外设,对于每个PC都有一个或多个Host控制器设备,该Host控制器和一个根Hub作为一个整体,跟Hub下可以连接多个Hub,这样形成级连设置,Host分别有2种驱动,一种是1.0,另一种是2.0,分别对应着USB协议1.0和USB协议2.0。虽然存在Hub,但是对于用户来说,这些都是透明的,就好象USB设备和直接连接到USB Host控制器上一样。当USB设备插入和删除都会发电信号给系统,这样可以枚举USB设备。
USB 的连接模式是Host和Devcie的连接模式,所有的请求必须是Host向Device发出,这就使Host端设计相对复杂,而Device端设计相对简单。在USB的通信中,可以看成是一个分层的协议。分为三个层次,即最底层USB总线接口层、USB设备层、功能通信层,如图1-1所示。
图1 usb逻辑和控制图
对于每个USB设备,都有一个或者多个的接口(Interface),每个Interface都有多个端点(Endpoints),每个端点通过管道(Pipes)和USB Host控制器连接。每个USB设备都会有一个特殊的端点,即Endpoint0,它负责传输设备的描述信息,同时也负责传输PC与设备之间的控制信息,如图1-2所示:
图1-2 USB 管道与端点
现在讲讲usb传输吧,Usb传输一般分为3个部分:令牌传输,数据传输,握手阶段,传输的方式有4种:控制传输,这个是传输控制信息,Bulk传输,这个是批处理传输,中断传输,同步传输。
对于控制传输来说,一般采用端点0进行控制传输,主要用来配置设备、获取设备信息、发送命令或者获取设备的状态报告。总线驱动程序为它保留了10%的带宽,使得控制传输能在1ms内完成。
对于控制端点:
端点所传的数据净负荷的长度必须小于或等于其wMaxPacketSize,当传输的数据大于wMaxPacketSize时,必须分多次进行传送。除最后一次传输外,其它都应达到最大长度。最后一次传输含最后剩下的数据。控制传送的数据阶段结束的标志如下:
·已传了由Setup阶段指定的数据量。
·传了一个数据包,它的长度为0或它的数据区长度小于最大长度。
中断传输:主要用来以一个固定的速度传送少量的数据,对于中断传输,系统会预留带宽。
Bulk传输:用来传送大量的数据,数据传送是可靠的,当总线上的空间不足以发送整个批量包时,会划分成多个包传送。缺点:是当有多个usb设备时,bulk传输,由于系统没有给他预留usb带宽,有可能被其它以中断或同步传输的usb设备抢占带宽,造成bulk传输的设备不能正常使用。
Bulk传输也像控制传输一样,端点所传的数据净负荷的长度必须小于或等于其wMaxPacketSize,当传输的数据大于wMaxPacketSize时,必须分多次进行传送。除最后一次传输外,其它都应达到最大长度。最后一次传输含最后剩下的数据。控制传送的数据阶段结束的标志如下:
·已传了由bulk传输指定的数据量。
·传了一个数据包,它的长度为0或它的数据区长度小于最大长度。
这里要注意了,硬件设计的时候,主要必须能给PC端传送short包,什么意思呢,因为usb bulk传输结束的条件有2个,当数据没有全部传送成功时,我们可以根据short包或zero包来判断这次传输的结束。
同步传输:也叫等时传输,用来传送大量不可靠传输,不保证数据的到达,但能保证恒定的数据流,一般用于摄像机等视频设备的数据采集。
Usb协议中除了上面的讲解的内容,还有usb描述符,usb描述符包括,usb设备描述符,usb配置描述符,usb接口描述符和usb端点描述符。Usb设备描述符长度为18个字节,主要用来枚举设备使用,其中重要的字节是PID/VID,因为它可以用来枚举设备。还有一个字节不得不将,也是面试时,考官容易考试的,SerialNumber字段,各位看官看好了,估计你不知道这个字节的作用了吧。你做usb驱动有过在一个usb口安装usb驱动后,到另外一个口还提示你安装驱动的经验吗,呵呵,这就是SerialNumber了,如何设置,就不说了。各位看官自己研究吧。
Usb配置描述符和usb接口描述符都不重点讲解了,它们的长度都是9个字节,下面在讲讲usb端点描述符,usb端点描符的长度为7个字节,其中重要的字段为端点地址,如果是0x82表示端点是一个端点号为2的IN端点,而0x02表示一个端点号为2的OUT端点。还有bmAttributes的低2位表示端点的类型,如0表示控制端点,而1表示同步端点,2表示bulk端点,3表示中断端点。还有一个就是wMaxpacketsize,不用我说,大家看到这个知道它表示什么意思了,对了,就是表示该端点最大的传输size,如果总的传输大小比这个大,就必须分割成多个块进行传输,每个块的size为wMaxpacketsize,最后剩余的数据放在最后一个块里面输出。剩下的就是bInterval字节的,它只对同步和中断端点有效,对于中断端点,该值得范围为1-255ms,代表2次巡检间的最大时间间隔。对于同步端点,固定为1,表示每隔一个帧周期(1ms)都应该巡检。
谢谢 未完待续!!!!