资源描述
14.2.5设备列举
(1)设备描述符
USB描述符就好像是USB外围设备的“身份证”一样,详细地记录着外围设备相关的一切信息。为了描述不同的数据,就需以不同类型的USB描述符来加以描述,它共有以下几种类型:设备描述符、配置描述符、接口描述符和端点描述符,这几个描述符是必须具有的,下面将结合实例详细介绍;其他的描述符,例如,字符串描述符、数种不同的群组描述符以及报告描述符则可以根据不同的设备进行选择。
①设备描述符
设备描述符具有18字节的长度,并且是主机向设备请求的第一个描述符。以下列出设备描述符的范例、数值以及各个字段的意义:
DeviceDesc: ;表示设备描述符
FCB $12 ; bLength域,表示该描述符的字节长度为18个字节
FCB $01 ; bDescriptorType域描述符类型,1代表设备
FCB $10,$01 ; bcdUSB域表示符合USB 1.10规范,$210代表2.10规范
FCB $00 ; bDeviceClass域,群组码,0表示每个接口都有自身的群信息,
;不同的接口操作相互独立
FCB $00 ; bDeviceSubClass域,设备次群组(如果群组码为0,设备次群组必须为0)
FCB $00 ; bDeviceProtocol域,设备协议(0表示无群组特定协议)
FCB $08 ; bMaxPacketSize0域,端点0的最大封包大小(只能为8、16、32或64)
FCB $70,$0C ; idVendor域,制造商ID(2字节)
FCB $00,$00 ; idProduct域,产品ID(2字节)
FCB $00,$01 ; bcdDevice域,以BCD表示设备发行序号(2字节)
FCB $01 ; iManufacturer域,制造商的字符串描述符索引(1字节),本实例中指
; String1Desc处的字符串描述符
FCB $02 ; iProduct域,产品的字符串描述符索引(1字节),本实例中指
; String2Desc处的字符串描述符
FCB $00 ; iSerialNumber域,设备序号的字符串描述符索引(1字节),
;本实例中指String0Desc处的字符串描述符
FCB $01 ; bNumConfigurations域,配置数目为1
②配置描述符
配置描述符具有9字节的长度,针对设备给予配置的信息。以下列出配置描述符的范例、数值以及各个字段的意义:
ConfigDesc: ;表示配置描述符
FCB $09 ; bLength域,表示该描述符的字节长度为9个字节(1字节)
FCB $02 ; bDescriptorType域,描述符类型,2代表配置(1字节)
FCB $20,$00 ; wTotalLength域,描述符的总长度为32个字节,(包括配置描述符
; 9字节,接口描述符9字节,两个端点描述符各7字节)
FCB $01 ; bNumInterfaces域,该配置支持的接口数目(1字节)
FCB $01 ; bConfigurationValue域,配置值,作为Set Configuration请求的配置值
FCB $00 ; iConfiguration域,配置的字符串描述符的索引(1字节)
FCB $C0 ; bmAttributes域,配置的属性(自供电,不具有远程唤醒的特征)
FCB $00 ; MaxPower域,表示当USB设备操作时,它从总线上
;获得的最大电源(以2mA为单位)
③接口描述符
接口描述符具有9字节的长度,用来描述每一个设备的接口特性。以下列出接口描述符的范例、数值以及各个字段的意义:
InterfaceDesc: ;表示接口描述符
FCB $09 ; bLength域,表示该描述符的字节长度为9个字节
FCB $04 ; bDescriptorType域,描述符类型,4代表接口
FCB $00 ; bInterfaceNumber域,接口数目以0为基值(表示一个接口)
FCB $00 ; bAlternateSetting域,交互设置值为0(因为只有一个接口)
FCB $02 ; bNumEndpoints域,端点数目设置为2
FCB $FF ; bInterfaceClass域,接口群组,$FF表示是供应商说明书
FCB $01 ; bInterfaceSubClass域,接口次群组
FCB $FF ; bInterfaceProtocol域,接口协议,$FF表示该接口使用的
;是供应商说明的协议
FCB $00 ; iInterface域,接口的字符串描述符的索引,本实例没有
④端点描述符
端点描述符具有7字节长度,用来描述端点的属性以及各个端点的位置。该实例中有两个端点,我们首先介绍端点1描述符:
Endpoint1Desc: ;表示端点1描述符
FCB $07 ; bLength域,表示该描述符的字节长度为7个字节
FCB $05 ; bDescriptorType域,描述符类型,5代表端点
FCB $81 ; bEndpointAddress域,端点地址([0x80=IN,0=OUT]),
;本实例端点编号为1且为IN端点
FCB $03 ; bmAttributes域,传输类型的属性设置为中断传输
;(0=控制,1=等时,2=批量,3=中断)
FCB $08,$00 ; wMaxPacketSize域,最大封包的大小设置为8个字节
FCB $0A ; bInterval域,轮询间隔,以ms为单位,在此设置为10ms
接下来介绍端点2描述符:
Endpoint2Desc: ;表示端点2描述符
FCB $07 ; bLength域,表示该描述符的字节长度为7个字节
FCB $05 ; bDescriptorType域,描述符类型,5代表端点
FCB $02 ; bEndpointAddress域,端点地址([0x80=IN,0=OUT]),
;本实例端点编号为2且为OUT端点
FCB $03 ; bmAttributes域,传输类型的属性设置为中断传输
;(0=控制,1=等时,2=批量,3=中断)
FCB $08,$00 ; wMaxPacketSize域,最大封包的大小设置为8个字节
FCB $0A ; bInterval域,轮询间隔,以ms为单位,在此设置为10ms
(2)USB设备请求
在USB接口的通信协议中,由于主机是取得绝对的主控权,因此,主机与设备之间就必须遵循某种已沟通的特定命令格式,以达到通信的目的。而这个命令格式就是USB规范书中所制定的“设备请求”。这个设备请求的设置、清除与取得都须通过控制传输的数据交换来完成。表14-3中列出了标准设备请求的数据格式内容。
表14-3 数据请求的数据格式内容
位移量
字段值
大小(字节)
描述
0
BmRequest Type
1
D7-数据传输方向:0=主机至设备,1=设备至主机
D[6:5]-类型:0=标准,1=群组,2=供应商 3=保留
D[4:0]-接收端:0=设备,1=接口,2=端点,3=其他,
4~31=保留
1
bRequest
1
特定请求
2
wValue
2
字大小字段,根据请求的不同而不同
4
wIndex
2
字大小字段,根据请求的不同而不同,通常是传递索引和位移量
6
wLength
2
如果有数据阶段,该域表示所要传输的字节大小
bmRequestType域决定了特定请求的特征,该域的D7表示在控制传输的数据阶段,数据传输的方向。如果wLength的值为0,表示没有数据阶段,该位可以忽略;D[6:5]表示了该请求所属的类型,USB标准中定义了所有的USB设备必须支持的一系列的标准请求,此外,群组和供应商也可以定义一些其他的请求;D[4:0]表示接收端,请求可以针对设备、接口或设备的一个端点,当针对一个接口或端点时,wIndex域决定了是哪个接口或端点。
bRequest域表示特定请求,如果bmRequestType域的类型字段为0,可以根据USB指定的一系列的标准请求,结合该域的值,知道这是什么请求。将在下面介绍这些请求。
wValue域的值根据请求的不同而不同,用来传递一个参数给设备。
wIndex域的值根据请求的不同而不同,用来指定一个接口或端点。
wLength域表示控制传输的数据阶段中传输数据的字节大小,数据传输的方向由bmRequestType域中的D7位决定,如果该域的值为0,表示没有数据阶段。
下面结合实例分别介绍几个主要的设备请求:
①Clear Feature
该请求是用来取消一个特点,其格式如下:
bmRequestType
bRequest
wValue
wIndex
wLength
Data
00000000B
00000001B
00000010B
CLEAR_FEATURE
(01H)
特色选择
0接口端点
0
无
该请求中的wValue表示特色选择器,它对应的值为:0=端点,1=设备。当某个特点不允许取消,或该特点根本不存在,或者是指向一个根本不存在的接口或端点时,该请求将会导致设备请求失败。如果端点被固件设为停止状态,主机软件(总线驱动程序)也可以发送一个值为0的CLEAR_FEATURE命令清除该端点的停止状态,本实例中就是这样使用该请求的。
②Get Descriptor
该请求可以取得USB设备中存在的特定的描述符,其格式如下:
bmRequestType
bRequest
wValue
wIndex
wLength
Data
10000000B
GET_DESCRIPTOR
(06H)
描述符类型与描述符指针
0或语言ID
描述符的长度
各个描述符
该请求中的wValue的高字节表示要取的描述符类型,低字节表示描述符的索引值,描述的类型有:1表示设备描述符,2表示配置描述符,3表示字符串描述符,4表示接口描述符,5表示端点描述符。wIndex的值为0或语言ID;当要取的描述符是字符串描述符时,该域的值为语言ID;当为其他的描述符时,该域为0。wLength表示要返回的数据长度,如果SETUP阶段的地址使用的是预设地址0(ENDP字段为0),这时的wLength值会大于实际的描述的值。这是为什么呢?原因是用户以预设的地址0来取得设备描述符时,不管设多少字节,用户最多只取其前8字节,即在控制传输过程只有一次数据阶段。但是,如果用户以新的地址(ENDP字段不为0)来取得设备描述符时,这时wLength的值就要注意了。
③Set Address
该请求给USB设备设置地址,从而可以对该USB设备进行进一步的访问。其格式如下:
bmRequestType
bRequest
wValue
wIndex
wLength
Data
00000000B
SET_ADDRESS(05H)
设备地址
0
0
无
该请求与其他的请求有一个重要的不同点,该请求下,USB设备一直不改变它的地址,直到该请求的状态阶段被成功地完成,而其他请求的操作都是在状态阶段之前完成,可以阅读本实例加深对该点的理解。若特定的设备地址大于127,或者wIndex 或wLength为非0值,那么该请求不执行。
④Set Configuration
该请求对设备进行设置。其格式如下:
bmRequestType
bRequest
wValue
wIndex
wLength
Data
00000000B
SET_CONFIGURATION(09H)
设置值
0
0
无
该请求中的wValue域的低字节表示设置的值,该值必须为0或者与配置描述符中的配置值相匹配。如果设置值等于0,表示设备在地址状态。如果wIndex 或 wLength为非0值,那么该请求不执行。
展开阅读全文