USB2.0 프로토콜 연구 노트 --- 다양한 설명

 USB 장치 설명

필드 이름 길이 (바이트)  주소 오프셋 의미
Blaenth   1  0  설명자 길이
bDescriptorType   1  1 설명자 유형 (여기에서, 1)
bcdUSB   이  이 USB 사양 버전 번호 (BCD 코드) 
bDeviceClass   1  4 클래스 코드 
bDeviceSubClass   1  5 서브 클래스 코드 
bDeviceProtocol  1  6 프로토콜 코드 
bMaxPackSize0   1  (7) 엔드 포인트 0의 최대 패킷 사이즈를 지원 
idVendor   이  9 공급 업체 ID 
idProduct   이  (11) 제품 ID 
bcdDevice   이  (13) 장치의 버전 번호 (BCD 코드) 
iManufacturer   1  (14) 공급자 문자열 설명 지수 
i- 제품   1  (15) 제품 문자 설명 문자열 색인 
iSerialNumber   1  (16) 제품 일련 좋은 기술자 지수 
bNumConfigurations   1  (17) 지원되는 구성의 수 

bLenth : 바이트 디스크립터 일반적인 USB 디바이스 디스크립터의 길이는 18 바이트, 즉 0x12를 고정이고;

bDescriptorType : 설명 범주 코드입니다. USB 디바이스 디스크립터하는 0x01이고;

bcdUSB : USB 프로토콜 버전, BCD 부호화 0x0200를 사용하여 2.0이지만 작은 USB 단자, 그래서 × 00 [실제, 0x20에}

bDeviceClass : 장치 클래스 코드가 0 bInterfaceClass 인터페이스 디스크립터는 지정된 인터페이스 기능의 대부분은,이 bDeviceClass이 0 인 경우, bDeviceSubClass는 0이어야 유의한다;

bDeviceSubClass : bDeviceClass 코드 결정으로, USB 표준 정의.

bDeviceProtocol : 디바이스 클래스 프로토콜이 클래스를 정의하는 데 사용 및 0이 아닌 경우, 필드가 0xFF를 표시 지정 프로토콜이다 .

bMaxPackSize0 : 열거 프로세스가 얻기 디바이스 디스크립터 제 번만 판독 때문에 0의 엔드 포인트의 최대 길이는 최소가 USB 디바이스 디스크립터이 패키지를 포함하는 것이 필요하고, 8이다 .

idVendor : 공급 업체 ID의 VID는 적용 보호 돈을 지불 할 필요가있다.

idProduct : 제조 업체 스스로에 의해 정의 된 제품 ID PID. 일반적으로 로컬 VID와 PID에 따라로드하는 드라이버 나 소스를 호스팅합니다.

bcdDevice : 장비 버전도 사용 BCD, 공감 USB 프로토콜 버전 번호입니다.

iSerialNumber : 일련 번호 문자열 인덱스 값.

bNumConfigurations : 구성의 장비 번호, USB 장치의 대부분은 단지 하나 개의 구성입니다 .

 

USB 구성 설명

즉 경우에 따라 구성 기술자 등 인터페이스 설명, 특별한 클래스 기술자, 최종 기술자 정보가 포함되어 있습니다, 호스트 열거 구성의 설명을 요청하는 장치와 함께 호스트로 돌아 호스트는 개인에게 반환 할 수 없습니다 .

필드 이름  길이 (바이트)  오프셋      의미
Blaenth  1 0 구성 설명 길이
bDescriptorType 1 1 구성 설명 유형
wTotalLength 구성 정보의 총 길이
bNumInterfaces 1 4 인터페이스의 수를 구성합니다
bConfigurationValue 1 5 구성 값
iConfiguration 1 6 문자열 설명 지수
bmAttributes 1 (7) 구성의 특징
bMaxPower 1 8 최대 전류 (2mA 유닛)

 

bLenth : 기술자 길이

bDescriptorType : 설명 형, 0x02로의 구성을 설명 ;

wTotalLength : 구성 기술자, 인터페이스 설명, 엔드 포인트 디스크립터 특별 클래스 기술자를 포함한 전체 구성 기술자의 총 길이.

bNumInterfaces : 지원되는 인터페이스의 수를 구성합니다 .

bConfigurationValue : 각 구성하는 식별 값을 갖는다.

iConfiguration : 구성 설명자 인덱스입니다.

bmAttributes : 특성화 D7, D6는 자체 전원 또는 버스 파워가, D5 원격 웨이크 - 업 (1), D4-D0 소유 지원 여부 확인을위한 전원과 1 식별 소유.

bMaxPower : 최대 전류 버스 파워 그러한 최대 전류 값 200mA로 100.

 

USB 인터페이스 설명

 필드 이름   길이 (바이트)  주소 오프셋     의미   
Blaenth 1 0 기술자의 길이
bDescriptorType 1 1 타입 설명
bInterfaceNumber 1 인터페이스 번호
bAlterateSetting 1 대안 설정치
bNumEndpoint 1 4 0 이외의 엔드 포인트 엔드 포인트
bInterfaceClass 1 5 클래스 코드
bInterfaceSubClass 1 6 서브 클래스 코드
bInterfaceProtocol 1 (7) 프로토콜 코드
는 IInterface 1 8 문자열 설명 지수

bLenth :  기술자의 길이.

bDescriptorType :  기술자의 종류 (인터페이스 설명 4)

bInterfaceNumber은 :   0 번째의 복수의 인터페이스를 고유 번호로 각각의 인터페이스를 사용하여 구성에서, 인터페이스의 수를 나타낸다.

bAlterateSetting:接口的备用编号,规则同上。一般不用

bNumEndpoint:该接口使用的端点数,不包括端点0。即如果为0 就只有控制端点

bInterfaceClass:接口使用的类

bInterfaceSubClass:接口使用的子类

bInterfaceProtocol:接口使用的协议。三个一起定义了设备的功能,鼠标键盘就只需要改协议部分就可以。其他两个都是HID类

iInterface:接口字符串描述符的索引值。

 

USB端点描述符

域  大小(字节) 偏移
bLenth 1 0
bDescriptorType 1 1
bEndpointAddress 1 2
bmAttributes 1 3
wMaxPackSize 2 4
bInterval 1 6

bLenth: 该描述符的长度(字节)

bDescriptorType: 该描述符的类型(0x05)

bEndpointAddress:端点的地址,D7表示端点的传输方向,为1则为输入,为0则为输出,D3-D0为端点号,其他位没有用。

bmAttributes:一个字节的属性描述字节,D1~D0表示端点传输类型,0 为控制传输,1为等时传输,2为批量传输,3为中断传输。如果为等时传输,D3-D2表示等时传输的类型,0表示无同步,1为异步,2为适配,3为同步;D5-D4辨识用途,0为数据端点,1为反馈端点,2为暗反馈端点,3保留;D7-D6保留。但是如果不是同步传输则只用到D1-D0其他位全部保留。

wMaxPackSize:该端点支持的最大数据长度,对于低速和全速设备而言,D10-D0表示数据包最大长,其他位未用,对于高速设备D12-D11表示每个帧的附件传送次数,具体参考USB标准协议。

bInterval:表示该端点的查询时间,对于中断传输表示查询的帧间隔数;对于其他传输方式参考USB标准协议。

 

 类特殊描述符

有些设备还需要有类特殊描述符,这里拿HID设备举例,HID设备的特殊描述符如下

大小 偏移 说明
bLenth 1 0 描述符长
bDescriptorType 1 1 描述符类型
bcdHID 2 2 HID 协议版本
bCountryCode 1 4 国家代码
bNumDescriptors 1 5 下级描述符数量
bDescriptorType 1 6 下级描述符类型
bDescriptorLength 2 7 下级描述符长度
bDescriptorType 1 9 下级描述符的类型(可选)
wDescriptorLength 2 10 下级描述符的长度(可选)
... ... ... ...

 

类比前面描述符的作用这里只需要记一下一下几个字段的意义:

bcdHID:为 HID设备的版本,用BCD码表示,两个字节,如下表示版本为1.10 

bCountryCode:  国家代码(这个用在特殊情况下 比如键盘,美式键盘等)。

bNumDescriptors:下级描述符的数量,在HID设备中至少有一个是报告描述符。

bDescriptorType:HID报告描述符为0x22.

bDescriptorLength:对应描述符的大小

因为下级描述符至少有一个因此,HID类描述至少是10个字节,底下就是一个HID描述符的例子。

 

 

 

    0x09,         /* bLength: HID Descriptor size */
    HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */
    0x10,         /* bcdHID: HID Class Spec release number */
    0x01,
    0x00,         /* bCountryCode: Hardware target country */
    0x01,         /* bNumDescriptors: Number of HID class descriptors to follow */
    0x22,         /* bDescriptorType */
    CUSTOMHID_SIZ_REPORT_DESC,/* wItemLength: Total length of Report descriptor */
    0x00,

 

看了这么多,现在我对USB协议的理解是这样的:USB设备可以理解为一个类,描述符就是这个类的属性,而枚举过程就是host主动请求调用,获取属性的方法,从而知道这个类的属性,其余在主机和设备数据交换过程的处理细节就是设备类的方法,我们实现一个USB设备就是在定义设备属性和定义方法接口的过程,只是定义属性需要了解到以上USB标准中的这些规则(profile),同时枚举过程的一些操作就是必须要实现的接口,其余的部分就要看我们的设备,设计出来支持的操作有哪些,选择的实现了,好了暂时就这些,后面还有一部分概念需要学习,待续。。。

2019-06-02 11:39:57

추천

출처www.cnblogs.com/w-smile/p/10946665.html