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

[BUG] ST库的USB鼠标小BUG发现

[复制链接]
ldskendy 发布时间:2018-2-5 10:00
本帖最后由 ldskendy 于 2018-2-5 11:34 编辑 8 y/ X, U3 a0 I9 k
5 B" J, I4 _* `  E% h% M$ U+ K
  最近用EMWIN做的一个控制检测界面,用的是STM32F746DISCO开发板,4.7寸480*272的屏,由于控扭较多,所以每个按扭做的都较小,用手指去按的话有时很难点中,所以就想加一个USB鼠标进去操作。" }- o. b5 R! U; k
  没想到ST的库兼容性不好,又害我调试了一天,才发现问题,这个问题正点原子的USB鼠标有提到,但他用的库是比较早的一个版本,ST最近更新的1.9都没有去解决,下面进入正题。  [( M# b/ W& @" y# l

4 o: _( _5 i8 }1 j! s  开发环境:WIN7_64Bit + MDK5.24.1

& X5 N" i6 j( c& N6 P' M0 S  U) [  固 件 库:STM32Cube_FW_F7_V1.9.03 M/ J3 f0 ^% Y' U
  EMWIN库: STemWin540_CM7_Keil.lib
* W6 a6 I! c; h7 U% l# ^
- K  i! a/ ~# m9 ^; c$ q
* ]' U' y+ q0 M# D3 q
  usbh_hid_mouse.c文件修改如下:9 {' a& d  a$ e/ t
  1. L92:uint32_t mouse_report_data[1];
  }' F9 g& I4 J7 n# z  该变量用于保存鼠标的报告数据,但有些鼠标是报告4字节,有些为5字节,还有可能6,7,8个字节,本次我使用的鼠标就是报告5个字节,这里修改为:uint8_t mouse_report_data[8];0 @. D: N! W9 E: n% g

  F. J6 Q% G* u" b  J1 l

) d& `4 Z. I) l  2. L227对应的static USBH_StatusTypeDef USBH_HID_MouseDecode(USBH_HandleTypeDef *phost)函数在对报告数据的处理上就必须分开处理5个字节及以上的数据,这里处理方式参考正点原子的代码。修改如下:(不使用库里的HID_ReadItem函数,数据提取繁锁,浪费时间
8 A3 k9 _9 j' _! V
  1. static USBH_StatusTypeDef USBH_HID_MouseDecode(USBH_HandleTypeDef *phost)% C; Q7 V! m+ O7 b8 M
  2. {
    & o  w5 e) |  l
  3.   HID_HandleTypeDef *HID_Handle = (HID_HandleTypeDef *) phost->pActiveClass->pData;* t4 z. R2 S4 a* v: G" E
  4.   / q4 H3 [. P) N/ L  g. u( J7 K
  5.   if(HID_Handle->length == 0); A  z, ^( a  O# f% ^& _
  6.   {$ h0 X: `. v8 C
  7.     return USBH_FAIL;: s' q& {; w5 I* E
  8.   }
    , r' Q' ]: t2 ^& k
  9.   /*Fill report */  ?' ?3 d. N! g7 B8 I
  10.   if(fifo_read(&HID_Handle->fifo, &mouse_report_data, HID_Handle->length) ==  HID_Handle->length)2 o0 G- A  l5 K- u" l
  11.   {
    ( Y# f: o* Q# M8 j1 v
  12.     * K- r1 X6 ]+ y" }' F( T
  13.     /*Decode report */) ]$ w6 r, d2 a1 A) v
  14.       /*LDS% P( V* ~, b9 j0 L
  15.     mouse_info.x = (int16_t )HID_ReadItem((HID_Report_ItemTypedef *) &prop_x, 0);
    0 n( o; Z# i1 Z8 i& g! g8 y( c' I
  16.     mouse_info.y = (int16_t )HID_ReadItem((HID_Report_ItemTypedef *) &prop_y, 0);# @7 S. R$ J' C, C! V  A) |
  17.     2 ~7 K+ ^4 M7 |; f' r* t
  18.     mouse_info.buttons[0]=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &prop_b1, 0);$ p" B) e2 Z& @# A  C8 h2 e4 g
  19.     mouse_info.buttons[1]=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &prop_b2, 0);& y6 v0 h" ^1 I$ r7 n* Q
  20.     mouse_info.buttons[2]=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &prop_b3, 0);0 F8 q% C3 l, X# u' @" ?- k$ \
  21.       */
    - t4 B% K8 J; ?
  22.       ! g3 l9 K( x5 k$ [9 n
  23.       //LDS:
    , N" f' V: z( X
  24.       " K2 o! V, ?  S  J0 j9 B
  25.     mouse_info.buttons[0]= mouse_report_data[0];) q/ Y% F4 T9 `1 @+ c& s( H
  26.     if(HID_Handle->length>4) //5/6/8 ×Ö½Ú³¤¶ÈµÄ USB Êý¾Ý´¦Àí
    9 Z' l2 s: l' O8 k. n" B
  27.     {9 f' [1 q" U3 h4 Q. ?
  28.         mouse_info.x = mouse_report_data[1];
      K$ t" w- B8 N$ b
  29.         mouse_info.y = mouse_report_data[3]<<4|mouse_report_data[2]>>4;- d# N! K' ]0 T; Z6 m5 p
  30.     }
    / o! ^4 A/ c# B' ~2 v0 v! O8 |
  31.     else if(HID_Handle->length==4) //4×Ö½Ú³¤¶ÈµÄ USB Êý¾Ý´¦Àí
    ' c4 U' g6 W$ C2 ?3 |$ S
  32.     {$ a3 z, g6 [1 E8 {; n% ~! v2 h
  33.         mouse_info.x = mouse_report_data[1];* B+ x0 s/ j6 w: T. F( ]4 v  R
  34.         mouse_info.y = mouse_report_data[2];) |4 {6 Q" ]/ \, h
  35.     }
    $ ^* o  C) K: s4 L/ c' b
  36.     / v/ l' P5 c( Z1 I/ t/ o& q
  37.     return USBH_OK;  
    5 Q" F( e: A# r% Z
  38.   }
    # Q: P- I3 _/ C- ?
  39.   return   USBH_FAIL;/ }$ s' t5 C4 x: l) r4 u* e
  40. }
复制代码

% l0 d; B! Y; F$ l# A
7 j6 @5 w, C3 t! q( P6 {( @: ]1 ^3 m3 e
发个运行图吧。
* T# [& [  U- W4 B' t6 ~; v8 F7 k1 Q- F

/ ]1 z$ L) h( a' H" Q& y/ e& _/ u9 Y) a2 T# \1 O9 r2 B# `' m% c
/ V' g: U9 @7 I/ d
IMG_1760.JPG

评分

参与人数 2 ST金币 +23 收起 理由
creep + 20 感谢分享!
Inc_brza + 3 很给力!

查看全部评分

收藏 2 评论9 发布时间:2018-2-5 10:00

举报

9个回答
七哥 回答时间:2018-2-5 10:36:55
不错,参考一下。库有BUG很正常,希望ST后继改进。7 C7 V7 A" _  d% r. d" ~. c5 Z* ]
板子也很好,是梦寐以求的板
ldskendy 回答时间:2018-2-5 10:58:28
toofree 发表于 2018-2-5 10:36
" M8 `8 _) S6 D5 p0 d0 B, e不错,参考一下。库有BUG很正常,希望ST后继改进。
! i& E8 A4 v( ~8 r1 C板子也很好,是梦寐以求的板 ...

5 H8 I' I! g. \! }# j  A7 m梦寐以求 就入手一块吧,
zero99 回答时间:2018-2-5 11:28:46
好大的屏~
kuku275176027 回答时间:2018-2-5 14:26:23
至少要200快
chrome777 回答时间:2018-2-5 14:56:53
kuku275176027 发表于 2018-2-5 14:26% e- {$ r2 y7 k
至少要200快

- \; b3 G; b2 x0 T: O翻一倍吧。400+差不多。。
ldskendy 回答时间:2018-2-5 16:15:30
下行继折腾,搞定了无线鼠标支持。
: Q- {+ G4 D& d9 D7 I! j无线鼠标的报告数据包居然是10个字节的。
wyxy163@126.com 回答时间:2018-2-5 21:08:48
提示: 作者被禁止或删除 内容自动屏蔽
qianfan 回答时间:2018-2-7 12:47:30
要想兼容所有的鼠标就要考虑处理HID REPORT,那玩意相当麻烦。并不是所有的鼠标报告的键值都是相同的。
zero99 回答时间:2018-2-12 14:16:48
感谢分享,已汇总到2月技术原创  https://www.stmcu.org.cn/module/forum/thread-614799-1-1.html
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版