新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > STM32的USB键盘及鼠标的例程介绍

STM32的USB键盘及鼠标的例程介绍

作者:时间:2012-10-14来源:网络收藏

本文引用地址:http://www.eepw.com.cn/article/170774.htm

/************************部分报告描述符**********************/

/*******************************************************************/

//这是一个全局(bType为1)条目,选择用途页为普通桌面Generic Desktop Page(0x01)

0x05, 0x01, // USAGE_PAGE (Generic Desktop)

//这是一个局部(bType为2)条目,说明接下来的应用集合用途用于

0x09, 0x02, // USAGE (Mouse)

//这是一个主条目(bType为0)条目,开集合,后面跟的数据0x01表示

//该集合是一个应用集合。它的性质在前面由用途页和用途定义为

//普通桌面用的

0xa1, 0x01, // COLLECTION (Application)

//报告ID,这里定义鼠标报告的ID为2

0x85, 0x02, //Report ID (2)

//这是一个局部条目。说明用途为指针集合

0x09, 0x01, // USAGE (Pointer)

//这是一个主条目,开集合,后面跟的数据0x00表示该集合是一个

//物理集合,用途由前面的局部条目定义为指针集合。

0xa1, 0x00, // COLLECTION (Physical)

//这是一个全局条目,选择用途页为按键(Button Page(0x09))

0x05, 0x09, // USAGE_PAGE (Button)

//这是一个局部条目,说明用途的最小值为1。实际上是鼠标左键。

0x19, 0x01, // USAGE_MINIMUM (Button 1)

//这是一个局部条目,说明用途的最大值为3。实际上是鼠标中键。

0x29, 0x03, // USAGE_MAXIMUM (Button 3)

//这是一个全局条目,说明返回的数据的逻辑值(就是我们返回的数据域的值啦)

//最小为0。因为我们这里用Bit来表示一个数据域,因此最小为0,最大为1。

0x15, 0x00, // LOGICAL_MINIMUM (0)

//这是一个全局条目,说明逻辑值最大为1。

0x25, 0x01, // LOGICAL_MAXIMUM (1)

//这是一个全局条目,说明数据域的数量为三个。

0x95, 0x03, // REPORT_COUNT (3)

//这是一个全局条目,说明每个数据域的长度为1个bit。

0x75, 0x01, // REPORT_SIZE (1)

//这是一个主条目,说明有3个长度为1bit的数据域(数量和长度

//由前面的两个全局条目所定义)用来做为输入,

//属性为:Data,Var,Abs。Data表示这些数据可以变动,Var表示

//这些数据域是独立的,每个域表示一个意思。Abs表示绝对值。

//这样定义的结果就是,第一个数据域bit0表示按键1(左键)是否按下,

//第二个数据域bit1表示按键2(右键)是否按下,第三个数据域bit2表示

//按键3(中键)是否按下。

0x81, 0x02, // INPUT (Data,Var,Abs)

//这是一个全局条目,说明数据域数量为1个

0x95, 0x01, // REPORT_COUNT (1)

//这是一个全局条目,说明每个数据域的长度为5bit。

0x75, 0x05, // REPORT_SIZE (5)

//这是一个主条目,输入用,由前面两个全局条目可知,长度为5bit,

//数量为1个。它的属性为常量(即返回的数据一直是0)。

//这个只是为了凑齐一个字节(前面用了3个bit)而填充的一些数据

//而已,所以它是没有实际用途的。

0x81, 0x03, // INPUT (Cnst,Var,Abs)

//这是一个全局条目,选择用途页为普通桌面Generic Desktop Page(0x01)

0x05, 0x01, // USAGE_PAGE (Generic Desktop)

//这是一个局部条目,说明用途为X轴

0x09, 0x30, // USAGE (X)

//这是一个局部条目,说明用途为Y轴

0x09, 0x31, // USAGE (Y)

//这是一个局部条目,说明用途为滚轮

0x09, 0x38, // USAGE (Wheel)

//下面两个为全局条目,说明返回的逻辑最小和最大值。

//因为鼠标指针移动时,通常是用相对值来表示的,

//相对值的意思就是,当指针移动时,只发送移动量。

//往右移动时,X值为正;往下移动时,Y值为正。

//对于滚轮,当滚轮往上滚时,值为正。

0x15, 0x81, // LOGICAL_MINIMUM (-127)

0x25, 0x7f, // LOGICAL_MAXIMUM (127)

//这是一个全局条目,说明数据域的长度为8bit。

0x75, 0x08, // REPORT_SIZE (8)

//这是一个全局条目,说明数据域的个数为3个。

0x95, 0x03, // REPORT_COUNT (3)

//这是一个主条目。它说明这三个8bit的数据域是输入用的,

//属性为:Data,Var,Rel。Data说明数据是可以变的,Var说明

//这些数据域是独立的,即第一个8bit表示X轴,第二个8bit表示

//Y轴,第三个8bit表示滚轮。Rel表示这些值是相对值。

0x81, 0x06, // INPUT (Data,Var,Rel)

//下面这两个主条目用来关闭前面的集合用。

//我们开了两个集合,所以要关两次。bSize为0,所以后面没数据。

0xc0, // END_COLLECTION

0xc0 // END_COLLECTION

//以下注释不包括第一字节报告ID。

//通过上面的报告描述符的定义,我们知道返回的输入报告具有4字节。

//第一字节的低3位用来表示按键是否按下的,高5位为常数0,无用。

//第二字节表示X轴改的变量,第三字节表示Y轴的改变量,第四字节表示

//滚轮的改变量。我们在中断端点1中应该要按照上面的格式返回实际的

//鼠标数据。

};

// String Descriptors

const u8 HID_StringLangID[HID_SIZE_STRING_LANGID]=

{

HID_SIZE_STRING_LANGID,

_STRING_DESCRIPTOR_TYPE,

0x09,

0x04

};

const u8 HID_StringVendor[HID_SIZE_STRING_VENDOR]=

{

HID_SIZE_STRING_VENDOR,

USB_STRING_DESCRIPTOR_TYPE,

'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0,

'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0,

'c', 0, 's', 0

};

const u8 HID_StringProduct[HID_SIZE_STRING_PRODUCT] =

{

HID_SIZE_STRING_PRODUCT, /* bLength */

USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */

0x34, 0x6c, //水

0x62, 0x97, //面

0x4b, 0x4e, //之

0x0b, 0x4e, //下

0x84, 0x76, //的

0x55, 0x00, //U

0x53, 0x00, //S

0x42, 0x00, //B

0x4b, 0x6d, //测

0xd5, 0x8b, //试

};

u8 HID_StringSerial[HID_SIZE_STRING_SERIAL] =

{

HID_SIZE_STRING_SERIAL, /* bLength */

USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */

0x73, 0x00, //s

0x6e, 0x00, //n

0x69, 0x00, //i

0x63, 0x00, //c

0x5f, 0x00, //_

0x6b, 0x00, //k

0x84, 0x76, //的

0x55, 0x00, //U

0x53, 0x00, //S

0x42, 0x00, //B

0x2e, 0x95, //键

0xd8, 0x76, //盘

};

DIY机械键盘相关社区:机械键盘DIY


绝对值编码器相关文章:绝对值编码器原理

上一页 1 2 3 下一页

关键词: 介绍 鼠标 键盘 USB STM32

评论


相关推荐

技术专区

关闭