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

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

[复制链接]
ldskendy 发布时间:2018-2-5 10:00
本帖最后由 ldskendy 于 2018-2-5 11:34 编辑
# J8 y1 y; N* U' ?% g# e' e, ?5 s0 I* q; o! I7 Y
  最近用EMWIN做的一个控制检测界面,用的是STM32F746DISCO开发板,4.7寸480*272的屏,由于控扭较多,所以每个按扭做的都较小,用手指去按的话有时很难点中,所以就想加一个USB鼠标进去操作。
* f9 S# Y/ R! X! n$ D0 y  没想到ST的库兼容性不好,又害我调试了一天,才发现问题,这个问题正点原子的USB鼠标有提到,但他用的库是比较早的一个版本,ST最近更新的1.9都没有去解决,下面进入正题。
* K, l1 {9 V9 ~, {& Q; b
" P2 A- E# q6 b6 v, p1 N. i  开发环境:WIN7_64Bit + MDK5.24.1
* E$ F' w6 F! F# `' s" A5 |
  固 件 库:STM32Cube_FW_F7_V1.9.0( R. n* F+ b& h4 p" i3 [$ u. S' P2 t
  EMWIN库: STemWin540_CM7_Keil.lib+ e# k/ g( n$ ^: y+ B2 B

' P6 j1 t3 s+ ]

9 m% E/ f9 s% V' d5 U# I  usbh_hid_mouse.c文件修改如下:: A% v6 q: K4 d) u6 e# z1 y
  1. L92:uint32_t mouse_report_data[1];  U  I# U3 [" |3 X4 y" ]; n
  该变量用于保存鼠标的报告数据,但有些鼠标是报告4字节,有些为5字节,还有可能6,7,8个字节,本次我使用的鼠标就是报告5个字节,这里修改为:uint8_t mouse_report_data[8];; K2 k3 w# ^8 I' _* N; W) P

; x* |! u" F+ W8 V/ W7 i
# s( y2 O& S6 x* ?) i- E
  2. L227对应的static USBH_StatusTypeDef USBH_HID_MouseDecode(USBH_HandleTypeDef *phost)函数在对报告数据的处理上就必须分开处理5个字节及以上的数据,这里处理方式参考正点原子的代码。修改如下:(不使用库里的HID_ReadItem函数,数据提取繁锁,浪费时间)
+ U2 s. N8 |. A% u
  1. static USBH_StatusTypeDef USBH_HID_MouseDecode(USBH_HandleTypeDef *phost)
    * `0 {- n2 y4 c& L+ E: I; a) V. ]* a' U
  2. {3 R6 d1 l) }$ B  y
  3.   HID_HandleTypeDef *HID_Handle = (HID_HandleTypeDef *) phost->pActiveClass->pData;& z, X( g0 |8 J+ o
  4.   
    7 ?# E  E; D! ~  |
  5.   if(HID_Handle->length == 0)6 N( N, V, o8 E$ @0 O  P
  6.   {
    2 u) c2 G, e1 O$ p7 }% l3 l
  7.     return USBH_FAIL;
    ( k; R9 B# i' K1 J" q' U" h9 i( h
  8.   }
    ( t# a2 v$ |8 h+ _/ N
  9.   /*Fill report */1 j/ {2 e8 s) o3 S& ^  P
  10.   if(fifo_read(&HID_Handle->fifo, &mouse_report_data, HID_Handle->length) ==  HID_Handle->length)% u. n( V; J1 u$ r% h& k+ d1 p
  11.   {
    4 \! m/ z/ X( ?5 ]; G
  12.     ) _2 `8 ^0 I7 ~  D( X( z
  13.     /*Decode report */8 Q6 \7 \0 ^1 ^- Q* D
  14.       /*LDS
    - [. G" A# c& i9 S5 b5 M9 O
  15.     mouse_info.x = (int16_t )HID_ReadItem((HID_Report_ItemTypedef *) &prop_x, 0);
    7 Y: X+ o5 R$ C# _9 {
  16.     mouse_info.y = (int16_t )HID_ReadItem((HID_Report_ItemTypedef *) &prop_y, 0);
    , O( ~* e5 ~+ N& ?8 |
  17.     + |; ^/ M% V0 {1 U/ v4 M
  18.     mouse_info.buttons[0]=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &prop_b1, 0);
    ) x: U, {$ H. l# {5 b7 f! \
  19.     mouse_info.buttons[1]=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &prop_b2, 0);: D$ [( R8 q9 g/ t. ^7 [: |; V; ^
  20.     mouse_info.buttons[2]=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &prop_b3, 0);
    ) ?1 P. L6 X! A9 n# V3 t. w
  21.       */
    0 G, a7 u6 r* f# a$ ~2 }( C9 g
  22.       
    ( d6 c  c% Q+ |- S* T
  23.       //LDS:
    - m% v- w9 {& u. y2 h
  24.       7 _0 @3 a* ^' H& C
  25.     mouse_info.buttons[0]= mouse_report_data[0];
    / H1 I* t7 e8 e" T$ k3 r( C# ?4 m
  26.     if(HID_Handle->length>4) //5/6/8 ×Ö½Ú³¤¶ÈµÄ USB Êý¾Ý´¦Àí  }# G! j$ P  X8 q" f% e
  27.     {
    $ [- X5 \4 m# ]  k5 ?8 w
  28.         mouse_info.x = mouse_report_data[1];
    0 j+ R9 h# R4 x, q
  29.         mouse_info.y = mouse_report_data[3]<<4|mouse_report_data[2]>>4;
    0 T5 U7 n( M/ L6 _, g# ~; r
  30.     }5 z5 ?* r1 A+ E" L
  31.     else if(HID_Handle->length==4) //4×Ö½Ú³¤¶ÈµÄ USB Êý¾Ý´¦Àí
    0 c0 b3 c+ M) U
  32.     {; F% `# O& _8 ]
  33.         mouse_info.x = mouse_report_data[1];
    6 n& Z- ^: K" M, b* r* v1 z
  34.         mouse_info.y = mouse_report_data[2];
    , G: ^8 t9 T. _0 m
  35.     }
    4 {/ Z7 q+ F- o
  36.     4 y1 B2 ~( u, ]& U0 B* X
  37.     return USBH_OK;  ! d4 ]! l# J( D$ z4 e( G* L' d( [
  38.   }
    ( {- q9 x6 i- a
  39.   return   USBH_FAIL;  N& s' \+ P8 S* p# o- \: k
  40. }
复制代码
' z2 @% ~) u. w( @

" B$ E3 R# |# @* Y  v. h5 B' `- `. D8 N
发个运行图吧。
( X' T5 e8 _! `9 x4 k# S% a, W* ^9 W' K! C" p8 d' o6 F( P
/ ^* [$ v* P$ P" L* Q4 ?
( s5 S, y7 H3 J( k8 \& m

0 s) ~; S0 w1 h  _0 @; x& Y
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后继改进。
+ p, M3 D- \# {9 y, ^板子也很好,是梦寐以求的板
ldskendy 回答时间:2018-2-5 10:58:28
toofree 发表于 2018-2-5 10:36
' \- t2 t: S$ q. P' I8 s不错,参考一下。库有BUG很正常,希望ST后继改进。6 b* \+ h" n3 |+ ^, F
板子也很好,是梦寐以求的板 ...
% W+ Z) k& A) G& C- y2 w- l' H8 I- v
梦寐以求 就入手一块吧,
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
$ G0 D9 c/ A1 u5 Q至少要200快

( k  @1 s: h; U/ u2 M翻一倍吧。400+差不多。。
ldskendy 回答时间:2018-2-5 16:15:30
下行继折腾,搞定了无线鼠标支持。  t4 l9 {& F9 {" S/ S# H- K
无线鼠标的报告数据包居然是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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版