OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 30505|回复: 25

原子STM32将USB鼠标例程改为自定义HID设备

[复制链接]

6

主题

19

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2013-9-10
在线时间
0 小时
发表于 2014-5-29 22:14:33 | 显示全部楼层 |阅读模式

     近来一直研究USB,刚开始确实有些困难,不过贵在坚持。手头主要一本《圈圈教你玩USB》,看到自定义USB部分,就想在原子开发板上实现HID。其实在开发板例程—— 触控USB鼠标实验基础上还是比较容易改动的。下面简单总结一下改动步骤:

1、修改设备描述符

在文件usb_desc.c中。因为鼠标本身就属于HID设备,因此,改动起来就相当容易了。设备描述符即Joystick_DeviceDescriptor[]基本不用改动,但最好把idVendoridProduct字段改下,这样有助于PC重新为设备查找驱动程序,至于改成什么值就随意了。这里我将它们改为如下值:

0x88,                       /*idVendor (0x8888)*/

0x88,

0x06,                       /*idProduct = 0x0006*/

0x00,

当然,这是圈圈书中取得值,由于历史原因(USB技术规范文件上就有这句话,感觉很神秘的样子啊~),我这里只是为了图方便就采用这俩值。如果修改了USB固件,这里最好也顺便把这俩值修改下,便于PC重新为设备加载驱动。

2、修改配置描述符

Joystick_ConfigDescriptor[]中,将接口描述符部分bInterfaceSubClassnInterfaceProtocol字段改为都改为0x00,这样就表示是自定义的HID设备了,需要我们自己编写上位机进行数据的接收和发送。两个字段的修改:

    0x00,         /*bInterfaceSubClass: 1=BOOT, 0=no boot*/

    0x00,         /*nInterfaceProtocol: 0=none, 1=keyboard, 2=mouse*/

在端点描述符部分,将wMaxPacketSize字段改为0x100x00,即表示端点1最大包长度为16字节。因为原来原子板鼠标例程用的是中断输入端点1,这里就顺便用这个端点好了。端点最大包长度修改:

    0x10,          /*wMaxPacketSize: 16 Byte max */

    0x00,

配置描述符中其他部分不用改动。

3、修改报告描述符

这里我将圈圈书中的报告描述符直接搬过来,为了简单起见,将描述符中输出数据描述部分去掉。然后将报告描述符的长度JOYSTICK_SIZ_REPORT_DESC改为21,即报告描述符共21个字节。

#define JOYSTICK_SIZ_REPORT_DESC                21

这里报告描述符定义了8个输入字节。将报告描述符贴在这里:

 //每行开始的第一字节为该条目的前缀,前缀的格式为:

 //D7~D4bTagD3~D2bTypeD1~D0bSize。以下分别对每个条目注释。

 

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

 //后面跟1字节数据(bSize1),后面的字节数就不注释了,自己根据bSize来判断。

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

 

 //这是一个局部(bType2)条目,用途选择为0x00。在普通桌面页中,

 //该用途是未定义的,如果使用该用途来开集合,那么系统将不会把它

 //当作标准系统设备,从而就成了一个用户自定义的HID设备。

 0x09, 0x00, // USAGE (0)

 

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

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

 //用户自定义。

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

 

 //这是一个全局条目,说明逻辑值最小值为0

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

 

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

 0x25, 0xff, //     LOGICAL_MAXIMUM (255)

 

 //这是一个局部条目,说明用途的最小值为1

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

 

 //这是一个局部条目,说明用途的最大值8

 0x29, 0x08, //     USAGE_MAXIMUM (8) 

 

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

 0x95, 0x08, //     REPORT_COUNT (8)

 

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

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

 

 //这是一个主条目,说明有8个长度为8bit的数据域做为输入。

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

 

 //下面这个主条目用来关闭前面的集合。bSize0,所以后面没数据。

 0xc0        // END_COLLECTION

4、修改端点1发送字节数

usb_prop.c中,找到Joystick_Reset()函数,将其中SetEPTxCount(ENDP1, 4);改为SetEPTxCount(ENDP1, 8);,因为报告描述符定义的是8个输入字节。

5、修改Joystick_Send()函数

Joystic_Send()函数在hw_config.c文件中。原来的Joystick_Send()函数发送4个字节,这里将其改为发送8个字节:

void Joystick_Send(u8 buf0,u8 buf1,u8 buf2,u8 buf3, u8 buf4, u8 buf5, u8 buf6, u8 buf7)

{

  u8 Mouse_Buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0};

    

  /* prepare buffer to send */

  Mouse_Buffer[0]=buf0;

  Mouse_Buffer[1]=buf1;

  Mouse_Buffer[2]=buf2;

  Mouse_Buffer[3]=buf3;

  Mouse_Buffer[4] = buf4;

  Mouse_Buffer[5] = buf5;

  Mouse_Buffer[6] = buf6;

  Mouse_Buffer[7] = buf7;

 

  /*copy mouse position info in ENDP1 Tx acket Memory Area*/

  UserToPMABufferCopy(Mouse_Buffer, GetEPTxAddr(ENDP1), 8);

  /* enable endpoint for transmission */

  SetEPTxValid(ENDP1);

}

还有,千万别忘了在hw_config.h中修改Joystick_Send()的声明,否则keil将报错的,当然,等报错的时候也就意识到还木有修改了~

6、经上述步骤,其实已经差不多了,在main()中,简单修改如下:

  while(1)

{  

key=KEY_Scan(1);//支持连按

if(key)

{       

if(key==KEY_UP)Joystick_Send(11, 22,33,44,55,66, 77, 88);  //发送滚轮数据到电脑     

}

if(bDeviceState==CONFIGURED){

LED1=0;//USB配置成功了,LED1亮,否则,灭

}else{ 

LED1=1; 

}   

}

当我们按动原子旗舰板上的KEY_UP键,就可以向PC发送数据了。打开圈圈写的HID上位机,看下效果

  

怎样,是不是收到数据了啊~注意PVN改为0200啊,因为我们USB固件中用的是USB2.0,当然,将USB版本改为1.0也是可以的,只要和上位机中PVN一致就可以了。

 

 

 

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-5-29 23:28:31 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

33

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2014-1-7
在线时间
10 小时
发表于 2014-7-30 08:11:26 | 显示全部楼层
你好,能够把修改的工程上传一下吗,不胜感激
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2014-10-10
在线时间
0 小时
发表于 2014-10-10 20:38:36 | 显示全部楼层
求楼主的源代码,希望楼主能给我发一个534154506@qq.com,万分感谢!
回复 支持 反对

使用道具 举报

28

主题

187

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
381
金钱
381
注册时间
2014-10-9
在线时间
6 小时
发表于 2014-12-8 16:59:01 | 显示全部楼层
楼主,我刚开始接触USB,现在想要修改ST 的官方HID例程 变成游戏手柄可以和主机通信的
现在正在枚举,需要改哪些地方?
有什么可以参考的资料么?
拿什么让你自己信服 自己
回复 支持 反对

使用道具 举报

14

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2014-12-6
在线时间
0 小时
发表于 2014-12-12 15:25:34 | 显示全部楼层
楼主用的哪个库啊
画杯粪,为力量
回复 支持 反对

使用道具 举报

33

主题

253

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
412
金钱
412
注册时间
2012-8-16
在线时间
0 小时
发表于 2014-12-26 17:05:02 | 显示全部楼层
不错!!支持~~绑定!!!!
开源的世界,你可以做主!!
回复 支持 反对

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2015-2-3 16:55:58 | 显示全部楼层
很好,正在学习usb部分
回复 支持 反对

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2014-5-7
在线时间
5 小时
发表于 2015-3-9 14:23:59 | 显示全部楼层
如果需要在其它的系统上实现HID呢?例如在IOS设备上该如何实现啊?
回复 支持 反对

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
发表于 2015-3-20 17:05:21 | 显示全部楼层
回复【9楼】sinc_mark:
---------------------------------
cool
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-3-19
在线时间
0 小时
发表于 2015-3-23 20:54:32 | 显示全部楼层
搞了好久搞不定,求帮助
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-3-19
在线时间
0 小时
发表于 2015-3-23 20:55:37 | 显示全部楼层
有没有 stm32-407的鼠标改HID的,求帮助
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2015-6-13
在线时间
0 小时
发表于 2015-6-13 09:01:26 | 显示全部楼层
回复【12楼】LOVENFZS:
---------------------------------
我顶,我也需要,求帮助啊
回复 支持 反对

使用道具 举报

13

主题

104

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2011-8-2
在线时间
0 小时
发表于 2015-6-16 11:52:39 | 显示全部楼层
有没有在stm32f207上实现过呢,stm32f2用的usb库不一样,搞不定啊
回复 支持 反对

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2014-7-14
在线时间
0 小时
发表于 2015-7-5 16:50:29 | 显示全部楼层
楼主你好,我现在需要写USB通信的上位机和下位机,以前我用鼠标例程中的下位机我上位机能查找到设备,但是无法用读的方式打开,写也写不进去数据,更具你的方法我该的现在,设备都查找不到了。楼主大哥能知道下吗?把你的资料给我发一份我的邮箱446310852@qq.com非常感谢
回复 支持 反对

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2014-7-14
在线时间
0 小时
发表于 2015-7-6 12:01:03 | 显示全部楼层
我也是根据你这该的,按圈圈说的这个时候应该在人体输入设备下出现HID-compliant device但是我的人体输入设备下面本来就有HID-compliant device。反而是鼠标和其他指针设备下面出现一个错误的鼠标HID—compliant mouse。这就是把原来的鼠标配置修改错了,有出现不了正确的,我不懂为啥,求提示
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-9-3
在线时间
6 小时
发表于 2015-8-28 09:23:04 | 显示全部楼层
谢谢楼主的分享,这几天想制一个游戏手柄,网上根本找不到一个完全的例程,要不就是在别的网站上要收钱的,免费的只有那“STM32手柄(增强版)VET6,兼容Win7”,这个程序也有好多人放在其他网站骗钱骗积分!本论坛也有个朋友做飞行器摇杆摆上来的就是这个程序,根本不可以用,只能PC识别到是手柄和出现按键,没办法正常通信~~~我查阅了它的代码,向PC发送报告那部分有问题,怎么搞都不行,而且是不是它的USB库旧还是什么的,总感觉USB库文件不全,无从下手!绕了一大圈,还是回到原子哥论坛看到这个贴,然后照着楼主的方法修改,立马把原子哥的触控鼠标例程变成PC手柄了,按键也能正常通信了~~~
回复 支持 反对

使用道具 举报

8

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2015-3-27
在线时间
11 小时
发表于 2015-9-14 13:42:54 | 显示全部楼层
楼主上位机软件在哪里有下载啊,麻烦给个链接。谢谢!!!
回复 支持 反对

使用道具 举报

1

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-12-16
在线时间
0 小时
发表于 2015-9-21 16:55:50 | 显示全部楼层
楼主,我用你的上位机遇到一个问题,电脑设备管理器可以看到我的USB设备正常使用,但是在你写的上位机上面输入VID和PID、版本号然后查找时候找不到,有点郁闷,找不到原因,能帮忙分析下吗
正在入门.........
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-10-13
在线时间
0 小时
发表于 2015-10-13 15:07:07 | 显示全部楼层
回复【14楼】提刀上马:
---------------------------------
能分享一下stm32f2用的usb库吗?小弟愚钝没有找到
回复 支持 反对

使用道具 举报

8

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2015-11-9
在线时间
23 小时
发表于 2016-2-23 17:40:25 | 显示全部楼层
MAK!!!!!!!!!!!!11
回复 支持 反对

使用道具 举报

8

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2015-11-9
在线时间
23 小时
发表于 2016-2-24 11:38:14 | 显示全部楼层
紫砂冰茶 发表于 2015-9-14 13:42
楼主上位机软件在哪里有下载啊,麻烦给个链接。谢谢!!!

请问有没有找到这个上位机啊,能不能给发一份~
回复 支持 反对

使用道具 举报

4

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2015-3-16
在线时间
3 小时
发表于 2016-4-25 15:56:03 | 显示全部楼层
多谢楼主分享
回复 支持 反对

使用道具 举报

4

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2015-3-16
在线时间
3 小时
发表于 2016-4-26 11:04:13 | 显示全部楼层
我是参照楼主的改的,但是设备插到电脑上还是识别不出来,这是为什么?
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
47
金钱
47
注册时间
2015-2-12
在线时间
12 小时
发表于 2016-5-29 21:38:13 | 显示全部楼层
你好,你可以实现鼠标的功能的同时又可以向PC传数据????
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2011-12-14
在线时间
20 小时
发表于 2020-10-5 11:11:15 | 显示全部楼层
求修改的工程上传,不胜感激
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-17 04:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表