三、USB通信

使用全速模式,基本通信代码较多,这里主要贴一下报告描述符以及变量设置。

一、报告描述符

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;

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值