zoukankan      html  css  js  c++  java
  • usb基础知识以及枚举过程介绍

    一个USB设备有一个设备描述符,设备描述符里面决定了该设备有多少种配置,
    每种配置描述符对应着配置描述符;而在配置描述符中又定义了该配置里面有多少个接口,
    每个接口有对应的接口描述符;在接口描述符里面又定义了该接口有多少个端点,
    每个端点对应一个端点描述符;端点描述符定义了端点的大小,类型等等。
    由此我们可以看出,USB的描述符之间的关系是一层一层的,
    最上一层是设备描述符,
    下面是配置描述符,再下面是接口描述符,
    再下面是端点描述符。在获取描述符时,
    先获取设备描述符,
    然后再获取配置描述符,
    根据配置描述符中的配置集合长度,
    一次将配置描述符、接口描述符、端点描述符一起一次读回。
    其中可能还会有获取设备序列号,厂商字符串,产品字符串等

    usb数据发送方式:

    LDDR3中详细介绍了usb数据发送的几种方式为: 控制传输、中断传输、同步传输、批量传输。

    1、控制传输:

    由主机发起,丛机响应,多用于命令、传输较短的数据。

    2、中断传输:

    中断可想而知,需要高效实时响应的传输,要求数据简单、精悍,数据传输过程中低延迟等。适用于鼠标类、键盘类。

    3、同步传输

    传输过程中对数据同步要求交过,所以必须适用定期批量发送或者接收数据的设备,例如媒体播放设备,多考虑数据能定时发送或者接收到,不用考虑

    数据的应答机制,即不考虑发起方是否需要知道数据发送是否成功。因此在usb数据发送过程中是不需要握手阶段的
    4、批量传输

    非周期、批量的传输,在每传输一批包后,需要有握手阶段,所以是稳定、可靠的传输,但是容易出现延时的问题。

    usb数据发送流程:

    a) 令牌阶段:主机发送请求,USB设备依据请求PID来判断IN或OUT传输
    b) 数据传输阶段:依据令牌阶段的IN或OUT传输,来决定数据传输为DATA0或DATA1来进行数据传输
    c) 握手阶段:接收信息的一方发送ACK信号以表示接收成功;若为NAK,表示发送失败;STALL表示不可预知的错误

    usb枚举过程:需要记住的一点是枚举只能是由主设备端发起

    1、usb接口检测到设备插入,通过D+和D-查分电压检测得到,产生一个中断。
      连接了设备的 HUB 在 HOST 查询其状态改变端点 时返回对应的 bitmap,告知HOST 某个PORT状态发生了改变。
      主机向 HUB 查询该PORT的状态,得知有设备连接,并知道了该设备的基本特性。
      主机等待(至少 100mS)设备上电稳定,然后向 HUB 发送请求,复位并使能该PORT。
      HUB执行PORT复位操作,复位完成后该PORT就使能了。现在设备进入到defalut状态,可以从Vbus获取不超过 100mA 的电流。主机可以通过0地址与其通讯。

    2、主机通过0地址向该设备发送get_device_descriptor标准请求,获取设备的描述符。目的是取得却缺省控制管道所支持的最大数据包长度,
      该长度包含在设备描述符的bMaxPacketSize0字段中,其地址偏移量为7,主机读取64字节,但实际不一定能读到,
      因为这时候还不知道一次能读取的最大长度,但是肯定能读到前8个字节,因为可能的值为(8,16,32,64).

    3、主机再次向 HUB 发送请求,复位该PORT。

    4、 主机通过标准请求 set_address给设备分配地址。

    5、主机通过新地址向设备发送 get_device_descriptor标准请求,获取设备的描述符。

    6、 主机通过新地址向设备发送其他 get_configuration请求,获取设备的配置描述符。

    7、 根据配置描述符的wTotalLength字段(地址偏移为2,总共两个字节,即偏移地址3表示高8位,偏移地址2表示低8位),
      表示该配置描述符及其包含的接口描述符、端点描述符和供应商描述等的总长度。
      英文原文:Total length of data returned for thisconfiguration.Includes the combined lengthof all descriptors (configuration, interface,endpoint,
      and class- or vendor-specific)returned for this configuration.再次发送get_configuration请求,获取数据长度为wTotalLength。

    8、根据配置信息,主机选择合适配置,通过 set_configuration请求对设备而进行配置。这时设备方可正常使用。

  • 相关阅读:
    今天整理了一下博客文章
    让我们猜猜明天凌晨一点NASA会有什么重大消息公布?
    微软2010 PDC Party郑州社区行
    记一次Shiro反序列化到远程桌面
    从公有云到渗透进内网漫游
    华为云CTF cloud非预期解之k8s渗透实战
    记一次任意文件下载到getshell
    记一次失败的实战渗透
    Subversion for Windows 安装配置
    使用Fiddler2录制HTTP操作脚本
  • 原文地址:https://www.cnblogs.com/haoxing990/p/8911045.html
Copyright © 2011-2022 走看看