使用全速模式,基本通信代码较多,这里主要贴一下报告描述符以及变量设置。
一、报告描述符
1、标准6键键盘报告
const unsigned char StdKeyReportDesc[]=
{
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x07, // USAGE_PAGE (Keyboard/Keypad)
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x08, // REPORT_COUNT (8)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0x95, 0x06, // REPORT_COUNT (6)
0x75, 0x08, // REPORT_SIZE (8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xFF,0X00, // LOGICAL_MAXIMUM (255)
0x05, 0x07, // USAGE_PAGE (Keyboard/Keypad)
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
0x81, 0x00, // INPUT (Data,Ary,Abs)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x05, // REPORT_COUNT (5)
0x75, 0x01, // REPORT_SIZE (1)
0x05, 0x08, // USAGE_PAGE (LEDs)
0x19, 0x01, // USAGE_MINIMUM (Num Lock)
0x29, 0x05, // USAGE_MAXIMUM (Kana)
0x91, 0x02, // OUTPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x03, // REPORT_SIZE (3)
0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
0xc0, // END_COLLECTION
};
2、全键无冲、厂商自定义、鼠标、多媒体、系统控制、无线控制报告
const unsigned char KeyboardReportDesc[] =
{
0x05,0x01, // USAGE PAGE(GENERIC DESKTOP)
0x09,0x06, // USAGE(KEYBOARD)
0xA1,0x01, // COLLECTION(APPICATION)
0x85, 0x01, //ReportID(1)
0x05,0x07, // USAGE PAGES(KEY CODES)
0x19,0xE0, // USAGE MINIMUM(0xE0)
0x29,0xE7, // USAGE MAXIMUM(0xE7)
0x15,0x00, // LOGICAL MINIMUM(0)
0x25,0x01, // LOGICAL MAXIMUM(1)
0x75,0x01, // REPORT SIZE (1)
0x95,0x08, // REPORT COUNT (8)
0x81,0x02, // INPUT(DATA,VARIABLE,ABSOLUTE)
0x05,0x07, // USAGE PAGES(KEY CODES)
0x19,0x00, // USAGE MINIMUM(0)
0x29,0x65, // USAGE MAXIMUM(0x65)
0x15,0x00, // LOGICAL MINIMUM(0)
0x25,0x01, // LOGICAL MAXIMUM(1)
0x75,0x01, // REPORT SIZE (1)
0x95,0x66, // REPORT COUNT (102)
0x81,0x02, // INPUT(DATA,VARIABLE,ABSOLUTE)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x02, // REPORT_SIZE (2)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0xC0,
0x06,0x00,0xff, //厂商自定义
0x09,0x01, //USAGE (01)
0xa1,0x01, //COLLECTION (Application)
0x85,0x02, //ReportID(2)
0x19,0x00, //USAGE_MINIMUM (0)
0x2a,0xff,0x00, //USAGE_MAXIMUM (255)
0x15,0x00, //LOGICAL_MINIMUM (0)
0x26,0xff,0x00, //LOGICAL_MAXIMUM (255)
0x75,0x08, //REPORT_SIZE (8)
0x95,MAX_EP2_SIZE-1, //REPORT_COUNT (63)
0x81,0x00, // INPUT (Data,Var,Abs)
0x19,0x00, //USAGE_MINIMUM (0)
0x2a,0xff,0x00, //USAGE_MAXIMUM (255)
0x91,0x00, // OUTPUT (Data,Var,Abs)
0xc0, // END_COLLECTION
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x02, // USAGE (Mouse)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x03, //ReportID(3)
0x09, 0x01, // USAGE (Pointer)
0xa1, 0x00, // COLLECTION (Physical)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x05, // USAGE_MAXIMUM (Button 5)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x05, // REPORT_COUNT (5)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x03, // REPORT_SIZE (5)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x30, // USAGE (X)
0x09, 0x31, // USAGE (Y)
0x16,0x00,0x80, // LOGICAL_MINIMUM (-32768)
0x26,0xff,0x7f, // LOGICAL_MAXIMUM (32767)
0x75,0x10, // REPORT_SIZE (16)
0x95,0x02, // REPORT_COUNT (2)
0x81,0x06, // INPUT (Data,Var,Rel)
0x09, 0x38, // USAGE (Wheel)
0x15, 0x81, // LOGICAL_MINIMUM (-127)
0x25, 0x7f, // LOGICAL_MAXIMUM (127)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x06, // INPUT (Data,Var,Rel)
0X05,0X0C, // USAGE_PAGE (Consumer Page)
0X0A,0X38,0X02, //USAGE(AC Pan)
0X95,0X01, //REPORT_COUNT (1)
0X81,0X06, // INPUT (Data,Var,Rel)
0xc0, // END_COLLECTION
0xc0, // END_COLLECTION
0x05, 0x0c, // USAGE_PAGE (Consumer Page)
0x09, 0x01, // USAGE (Consumer Control)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x04, //ReportID(4)
0x19,0x00, // USAGE_MINIMUM (Unassigned)
0X2A,0X3C,0X02,// USAGE_MAXIMUM (AC Format)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0X26,0X3C,0X02,// LOGICAL_MAXIMUM (0X23C)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x10, // REPORT_SIZE (16)
0x81, 0x00, // INPUT (Data,Ary,Abs)
0xc0, // END_COLLECTIONS
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x80, // USAGE (System Control)
0xa1, 0x01, // COLLECTION (Application)
0x85,0x05, //ReportID(5)
0x19,0x81, // USAGE_MINIMUM (System Power Down)
0X29,0X83,// USAGE_MAXIMUM (System Wake Up)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, //LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x03, // REPORT_COUNT (3)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x75, 0x05, // REPORT_SIZE (5)
0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x01, // INPUT (Cnst,Ary,Abs)
0XC0, // END_COLLECTION
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x0C, // USAGE (Wireless Radio Controls)
0xa1, 0x01, // COLLECTION (Application)
0x85,0x06, //ReportID(6)
0x19,0xc6, //USAGE_MINIMUM (Wireless Radio Button)
0x29,0xc8, //USAGE_MAXIMUM (Wireless Radio Slider Switch)
0x15,0x00, //LOGICAL_MINIMUM (0)
0x25,0x01, //LOGICAL_MAXIMUM (1)
0x75,0x01, //REPORT_SIZE (1)
0x95,0x01, //REPORT_COUNT (1)
0x81,0x02, // INPUT (Data,Var,Abs)
0x75,0x01, // REPORT_SIZE (1)
0x95,0x07, // REPORT_COUNT (7)
0x81,0x03, //INPUT (Cnst,Var,Abs)
0xc0, // END_COLLECTION
};
3、端点分配
标准报告分配在了端点5,其余报告分配在了端点2;
二、变量
1、6键键盘
typedef union
{
u8 Buffer[8];
struct
{
union
{
u8 SpecialKey;
struct
{
u8 LCtrl:1;
u8 LShift:1;
u8 LAlt:1;
u8 LGUI:1;
u8 RCtrl:1;
u8 RShift:1;
u8 RAlt:1;
u8 RGUI:1;
};
};
u8 Reserve;
u8 Code[6];
};
}STDKEY_REPORT;
STDKEY_REPORT StdKeyboardReport;
2、全键无冲
typedef union
{
u8 Buffer[15];
struct
{
u8 ID;
union
{
u8 SpecialKey;
struct
{
u8 LCtrl:1;
u8 LShift:1;
u8 LAlt:1;
u8 LGUI:1;
u8 RCtrl:1;
u8 RShift:1;
u8 RAlt:1;
u8 RGUI:1;
};
};
u8 Code[13];
};
}NKEY_REPORT;
NKEY_REPORT NKeyboardReport;
这里的Code,根据报告描述符,代表按键状态,每个bit分别代表键值0X00-0X65对应按键的状态(byte1的bit0对应键值0X00),值0代表释放按键,值1代表按下按键,详细查询USB官方键值表;
3、鼠标
typedef union
{
u8 Buffer[8];
struct
{
u8 ID;
union
{
u8 Button;
struct
{
u8 LeftBtn:1;
u8 RightBtn:1;
u8 MidBtn:1;
u8 BackBtn:1;
u8 ForwardBtn:1;
u8 reserve:3;
};
};
s16 X;
s16 Y;
s8 Wheel;
s8 ACPan;
};
}MOUSE_REPORT;
MOUSE_REPORT MouseReport;
4、多媒体
typedef union
{
u8 Buffer[3];
struct
{
u8 ID;
u8 Code[2];
};
}CONSUMER_REPORT;
CONSUMER_REPORT ConsumerReport;
Code是usb官方的Consumer表,低位在前高位在后;
5、系统控制
typedef union
{
u8 Buffer[2];
struct
{
u8 ID;
union
{
u8 Flag;
struct
{
u8 bSysShutdown:1;
u8 bSysSleep:1;
u8 bSysWakeup:1;
u8 Reserve:5;
};
};
};
}SYSCTRL_REPORT;
SYSCTRL_REPORT SysCtrlReport;
6、无线控制
typedef union
{
u8 Buffer[2];
struct
{
u8 ID;
union
{
u8 Flag;
struct
{
u8 bWirelessEnable:1;
u8 Reserve:7;
};
};
};
}WIRELESS_REPORT;
WIRELESS_REPORT WirelessReport;