欢迎大家多提宝贵意见,如果对大家有所帮助,不胜荣幸:)

USB部分笔记整理

上一篇 / 下一篇  2008-05-05 16:45:29 / 个人分类:学习笔记

一、      

     本章将对USB的2.0标准和上位机下位机通讯标准,各部分的结构组成和实现情况进行整理。当时做项目涉及到这部分的知识,所以看了大量的资料,这部分的东西蛮多的,这里只是总结出对我的项目有用的部分。

二、

        USB软件系统架构主要分为主机驱动程序和固件程序开发两大部分:

主机控制器是主机物理层

USB协议软件包括:主机控制器驱动程序(HCD

USB总线驱动程序(USBD

     功能:对主机控制器硬件的管理

                  对系统总线带宽管理

                  对四种USB传输方式的管理

                  USB设备的配置和管理

                  对客户端驱动程序的管理和维护

 

客户端驱动程序功能:实现对特定设备功能的管理和配置等操作

                   它不能直接访问设备的硬件,需通过主机端的协议软件和主机控制器与设备接口进行数据通信

 

USB总线接口负责实现其和主机间数据的物理传输

USB逻辑设备负责处理USB总线接口与功能单元各端点之间的数据传输

功能接口部件负责实现USB设备所特定的功能

 

注:1USB协议软件在主机系统内部已集成,其中USBD为所有USB总线设备提供了一个抽象模型,并且有所有客户端驱动程序预先定义的接口,即所有设备类型都采用相同的核心驱动程序模型。如果客户端驱动程序需要我们自己开发的情况,开发工作就是以USBD相关接口为基础。

       2、客户端驱动程序分为标准设备驱动和自定义设备驱动,前者如键盘鼠标打印机等设备驱动已经包含在相应的系统软件里,其它的设备开发就需要我们自己做客户端驱动程序,或者厂商会提供相关实例程序作参考。

3、应用程序主机方面可以通过高级语言构筑功能强大的图形界面程序,去调用驱动程序中各种繁琐的和细微的功能。Windows提供API函数来启用应用程序与客户端驱动程序之间的通信。应用程序不需要知道USB细节就可与USB通信。

三、上位机部分

A系统上电识别USB设备过程

首先是主机对设备的枚举,该过程是USB协议软件自动完成的。当USB连接时,主机将使用缺省控制管道向其发出标准USB设备请求,为识别设备,USB设备部分需要通过编写固件代码或者芯片内部自动实现响应请求功能。主机部分需提供相应设备驱动程序和INF文件。该部分资源芯片厂商会提供实例程序和相应的INF文件,可在此基础上进行修改。

详细过程分为以下六步:

1)USB设备连接至某集线器的下行端口,集线器马上会提供电源。

2)集线器监视其D-D+线上的电压,当达到一定值时,认为有设备连接。

3)集线器使用中断输入管道向主机报告其USB设备的连接,主机会向集线器发出GetPortStatus请求以了解更多信息。

4)为确保连接的机械特性和电气特性稳定,主机至少要等待100msUSB设备在接收到任何请求前,其电源已经稳定工作了100ms

5)主机向集线器发出SetPortStatus请求,以复位这个USB设备。并通过检测USB设备连接在D-D+上的上拉电阻来确定设备的传输速度:低速、全速或高速。

6)为确保USB设备复位操作的完成,主机需提供10ms的复位恢复时间。

B自动枚举并配置设备

USB总线驱动程序有一个专门的功能:集线器驱动程序,它负责监视集线器下行端口状态的变化,发现USB设备连接后,就会使用非USB主机软件和USB设备驱动程序识别和配置设备。

配置分为以下三种:

1设备配置:建立设备的所有USB参数,并为其分配总线资源。该操作通过设置USB设备的配置值完成。

2 USB配置:客户软件获取USB设备的管道信息,如传输速率、传输类型等,已与该设备进行正确的数据传输。

3功能配置:从USB的角度来看,在设备配置和USB配置完成后,客户软件就可以和指定的设备通信了,但有些USB设备还需要设备类或供应商的特定设置操作。

 

设备配置过程首先读取USB设备的设备描述符,然后请求每种配置的配置信息,最后USB设备驱动程序会从中选择一个作为当前配置。

设备配置之后,配置软件会把USB设备接口信息返回给客户软件,使其拥有一组可进行USB数据传输的管道,USB配置对这些管道进行初始化,如设置服务间隔、最大数据包长度等。之后界面应用程序就可以使用这些管道和USB设备的功能单元进行数据传输了。

详细过程分为以下六步:

7)主机向设备发出GetDescriptor(Device)请求,以取得缺省管道所支持的最大数据包长度。该长度包含在设备描述符bMaxPacketSize0字段中,其地址偏移量为7,所以这时主机只需要读取该描述符的前8字节。

8)主机向设备发出SetAddress请求,为其分配一个唯一的设备地址。之后它不再使用缺省设备地址,而将使用这个新的地址和主机进行通信,该地址在USB设备断开或系统断电时丢失。

9)主机使用新地址向设备发出GetDescriptor(Device)请求,并读取其设备描述符的全部字段,以了解该设备的总体信息,如供应商ID,产品ID等。

10)             主机向设备循环发出GetDescriptor(Configuration)请求,以取得其全部配置信息(其个数由设备描述符bNumConfiguration字段指出),包括配置描述符、接口描述符、端点描述符以及各种设备类定义描述符和供应商自定义描述符等。

11)主机根据USB设备的配置信息,如供应商ID,产品ID等,寻找到主机中相应INF文件(标识出设备驱动程序名称和位置的文件)为其选择一个合适的USB设备驱动程序。它通常需要由开发人员自己编写,但有时也可以使用设备类或供应商提供的通用驱动程序。

12)在加载了USB设备驱动程序后,主机将发出SetConfiguration(x)请求为该设备选择一个合适的配置。为USB设备选择一个配置值、一个接口和一个可替换设置值,并确定相应端点特性,如所支持的传输类型,最大数据包常数等。USB系统软件会判断当前USB是否有足够的帧时间来满足该配置的总线带宽请求,不满足,主机尝试使用其他配置值。满足,配置成功。USB设备可从USB总线获取其配置描述符中所指出的最大总线电流,并可以和客户软件进行数据传输。

 

四、外设部分: 

固件部分需要一子函数负责处理USB设备用到的所有标准请求和厂商自定义请求,在内核正确接收到SETUP令牌包之后,他会将其8字节的SETUP数据复制到SETUPDAT寄存器。所以该函数使用switch语句判断SETUPDAT[1]中包含设备请求的类型,以对其进行分解处理。一步步分析令牌中请求,并调用相关子函数,用来完成响应主机命令的任务。

另外固件程序还需要功能子函数响应外界中断命令和各种功能的实现任务。

五、主机识别USB海量存储器的配置

    USB海量存储设备规范还定义了几种其支持的工业传输协议,这些协议及对应的代码如下表所示。海量存储设备规范支持的工业传输协议在接口描述符中定义。

 

U盘系统组成框图:

 海量存储器设备类规范是USB总线规范中的一个子类,在设备的枚举阶段,USB主机是通过获得USB设备的描述符信息来获知设备的类型的。海量存储设备的USB描述符包含了海量存储设备的基本信息。以采用Bulk-Only传输方式的海量存储设备为例,介绍海量存储设备描述符的定义。和其他USB设备一样,海量存储设备也必须具有以下几种描述符:设备描述符;配置描述符;接口描述符;端口描述符。

六、主机与海量存储器通信规范

其中各字节意义:

 

CSW状态字:

 

 

 

 

注:该图表做得有点难以理解,最好结合测试工具Bus Hound测得的总线传输数据的组成结构进行分析。

 

 

 

注:该份命令列表里和代码有一定的出入,最好也结合代码和测试工具Bus Hound测得的总线传输数据的组成结构进行认真分析。

结合下图和SCSI指令表看看有什么出入:

 

 


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-09-25  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 2892
  • 日志数: 31
  • 建立时间: 2008-04-18
  • 更新时间: 2008-07-08

RSS订阅

Open Toolbar