OpenEdv-开源电子网

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

USB鼠标程序改成HID自定义设备

[复制链接]

4

主题

7

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2014-10-26
在线时间
0 小时
发表于 2014-11-12 17:39:23 | 显示全部楼层 |阅读模式
5金钱
    请问谁做过HID自定义设备?我想把STM32F407的鼠标例程改为能收发数据的自定义HID设备,现在枚举已经成功,
能一次性发送64个字节,但是收不到数据。我只修改了usbd_hid_core.c文件里的描述符,并增加了一个USBD_HID_Data回调函数用于处理接收到的数据。
程序如下,请问谁知道怎么解决啊?????

USBD_Class_cb_TypeDef  USBD_HID_cb = 
{
USBD_HID_Init,
USBD_HID_DeInit,
USBD_HID_Setup,
NULL, /*EP0_TxSent*/  
NULL, /*EP0_RxReady*/
USBD_HID_DataIn, /*DataIn*/
USBD_HID_DataOut, /*xcs DataOut*/*********** 增加的回调函数用于处理接收到的数据
NULL, /*SOF */
NULL,
NULL,      
USBD_HID_GetCfgDesc,
#ifdef USB_OTG_HS_CORE  
USBD_HID_GetCfgDesc, /* use same config as per FS */
#endif  
};
 /* USB HID device Configuration Descriptor */
__ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_END =
{
  0x09, /* bLength: Configuration Descriptor size */
  USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */
  USB_HID_CONFIG_DESC_SIZ,
  /* wTotalLength: Bytes returned */
  0x00,
  0x01,         /*bNumInterfaces: 1 interface*/
  0x01,         /*bConfigurationValue: Configuration value*/
  0x00,         /*iConfiguration: Index of string descriptor describing the configuration*/
  0xE0,         /*bmAttributes: bus powered and Support Remote Wake-up */
  0x32,         /*MaxPower 100 mA: this current is used for detecting Vbus*/
  
  /************** Descriptor of Joystick Mouse interface ****************/
  /* 09 */
  0x09,         /*bLength: Interface Descriptor size*/
  USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/
  0x00,         /*bInterfaceNumber: Number of Interface*/
  0x00,         /*bAlternateSetting: Alternate setting*/
  0x02,//xcs 0x01,         /*bNumEndpoints*/
  0x03,         /*bInterfaceClass: HID*/
  0x00,//xcs 0x01,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
  0x00,//xcs 0x02,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
  0x00,         /*iInterface: Index of string descriptor*/
  /******************** Descriptor of Joystick Mouse HID ********************/
  /* 18 */
  0x09,         /*bLength: HID Descriptor size*/
  HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
  0x11,         /*bcdHID: HID Class Spec release number?汾*/
  0x01,
  0x00,         /*bCountryCode: Hardware target country*/
  0x01,         /*bNumDescriptors: Number of HID class descriptors to follow*/
  0x22,         /*bDescriptorType*/
  HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/
  0x00,
  /******************** Descriptor of Mouse endpoint ********************/
  /* 27 */
  0x07,          /*bLength: Endpoint Descriptor size*/
  USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/
  
  HID_IN_EP,     /*bEndpointAddress: Endpoint Address (IN)*/
  0x03,          /*bmAttributes: Interrupt endpoint*/
  HID_IN_PACKET, /*wMaxPacketSize*/
  0x00,
  0x0A,          /*bInterval: Polling Interval (10 ms)*/
  /* 34 */
  
  //xcs************************************************
  0x07,          /*bLength: Endpoint Descriptor size*/
  USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/
  
  HID_OUT_EP,     /*bEndpointAddress: Endpoint Address (IN)*/
  0x03,          /*bmAttributes: Interrupt endpoint*/
  HID_IN_PACKET, /*wMaxPacketSize*/
  0x00,
  0x0A,          /*bInterval: Polling Interval (10 ms)*/
  /* 41 */
} ;

#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
  #if defined ( __ICCARM__ ) /*!< IAR Compiler */
    #pragma data_alignment=4   
  #endif
/* USB HID device Configuration Descriptor */
__ALIGN_BEGIN static uint8_t USBD_HID_Desc[USB_HID_DESC_SIZ] __ALIGN_END=
{
  /* 18 */
  0x09,         /*bLength: HID Descriptor size*/
  HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
  0x11,         /*bcdHID: HID Class Spec release number*/
  0x01,
  0x00,         /*bCountryCode: Hardware target country*/
  0x01,         /*bNumDescriptors: Number of HID class descriptors to follow*/
  0x22,         /*bDescriptorType*/
  HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/
  0x00,
};
#endif 


#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
  #if defined ( __ICCARM__ ) /*!< IAR Compiler */
    #pragma data_alignment=4   
  #endif
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */  
__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END = //xcs
{
0x05,0x8C,              //USAGE_PAGE (Vendor Defined Page 1)
0x09,0x01,              //USAGE (Vendor Usage 1)
0xA1,0x01,              //COLLECTION (Application)

0x09,0x03,              //(Vendor Usage 1)
0x15,0x00,              //LOGICAL_MINIMUM (0)
0x26,0xFF,0x00,     //LOGICAL_MAXIMUM (255)
0x75,0x08,              //REPORT_SIZE (8)
0x95,0x40,              //REPORT_COUNT (64)
0x81,0x02,              //INPUT (Data,Var,Abs)

0x09,0x04,              //(Vendor Usage 1)
0x15,0x00,              //LOGICAL_MINIMUM (0)
0x26,0xFF,0x00,     //LOGICAL_MAXIMUM (255)
0x75,0x08,              //REPORT_SIZE (8)
0x95,0x40,              //REPORT_COUNT (64)
0x91,0x02,              //OUTPUT (Data,Var,Abs)

0xC0                /*     END_COLLECTION */
}
 static uint8_t  USBD_HID_DataIn (void  *pdev, 
                              uint8_t epnum)
{
  
  /* Ensure that the FIFO is empty before a new transfer, this condition could 
  be caused by  a new transfer before the end of the previous transfer */
  DCD_EP_Flush(pdev, HID_IN_EP);
  return USBD_OK;
}


static uint8_t USBD_HID_DataOut( void *pdev, uint8_t epnum)
{
return USBD_OK;
}

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

使用道具 举报

12

主题

98

帖子

0

精华

高级会员

Rank: 4

积分
777
金钱
777
注册时间
2012-4-23
在线时间
66 小时
发表于 2014-11-12 20:21:27 | 显示全部楼层
你问题不懂,我这几天也在弄USB鼠标改键盘模式打印输出,问题是一次输6个字节,若有两个连续重复的字节,就只能输出一个。不知是什么原因?
我不相信命运,人定胜天!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-12 21:49:32 | 显示全部楼层
何不直接用ST提供的HID例程?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

7

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2014-10-26
在线时间
0 小时
 楼主| 发表于 2014-11-13 09:11:20 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
你有改好的吗?给大伙参考参考
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-13 16:39:02 | 显示全部楼层
回复【4楼】zhhj:
---------------------------------
没有。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

28

主题

187

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
381
金钱
381
注册时间
2014-10-9
在线时间
6 小时
发表于 2014-12-8 16:48:45 | 显示全部楼层
楼主,如果要改成游戏手柄,需要修改那些描述符?
拿什么让你自己信服 自己
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-12-23
在线时间
0 小时
发表于 2015-1-6 14:56:59 | 显示全部楼层
你的现在实现了吗?可以借我参考一下吗?我用cube做的,现在处在改手柄阶段~我的邮箱1305886705@qq.com
回复

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2014-12-26
在线时间
0 小时
发表于 2015-1-27 08:38:25 | 显示全部楼层
我也正在调HID,可接收数据,还不知道怎么取出来。
回复

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2014-12-26
在线时间
0 小时
发表于 2015-1-27 10:27:29 | 显示全部楼层
看了下ST的库 发现 DCD_Init 里将 ep->xfer_buff = 0; 数据缓存指针指到0地址了;这样HID的数据接收也就存到0地址去了。
case STS_DATA_UPDT:
    if (status.b.bcnt)
    {
      USB_OTG_ReadPacket(pdev,ep->xfer_buff, status.b.bcnt);
      ep->xfer_buff += status.b.bcnt;
      ep->xfer_count += status.b.bcnt;
    }
    break;
这肯定有问题;
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-10-22
在线时间
0 小时
发表于 2015-3-27 21:51:48 | 显示全部楼层
我也是直接将例子里面的HID鼠标改为自定义HID设备了。但是我的问题是只能收,不能发。看到了我们一起讨论下,说不得就和一起了。
回复

使用道具 举报

2

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2015-3-30
在线时间
0 小时
发表于 2015-3-30 21:47:26 | 显示全部楼层
DCD_EP_PrepareRx(&USB_OTG_dev,MSC_OUT_EP,buf,64);//接收数据的函数,
    DCD_EP_Tx (&USB_OTG_dev, MSC_IN_EP, buf, 64);  发送数据的函数;只要在主函数调用这两个函数就可收发了··············
回复

使用道具 举报

2

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2015-3-30
在线时间
0 小时
发表于 2015-3-30 21:52:23 | 显示全部楼层
在程序里面找一下,一般两个函数都在usb_dcd.c中
回复

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2015-3-31
在线时间
1 小时
发表于 2015-4-7 16:31:41 | 显示全部楼层
回复【11楼】Clarababy:
---------------------------------
我这几天也在调试这俩函数,发现单独用是不行的,在while1里面用,不会往外发数据,似乎需要清标志位或者状态什么的,请解释一下,谢谢
回复

使用道具 举报

2

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2015-3-30
在线时间
0 小时
发表于 2015-4-14 10:28:54 | 显示全部楼层
回复【13楼】linbeithree:
---------------------------------
不好意思哦,最近忙的没有看帖子。程序方面估计其他地方也要微调,可能地方有点多,我不太好细说,我现在换高速模式了,上行速度已经可以达到12M字节每秒了,满足你的要求了。如果不行,你把程序发给我我给你看看
回复

使用道具 举报

2

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2015-3-30
在线时间
0 小时
发表于 2015-4-14 10:30:16 | 显示全部楼层
回复【6楼】真的好多巧合:
---------------------------------
配置描述符需要改
回复

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2015-3-31
在线时间
1 小时
发表于 2015-4-15 17:10:13 | 显示全部楼层
回复【14楼】Clarababy:
---------------------------------
我现在在使用vcp官方代码修改,现在还没到调速度,刚把USB接收程序搞好,发送还没搞好,官方封装的那个发送函数不行,发不出数。我想问一下之前的FS模式最大上行能到多少?我们现在不想用HS,成本考虑。
回复

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2015-3-31
在线时间
1 小时
发表于 2015-4-16 09:00:08 | 显示全部楼层
回复【14楼】Clarababy:
---------------------------------
你这个上行达到12MB需要外扩SRAM吗?内部192够使吗?
回复

使用道具 举报

2

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2015-3-30
在线时间
0 小时
发表于 2015-4-16 10:08:21 | 显示全部楼层
回复【17楼】linbeithree:
--------------------------------
我用的是高速模式,所以够的,不用外扩SRAM,但是高速模式的话要外扩另一个片子,因为手上有一块STM32F407IGT6的板子已经外扩了3300的片子了
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2015-6-13
在线时间
0 小时
发表于 2015-6-13 08:46:05 | 显示全部楼层
回复【14楼】Clarababy
你好,可否帮忙看看我的代码,我需要将F407的游戏操作杆例程的修改为可以使用HID与主机进行数据的接收与发送的!但是我不会啊,老板催命似得催,急死个人啦!非常感谢~~
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2015-6-13
在线时间
0 小时
发表于 2015-6-13 08:47:22 | 显示全部楼层
回复【14楼】Clarababy:
---------------------------------
可否提供下邮箱啊!?
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-6-18
在线时间
0 小时
发表于 2015-6-23 14:41:22 | 显示全部楼层
回复【20楼】lyccccx:
---------------------------------
楼上弄出来么,我的可以枚举,但是不能收发数据。求帮手啊
回复

使用道具 举报

2

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2015-3-30
在线时间
0 小时
发表于 2015-7-17 12:44:21 | 显示全部楼层
回复【19楼】lyccccx:
---------------------------------
1023541472@qq.com
回复

使用道具 举报

2

主题

3

帖子

0

精华

新手入门

积分
31
金钱
31
注册时间
2015-10-7
在线时间
0 小时
发表于 2015-10-22 14:08:53 | 显示全部楼层
回复【19楼】lyccccx:
---------------------------------
你好,请问你的这个改好了么?可否给我个例程参考,我也是要做这个,刚接触usb,一头雾水
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-10-5
在线时间
1 小时
发表于 2015-11-9 18:18:47 | 显示全部楼层
我最近才刚看了这个  为什么我直接下载原子哥的源码进去 ,电脑识别之后就提示 ,这个设备工作不正常 有没有哪位大神可以帮我解决下问题啊
回复

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-12-11
在线时间
0 小时
发表于 2015-12-11 17:42:13 | 显示全部楼层
回复【8楼】huaqping:
---------------------------------
你好,能不能把代码给我一份谢谢了   yuanSnowBoy@163.com
天地是我的心
回复

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-12-11
在线时间
0 小时
发表于 2015-12-15 11:49:02 | 显示全部楼层
楼主,我是用stm32F407的FS模式和计算机互发数据的,但是我只知道用USBD_HID_SendReport ()函数发送数据。怎么接受电脑发给我的数据呢?能不能把你的给我一份啊  1075452150@qq.com  不胜感激。
天地是我的心
回复

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-12-11
在线时间
0 小时
发表于 2015-12-15 15:39:53 | 显示全部楼层
回复【10楼】Richer:
---------------------------------
请问你做好了吗  能把程序给我一份吗  1075452150@qq.com  谢谢了
天地是我的心
回复

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-12-11
在线时间
0 小时
发表于 2015-12-15 17:04:52 | 显示全部楼层
回复【11楼】Clarababy:
---------------------------------
我怎么调用你的这个接收数据的函数不行啊   那个发送数据的函数可以使用   能不能把你写的给我一下  1075452150@qq.com  谢谢了
天地是我的心
回复

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-12-11
在线时间
0 小时
发表于 2015-12-20 18:12:49 | 显示全部楼层
回复【11楼】Clarababy:
---------------------------------
能不能给我讲讲 啊  发送用你给我的函数好使  但是接受不行  不知道为什么  能不能帮帮忙
天地是我的心
回复

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-12-11
在线时间
0 小时
发表于 2015-12-20 18:14:40 | 显示全部楼层
回复【13楼】linbeithree:
---------------------------------
现在调好HID了吗  能不能告诉下 怎么接受接受数据  在哪里接受数据?
天地是我的心
回复

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2016-4-11
在线时间
14 小时
发表于 2016-4-14 16:07:52 | 显示全部楼层
哪里有usbd_hid_core.c这个文件啊?只有usbh_hid_core.c这个文件,你的例程不是例程35吗?
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-4-22
在线时间
2 小时
发表于 2016-5-25 19:46:18 | 显示全部楼层
能不能发我一份啊,真的很急啊,邮箱951747197@qq.com
回复

使用道具 举报

18

主题

190

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1068
金钱
1068
注册时间
2012-6-18
在线时间
158 小时
发表于 2016-5-26 19:50:59 来自手机 | 显示全部楼层
为什么非要纠结鼠标改数据传输呢,官方库里面有数据传输的说法的嘛。仔细看看usb说明文档啊。
回复

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2016-10-29
在线时间
14 小时
发表于 2016-10-29 15:30:39 | 显示全部楼层
正点原子 发表于 2014-11-12 21:49
何不直接用ST提供的HID例程?

ST的例程在官网上?找了好久都没有,都是文档
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-1-3
在线时间
3 小时
发表于 2017-1-5 15:27:18 | 显示全部楼层
请问能否把调通的源码发我参考一下吗?25765672@qq.com
回复

使用道具 举报

xuhtdqsy 该用户已被删除
发表于 2017-3-30 20:19:49 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 12:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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