📄 usb.h
字号:
/*===============================================================================//
//== 文 件 名:USB.h
//== author :gnsusn
//== 说 明:USB 描述符,控制命令等信息
//== 修改日志:2008.8.12 创建文件
//==
//===============================================================================*/
#ifndef __USB_H__
#define __USB_H__
#define SWAP16(x) ((((unsigned short)(x))<<8)|(((unsigned short)(x))>>8)) //== 高低字节交换
#define LSB(x) ((unsigned char)(x)) //== 取一个整数的低字节
#define MSB(x) ((unsigned char)(((unsigned short)(x))>>8)) //== 取一个整数的高字节
//***************************************************************************************
//== 定义标准的USB请求命令,即USB分配的各种请求的编号,即bRequest字段的值
#define GET_STATUS 0x00 //== 获取状态请求
#define CLEAR_FEATURE 0x01 //== 清除特性请求
#define SET_FEATURE 0x03 //== 设置特性请求
#define SET_ADDRESS 0x05 //== 设置地址请求
#define GET_DESCRIPTOR 0x06 //== 获取描述符请求
#define SET_DESCRIPTOR 0x07 //== 设置描述符请求
#define GET_CONFIGURATION 0x08 //== 获取配置请求
#define SET_CONFIGURATION 0x09 //== 设置配置请求
#define GET_INTERFACE 0x0A //== 获取接口请求
#define SET_INTERFACE 0x0B //== 设置接口请求
#define SYNCH_FRAME 0x0C //== 同步帧请求
//=======================================================================================
//***************************************************************************************
//== 定义标准的描述符类型,也就是USB分配的各种描述符的编号,即bDescriptorType 字段的值
#define DEVICE_DESCRIPTOR 0x01 //== 设备描述符
#define CONFIGURATION_DESCRIPTOR 0x02 //== 配置描述符
#define STRING_DESCRIPTOR 0x03 //== 字符串描述符
#define INTERFACE_DESCRIPTOR 0x04 //== 接口描述符
#define ENDPOINT_DESCRIPTOR 0x05 //== 端点描述符
#define HID_DESCRIPTOR 0x21 //== HID描述符
#define REPORT_DESCRIPTOR 0x22 //== 报告描述符
#define PHYSICAL_DESCRIPTOR 0x23 //== 物理描述符
//=======================================================================================
//***************************************************************************************
//== 定义USB HID特定命令请求
#define GET_REPORT 0x01 //== 获取报告
#define GET_IDLE 0x02 //== 获取空闲状态
#define GET_PROTOCOL 0x03 //== 获取协议
#define SET_REPORT 0x09 //== 设置报告
#define SET_IDLE 0x0A //== 设置空闲
#define SET_PROTOCOL 0x0B //== 设置协议
//=======================================================================================
//***************************************************************************************
//== 定义特性选择器
#define ENDPOINT_HALT 0x00 //== 端点的禁止特性
//== USB defined Feature selectors
#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
//=======================================================================================
//***************************************************************************************
//== 定义的端点类型
#define ENDPOINT_TYPE_CONTROL 0x00 //== 控制传输
#define ENDPOINT_TYPE_ISOCHRONOUS 0x01 //== 同步传输
#define ENDPOINT_TYPE_BULK 0x02 //== 批量传输
#define ENDPOINT_TYPE_INTERRUPT 0x03 //== 中断传输
//=======================================================================================
//***************************************************************************************
//== 定义标准的设备描述符结构 18字节(0x12)
typedef struct _DEVICE_DCESCRIPTOR_STRUCT
{
unsigned char blength; //== 1:设备描述符的字节数大小
unsigned char bDescriptorType; //== 1:设备描述符类型编号
unsigned short bcdUSB; //== 2:USB版本号
unsigned char bDeviceClass; //== 1:USB分配的设备类代码
unsigned char bDeviceSubClass; //== 1:USB分配的子类代码
unsigned char bDeviceProtocol; //== 1:USB分配的设备协议代码
unsigned char bMaxPacketSize0; //== 1:端点0的最大包大小
unsigned short idVendor; //== 2:厂商编号
unsigned short idProduct; //== 2:产品编号
unsigned short bcdDevice; //== 2:设备出厂编号
unsigned char iManufacturer; //== 1:设备厂商字符串的索引
unsigned char iProduct; //== 1:描述产品字符串的索引
unsigned char iSerialNumber; //== 1:描述设备序列号字符串的索引
unsigned char bNumConfigurations; //== 1:可能的配置数量
}
DEVICE_DESCRIPTOR_STRUCT, * pDEVICE_DESCRIPTOR_STRUCT;
//=======================================================================================
//***************************************************************************************
//== 定义标准的配置描述符结构 9字节
typedef struct _CONFIGURATION_DESCRIPTOR_STRUCT
{
unsigned char bLength; //== 1:配置描述符的字节数大小
unsigned char bDescriptorType; //== 1:配置描述符类型编号
unsigned short wTotalLength; //== 2:此配置返回的所有数据大小
unsigned char bNumInterfaces; //== 1:此配置所支持的接口数量
unsigned char bConfigurationValue; //== 1:Set_Configuration命令所需要的参数值
unsigned char iConfiguration; //== 1:描述该配置的字符串的索引值
unsigned char bmAttributes; //== 1:供电模式的选择
unsigned char MaxPower; //== 1:设备从总线提取的最大电流
}
CONFIGURATION_DESCRIPTOR_STRUCT, * pCONFIGURATION_DESCRIPTOR_STRUCT;
//=======================================================================================
//***************************************************************************************
//== 定义标准的接口描述符结构 9字节
typedef struct _INTERFACE_DESCRIPTOR_STRUCT
{
unsigned char bLength; //== 接口描述符的字节数大小
unsigned char bDescriptorType; //== 接口描述符的类型编号
unsigned char bInterfaceNumber; //== 该接口的编号
unsigned char bAlternateSetting; //== 备用的接口描述符编号
unsigned char bNumEndpoints; //== 该接口使用的端点数,不包括端点0
unsigned char bInterfaceClass; //== 接口类型
unsigned char bInterfaceSubClass; //== 接口子类型
unsigned char bInterfaceProtocol; //== 接口遵循的协议
unsigned char iInterface; //== 描述该接口的字符串索引值
}
INTERFACE_DESCRIPTOR_STRUCT, * pINTERFACE_DESCRIPTOR_STRUCT;
//=======================================================================================
//***************************************************************************************
//== 定义标准的端点描述符结构 7字节
typedef struct _ENDPOINT_DESCRIPTOR_STRUCT
{
unsigned char bLength; //== 端点描述符字节数大小
unsigned char bDescriptorType; //== 端点描述符类型编号
unsigned char bEndpointAddress; //== 端点地址及输入输出属性
unsigned char bmAttributes; //== 端点的传输类型属性
unsigned short wMaxPacketSize; //== 端点收、发的最大包大小
unsigned char bInterval; //== 主机查询端点的时间间隔
}
ENDPOINT_DESCRIPTOR_STRUCT, * pENDPOINT_DESCRIPTOR_STRUCT;
//=======================================================================================
//***************************************************************************************
//== HID描述符中的下级描述符号 3字节
typedef struct _HID_SUB_DESCRIPTOR_STRUCT
{
unsigned char bDescriptorType; //== 下级描述符的类型编号
unsigned short wDescriptorLength; //== 下级描述符的长度
}
HID_SUB_DESCRIPTOR_STRUCT,*pHID_SUB_DESCRIPTOR_STRUCT;
//=======================================================================================
//***************************************************************************************
#define NUM_SUB_DESCRIPTORS 1
//=======================================================================================
//***************************************************************************************
//== 定义HID描述符结构 9字节
typedef struct _HID_DESCRIPTOR_STRUCT
{
unsigned char bLength; //== HID描述符字节数大小
unsigned char bDescriptorType; //== HID描述符类型编号
unsigned short bcdHID; //== HID版本号
unsigned char bCountryCode; //== 国家代码
unsigned char bNumDescriptors; //==
HID_SUB_DESCRIPTOR_STRUCT HidSubDescriptors[NUM_SUB_DESCRIPTORS];
}
HID_DESCRIPTOR_STRUCT,*pHID_DESCRIPTOR_STRUCT;
//=======================================================================================
//***************************************************************************************
//== 一个字符串描述符结构
typedef struct _STRING_DESCRIPTOR_STRUCT
{
unsigned char bLength; //== 字符串描述符的字节数大小
unsigned char bDescriptorType; //== 字符串描述符类型编号
unsigned char SomeDesriptor[36]; //== UNICODE编码的字符串
}
STRING_DESCRIPTOR_STRUCT, * pSTRING_DESCRIPTOR_STRUCT;
//=======================================================================================
//***************************************************************************************
//== 标准设备请求命令结构
typedef struct _REQUESTCMD
{
unsigned char bmRequestType; //== 请求命令类型
unsigned char bRequest; //== 请求命令代码
unsigned short wValue; //== 命令信息
unsigned short wIndex; //== 索引信息
unsigned short wLength; //== 传输数据大小
}
REQUESTCMD, * pREQUESTCMD;
//== 标准设备请求命令结构中用到的掩码
#define USB_RECIPIENT (unsigned char)0x1F //== bmRequestType的(4~0)位指明了操作的对象
#define USB_RECIPIENT_DEVICE (unsigned char)0x00 //== 设备
#define USB_RECIPIENT_INTERFACE (unsigned char)0x01 //== 接口
#define USB_RECIPIENT_ENDPOINT (unsigned char)0x02 //== 端点
#define USB_REQUEST_TYPE_MASK (unsigned char)0x60 //== bmRequestType的(6~5)位指明了主机请求的类型
#define USB_STANDARD_REQUEST (unsigned char)0x00 //== 标准请求(主机询问设备的一些标准特性)
#define USB_CLASS_REQUEST (unsigned char)0x20 //== 类请求(主机询问设备的类特性)
#define USB_VENDOR_REQUEST (unsigned char)0x40 //== 厂商请求(主机询问设备的厂商)
#define USB_REQUEST_MASK (unsigned char)0x0F //== bRequest 请求命令的掩码
#define DEVICE_ADDRESS_MASK (unsigned char)0x7F //== 地址掩码
#define USB_ENDPOINT_DIRECTION_MASK (unsigned char)0x80 //== 端点号掩码
//=======================================================================================
//***************************************************************************************
//== setup_packet 包缓冲区
#define MAX_CONTROLDATA_SIZE 8
typedef struct _control_data_buff
{
REQUESTCMD DeviceRequest; //== USB设备请求
unsigned short wLength; //== 主机请求的长度
unsigned short wCount; //== 数据的实际长度
unsigned char * pData;
unsigned char dataBuffer[MAX_CONTROLDATA_SIZE];
}CONTROL_DATA_BUFF;
//=======================================================================================
//***************************************************************************************
//== USB 的控制端点有4种状态:空闲,接收,发送,忙
#define USB_IDLE 0 //== 表示控制端点空闲
#define USB_TRANSMIT 1 //== 表示控制端点处于发送状态,(等待发送数据的到来)
#define USB_RECEIVE 2 //== 表示控制端点处于接收完状态,(数据接收完接收,等待对接收数据的处理)
#define USB_HANDEL 3 //== 表示控制端点正在处理,忙
typedef union _epp_flags //== 程序运行标志位
{
unsigned short Register;
struct _flags
{
unsigned char bus_reset :1; //== 总线复位标志
unsigned char suspend :1; //== 挂起改变标志
unsigned char remote_wakeup :1; //== 远程唤醒标志(未使用)
unsigned char int_isr :1; //== USB中断标志
unsigned char control_state :2; //== 控制端点处理状态
//== 0: 空闲
//== 1: 数据发送
//== 2: 数据接收
unsigned char configuration :1; //== 配置标志(0:未配置;1:已经配置)
unsigned char verbose :1;
unsigned char first_get_descriptor :1; //== 第一次获得描述符描述符
unsigned char setup_packet_in :1;
unsigned char setup_packet_out :1;
unsigned char usb_endp0_in :1;
unsigned char usb_endp2_in :1;
unsigned char usb_endp2_out :1;
unsigned char reserve :2;
// unsigned char dma_state :2;
// unsigned char setup_dma :1;
}bits;
}EPPFLAGS;
//=======================================================================================
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -