你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

USBD_HID_SendReport只能发送4个字节

[复制链接]
jyl518-283289 提问时间:2018-7-25 08:55 /
阅读主题, 点击返回1楼
收藏 评论19 发布时间:2018-7-25 08:55
19个回答
lidazhi1023 回答时间:2018-7-27 16:44:50
坐等大神答疑
imgroot 回答时间:2018-7-31 05:35:31
jyl518-283289 发表于 2018-7-27 14:24
1、USBD_HID_ConfigDesc 里面End point的 wMaxPacketSize 值已由0x04改0x08,此值前期改过不管用,可能是只 ...

HID_EPIN_SIZE 改了没有?不然描述符里虽然说 wMaxPacketSize 是0x8, 但是你的设备因为USB 驱动配置原因自己发不出去 0x8个字节

另外,我说的HID REPORT SIZE 不是 HID_MOUSE_REPORT_DESC_SIZE, 这个可能给你搞糊涂了。HID_MOUSE_REPORT_DESC_SIZE 是 USB HID 描述符本身的大小 (见HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE])。 在这个 USB HID 描述符里面会告诉操作系统这个设备的HID REPORT是多少字节,如何去处理,等等细节。你学习下USB HID规范就了解了。HID_MOUSE_ReportDesc这个array里面奥妙很多的。

具体请看 http://notes.iopush.net/stm32-custom-usb-hid-step-by-step-2/http://damogranlabs.com/2016/03/ ... -device-yes-please/

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

jyl518-283289 回答时间:2018-8-3 11:30:56
imgroot 发表于 2018-7-31 05:35
HID_EPIN_SIZE 改了没有?不然描述符里虽然说 wMaxPacketSize 是0x8, 但是你的设备因为USB 驱动配置原因 ...

非常感谢,回答的很详细,这二天工作又忙 了,等空了再研究下。
jyl518-283289 回答时间:2018-8-31 13:48:02
imgroot 发表于 2018-7-31 05:35
HID_EPIN_SIZE 改了没有?不然描述符里虽然说 wMaxPacketSize 是0x8, 但是你的设备因为USB 驱动配置原因 ...

非常感谢,谢谢您的耐心解答,终于搞定了。
个人总结下:
1、主要还是我对描述报告“HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]”没理解。
2、现将HID_EPIN_SIZE改为5,并在“HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]”中要发送的数据改为5个,且HID_MOUSE_REPORT_DESC_SIZE改为数组(HID_MOUSE_ReportDesc)实际大小后OK了。
3、改这个东西好像没有赛普拉斯的方便。
yelm 回答时间:2018-10-12 14:59:33
好贴,顶起!
yelm 回答时间:2018-10-12 15:02:41
imgroot 发表于 2018-7-27 04:00
不对。 你要改的是USBD_HID_ConfigDesc 里面End point的 wMaxPacketSize 值。
同时,要让操作系统能够理解 ...

__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END =
{
  0x05,   0x01,
  0x09,   0x02,
  0xA1,   0x01,
  0x09,   0x01,
  
  0xA1,   0x00,
  0x05,   0x09,
  0x19,   0x01,
  0x29,   0x03,
  
  0x15,   0x00,
  0x25,   0x01,
  0x95,   0x03,
  0x75,   0x01,
  
  0x81,   0x02,
  0x95,   0x01,
  0x75,   0x05,
  0x81,   0x01,
  
  0x05,   0x01,
  0x09,   0x30,
  0x09,   0x31,
  0x09,   0x38,
  
  0x15,   0x81,
  0x25,   0x7F,
  0x75,   0x40, //0x75,   0x08,  //此处由原来0x8字节改成0x40(64)字节,发送变成一次发送成功
  0x95,   0x03,
  
  0x81,   0x06,
  0xC0,   0x09,
  0x3c,   0x05,
  0xff,   0x09,
  
  0x01,   0x15,
  0x00,   0x25,
  0x01,   0x75,
  0x01,   0x95,
  
  0x02,   0xb1,
  0x22,   0x75,
  0x06,   0x95,
  0x01,   0xb1,
  
  0x01,   0xc0

};
yelm 回答时间:2018-10-12 17:50:14
但是目标是一次发送64个字节,楼主有解决么?像楼主那样改最多一次只能发20~30个字节
imgroot 回答时间:2018-10-12 22:33:36
有可能你的ENDPOINT大小没有改?把HID_MOUSE_ReportDesc注释一下才贴上来好分析。你也可以用usbview.exe或者 lsusb 看看,确保所有应该设置为64 byte的地方都已经改过。
yelm 回答时间:2018-10-13 09:44:55
imgroot 发表于 2018-10-12 22:33
有可能你的ENDPOINT大小没有改?把HID_MOUSE_ReportDesc注释一下才贴上来好分析。你也可以用usbview.exe或 ...

#define HID_IN_EP                      0x81
#define HID_OUT_EP                   0x01
       
#define HID_IN_PACKET            64//  4
#define HID_OUT_PACKET          64// 4

你说的ENDPOINT大小应该是我这的HID_IN_PACKET和HID_OUT_PACKET吧,有改的。
HID_MOUSE_ReportDesc里的值我是照搬ST的DEVICE HID例子来的,它里边也没有解释,我只是估计改0x75或者0x95开头的。
另外USBVIEW的结果如下
Device Descriptor:
bcdUSB:             0x0200
bDeviceClass:         0x00
bDeviceSubClass:      0x00
bDeviceProtocol:      0x00
bMaxPacketSize0:      0x40 (64)
idVendor:           0x0483 (STMicroelectronics)
idProduct:          0x5710
bcdDevice:          0x0200
iManufacturer:        0x01
iProduct:             0x02
iSerialNumber:        0x03
bNumConfigurations:   0x01

ConnectionStatus: DeviceConnected
Current Config Value: 0x01
Device Bus Speed:     Full
Device Address:       0x05
Open Pipes:              2

Endpoint Descriptor:
bEndpointAddress:     0x81
Transfer Type:   Interrupt
wMaxPacketSize:     0x0040 (64)
bInterval:            0x0A

Endpoint Descriptor:
bEndpointAddress:     0x01
Transfer Type:   Interrupt
wMaxPacketSize:     0x0040 (64)
bInterval:            0x0A
imgroot 回答时间:2018-11-1 21:36:54
我看了下你在16楼的帖子,你可能对HID Descriptor不熟悉。光靠改Report Size从8到64,操作系统是不会理解的。同时需要给这64byte里面每一个字节的意义都要和操作系统描述。

这篇文章不错 http://eleccelerator.com/tutoria ... report-descriptors/
你可以用这个来确认HID Descriptor http://eleccelerator.com/usbdescreqparser/

推荐用Linux,因为直接一行命令
  1. cat /sys/kernel/debug/hid/<interface>/rdesc
复制代码
然后你的HID descriptor就一幕了然。如果有任何错误内核dmesg会有相应信息。在windows上面我不太清楚如何来看。
12

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版