📄 descriptor.h
字号:
/*
;************************************************************************************************************
;* 江西师范大学物理通讯电子学院
;*
;* 创 新 中 心
;*
;*--------------------------------------------- 文件信息 ----------------------------------------------------
;* 文件名称 : Descriptor.h
;* 文件功能 : 与USB相关描述符数据结构的定义.
;* 补充说明 :
;*-------------------------------------------- 最新版本信息 -------------------------------------------------
;* 修改作者 : zhouhong
;* 修改日期 : 2006-11-5
;* 版本声明 : V1.0.0
;*-------------------------------------------- 历史版本信息 -------------------------------------------------
;* 文件作者 : zhouhong
;* 创建日期 : 2006-11-5
;* 版本声明 : V1.0.0
;*-----------------------------------------------------------------------------------------------------------
;************************************************************************************************************
;*/
#ifndef _Descriptor_H_
#define _Descriptor_H_
#include "..\INC\USBecd.h"
//
// Definition Data Type
// 定义数据类型
//
#define USB_U8 unsigned char
#define USB_U16 unsigned short
//将一个十六位的数据分成二个8位的数据,低位在前,高位在后
#define U16TO2U8(dataNum) ((dataNum)&0x00ff) , ((dataNum)>>8)
//****************************************************************************
//
// The following defines are specific the USB standard version 1.1.
// 以下定义在USB1.1版本中使用
//****************************************************************************
//
// Definitions of the bit fields in the bmRequestType field of a setup packet.
// 定义设置包中USB请求类型(bmRequestType)中各位字段.
// RT==RequestType
//
#define USB_RT_DEVICE_TO_HOST 0x80 //D7:传输方向(设备到主机)
#define USB_RT_TYPE_MASK 0x60 //D6..D5:保留
#define USB_RT_TYPE_STANDARD 0x00 //D6..D5:标准
#define USB_RT_TYPE_CLASS 0x20 //D6..D5:类
#define USB_RT_TYPE_VENDOR 0x40 //D6..D5:厂商
#define USB_RT_RECIPIENT_MASK 0x1F //D4..D0:接收者:4-31保留
#define USB_RT_RECIPIENT_DEVICE 0x00 //D4..D0:接收者:0 设备
#define USB_RT_RECIPIENT_INTERFACE 0x01 //D4..D0:接收者:1 接口
#define USB_RT_RECIPIENT_ENDPOINT 0x02 //D4..D0:接收者:2 端点
#define USB_RT_RECIPIENT_OTHER 0x03 //D4..D0:接收者:3 其它
//
// Definitions bmRequest field of a setup packet
// 定义USB标准请求命令(bmRequest)
#define USB_R_GET_STATUS 0x00 //获得设备,接口或者端点的某种状态
#define USB_R_GET_DEVICE 0x01
#define USB_R_CLEAR_FEATURE 0x01 //清除设备、接口或端点的某种特征。设备:清除其远程唤醒功能
// 接口:无 端口:清除其停止工作的状态
#define USB_R_GET_STRING 0x03
#define USB_R_SET_FEATURE 0x03 //主机要求启动一个在设备、接口或端点上的特征。
#define USB_R_SET_ADDRESS 0x05 //为设备设置一个惟一的地址
#define USB_R_GET_DESCRIPTOR 0x06 //获得设备的某种标准描述符
#define USB_R_SET_DESCRIPTOR 0x07 //为设备新增一个描述符,或更新一个已存在的描述符
#define USB_R_GET_CONFIGURATION 0x08 //获得指定设备当前配置的值
#define USB_R_SET_CONFIGURATION 0x09 //激活设备的某个配置
#define USB_R_GET_INTERFACE 0x0A //获得设备接口当前工作的选择设置值(AlternateSetting)
#define USB_R_SET_INTERFACE 0x0B //主机激活设备的某个接口
#define USB_R_SYNCH_FRAME 0x0C //在实时传输中,设备的端点可以以一个次序传输不同大小的数据包
//
// Definitions of the bit fields in the wIndex field of setup packets where the
// wIndex field is used to specify a endpoint (i.e. Clear_Feature, Get_Status,
// and Set_Feature).
// 定义wIndex被指定为端点时表示端点地址.
//
#define USB_ENDPOINT_DIRECTION_MASK 0x0080 //配置值低字节有效
#define USB_ENDPOINT_ADDRESS_MASK 0x007f //端点地址1-127
//
// Definitions of the features that can be specified in the wValue field of a
// Clear_Feature or Set_Feature setup packet.
// 定义wValue在Clear_Feature 或 Set_Feature 安装包中表示特征选择符.
//
#define USB_FEATURE_ENDPOINT_STALL 0x0000 //命令接收对象:设备
#define USB_FEATURE_REMOTE_WAKEUP 0x0001 //命令接收对象:端点
#define USB_FEATURE_POWER_D0 0x0002
#define USB_FEATURE_POWER_D1 0x0003
#define USB_FEATURE_POWER_D2 0x0004
#define USB_FEATURE_POWER_D3 0x0005
//
// Definitions of the wValue field for a Get_Descriptor setup packet.
//wValue在Get_Descriptor安装包中表示描述符类型和描述符的索引值
//高字节表示描述符类型,低字节表示描述符索引值
//
#define USB_DESCRIPTOR_TYPE_MASK 0xFF00 //得到描述符类型,屏蔽索引值
#define USB_DESCRIPTOR_DEVICE 0x0100 //设备描述符
#define USB_DESCRIPTOR_CONFIGURATION 0x0200 //配置描述符
#define USB_DESCRIPTOR_STRING 0x0300 //字符串描述符
#define USB_DESCRIPTOR_INTERFACE 0x0400 //接口描述符
#define USB_DESCRIPTOR_ENDPOINT 0x0500 //端点描述符
#define USB_DESCRIPTOR_INDEX_MASK 0x00FF //得到描述符索引值,屏蔽描述符类型
//
// Definitions of the device status returned for a Get_Status setup packet.
// 设备状态
//
#define USB_DEVICE_STATUS_SELF_POWERED 0x01 //自供电
#define USB_DEVICE_STATUS_REMOTE_WAKEUP 0x02 //远程唤醒
//
// Definitions of the endpoint status returned for a Get_Status setup packet.
// 端点状态
//
#define USB_ENDPOINT_STATUS_STALLED 0x01 //端点停止
//
// Definitions Constant of Descriptor Type in the USB
// 定义描述符常数
//
#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 //设备描述符类型=01H
#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 //配置描述符类型=02H
#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 //接口描述符类型=04H
#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 //端点描述符类型=05H
//
// Definitions of bDeviceClass in the USB_DEVICE_DESCRIPTOR
// 定义类型代码(设备的类别)
//
#define USB_CLASS_SPECIFIED_IN_INTERFACE 0x00 //在接口描述符中提供
#define USB_CLASS_COMMUNICATION 0x02 //通信类
#define USB_CLASS_HUB 0x09 //集线器类
#define USB_CLASS_CODE_TEST_CLASS_DEVICE 0xDC //测试设备类型
#define USB_CLASS_RADIO_COMMUNICATION_DEVICE 0xE0 //无线通信设备类
#define USB_CLASS_VENDOR_DEFINITION_DEVICE 0xFF //厂商定义的设备类
//
// Definitions of the bmAttributes in the USB_ENDPOINT_DESCRIPTOR
// 定义端点传输类型
//
#define USB_ENDPOINT_TYPE_CONTROL 0x00 //控制传输
#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01 //实时传输
#define USB_ENDPOINT_TYPE_BULK 0x02 //批量传输
#define USB_ENDPOINT_TYPE_INTERRUPT 0x03 //中断传输
//
// Definitions of
//
#define NUM_ENPOINTS 0x04 //除端点0的端点数目4H
#define MAX_ENPOINTS 0x007f //除端点0最大端点数目4H
#define USB_TOTAL_CFG_DESCSIZE sizeof(USB_CONFIGURATION_DESCRIPTOR)+sizeof(USB_INTERFACE_DESCRIPTOR)\
+NUM_ENPOINTS*sizeof(USB_ENDPOINT_DESCRIPTOR)
/*USB设备请求数据结构*/
typedef struct _USB_device_request
{
USB_U8 bmRequestType; //请求类型
USB_U8 bRequest; //USB具体请求
USB_U16 wValue; //USB数据,根据不同的请求含义改变
USB_U16 wIndex; //USB请求索引,根据不同的请求含义改变
USB_U16 wLength; //数据字节数
}USB_DEVICE_REQUEST;
/*控制传输数据结构*/
typedef struct _control_xfer
{
USB_DEVICE_REQUEST DeviceRequest; //USB设备请求数据结构体,8Byte
USB_U16 wLength; //传输数据的总字节数
USB_U8 wCount; //传输数据的指针
USB_U8 *pData; //传输数据的指针
USB_U8 dataBuffer[MAX_CONTROLDATA_SIZE]; //请求的数据
}USB_CONTROL_XFER;
/*USB设备描述符数据结构*/
typedef struct _USB_device_descriptor
{
USB_U8 bLength; //设备描述符长度=12H
USB_U8 bDescriptorType; //设备描述符类型=01H
USB_U16 bcdUSB; //USB规划发布号(BCD码)
USB_U8 bDeviceClass; //设备类型代码(由USB指定)
USB_U8 bDeviceSubClass; //设备子类型代码(由USB分配)
USB_U8 bDeviceProtocol; //设备协议代码(由USB分配)
USB_U8 bMaxPacketSize0; //端口0最大数据吞吐量(8,16,32,64)
USB_U16 idVendor; //供应商ID(由USB分配)
USB_U16 idProduct; //产品ID(由厂商分配)
USB_U16 bcdDevice; //设备出厂编码(序列号)
USB_U8 iManufacturer; //厂商描述符字符串索引
USB_U8 iProduct; //产品描述符字符串索引
USB_U8 iSerialNumber; //设备序列号字符串索引
USB_U8 bNumConfiguations; //可能的配置数
}USB_DEVICE_DESCRIPTOR;
/*
*************************************************************************************************************
***********************注意:当一个结构体中包含十六的数据时这个结构体的大小一定为偶数*************************
************所以:当表示用结构体表示一个结构体大小为奇数时,在此结构体中不能包含有十六位的数据类型*************
*********这就是为什么把:USB_U16 wTotalLength分为两个USB_U8 wTotalLengthH,USB_U8 wTotalLengthL的原因**********
*************************************************************************************************************
*/
/*USB配置描述符数据结构*/
typedef struct _USB_configuration_descriptor
{
USB_U8 bLength; //描述符长度=09H
USB_U8 bDescriptorType; //描述符类型=02H
USB_U8 wTotalLengthL; //此配置信息总长(低位)
USB_U8 wTotalLengthH; //(包括配置、接口、端点、和设备类及厂商定义的描述符)
USB_U8 bNumInterface; //配置所支持接口数
USB_U8 bConfigurationValue; //在SetConfiguration()请求中用作参数选择配置值
USB_U8 iConfiguration; //用于描述该配置字符串描述符的索引
USB_U8 bmAttibutes;//配置特性:D7:保留(1),D6:自给电源,D5:远程唤醒,D4..0:保留(1)
USB_U8 MaxPower; //最大电源耗费量.以2mA为一个单位
}USB_CONFIGURATION_DESCRIPTOR;
/*USB接口描述符数据结构*/
typedef struct _USB_interface_descriptor
{
USB_U8 bLength; //描述符长度=09H
USB_U8 bDescriptorType; //描述符类型=04H
USB_U8 bInterfaceNumber; //接口编号
USB_U8 bAlternateSetting; //可选设置的索引值
USB_U8 bNumEndpoint; //使用端口数目(端口0除外)
USB_U8 bInterfaceClass; //类型代码(由USB分配)
USB_U8 bInterfaceSubClass; //子类型代码(由USB分配)
USB_U8 bInterfaceProtocol; //协议代码(由USB分配)
USB_U8 iInterface; //字符串描述符的索引
}USB_INTERFACE_DESCRIPTOR;
/*USB端点描述符数据结构*/
typedef struct _USB_endpoint_descriptor
{
USB_U8 bLength; //描述符长度=07H
USB_U8 bDescriptorType; //描述符类型=05H
USB_U8 bEndpointAddress; //USB设备端点地址:Bit0..3:端口号 Bit4..6:保留(0)
//Bit7:方向,对于控制端点可忽略.0:out端点 1:in端点
USB_U8 bmAttributes; //端点属性. Bit1..0: 00:控制 01:同步 02:批量 03:中断
USB_U8 wMaxPacketSizeL; //本端点接收或发送的最大信息包的大小
USB_U8 wMaxPacketSizeH; //高位
USB_U8 iInterval; //访问端点的时间间隔
}USB_ENDPOINT_DESCRIPTOR;
/*USB字符串描述符数据结构*/
typedef struct _USB_string_descriptor
{
USB_U8 bLength; //描述符长度
USB_U8 bDescriptorType; //描述符类型
}USB_STRING_DESCRIPTOR;
/*PDIUSBD12描述符结构*/
typedef struct _USB_descriptor
{
USB_CONFIGURATION_DESCRIPTOR ConfigDescr; //配置描述符
USB_INTERFACE_DESCRIPTOR InterfaceDescr; //接口描述符
USB_ENDPOINT_DESCRIPTOR EP1_TXDescr; //端点1输入描述符
USB_ENDPOINT_DESCRIPTOR EP1_RXDescr; //端点1输出描述符
USB_ENDPOINT_DESCRIPTOR EP2_TXDescr; //端点2输入描述符
USB_ENDPOINT_DESCRIPTOR EP2_RXDescr; //端点2输出描述符
}USB_DESCRIPTOR,*PUSB_DESCRIPTOR;
/*
*************************************************************************************************************
* 函数声明
*************************************************************************************************************
*/
INT8U USB_Get_Status(USB_DEVICE_REQUEST *sDeviceRequest);
INT8U USB_Clear_Feature(USB_DEVICE_REQUEST *sDeviceRequest);
INT8U USB_Set_Feature(USB_DEVICE_REQUEST *sDeviceRequest);
INT8U USB_Set_Address(USB_DEVICE_REQUEST *sDeviceRequest);
INT8U USB_Get_Descriptor(USB_DEVICE_REQUEST *sDeviceRequest);
INT8U USB_Set_Configuration(USB_DEVICE_REQUEST *sDeviceRequest);
INT8U USB_Get_Configuration(USB_DEVICE_REQUEST *sDeviceRequest);
INT8U USB_Get_Interface(USB_DEVICE_REQUEST *sDeviceRequest);
INT8U USB_Set_Interface(USB_DEVICE_REQUEST *sDeviceRequest);
INT8U USB_Reserved(USB_DEVICE_REQUEST *sDeviceRequest);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -