zoukankan      html  css  js  c++  java
  • 果壳中的USB(6)USB请求

    Setup 包

    每个 USB 设备都必须响应默认管道上的 Setup 包。Setup 包用于设备的检测和配置,并执行一些常用功能,例如设置 USB 设备的地址,请求设备的描述符或检查端点的状态。
     
    符合 USB 规范的主机希望所有请求最多在 5 秒内得到处理。它还为特定请求指定了更严格的时间规定:
    • 不包含数据阶段(data stage)的标准设备请求必须在 50 毫秒内完成。
    • 包含数据阶段的标准设备请求必须在请求后 500毫秒 开始返回数据。(1)每个数据包必须在成功传输前一个包的 500毫秒内发送。(2)状态阶段(status stage)必须在最后一个数据包传输后的 50 毫秒内完成。
    • SetAddress 命令(该命令包含数据阶段)必须在 50ms 内处理命令并返回状态。在发送下一个请求之前,设备将有 2 毫秒的时间更改地址。
     
    即使对于最慢的设备,这些超时时间也是可以接受的,但是对于调试来说增加了限制。50ms 的时间并不能在 9600bps 的异步串行端口上发送多少字符数据,也没有提供在线调试器/仿真器(In Circuit Debugger/Emulator)单步执行或中断执行以检查内部寄存器的功能。所以 USB 的调试需要使用迥异于其他微控制器的调试方法。
    附:随便翻阅XP DDK,可能会注意到主机控制器驱动程序现在具有一个 USBUSER_OP_SEND_ONE_PACKET 命令,该命令有如下注释,“此 API 被 USB 事务传输工具用来实现 ‘单步调试(single step)’”。尽管尚未发布这种工具,但我们希望能很快看到它。
     
    每个请求都以一个 8 字节长的 Setup 包开始,该包具有以下格式:
    Offset Field Size Value Description
    0 bmRequestType 1 Bit-Map D7 Data Phase Transfer Direction
    0 = Host to Device
    1 = Device to Host
    D6..5 Type
    0 = Standard
    1 = Class
    2 = Vendor
    3 = Reserved
    D4..0 Recipient
    0 = Device
    1 = Interface
    2 = Endpoint
    3 = Other
    4..31 = Reserved
    1 bRequest 1 Value

    Request

    2 wValue 2 Value

    Value

    4 wIndex 2 Index or Offset

    Index

    6 wLength 2 Count

    Number of bytes to transfer if there is a data phase

     
    bmRequestType 字段确定请求的方向,请求的类型和指定的收件者。bRequest 字段指明正在发出的请求。解析 bmRequestType 然后根据解析结果执行不同的处理分支,如标准设备请求处理程序,标准接口请求处理程序,标准端点请求处理程序,类设备请求处理程序等等。如何解析 Setup 包可以根据您的喜好,有的选择首先解析 bRequest ,然后根据每个请求确定类型和接收者。
    标准请求(Standard requests)对所有 USB 设备来说都是通用的,接下来会详细介绍。类请求(Class requests)对于类驱动程序是通用的。例如,所有符合 HID 类的设备将具有一组通用的类特定请求,这些和通信类别的设备不同,和大容量存储类别的设备也不同。
     
    最后,是供应商自己定义的请求。这些是作为 USB 设备设计者可以指定的请求,通常因设备而异,这就看各自的想象力和实现了。

    一个通用的请求可以发送到不同的接收者,并基于接收者执行不同的功能。例如,GetStatus 这个标准请求可以发给设备,接口或端点。如果接收者是设备,它将返回一个包含远程唤醒状态以及设备是否自供电的标志;如果接收者是接口,则它始终返回零;如果接收者是端点它将返回该端点的暂停标志(halt flag)。
     

    wValue 和 wIndex 字段允许参数与请求一起传递。wLength 用于指定在存在数据阶段时要传输的字节数。

     

    标准请求

    USB 规范的 9.4 节(注:Standard Device Requests)详细说明了需要为每个 USB 设备实现的“标准设备”请求。该标准提供了按请求对项目进行分组的单个表。考虑到大多数固件将按收件者解析设置数据包,我们将选择按收件者分解请求,以简化检查和实施。
     

    标准设备请求

    当前有 8 个标准设备请求,所有请求在下表中详细说明。

    1000 0000b GET_STATUS (0x00) Zero Zero Two Device Status
    0000 0000b CLEAR_FEATURE (0x01) Feature Selector Zero Zero None
    0000 0000b SET_FEATURE (0x03) Feature Selector Zero Zero None
    0000 0000b SET_ADDRESS (0x05) Device Address Zero Zero None
    1000 0000b GET_DESCRIPTOR (0x06) Descriptor Type & Index Zero or Language ID Descriptor Length Descriptor
    0000 0000b SET_DESCRIPTOR (0x07) Descriptor Type & Index Zero or Language ID Descriptor Length Descriptor
    1000 0000b GET_CONFIGURATION (0x08) Zero Zero 1 Configuration Value
    0000 0000b SET_CONFIGURATION (0x09) Configuration Value Zero Zero None
     
    • GetStatus:发送给设备的 GetStatus 请求,设备将在数据阶段返回 2Byte 的数据,格式如下:

    D0 置位表示是自供电设备,清零表示是总线供电设备。D1 置位表示设备使能了远程唤醒功能,能够在挂起时唤醒主机。远程唤醒位可以通过 SetFeature 和 ClearFeature 设置,参数 DEVICE_REMOTE_WAKEUP (0x01)。
    • SetFeature/ClearFeature:SetFeature 和 ClearFeature 可用于设置 boolean 型的功能。指定设备作为接收者,支持的选项只有 DEVICE_REMOTE_WAKEUP 和 TEST_MODE,Test 模式允许设备到处多种条件,更多内容在 USB 规范 2.0 中详述。
    • SetAddress:SetAddress 用于枚举(enumeration)阶段为设备分配一个唯一的地址,地址在 wValue 字段中且最大值为 127。该请求特别的地方在于,直到状态阶段完成,设备才完成地址设置。其他所有请求必须在状态阶段之前完成。
    • SetDescriptor/GetDescriptor:SetDescriptor/GetDescriptor 用于返回 wValue 字段指定的描述符。一个配置描述符的请求将在一个请求事务中返回设备描述符和所有的接口、端点描述符。(1)端点描述符:不能直接通过 SetDescriptor/GetDescriptor 请求访问;(2)接口描述符:不能直接通过 SetDescriptor/GetDescriptor 请求访问;(3)字符串描述符:wIndex 中包含语言 ID,支持多语言。
    • GetConfiguration/SetConfiguration:GetConfiguration/SetConfiguration 用于请求或者获取设备当前的配置。对于 GetConfiguration 请求,将在数据阶段返回 1Byte 指示设备的状态。值为 0 意味着设备还没有完成配置,非 0 表示设备已完成配置。SetConfiguration 用于使能设备,它应该在 wValue 字段的低字节处包含 bConfigurationValue 值以选中要使能的配置。
     

    标准接口请求

    规范目前定义了 5 个标准接口请求,在下表中详细说明。有趣的是,只有两个请求执行可理解的操作。
    1000 0001b GET_STATUS (0x00) Zero Interface Two Interface Status
    0000 0001b CLEAR_FEATURE (0x01) Feature Selector Interface Zero None
    0000 0001b SET_FEATURE (0x03) Feature Selector Interface Zero None
    1000 0001b GET_INTERFACE (0x0A) Zero Interface One Alternate Interface
    0000 0001b SET_INTERFACE (0x11) Alternative Setting Interface Zero None
    • wIndex 用来指定操作的接口,格式如下:
    • GetStatus:GetStatus 用来返回接口的状态,发往接口的该请求应该返回 2Byte 数据,内容 0x00,0x00(这两个字节留着未来使用)。
    • SetFeature/ClearFeature:SetFeature 和 ClearFeature 可用于设置 boolean 型的功能。指定接口作为接收者,目前的 USB 规范 Revision 2 版本没有指定任何功能。
    • GetInterface/SetInterface:GetInterface 和 SetInterface 用来设置备用的接口,详细内容在接口描述符章节中。
     

    标准端点请求

    标准端点请求有 4 个,下表列述:
    1000 0010b GET_STATUS (0x00) Zero Endpoint Two Endpoint Status
    0000 0010b CLEAR_FEATURE (0x01) Feature Selector Endpoint Zero None
    0000 0010b SET_FEATURE (0x03) Feature Selector Endpoint Zero None
    1000 0010b SYNCH_FRAME (0x12) Zero Endpoint Two FrameNumber
    • wIndex 用来指定操作的端口和请求的方向,格式如下:
    • GetStatus:GetStatus 返回 2Byte 数据,指示端点的状态(Halted/Stalled) ,格式如下:

    • SetFeature/ClearFeature:SetFeature 和 ClearFeature 可用于设置端点的功能。标准目前定义了一个端点选项 ENDPOINT_HALT (0x00) ,允许主机停止并清除一个端点。只有端点 0 之外的端点才推荐拥有该项功能。
    • SynchFrame:用于报告端点同步帧。
  • 相关阅读:
    docker---基本操作
    one_day_one_linuxCmd---netstat命令
    docker---Dockerfile编写
    one_day_one_linuxCmd---sz命令
    one_day_one_linuxCmd---scp命令
    同义英语词汇整理
    网络实习——校园网络设计方案
    实现 FTP 客户端和服务器程序所调用的系统函数
    2020年上半年总结
    单片机的串行总线拓展技术
  • 原文地址:https://www.cnblogs.com/rockyching2009/p/14001635.html
Copyright © 2011-2022 走看看