?? usb.h
字號:
/*===============================================================================//
//== 文 件 名:USB.h
//== author :gnsusn
//== 說 明:USB 描述符,控制命令等信息
//== 修改日志:2008.8.12 創(chuàng)建文件
//==
//===============================================================================*/
#ifndef __USB_H__
#define __USB_H__
#define SWAP16(x) ((((unsigned short)(x))<<8)|(((unsigned short)(x))>>8)) //== 高低字節(jié)交換
#define LSB(x) ((unsigned char)(x)) //== 取一個整數(shù)的低字節(jié)
#define MSB(x) ((unsigned char)(((unsigned short)(x))>>8)) //== 取一個整數(shù)的高字節(jié)
//***************************************************************************************
//== 定義標(biāo)準(zhǔn)的USB請求命令,即USB分配的各種請求的編號,即bRequest字段的值
#define GET_STATUS 0x00 //== 獲取狀態(tài)請求
#define CLEAR_FEATURE 0x01 //== 清除特性請求
#define SET_FEATURE 0x03 //== 設(shè)置特性請求
#define SET_ADDRESS 0x05 //== 設(shè)置地址請求
#define GET_DESCRIPTOR 0x06 //== 獲取描述符請求
#define SET_DESCRIPTOR 0x07 //== 設(shè)置描述符請求
#define GET_CONFIGURATION 0x08 //== 獲取配置請求
#define SET_CONFIGURATION 0x09 //== 設(shè)置配置請求
#define GET_INTERFACE 0x0A //== 獲取接口請求
#define SET_INTERFACE 0x0B //== 設(shè)置接口請求
#define SYNCH_FRAME 0x0C //== 同步幀請求
//=======================================================================================
//***************************************************************************************
//== 定義標(biāo)準(zhǔn)的描述符類型,也就是USB分配的各種描述符的編號,即bDescriptorType 字段的值
#define DEVICE_DESCRIPTOR 0x01 //== 設(shè)備描述符
#define CONFIGURATION_DESCRIPTOR 0x02 //== 配置描述符
#define STRING_DESCRIPTOR 0x03 //== 字符串描述符
#define INTERFACE_DESCRIPTOR 0x04 //== 接口描述符
#define ENDPOINT_DESCRIPTOR 0x05 //== 端點(diǎn)描述符
#define HID_DESCRIPTOR 0x21 //== HID描述符
#define REPORT_DESCRIPTOR 0x22 //== 報(bào)告描述符
#define PHYSICAL_DESCRIPTOR 0x23 //== 物理描述符
//=======================================================================================
//***************************************************************************************
//== 定義USB HID特定命令請求
#define GET_REPORT 0x01 //== 獲取報(bào)告
#define GET_IDLE 0x02 //== 獲取空閑狀態(tài)
#define GET_PROTOCOL 0x03 //== 獲取協(xié)議
#define SET_REPORT 0x09 //== 設(shè)置報(bào)告
#define SET_IDLE 0x0A //== 設(shè)置空閑
#define SET_PROTOCOL 0x0B //== 設(shè)置協(xié)議
//=======================================================================================
//***************************************************************************************
//== 定義特性選擇器
#define ENDPOINT_HALT 0x00 //== 端點(diǎn)的禁止特性
//== USB defined Feature selectors
#define USB_FEATURE_ENDPOINT_STALL 0x0000
#define USB_FEATURE_REMOTE_WAKEUP 0x0001 //== 設(shè)備的遠(yuǎn)程喚醒特性
#define USB_FEATURE_POWER_D0 0x0002
#define USB_FEATURE_POWER_D1 0x0003
#define USB_FEATURE_POWER_D2 0x0004
#define USB_FEATURE_POWER_D3 0x0005
//=======================================================================================
//***************************************************************************************
//== 定義的端點(diǎn)類型
#define ENDPOINT_TYPE_CONTROL 0x00 //== 控制傳輸
#define ENDPOINT_TYPE_ISOCHRONOUS 0x01 //== 同步傳輸
#define ENDPOINT_TYPE_BULK 0x02 //== 批量傳輸
#define ENDPOINT_TYPE_INTERRUPT 0x03 //== 中斷傳輸
//=======================================================================================
//***************************************************************************************
//== 定義標(biāo)準(zhǔn)的設(shè)備描述符結(jié)構(gòu) 18字節(jié)(0x12)
typedef struct _DEVICE_DCESCRIPTOR_STRUCT
{
unsigned char blength; //== 1:設(shè)備描述符的字節(jié)數(shù)大小
unsigned char bDescriptorType; //== 1:設(shè)備描述符類型編號
unsigned short bcdUSB; //== 2:USB版本號
unsigned char bDeviceClass; //== 1:USB分配的設(shè)備類代碼
unsigned char bDeviceSubClass; //== 1:USB分配的子類代碼
unsigned char bDeviceProtocol; //== 1:USB分配的設(shè)備協(xié)議代碼
unsigned char bMaxPacketSize0; //== 1:端點(diǎn)0的最大包大小
unsigned short idVendor; //== 2:廠商編號
unsigned short idProduct; //== 2:產(chǎn)品編號
unsigned short bcdDevice; //== 2:設(shè)備出廠編號
unsigned char iManufacturer; //== 1:設(shè)備廠商字符串的索引
unsigned char iProduct; //== 1:描述產(chǎn)品字符串的索引
unsigned char iSerialNumber; //== 1:描述設(shè)備序列號字符串的索引
unsigned char bNumConfigurations; //== 1:可能的配置數(shù)量
}
DEVICE_DESCRIPTOR_STRUCT, * pDEVICE_DESCRIPTOR_STRUCT;
//=======================================================================================
//***************************************************************************************
//== 定義標(biāo)準(zhǔn)的配置描述符結(jié)構(gòu) 9字節(jié)
typedef struct _CONFIGURATION_DESCRIPTOR_STRUCT
{
unsigned char bLength; //== 1:配置描述符的字節(jié)數(shù)大小
unsigned char bDescriptorType; //== 1:配置描述符類型編號
unsigned short wTotalLength; //== 2:此配置返回的所有數(shù)據(jù)大小
unsigned char bNumInterfaces; //== 1:此配置所支持的接口數(shù)量
unsigned char bConfigurationValue; //== 1:Set_Configuration命令所需要的參數(shù)值
unsigned char iConfiguration; //== 1:描述該配置的字符串的索引值
unsigned char bmAttributes; //== 1:供電模式的選擇
unsigned char MaxPower; //== 1:設(shè)備從總線提取的最大電流
}
CONFIGURATION_DESCRIPTOR_STRUCT, * pCONFIGURATION_DESCRIPTOR_STRUCT;
//=======================================================================================
//***************************************************************************************
//== 定義標(biāo)準(zhǔn)的接口描述符結(jié)構(gòu) 9字節(jié)
typedef struct _INTERFACE_DESCRIPTOR_STRUCT
{
unsigned char bLength; //== 接口描述符的字節(jié)數(shù)大小
unsigned char bDescriptorType; //== 接口描述符的類型編號
unsigned char bInterfaceNumber; //== 該接口的編號
unsigned char bAlternateSetting; //== 備用的接口描述符編號
unsigned char bNumEndpoints; //== 該接口使用的端點(diǎn)數(shù),不包括端點(diǎn)0
unsigned char bInterfaceClass; //== 接口類型
unsigned char bInterfaceSubClass; //== 接口子類型
unsigned char bInterfaceProtocol; //== 接口遵循的協(xié)議
unsigned char iInterface; //== 描述該接口的字符串索引值
}
INTERFACE_DESCRIPTOR_STRUCT, * pINTERFACE_DESCRIPTOR_STRUCT;
//=======================================================================================
//***************************************************************************************
//== 定義標(biāo)準(zhǔn)的端點(diǎn)描述符結(jié)構(gòu) 7字節(jié)
typedef struct _ENDPOINT_DESCRIPTOR_STRUCT
{
unsigned char bLength; //== 端點(diǎn)描述符字節(jié)數(shù)大小
unsigned char bDescriptorType; //== 端點(diǎn)描述符類型編號
unsigned char bEndpointAddress; //== 端點(diǎn)地址及輸入輸出屬性
unsigned char bmAttributes; //== 端點(diǎn)的傳輸類型屬性
unsigned short wMaxPacketSize; //== 端點(diǎn)收、發(fā)的最大包大小
unsigned char bInterval; //== 主機(jī)查詢端點(diǎn)的時間間隔
}
ENDPOINT_DESCRIPTOR_STRUCT, * pENDPOINT_DESCRIPTOR_STRUCT;
//=======================================================================================
//***************************************************************************************
//== HID描述符中的下級描述符號 3字節(jié)
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描述符結(jié)構(gòu) 9字節(jié)
typedef struct _HID_DESCRIPTOR_STRUCT
{
unsigned char bLength; //== HID描述符字節(jié)數(shù)大小
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;
//=======================================================================================
//***************************************************************************************
//== 一個字符串描述符結(jié)構(gòu)
typedef struct _STRING_DESCRIPTOR_STRUCT
{
unsigned char bLength; //== 字符串描述符的字節(jié)數(shù)大小
unsigned char bDescriptorType; //== 字符串描述符類型編號
unsigned char SomeDesriptor[36]; //== UNICODE編碼的字符串
}
STRING_DESCRIPTOR_STRUCT, * pSTRING_DESCRIPTOR_STRUCT;
//=======================================================================================
//***************************************************************************************
//== 標(biāo)準(zhǔn)設(shè)備請求命令結(jié)構(gòu)
typedef struct _REQUESTCMD
{
unsigned char bmRequestType; //== 請求命令類型
unsigned char bRequest; //== 請求命令代碼
unsigned short wValue; //== 命令信息
unsigned short wIndex; //== 索引信息
unsigned short wLength; //== 傳輸數(shù)據(jù)大小
}
REQUESTCMD, * pREQUESTCMD;
//== 標(biāo)準(zhǔn)設(shè)備請求命令結(jié)構(gòu)中用到的掩碼
#define USB_RECIPIENT (unsigned char)0x1F //== bmRequestType的(4~0)位指明了操作的對象
#define USB_RECIPIENT_DEVICE (unsigned char)0x00 //== 設(shè)備
#define USB_RECIPIENT_INTERFACE (unsigned char)0x01 //== 接口
#define USB_RECIPIENT_ENDPOINT (unsigned char)0x02 //== 端點(diǎn)
#define USB_REQUEST_TYPE_MASK (unsigned char)0x60 //== bmRequestType的(6~5)位指明了主機(jī)請求的類型
#define USB_STANDARD_REQUEST (unsigned char)0x00 //== 標(biāo)準(zhǔn)請求(主機(jī)詢問設(shè)備的一些標(biāo)準(zhǔn)特性)
#define USB_CLASS_REQUEST (unsigned char)0x20 //== 類請求(主機(jī)詢問設(shè)備的類特性)
#define USB_VENDOR_REQUEST (unsigned char)0x40 //== 廠商請求(主機(jī)詢問設(shè)備的廠商)
#define USB_REQUEST_MASK (unsigned char)0x0F //== bRequest 請求命令的掩碼
#define DEVICE_ADDRESS_MASK (unsigned char)0x7F //== 地址掩碼
#define USB_ENDPOINT_DIRECTION_MASK (unsigned char)0x80 //== 端點(diǎn)號掩碼
//=======================================================================================
//***************************************************************************************
//== setup_packet 包緩沖區(qū)
#define MAX_CONTROLDATA_SIZE 8
typedef struct _control_data_buff
{
REQUESTCMD DeviceRequest; //== USB設(shè)備請求
unsigned short wLength; //== 主機(jī)請求的長度
unsigned short wCount; //== 數(shù)據(jù)的實(shí)際長度
unsigned char * pData;
unsigned char dataBuffer[MAX_CONTROLDATA_SIZE];
}CONTROL_DATA_BUFF;
//=======================================================================================
//***************************************************************************************
//== USB 的控制端點(diǎn)有4種狀態(tài):空閑,接收,發(fā)送,忙
#define USB_IDLE 0 //== 表示控制端點(diǎn)空閑
#define USB_TRANSMIT 1 //== 表示控制端點(diǎn)處于發(fā)送狀態(tài),(等待發(fā)送數(shù)據(jù)的到來)
#define USB_RECEIVE 2 //== 表示控制端點(diǎn)處于接收完?duì)顟B(tài),(數(shù)據(jù)接收完接收,等待對接收數(shù)據(jù)的處理)
#define USB_HANDEL 3 //== 表示控制端點(diǎn)正在處理,忙
typedef union _epp_flags //== 程序運(yùn)行標(biāo)志位
{
unsigned short Register;
struct _flags
{
unsigned char bus_reset :1; //== 總線復(fù)位標(biāo)志
unsigned char suspend :1; //== 掛起改變標(biāo)志
unsigned char remote_wakeup :1; //== 遠(yuǎn)程喚醒標(biāo)志(未使用)
unsigned char int_isr :1; //== USB中斷標(biāo)志
unsigned char control_state :2; //== 控制端點(diǎn)處理狀態(tài)
//== 0: 空閑
//== 1: 數(shù)據(jù)發(fā)送
//== 2: 數(shù)據(jù)接收
unsigned char configuration :1; //== 配置標(biāo)志(0:未配置;1:已經(jīng)配置)
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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -