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

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

[复制链接]
ldskendy 发布时间:2018-2-5 10:00
本帖最后由 ldskendy 于 2018-2-5 11:34 编辑 ) {% Y* b1 {& W; f
& u+ V" x3 o: m; {. A( z# Q
  最近用EMWIN做的一个控制检测界面,用的是STM32F746DISCO开发板,4.7寸480*272的屏,由于控扭较多,所以每个按扭做的都较小,用手指去按的话有时很难点中,所以就想加一个USB鼠标进去操作。
( y0 I' l9 y  O9 o2 o$ ~  没想到ST的库兼容性不好,又害我调试了一天,才发现问题,这个问题正点原子的USB鼠标有提到,但他用的库是比较早的一个版本,ST最近更新的1.9都没有去解决,下面进入正题。
4 P* C" U) H5 c8 }+ \1 \! B* T2 ]2 t) `9 O0 ^
  开发环境:WIN7_64Bit + MDK5.24.1
$ j; w7 l+ B" j  L9 L8 R8 b" ^
  固 件 库:STM32Cube_FW_F7_V1.9.0: V1 H  b) O8 U2 B, _
  EMWIN库: STemWin540_CM7_Keil.lib
4 ^$ s6 L9 P# j& @2 T+ m! s( K$ T/ X4 B
# N6 ^/ A7 x6 s, K: C$ f
  usbh_hid_mouse.c文件修改如下:& J/ Y0 o3 K! n" S
  1. L92:uint32_t mouse_report_data[1];
3 i) a4 \) a# c. T  该变量用于保存鼠标的报告数据,但有些鼠标是报告4字节,有些为5字节,还有可能6,7,8个字节,本次我使用的鼠标就是报告5个字节,这里修改为:uint8_t mouse_report_data[8];
* {* x" S$ [. d& z6 u# G) C3 g  J7 Z& w+ A
/ }! ~6 ?/ {+ q& d# p2 ~. d
  2. L227对应的static USBH_StatusTypeDef USBH_HID_MouseDecode(USBH_HandleTypeDef *phost)函数在对报告数据的处理上就必须分开处理5个字节及以上的数据,这里处理方式参考正点原子的代码。修改如下:(不使用库里的HID_ReadItem函数,数据提取繁锁,浪费时间
/ }2 }; M6 M9 Y6 A6 ^& b' S
  1. static USBH_StatusTypeDef USBH_HID_MouseDecode(USBH_HandleTypeDef *phost)
    9 b$ U* T' v  ]$ g
  2. {
    % p( D3 b. |& ~$ @' |
  3.   HID_HandleTypeDef *HID_Handle = (HID_HandleTypeDef *) phost->pActiveClass->pData;* a* M' _7 Q- @9 A' z1 h1 |7 g
  4.   2 M0 I' E3 q8 ~$ `  V  I
  5.   if(HID_Handle->length == 0)! |3 p$ |& k3 Q  c7 l+ T- g
  6.   {
    $ w' u: }  S/ V+ B3 I6 |
  7.     return USBH_FAIL;# }2 ~5 }* @1 ]  ^( R$ a5 y
  8.   }! Y/ Y1 @' g1 l$ ?2 x# R
  9.   /*Fill report */  ?' ^' T5 _8 V! [8 @0 {. M
  10.   if(fifo_read(&HID_Handle->fifo, &mouse_report_data, HID_Handle->length) ==  HID_Handle->length)- [8 |  }& f  E
  11.   {- d" }& |8 G  J/ w$ j& n$ k
  12.     , q& |. e+ H* {
  13.     /*Decode report */% [4 d" e" F1 M
  14.       /*LDS
    - l( O7 B, Z/ ]" a
  15.     mouse_info.x = (int16_t )HID_ReadItem((HID_Report_ItemTypedef *) &prop_x, 0);7 x- F# _7 B! _" Y$ Q: v2 a
  16.     mouse_info.y = (int16_t )HID_ReadItem((HID_Report_ItemTypedef *) &prop_y, 0);; o' F, S: L6 w; q
  17.     3 R4 C6 [) z5 K' N% q7 Y, |
  18.     mouse_info.buttons[0]=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &prop_b1, 0);
    / M/ E) Q6 G1 s
  19.     mouse_info.buttons[1]=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &prop_b2, 0);
    : D6 X9 Z# F1 h+ C; b3 X- z5 B* @- w2 U
  20.     mouse_info.buttons[2]=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &prop_b3, 0);
    , H" F& u6 a* K/ m* z# w9 m5 u) W
  21.       */" f3 z9 Y5 O6 h& g( \8 @2 x. e, Q
  22.       9 B( Q% S& t2 ^( \  q" ?
  23.       //LDS:. E) s) Y: x/ U) n, j# V
  24.       
    % Z7 u. ?# F! U$ D8 z, g# z
  25.     mouse_info.buttons[0]= mouse_report_data[0];5 K2 k1 h. J* _$ x4 W
  26.     if(HID_Handle->length>4) //5/6/8 ×Ö½Ú³¤¶ÈµÄ USB Êý¾Ý´¦Àí7 }5 F) K7 x. }6 |' ]7 }
  27.     {
    2 A% T, N. I! X/ u4 J( R# m
  28.         mouse_info.x = mouse_report_data[1];1 [3 t; d' l3 A" M, T) D0 \
  29.         mouse_info.y = mouse_report_data[3]<<4|mouse_report_data[2]>>4;7 k) S/ y. I0 c* b, v. d
  30.     }
    1 E- s( m$ q8 {4 z  c2 \
  31.     else if(HID_Handle->length==4) //4×Ö½Ú³¤¶ÈµÄ USB Êý¾Ý´¦Àí9 H, x/ R  @$ @3 s; q: t9 f! T! n
  32.     {2 X! n" @  f* B
  33.         mouse_info.x = mouse_report_data[1];8 P6 a# Y2 A1 `& v, W1 f
  34.         mouse_info.y = mouse_report_data[2];; a1 O( r# b. h4 g- A3 G# |* t+ Z& F% W
  35.     }- x( E' W* t3 Y6 o' L% y2 k, B
  36.    
    0 [" k9 w! X. g5 d
  37.     return USBH_OK;  * [& j  M7 k% E9 y6 |0 r! ?/ U) c
  38.   }
    4 M# ?5 G5 W* O1 f0 W
  39.   return   USBH_FAIL;
    0 u: t5 t$ t/ `0 o+ |+ g
  40. }
复制代码
5 }% q5 }4 g" c
7 |* Y3 a! ~2 {6 M  P* P0 K
) g" X8 G& r& G- R, P; g
发个运行图吧。
+ p9 Y# O  B1 W% m+ u7 [0 b% }& o4 Z
. t% s: c4 ?9 L" y! R, j- S

: a1 U9 S+ Q$ @% y" z: t. l
' }, Y$ n6 X& ~5 L
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后继改进。
5 x, M/ n3 j7 q, q: M% s. u板子也很好,是梦寐以求的板
ldskendy 回答时间:2018-2-5 10:58:28
toofree 发表于 2018-2-5 10:36
3 S, C1 ]: r+ E不错,参考一下。库有BUG很正常,希望ST后继改进。) ]# c0 R3 a7 c* A3 X0 j) y0 m
板子也很好,是梦寐以求的板 ...
$ V; e6 I; l1 g; X# h4 j) b
梦寐以求 就入手一块吧,
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# C! [  M  K' R5 ^
至少要200快

  t0 A) l& D0 n- K, P翻一倍吧。400+差不多。。
ldskendy 回答时间:2018-2-5 16:15:30
下行继折腾,搞定了无线鼠标支持。
7 |0 H" S6 u# w无线鼠标的报告数据包居然是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 手机版