当前位置 博文首页 > dadalaohua的博客:【USB笔记】 USB设备请求USB Device Requests

    dadalaohua的博客:【USB笔记】 USB设备请求USB Device Requests

    作者:[db:作者] 时间:2021-07-27 11:49

    USB笔记 USB设备请求USB Device Requests

    所有USB设备都会响应主机向设备默认控制管道(Control Pipe)上发送的请求(requests)。 这些请求是使用控制传输(control transfers)进行的。请求和请求的参数通过Setup packet发送给设备。主机将会设置下面的Format of Setup Data表格中所列字段的值。每个Setup packet共有8个字节。

    Format of Setup Data

    OffsetFieldSizeValueDescription
    0bmRequestType1BitmapCharacteristics of request:
    ?D7: ?Data 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…30 = Reserved
    ????31 = Vendor Specific
    1bRequest1ValueSpecific request
    2wValue2ValueWord-sized field that varies according to request
    4wIndex2Index or OffsetWord-sized field that varies according to request; typically used to pass an index or offset
    6wLength2CountNumber of bytes to transfer if there is a Data stage

    bmRequestType

    bmRequestType字段是一个位图字段,共占一个字节。

    这个位图字段用于标识特定请求的特征,包括数据传输方向 (Data transfer direction),类型(Type)和接收端(Recipient)。

    Bit 7用于表示控制传输第二阶段Data stage的数据传输方向 (Data transfer direction),该值为0时表示方向为主机到设备(Host-to-device),值为1时表示方向为设备到主机(Device-to-host)。如果 wLength字段为0,则表示没有数据阶段(Data stage),数据传输方向的状态将被忽略。

    Bit 6…5用于表示请求类型(Type),该值说明了请求是否为USB的标准请求,如果数值为0则表示是USB的标准请求。USB定义了所有设备都应支持的一系列标准请求(standard requests)。 USB所有的标准请求可以参照USB标准设备请求。 此外,设备类别还可以定义其他请求,设备供应商也可以定义设备所支持的请求。如果值为1则表示请求是为特定USB类定义的请求,如果值为2则表示这是由厂商专属的驱动程序为特定产品定义的请求。

    Bit 4…0用于表示请求的接收端(Recipient),请求可以指向设备、设备上的一个接口或设备上的一个特定端点。数值为0时表示请求是指向设备。数值为1时表示请求是指向设备上的一个特定接口,当指定了接口时,wIndex 字段标识了接口。数值为2时表示请求是指向设备上的一个特定端点,当指定了一个端点时,wIndex字段标识了端点。数值为3时,表示请求指向设备的其他部分。数值为31时,表示这个请求指向厂商专属的定义部分,31这个数值含义是在Universal Serial Bus 3.1 Specification中新增,之前的协议该数值保留。其他数值保留。

    bRequest

    bRequest这个字段指定了特定的请求,共占一个字节。根据bmRequestType字段中的Type位的不同,这个字段的含义也会不同。只有在当bmRequestType字段中的Type位为0时,bRequest字段的定义值才表示为标准请求。USB标准请求的bRequest值可以参照USB标准设备请求。

    wValue

    wValue字段占两个字节,用于向设备传递一个特定于请求的参数,字段的内容根据请求的不同而不同,各个请求都会根据需求来定义这个字段。例如,USB标准设备请求Get Descriptor的wValue字段表示的是Descriptor Type和Descriptor Index,而USB标准设备请求Set Address的wValue字段表示的是Device Address。

    wIndex

    该字段的内容根据请求的不同而不同。它用于向设备传递一个特定于请求的参数。

    wIndex字段占两个字节,用于向设备传递一个特定于请求的参数,字段的内容根据请求的不同而不同,各个请求都会根据需求来定义这个字段。

    wIndex字段通常用于指定端点或接口的请求中。

    如果wIndex字段用于指定端点,下图展示了指定端点时的格式。

    D7D6D5D4D3D2D1D0
    DirectionReserved (Reset to zero)Endpoint Number
    D15D14D13D12D11D10D9D8
    Reserved (Reset to zero)

    Bit 7,方向(Direction)位被设置为0时表示指定端点号的OUT端点,被设置为1时则表示IN端点。对于控制管道,请求中的方向(Direction)位应该设置为0,但设备可以接受方向(Direction)位的任何一个值。

    Bit 3…0用于表示端点号。

    其他bits保留为0。

    如果wIndex字段用于指定接口,下图展示了指定接口时的格式。

    D7D6D5D4D3D2D1D0
    Interface Number
    D15D14D13D12D11D10D9D8
    Reserved (Reset to zero)

    Bit 7…5用于表示接口号,其他bits保留为0。

    wLength

    wLength字段占两个字节,用于指定在控制传输的第二阶段Data stage传输的数据长度。数据传输的方向(主机到设备Host-to-device或设备到主机Device-to-host)由bmRequestType字段的方向(Direction)位表示。如果该字段为0,则不存在数据传输阶段。

    在input请求时,wLength字段所标示的值是主机可获取的最大长度,设备返回的数据长度不能超过wLength字段所标示的值,但是可以返回比标示的值小的数据长度。在output 请求时,wLength字段的值就是主机所要发送的数据长度。如果主机发送的数据多于或少于wLength字段所标示的值,则设备的行为是未定义的。

    例如,主机端通过USB标准设备请求Get Descriptor获取配置描述符Configuration Descriptor时,由于不知道配置描述符的长度,有些主控会直接将wLength字段设置为255,然后设备端根据实际情况返回配置描述符。如果设备的配置描述符长度少于255,就返回实际长度;如果设备的配置描述符长度长于255,就只返回长度255的配置描述符,主机端会根据返回的配置描述符信息进行确认,如果设备的配置描述符实际长于255,就再获取一次,并根据实际的配置描述符长度来设置wLength字段。
    wLength示例

    示例

    USB标准请求Get Descriptor的Setup packet:
    Get Descriptor


    [参考资料]

    Universal Serial Bus Specification Revision 1.1

    Universal Serial Bus Specification Revision 2.0

    Universal Serial Bus 3.0 Specification

    Universal Serial Bus 3.1 Specification

    Universal Serial Bus 3.2 Specification

    USB Complete, 5th Edition


    本文链接:https://blog.csdn.net/u012028275/article/details/114711502

    cs