当前位置:首页 >> 信息与通信 >>

USB HID 学习实例之如何枚举为鼠标


USB 学习板:EASY USB 51 PROGRAMER 配套光盘

USB HID 学习实例之如何枚举为鼠标
通过上一节的工作, 机能成功发现 USB 设备的插入, PC 但是 PC 要求我们提供此设置的驱动 程序,这是因为原固件驱动定义的设备类型是“测试设备类”,此时要求用户提供自定义的设备驱动 程序,如下图所示:

USB

主机是通过请求设备的相关描述符来判断设备类型的,所以我们只需要修改相关描述符 就能实现我们想要设备类型。描述符的配置位于 Descriptor.h 和 Descriptor.c 文件中。 下面我们来把 Easy USB 51 Programer 改造成一个鼠标。 第一步:修改 Descriptor.c 1、找到设备描述结构体

1. 2. 3. 4. 5. 6. 7.

//设备描述符 code USB_DEVICE_DESCRIPTOR DeviceDescr = { sizeof(USB_DEVICE_DESCRIPTOR), USB_DEVICE_DESCRIPTOR_TYPE, 0x00,0x01, //设备描述符长度,= 12H //设备描述符类型,= 01H //协议版本,= 1.10 //测试设备类型, = 0DCH

USB_CLASS_CODE_TEST_CLASS_DEVICE,

主页地址:http://www.baiheee.com/Products/Easy_USB_51_Programer/Easy_USB_51_Programer.htm 淘宝网店:http://shop60158254.taobao.com/

USB 学习板:EASY USB 51 PROGRAMER 配套光盘
8. 9. 10. 11. 12. 13. 14. 15. }; 0, 0, EP0_PACKET_SIZE, 0x71,0x04, 0x66,0x01, 0x00,0x01, 0, 0, 0, 1 //设备子类,设备协议 //端点 0 最大数据包大小,= 10H //PHILIPS 公司的设备 ID //设备制造商定的产品 ID //设备系列号 //索引 //可能的配置数

将其中的

1.

USB_CLASS_CODE_TEST_CLASS_DEVICE,

//测试设备类型, = 0DCH

注释掉,并在其后加入下面这行代码

1.

0,

//设备类型由接口描述符提供

同时也将

1.

0x66,0x01,

//设备制造商定的产品 ID

修改为

1.

0x66,0x02,

//设备制造商定的产品 ID

2、找到接口描述符结构体

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.

//接口描述符 { sizeof(USB_INTERFACE_DESCRIPTOR), USB_INTERFACE_DESCRIPTOR_TYPE, 0, 0, NUM_ENDPOINTS, USB_CLASS_CODE_TEST_CLASS_DEVICE, USB_SUBCLASS_CODE_TEST_CLASS_D12, USB_PROTOCOL_CODE_TEST_CLASS_D12, 0 //接口数,只有 1 个 //可选配置,只有 1 个 //除端点 0 的端点索引数目,= 04H //测试设备类型,= 0DCH //子类代码,= 0A0H //协议代码,= 0B0H //字符串描述符索引 //接口描述符长度,= 09H //接口描述符类型,= 04H

主页地址:http://www.baiheee.com/Products/Easy_USB_51_Programer/Easy_USB_51_Programer.htm 淘宝网店:http://shop60158254.taobao.com/

USB 学习板:EASY USB 51 PROGRAMER 配套光盘
12. },

将其中的

1.

USB_CLASS_CODE_TEST_CLASS_DEVICE,

//测试设备类型,= 0DCH

注释掉,并在其后加入下面一行代码

1.

0x03,

//人机接口设备(HID)类

第二步:编译源程序并写入主控芯片 将我们的编程器插入 PC 机,激动人心的时刻到了,我们看到 PC 机能成功识别到我们插入的 设备是人体工学设备(就是 HID 设备)了:

但是接下来却提示:

打开设备管理器我们发现人体学输入设备下面有一个 USB 设备出现了“!”号,这个设备就是 我们的 Easy USB 51 Programer,但为什么有问题呢?

主页地址:http://www.baiheee.com/Products/Easy_USB_51_Programer/Easy_USB_51_Programer.htm 淘宝网店:http://shop60158254.taobao.com/

USB 学习板:EASY USB 51 PROGRAMER 配套光盘

看来是我们对 USB 设备的枚举过程不够了解, 您可以先看看百合电子工作室发表的文章: USB 开发基础--实例讲解 USB 的枚举(配置)过程和 USB HID 设备类协议入门。 第三步:继续修改 《USB HID 设备类协议入门》一文中提到,除了 HID 的三个特定描述符组成对 HID 设备 的解释外,5 个标准描述符中与 HID 设备有关的部分有:
?

设备描述符中 bDeviceClass、bDeviceSubClass 和 bDeviceProtocol 三个字段的值必 须为零。 接口描述符中 bInterfaceClass 的值必须为 0x03, bInterfaceSubClass 的值为 0 或 1, 为 1 表示 HID 设备符是一个启动设备(Boot Device,一般对 PC 机而言才有意义,意思 是 BIOS 启动时能识别并使用您的 HID 设备, 且只有标准鼠标或键盘类设备才能成为 Boot Device。 bInterfaceProtocol 的取值含义如下表所示: HID 接口描述符中 bInterfaceProtocol 的含义 bInterfaceProtocol 的取值(十进制) 0 含义 NONE

?

主页地址:http://www.baiheee.com/Products/Easy_USB_51_Programer/Easy_USB_51_Programer.htm 淘宝网店:http://shop60158254.taobao.com/

USB 学习板:EASY USB 51 PROGRAMER 配套光盘

1 2 3~255 所以我们还有两处没有修改到: A、找到:

鼠标 键盘 保留

1.

USB_SUBCLASS_CODE_TEST_CLASS_D12,

//子类代码,= 0A0H

将其注释掉并在其后加入以下代码:

1.

1,

//使用的子类:(支持 boot)

B、找到:

1.

USB_PROTOCOL_CODE_TEST_CLASS_D12,

//协议代码,= 0B0H

将其注释掉,并在其后加入以下代码:

1.

1,

//bInterfaceProtocol 为 1 代表鼠标

虽然我们将接口描述符中的 bInterfaceProtocol 设为 1 (代表鼠标)但这只是针对启动设备 , (Boot Device)而言有才有效果(即 PC 机的 BIOS 加载后能识别和使用),但真正对 HID 设备的数据 流格式进行描述的是报告描述符,所以 bInterfaceProtocol 的取值实际意义不大。 对标准描述符的修改已经完成了,但是到目前为止还不能让我们的 HID 设备运行起来,因为 HID 设备类还有 3 个特定的描述符,它们分别是:HID 描述符、报告描述符和实体描述符,其中 实体描述符是可选描述符。 USB 主机在请求 HID 设备的配置描述符时, 设备返回的描述符为: 配置描述符、 接口描述符、 HID 描述符、端点描述符。HID 描述符里包含了其附属的描述的类型和长度(如报告描述符), 然后主机再根据 HID 描述符的信息请求其相关的描述符。 所以我们现在来完成 HID 设备类的两必 须的类特定描述符:HID 描述符和报告描述符。 1、修改 Descriptor.c

主页地址:http://www.baiheee.com/Products/Easy_USB_51_Programer/Easy_USB_51_Programer.htm 淘宝网店:http://shop60158254.taobao.com/

USB 学习板:EASY USB 51 PROGRAMER 配套光盘

A、将以下代码

1.

0x60,

//自供电,支持远程唤醒

修改为

1.

0x80,

//总线供电

B、在以下代码

1. 2. 3. 4. 5. 6. 7. 8. 9.

//端点描述符,端点 1 输入 { sizeof(USB_ENDPOINT_DESCRIPTOR), USB_ENDPOINT_DESCRIPTOR_TYPE, 0x81, USB_ENDPOINT_TYPE_INTERRUPT, EP1_PACKET_SIZE,0x00, 10 }, //端点描述符长度,= 07H //端点描述符类型,= 05H //端点 1 IN //中断传输, = 03H //端点最大包的大小,= 0010H //传输间隔时间,= 10ms

前面加入代码:

1. 2. 3.

//hid_descriptor { sizeof(USB_HID_DESCRIPTOR), 小 0x09 //HID 描述符的字节数大

4. 5. 6. 7. 8. 9. 10. },

USB_HID_DESCRIPTOR_TYPE, SWAP16(0x0110), 0x21, NUM_SUB_DESCRIPTORS, USB_REPORT_DESCRIPTOR_TYPE, SWAP16(sizeof(MouseReportDescriptor)),

//HID 描述符类型编号 0x21 //协议版本,= 1.10 //固件的国家地区代号,0x21 为美国 //下级描述符的数量 //下级描述符为报告描述符 //下级描述符的长度

其中 USB_HID_DESCRIPTOR 为 HID 描述符结构体, Descriptor 中定义; 在 SWAP16 为宏定 义,作用是交换双字节数据的高字节和低字节,在 Descriptor.h 中定义; MouseReportDescriptor 为 HID 报告描述符,我们可利用 HID Descriptor tool 来生成,这是 一个标准鼠标的报告描述符。

主页地址:http://www.baiheee.com/Products/Easy_USB_51_Programer/Easy_USB_51_Programer.htm 淘宝网店:http://shop60158254.taobao.com/

USB 学习板:EASY USB 51 PROGRAMER 配套光盘

C、在代码

1. 2.

/* 接口描述符: 协议代码 */ #define USB_PROTOCOL_CODE_TEST_CLASS_D12 0xB0

后面加入以下代码:

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35.

//该报告描述符号由 HID Descriptor tool 生成 code char MouseReportDescriptor[63] = { 0x05, 0x01, 0x09, 0x06, 0xa1, 0x01, 0x05, 0x07, 0x19, 0xe0, 0x29, 0xe7, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x08, 0x81, 0x02, 0x95, 0x01, 0x75, 0x08, 0x81, 0x03, 0x95, 0x05, 0x75, 0x01, 0x05, 0x08, 0x19, 0x01, 0x29, 0x05, 0x91, 0x02, 0x95, 0x01, 0x75, 0x03, 0x91, 0x03, 0x95, 0x06, 0x75, 0x08, 0x15, 0x00, 0x25, 0xFF, 0x05, 0x07, 0x19, 0x00, 0x29, 0x65, 0x81, 0x00, 0xc0 }; // USAGE_PAGE (Generic Desktop) // USAGE (Keyboard) // COLLECTION (Application) // // // // // // // // // // // // // // // // // // // // // // // // // // // // USAGE_PAGE (Keyboard) USAGE_MINIMUM (Keyboard LeftControl) USAGE_MAXIMUM (Keyboard Right GUI) LOGICAL_MINIMUM (0) LOGICAL_MAXIMUM (1) REPORT_SIZE (1) REPORT_COUNT (8) INPUT (Data,Var,Abs) REPORT_COUNT (1) REPORT_SIZE (8) INPUT (Cnst,Var,Abs) REPORT_COUNT (5) REPORT_SIZE (1) USAGE_PAGE (LEDs) USAGE_MINIMUM (Num Lock) USAGE_MAXIMUM (Kana) OUTPUT (Data,Var,Abs) REPORT_COUNT (1) REPORT_SIZE (3) OUTPUT (Cnst,Var,Abs) REPORT_COUNT (6) REPORT_SIZE (8) LOGICAL_MINIMUM (0) LOGICAL_MAXIMUM (255) USAGE_PAGE (Keyboard) USAGE_MINIMUM (Reserved (no event indicated)) USAGE_MAXIMUM (Keyboard Application) INPUT (Data,Ary,Abs)

// END_COLLECTION

主页地址:http://www.baiheee.com/Products/Easy_USB_51_Programer/Easy_USB_51_Programer.htm 淘宝网店:http://shop60158254.taobao.com/

USB 学习板:EASY USB 51 PROGRAMER 配套光盘

D、将以下代码注释掉

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.

//端点描述符,端点 1 输入 { sizeof(USB_ENDPOINT_DESCRIPTOR), USB_ENDPOINT_DESCRIPTOR_TYPE, 0x81, USB_ENDPOINT_TYPE_INTERRUPT, EP1_PACKET_SIZE,0x00, 10 }, //端点描述符,端点 1 输出 { sizeof(USB_ENDPOINT_DESCRIPTOR), USB_ENDPOINT_DESCRIPTOR_TYPE, 0x1, USB_ENDPOINT_TYPE_INTERRUPT, EP1_PACKET_SIZE,0x00, 10 }, //端点描述符长度,= 07H //端点描述符类型,= 05H //端点 1 OUT //中断传输,= 03H //端点最大包的大小,= 0010H //传输间隔时间,= 10ms //端点描述符长度,= 07H //端点描述符类型,= 05H //端点 1 IN //中断传输, = 03H //端点最大包的大小,= 0010H //传输间隔时间,= 10ms

E、将以下代码

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.

//端点 2 输入 { sizeof(USB_ENDPOINT_DESCRIPTOR), USB_ENDPOINT_DESCRIPTOR_TYPE, 0x82, USB_ENDPOINT_TYPE_BULK, EP2_PACKET_SIZE,0x00, 10 }, //端点 2 输出 { sizeof(USB_ENDPOINT_DESCRIPTOR), USB_ENDPOINT_DESCRIPTOR_TYPE, 0x2, USB_ENDPOINT_TYPE_BULK, EP2_PACKET_SIZE,0x00, 10 } //端点描述符长度,= 07H //端点描述符类型,= 05H //端点 2 IN //批量传输,= 02H //端点最大包的大小,= 0040H //批量传输时该设备无效 //端点描述符长度,= 07H //端点描述符类型,= 05H //端点 2 OUT //批量传输,= 02H //端点最大包的大小,= 0040H //批量传输时该设备无效

主页地址:http://www.baiheee.com/Products/Easy_USB_51_Programer/Easy_USB_51_Programer.htm 淘宝网店:http://shop60158254.taobao.com/

USB 学习板:EASY USB 51 PROGRAMER 配套光盘

修改为

1. 2. 3. 4. 5. 6. 7. 8.

//端点 2 输入 { sizeof(USB_ENDPOINT_DESCRIPTOR), USB_ENDPOINT_DESCRIPTOR_TYPE, 0x82, USB_ENDPOINT_TYPE_INTERRUPT, EP2_PACKET_SIZE,0x00, 0x01 1ms //端点描述符长度,= 07H //端点描述符类型,= 05H //端点 2 OUT //中断传输,= 03H //端点最大包的大小,= 0040H //中断扫描时间:设置为

9. 10. 11. 12. 13. 14. 15. 16. 17. 1ms 18.

}, //端点 2 输出 { sizeof(USB_ENDPOINT_DESCRIPTOR), USB_ENDPOINT_DESCRIPTOR_TYPE, 0x02, USB_ENDPOINT_TYPE_INTERRUPT, EP2_PACKET_SIZE,0x00, 0x01 //端点描述符长度,= 07H //端点描述符类型,= 05H //端点 2 IN //中断传输,= 03H //端点最大包的大小,= 0040H //中断扫描时间:设置为

}

2、修改 Descriptor.h A、将以下代码

1. 2. 3. 4. 5. 6. 7. 8. 9.

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

D12 USB 各种描述符结构体 *********************/

typedef struct _USB_DESCRIPTOR { USB_CONFIGURATION_DESCRIPTOR ConfigDescr; USB_INTERFACE_DESCRIPTOR InterfaceDescr; USB_ENDPOINT_DESCRIPTOR EP1_TXDescr; USB_ENDPOINT_DESCRIPTOR EP1_RXDescr; USB_ENDPOINT_DESCRIPTOR EP2_TXDescr; USB_ENDPOINT_DESCRIPTOR EP2_RXDescr; } USB_DESCRIPTOR, *PUSB_DESCRIPTOR; //配置描述符 //接口描述符 //端点 1 输入描述符 //端点 1 输出描述符 //端点 2 输入描述符 //端点 2 输出描述符

修改为

1. 2.

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

D12 USB 各种描述符结构体 *********************/

typedef struct _USB_DESCRIPTOR {

主页地址:http://www.baiheee.com/Products/Easy_USB_51_Programer/Easy_USB_51_Programer.htm 淘宝网店:http://shop60158254.taobao.com/

USB 学习板:EASY USB 51 PROGRAMER 配套光盘
3. 4. 5. 6. 7. 8. 9. 10. // // USB_CONFIGURATION_DESCRIPTOR ConfigDescr; USB_INTERFACE_DESCRIPTOR InterfaceDescr; USB_HID_DESCRIPTOR HidDescr; USB_ENDPOINT_DESCRIPTOR EP1_TXDescr; USB_ENDPOINT_DESCRIPTOR EP1_RXDescr; USB_ENDPOINT_DESCRIPTOR EP2_TXDescr; USB_ENDPOINT_DESCRIPTOR EP2_RXDescr; } USB_DESCRIPTOR, *PUSB_DESCRIPTOR; //配置描述符 //接口描述符 //HID 描述符 //端点 1 输入描述符 //端点 1 输出描述符 //端点 2 输入描述符 //端点 2 输出描述符

B、找到以下代码段:

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.

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

USB HUB 描述符结构体

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

typedef struct _USB_HUB_DESCRIPTOR { INT8U INT8U INT8U INT16U INT8U INT8U // // room for 255 ports power control and removable bitmask INT8U bRemoveAndPowerMask[64]; bDescriptorLength; bDescriptorType; bNumberOfPorts; wHubCharacteristics; bPowerOnToPowerGood; bHubControlCurrent; // Length of this descriptor // Hub configuration type // number of ports on this hub // Hub Charateristics // port power on till power good in 2ms // max current in mA

} USB_HUB_DESCRIPTOR, *PUSB_HUB_DESCRIPTOR;

在其后加入代码:

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.

#define NUM_SUB_DESCRIPTORS 1

/*********** 定义 HID 描述符结构 typedef struct _HID_DESCRIPTOR { INT8U bLength; INT8U bDescriptorType; INT16U bcdHID; INT8U bCountryCode; INT8U bNumDescriptors;

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

// USB_HID_SUB_DESCRIPTOR HidSubDescriptors[NUM_SUB_DESCRIPTORS]; INT8U bSubDescriptorType; INT16U wDescriptorLength; //下级描述符的类型编号 //下级描述符的长度

}USB_HID_DESCRIPTOR,*PUSB_HID_DESCRIPTOR;

C、找到以下代码:

主页地址:http://www.baiheee.com/Products/Easy_USB_51_Programer/Easy_USB_51_Programer.htm 淘宝网店:http://shop60158254.taobao.com/

USB 学习板:EASY USB 51 PROGRAMER 配套光盘

1.

#define USB_POWER_DESCRIPTOR_TYPE

0x06

在其后加入

1. 2.

#define USB_HID_DESCRIPTOR_TYPE #define USB_REPORT_DESCRIPTOR_TYPE

0x21 0x22

//HID 描述符类型

//报告描述符

D、找到以下代码:

1.

#define __HIDDESCRIPTOR_H__

在其后加入

1. 2. 3.

#define SWAP16(x)

((((INT16U)(x))<<8)|(((INT16U)(x))>>8))

extern code char MouseReportDescriptor[63];

E、将以下代码

1.

#define NUM_ENDPOINTS

4

修改为

1.

#define NUM_ENDPOINTS

2

F、将以下代码

1. 2. 3.

#define CONFIG_DESCRIPTOR_LENGTH

sizeof(USB_CONFIGURATION_DESCRIPTOR) \ + sizeof(USB_INTERFACE_DESCRIPTOR) \ + (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR))

修改为

1.

#define CONFIG_DESCRIPTOR_LENGTH

sizeof(USB_CONFIGURATION_DESCRIPTOR) + sizeof(USB_INTERFACE

_DESCRIPTOR) + sizeof(USB_HID_DESCRIPTOR) + (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR))

主页地址:http://www.baiheee.com/Products/Easy_USB_51_Programer/Easy_USB_51_Programer.htm 淘宝网店:http://shop60158254.taobao.com/

USB 学习板:EASY USB 51 PROGRAMER 配套光盘

3、修改 Chap_9.c 以下修改内容主要与实现与 HID 类相关请求有关。 A、将 get_descriptor 函数注释掉,并修改为

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.

void get_descriptor(void) { INT8U bDescriptor = MSB(ControlData.DeviceRequest.wValue); //wValue 的高字节表示描述符的类型,低字节表示描述符的索引值 //读取请求的描述符类型

if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) //获取设备描述符 { code_transmit((INT8U *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR)); } else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) //获取配置描述符 { if (ControlData.DeviceRequest.wLength > CONFIG_DESCRIPTOR_LENGTH) { ControlData.DeviceRequest.wLength = CONFIG_DESCRIPTOR_LENGTH; } code_transmit((INT8U *)&(usb_descr.ConfigDescr), ControlData.DeviceRequest.wLength);

//发送描述符内容 } //---------------(added by BH.)------------------------------

else if(bDescriptor == USB_REPORT_DESCRIPTOR_TYPE) {

//获取报告描述符

//

ControlData.wCount=SWAP16(sizeof(KeyBoardReportDescriptor)); ControlData.pData=(INT8U *)(MouseReportDescriptor);

// //

if(ControlData.wLength<ControlData.wCount) ControlData.wCount = ControlData.wLength;

//

code_transmit((INT8U *)(KeyBoardReportDescriptor),ControlData.wCount); code_transmit((INT8U *)(MouseReportDescriptor),sizeof(MouseReportDescriptor)); }

else {

主页地址:http://www.baiheee.com/Products/Easy_USB_51_Programer/Easy_USB_51_Programer.htm 淘宝网店:http://shop60158254.taobao.com/

USB 学习板:EASY USB 51 PROGRAMER 配套光盘
38. 39. 40. 41. 42. 43. } } //--------------------------------------------stall_ep0(); //没有该请求,返回 STALL

B、将 control_handler 函数中被注销掉的以下语句取消注释以复原

1. 2.

//else if(type == USB_CLASS_REQUEST) // (*ClassDeviceRequest[req])(); //类请求,如大容量类

C、找到以下代码

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.

//************************************************************************* //USB 标准设备请求入口地址指针表 //************************************************************************* code void (*StandardDeviceRequest[])(void) = { get_status, clear_feature, reserved, set_feature, reserved, set_address, get_descriptor, reserved, get_configuration, set_configuration, get_interface, set_interface, reserved, reserved, reserved, reserved };

在后面加入

1. 2.

//************************************************************************* //USB HID 设备类请求入口地址指针表

主页地址:http://www.baiheee.com/Products/Easy_USB_51_Programer/Easy_USB_51_Programer.htm 淘宝网店:http://shop60158254.taobao.com/

USB 学习板:EASY USB 51 PROGRAMER 配套光盘
3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. }; // // //************************************************************************* code void (*ClassDeviceRequest[])(void) = { reserved, get_report, get_idle, get_protocol, reserved, reserved, reserved, reserved, reserved, reserved, set_report, set_idle, setprotocol reserved

D、增加以下代码

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.

//定义 USB 事件标志变量 EPPFLAGS bEPPflags; 后加入 unsigned char idle; //空闲状态

/**************************************** ** 函数名称: void get_report(void) ** 功能描述: 读取报告描述符 *****************************************/ void get_report(void) {

}

/**************************************** ** 函数名称: void set_report(void) ** 功能描述: 获取空闲 *****************************************/ void set_report(void) { }

主页地址:http://www.baiheee.com/Products/Easy_USB_51_Programer/Easy_USB_51_Programer.htm 淘宝网店:http://shop60158254.taobao.com/

USB 学习板:EASY USB 51 PROGRAMER 配套光盘
23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. } while(D12_SelectEndpoint(1)&0x01); single_transmit(0, 0); //发送一个空的数据表示执行完毕 /**************************************** ** 函数名称: void set_idle(void) ** 功能描述: 设置空闲 *****************************************/ void set_idle(void) { } /**************************************** ** 函数名称: void get_idle(void) ** 功能描述: 获取空闲 *****************************************/ void get_idle(void) { code_transmit(&idle,1);

idle=ControlData.DeviceRequest.wValue;

4、修改 Chap_9.h 加入以下代码

1. 2. 3. 4. 5. 6.

#define LSB(x)

((INT8U)(x))

extern void get_idle(void); extern void set_idle(void); extern void set_report(void); extern void get_report(void);

第四步、再次编译程序,将程序写入主控芯片 再次怀着激动和不安的心情将我们的 Easy USB 51 Programer 插入电脑,这次终于实现了 我们的 USB 鼠标了!如图所示,“USB 人体学输入设备”已经没有“!”了,而且在“鼠标和其它指 针设备”中多了一项“HID-compliant mouse”,这就是我们“设计”的鼠标了。

主页地址:http://www.baiheee.com/Products/Easy_USB_51_Programer/Easy_USB_51_Programer.htm 淘宝网店:http://shop60158254.taobao.com/

USB 学习板:EASY USB 51 PROGRAMER 配套光盘

下载源程序 但是这个实例还不够生动, 因为它并没有鼠标的一点功能, 现在我们就来实现部分鼠标的功能。 我们可以利用扩展板 EXT-BOARD-A 上的两个按键来模拟鼠标指针的左移和右移, K1 按下鼠 当 标指针左移、K2 按下时鼠标指针右移(当然您也可以用它来模拟鼠标左键和鼠标右键)。实现这 个功能非常简单,只需修改 main 函数,其内容如下:

1. 2. 3. 4. 5. 6. 7. 8. 9. 10.

main() { unsigned char i = 0; signed char cKeyIn[4];

if (Init_D12()!=0) return;

//初始化 D12 //如果初始化不成功,返回

IT0 = 0;

//外部中断 0 为电平触发方式

主页地址:http://www.baiheee.com/Products/Easy_USB_51_Programer/Easy_USB_51_Programer.htm 淘宝网店:http://shop60158254.taobao.com/

USB 学习板:EASY USB 51 PROGRAMER 配套光盘
11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. /* } /////如果没有扩展板 EXT-BOARD-A,可用以下代码段模拟,功能为插入设备后鼠标指针往右移///// //如果有键按下 for(i=0;i<253;i++); //延时 cKeyIn[0]=0; D12_WriteEndpoint(5,4,cKeyIn); //发 4 个字节到 PC 机 } else if(K1 & ~K2) { cKeyIn[0]=0; cKeyIn[1]=1; cKeyIn[2]=0; cKeyIn[3]=0; //鼠标右移 //K2 按下 D12_WriteEndpoint(5,4,cKeyIn); //发 4 个字节到 PC 机 if(~K1 & K2) { cKeyIn[0]=0; cKeyIn[1]=-1; cKeyIn[2]=0; cKeyIn[3]=0; //鼠标左移 //K1 按下 for(i=0;i<100;i++); //延时 K1 K2 = 1; = 1; //P3.5 //P3.6 } while(1) { usbserve(); if(bEPPflags.bits.configuration) { //在这里添加端点操作代码 if(bEPPflags.bits.ep2_rxdone ) { bEPPflags.bits.ep2_rxdone = 0; //主端点接收到数据(从主机发往设备的数据) //处理 USB 事件 EX0 = 1; PX0 = 0; EA = 1; //开外部中断 0 //设置外部中断 0 中断优先级 //开 80C51 总中断

主页地址:http://www.baiheee.com/Products/Easy_USB_51_Programer/Easy_USB_51_Programer.htm 淘宝网店:http://shop60158254.taobao.com/

USB 学习板:EASY USB 51 PROGRAMER 配套光盘
55. 56. 57. 58. 59. 60. 61. 62. 63. 64. //////// 65. 66. 67. 68. } } } } */ /////////////////////////////////////////////////////////////////////////////////// cKeyIn[1]=1; cKeyIn[2]=0; cKeyIn[3]=0; for(i=0;i<100;i++) { //if(!bEPPflags.bits.ep2_txdone) D12_WriteEndpoint(5,4,cKeyIn); //发 4 个字节到 PC 机 //鼠标右移

USB 鼠标各个键的定义由报告描述符定义,此实例中的报告描述符描述了 4 个字节,第一个 字节表示按键,第二个字节表示 x 轴(即鼠标左右移动,0 表示不动,正值表示往右移,负值表示 往左移),第三个字节表示 y 轴(即鼠标上下移动,0 表示不动,正值表示往下移动,负值表示往 上移动),第四个字节表示鼠标滚轮(正值为往上滚动,负值为往下滚动)。 USB 鼠标报告各位(字节)用法及含义 字节 位 0 1 0 2 3 4 5~7 1 8~15 用法及含义 Button1 Button2 Button3 Button4 Button5 Not Used 指针 X 轴方向位移,相对量(若此值为 1,指针在原来基础上向右移动一个 像素,若为-1 则向左移动一个像素) 指针 Y 轴方向位移,相对量(若此值为 1,指针在原来基础上向下移动一个 像素,若为-1 则向上移动一个像素)

2 3

16~23

24~31 滚轮

主页地址:http://www.baiheee.com/Products/Easy_USB_51_Programer/Easy_USB_51_Programer.htm 淘宝网店:http://shop60158254.taobao.com/

USB 学习板:EASY USB 51 PROGRAMER 配套光盘

从硬件管理器中可以看到设备已被成功枚举为 USB 鼠标

主页地址:http://www.baiheee.com/Products/Easy_USB_51_Programer/Easy_USB_51_Programer.htm 淘宝网店:http://shop60158254.taobao.com/

USB 学习板:EASY USB 51 PROGRAMER 配套光盘

利用 EXT-BOARD-A 上的 K1 和 K2 键来控制鼠标指针 下载源程序

主页地址:http://www.baiheee.com/Products/Easy_USB_51_Programer/Easy_USB_51_Programer.htm 淘宝网店:http://shop60158254.taobao.com/


相关文章:
USB 命令及鼠标枚举过程
USB 命令及鼠标枚举过程_IT/计算机_专业资料。一、USB 命令 在 USB 规范里, ...USB HID 学习实例之如何... 20页 免费 实例讲解USB枚举(配置... 15页 免...
实例抓包分析USB鼠标枚举数据流
现在就抓到了 USB 鼠标枚举数据流 要看懂这些数据流,需要 http://hi.baidu....USB HID 学习实例之如何... 20页 5下载券 实例讲解USB枚举(配置... 15页...
HID--学习心得
USB 设 备只是配合主机完成设备的枚举、 数据方向和...PMA STM32f10x_it.c:里面有 功能,可以拿例子来...这里指定为 HID 设备,USB 键盘和鼠标都是 HID b...
USB学习小记-HID类学习流程
USB学习小记-HID学习流程_电脑基础知识_IT/计算机_专业资料。HID学习[...(可直接使用网上的例子的) ,那么此时应该能够枚举成功了,如果不正确,请 分部...
基于STM32的USB简易鼠标
基于STM32的USB简易鼠标_工_高等教育_教育专区。毕业设计USB鼠标毕业...驱动程序的编写,加快了开发效率, 因此一些简单的 USB 设备,都喜欢枚举HID ...
初涉USB,初学者USB入门总结
USB枚举的详细流程 6页 免费 USB HID 学习实例之如何枚... 20页 免费如要投诉...这样调试起来十分困难,建议从 USB 的键盘,鼠标开始做, 了解清楚了,再做自己的...
USB HID学习手册
USB HID学习手册_计算机软件及应用_IT/计算机_专业资料。USB HID通讯 ...看看实际的例子, 加深理解, 以我使用的 acer 鼠标来做例子, 插上鼠标时, ...
usb鼠标的实现
P0.0~P0.7 设备初始化 A0 WR_N RD_N D0 D7 USB 设备枚举 NO PDIUSB...Usb鼠标电路图 1页 免费 USB HID 学习实例之如何... 20页 免费 光电鼠标原理...
USB HID 设备类协议入门
所以很多简单 的 USB 设备,喜欢枚举HID 设备,...1、HID 描述符 、 含义 NONE 键盘 鼠标 保留 HID...USB HID 学习实例之如何... 20页 5下载券 USB-...
学USB的经历
USB HID 学习实例之如何枚... 20页 免费 USB驱动...完成 PC 主机对 USB 设备的枚举过程已经是轻松的事情...当写完最后一句代码,运行程序,看到设备在鼠标键盘点...
更多相关标签: