分享

usb枚举过程

 WUCANADA 2013-10-05

2440USB HOST进行初始化完毕(主要包括对符合OHCI规范的寄存器的初始化总线复位、中断使能、清除中断标志、电源管理、内存指针寄存器的初始化,各种数据结构的初始化等),等待USB设备的插入,当2440检测到有设备插入,就要对设备进行枚举了。那么为什么要对设备进行枚举呢?起始枚举就相当于主机和设备建立连接的过程(接头)HostDevice询问一些东西,Device将自身的设备类型,如何进行通信报告给Host,这样Host就知道怎么着对Device进行操作了。

枚举的过程实际上用到而且只用到了总线的“控制传输(Control Transfer)”的传输方式。这种传输方式通常用于配置/命令/状态等情形,其中的设置操作setup和状态操作status过程的数据包具有USB协议定义的数据结构,因此,控制传输只能通过消息管道进行。

一个完整的控制传输包括三个过程:1.建立连接    2.数据过程(可选)         3.状态过程

建立连接的过程都是有Host发起,它开始于一个Setup令牌包,后面紧跟一个DATA0包。如果是控制输入传输,数据过程则为输入数据,若是控制输出传输,则数据过程是输出数据。

数据过程的可选型是指设置过程需要指定数据长度,如果指定为0,则没有数据过程。状态过程跟在数据过程之后,状态过程恰好和数据过程的数据传输方向相反,因为此阶段主要是用来确认之前两阶段的所有数据都已经正确传输了。

       好了,下面就结合我的这个实例来看看枚举的详细过程:

       1.控制2440U盘发送第一个Setup包,内容是80 06 00 01 00 00 08 00其中最后的0008表示得到DEVICE_DCESCRIPTOR的前8个字节,因为这个包的主要目的是要获得USB Device中端点0的最大包的大小(第8个字节),所以只需要8个字节就可以了。USB Device返回的设备标识符为12 01 10 01 00 00 00 40,下面我们需要对0x40记录下来,将其放到Endpoint Descriptor数据结构的DWORD0MPSbit16~bit32)块中去。

       2.接下来2440发送第二个Setup包,内容是00 05 01 00 00 00 00 00这一个次的作用是为USB设备分配地址(相当于SD卡中的RCA)。如果USB Device接收并接受了此地址设置包,会返回一个长度为0的数据包。Host接收到长度为0的状态包之后就会返回一个ACKDeviceDevice再接收到这个ACK之后,就可以启用新地址了。这样Device就得到了一个唯一的设备地址,作为主机通信的唯一表示。

3.发送第三个Setup包,内容是80 06 00 02 00 00 09 00这次是为了获取配置描述符集合的大小,此位位于读回数据的第三个字节。U盘返回的数据为09 02 20 00 01 01 00 80 32即描述符集合总大小为0x20

4.发送第四个Setup包,内容是80 06 00 02 00 00 09 00,和上次不同的仅仅是,这次要读回来的数据是整个配置描述符区域。U盘返回来的数据是09 02 20 00 01 01 00 80 32 09 04 00 00 02 08 06 50 00 07 05 82 02 40 00 00 07 05 02 02 40 00 00

这时候我们就可以知道该设备是什么类型的设备,支持什么样的操作了。

上述这两个过程也有的程序就是直接读取0xff个字符大小,当然同样可以达到读回设备描述符集合的目的。

至此,我们已经得到了所需要的设备信息,之后就可以对设备进行配置了。

5.向设备发送第五个Setup包,数据为00 09 01 00 00 00 00 00USB Device返回一个长度为0的数据包,表明数据正确接收。

至此,USB的枚举过程就完成了。

以上是我的理解,不知道有没有什么问题。有什么问题希望大家指出,谢谢!

附:USB1.1规范中对枚举过程的说明
9.1.2 Bus Enumeration
When a USB device is attached to or removed from the USB, the host uses a process known as bus
enumeration to identify and manage the device state changes necessary. When a USB device is attached to
a powered port, the following actions are taken:
1. The hub to which the USB device is now attached informs the host of the event via a reply on its status
change pipe (refer to Section 11.13.3 for more information). At this point, the USB device is in the
Powered state and the port to which it is attached is disabled.
2. The host determines the exact nature of the change by querying the hub.
3. Now that the host knows the port to which the new device has been attached, the host then waits for at
least 100 ms to allow completion of an insertion process and for power at the device to become stable.
The host then issues a port enable and reset command to that port. Refer to Section 7.1.7.1 and Figure
7-19 for sequence of events and timings of connection through device reset.
4. The hub maintains the reset signal to that port for 10 ms (See Section 11.5.1.5). When the reset signal
is released, the port has been enabled. The USB device is now in the Default state and can draw no
more than 100mA from VBUS. All of its registers and state have been reset and it answers to the
default address.
5. The host assigns a unique address to the USB device, moving the device to the Address state.
6. Before the USB device receives a unique address, its Default Control Pipe is still accessible via the
default address. The host reads the device descriptor to determine what actual maximum data payload
size this USB device’s default pipe can use.
7. The host reads the configuration information from the device by reading each configuration zero to
n-1, where n is the number of configurations. This process may take several milliseconds to complete.
8. Based on the configuration information and how the USB device will be used, the host assigns a
configuration value to the device. The device is now in the Configured state and all of the endpoints in
this configuration have taken on their described characteristics. The USB device may now draw the
amount of VBUS power described in its descriptor for the selected configuration. From the device’s
point of view it is now ready for use.
When the USB device is removed, the hub again sends a notification to the host. Detaching a device
disables the port to which it had been attached. Upon receiving the detach notification, the host will update
its local topological information.



当USB设备插拔时候,主机会使用称为总线枚举的过程来识别和管理设备。当USB设备插入端口时,主机所要作的事情是:
(1) USB设备通过所连接的集线器向主机报告连接事件,此时,设备处于上电的状态,而连接的端口处于禁止的状态。
(2) 主机通过查询集线器端口确定变化的类型。
(3) 主机等待100ms让设备的电源变得稳定,然后向端口发出复位命令。
(4) 集线器在该端口执行复位处理,复位完成后激活该端口。此时,USB设备处于默认状态。
(5) 主机给设备分配一个唯一的地址,使设备进入寻址状态。
(6) 在USB设备接受到唯一的地址前,主机仍可以以默认控制管道和地址访问设备。主机读出设备描述符,确定设备默认管道的实际最大数据的有效负载。
(7) 通过读0~n-1个配置,主机可查找到设备的配置。
(8) 主机给设备分配一个配置值,使设备处于配置状态。从设备的观点来看,它已经可以使用了。

6.      USB的枚举过程

内核辅助线程khubd用来监视与该集线器连接的所有端口,通常情况下,该线程处于休眠状态,当集线器驱动程序检测到USB端口状态变化后,该内核线程立马唤醒。

USB的枚举过程:USB的枚举过程是热插拔USB设备的起始步骤,该过程中,主机控制器获取设备的相关信息并配置好设备,集线器驱动程序负责该枚举过程。枚举过程主要分如下几步:

Step1:根集线器报告插入设备导致的端口电流变化,集线器驱动程序检测到这一状态变化后,唤醒khubd线程。

Step2:khubd识别出电流变化的那个端口

Step3:khubd通过给控制端点0发送控制URB来实现从1-127中选出一个数作为插入设备的批量端点

Step4:khubd利用端口0使用的控制URB从插入的设备那里获得设备描述符,然后获得配置描述符,并选择一个合适的。

Step5:khubd请求USB核心把对应的客户驱动程序和该USB设备挂钩。

主机控制器驱动程序负责USB总线通信基本的职责
} 处理USB状态。管理状态并报告状态信息
} 数据串行/解串行,将设备申请传输的数据转换成比特流
} 生成frame或microframe
} 处理数据传输的请求
} 处理USB总线协议
} 进行差错检测和控制
} 处理能源管理请求,把总线置为suspended状态以及响应wakeup事件
} 提供root hub功能,让设备可以连接到主机控制器

usbcore注册了USB总线,USB文件系统,USB Hub以及USB的设备驱动usb generic driver等。

数据包分Token, Data, Handshake, Special,四种包有自己的数据组织方式
usb_hub_init()开启一个名为"khubd"的内核线程
hub_port_connect_change()是核心函数,以端口发现有新的USB设备插入为例,USB Hub为USB设备做了以下几步重要的工作,注意这里所谓的USB设备是指插入USB Hub的外接USB设备(包括Hub和Functions),接下来Hub都在为USB设备服务。

1) usb_alloc_dev() 为USB设备申请一个sturct usb_device结构。

2) usb_set_device_state() 设置USB设备状态为上电状态。(硬件上设备已进入powered状态)。

3) choose_address() 为USB设备选择一个地址,利用一个轮询算法为设备从0-127里选择一个地址号。

4) hub_port_init() 端口初始化,实质就是获取设备描述符device descriptor。

5) usb_get_status() 这个有点特殊,它是专门给Hub又外接Hub而准备的。

6) usb_new_device() 这时USB设备已经进入了Configured状态,调用device_add()在USB总线上寻找驱动,若匹配成功,则加载对应的驱动程序。

OTG的传输协议有三类 - ADP,SRP,HNP。

    ADP(Attach Detection Protocol) 当USB总线上没有供电时,ADP允许OTG设备或USB设备决定连接状态。
    SRP(Session Request Protocol) 允许从设备也可以控制主设备。
    HNP(Host Negotiation Protocol) 允许两个设备互换主从角色。

枚举的过程实际上用到而且只用到了总线的“控制传输(Control Transfer)”的传输方式。这种传输方式通常用于配置/命令/状态等情形,其中的设置操作setup和状态操作status过程的数据包具有USB协议定义的数据结构,因此,控制传输只能通过消息管道进行。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多