⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb.h

📁 HID 设备测试程序
💻 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 + -