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

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

[复制链接]
ldskendy 发布时间:2018-2-5 10:00
本帖最后由 ldskendy 于 2018-2-5 11:34 编辑
1 L1 L9 |" B  g0 Y6 {( [, G& J
& C- [& c& C' ?0 D/ v# i. L  最近用EMWIN做的一个控制检测界面,用的是STM32F746DISCO开发板,4.7寸480*272的屏,由于控扭较多,所以每个按扭做的都较小,用手指去按的话有时很难点中,所以就想加一个USB鼠标进去操作。9 K- Q: v7 H/ Z8 |- J6 B% z
  没想到ST的库兼容性不好,又害我调试了一天,才发现问题,这个问题正点原子的USB鼠标有提到,但他用的库是比较早的一个版本,ST最近更新的1.9都没有去解决,下面进入正题。
0 S( A6 A; t+ S! A- X7 M" |+ x1 M! Q3 T& _+ M! N# @
  开发环境:WIN7_64Bit + MDK5.24.1

# B2 z9 l0 R3 g: a/ f$ |: ?  固 件 库:STM32Cube_FW_F7_V1.9.0
3 j: h# r' {9 H% d  EMWIN库: STemWin540_CM7_Keil.lib" b5 I$ w5 P' u( m

* D$ N8 j# h, ?: x# O9 M, T

! i4 @' |/ z7 E7 s  usbh_hid_mouse.c文件修改如下:* R7 u2 |% h. O# l# b
  1. L92:uint32_t mouse_report_data[1];% Z! c8 S9 n2 u" |1 |/ t7 r
  该变量用于保存鼠标的报告数据,但有些鼠标是报告4字节,有些为5字节,还有可能6,7,8个字节,本次我使用的鼠标就是报告5个字节,这里修改为:uint8_t mouse_report_data[8];
& U; V( @6 V! M# ~, E1 u' @6 p8 M0 @2 i" p1 W0 {# d' J/ n

5 Y( V! z) H4 S3 d3 a, |, l  2. L227对应的static USBH_StatusTypeDef USBH_HID_MouseDecode(USBH_HandleTypeDef *phost)函数在对报告数据的处理上就必须分开处理5个字节及以上的数据,这里处理方式参考正点原子的代码。修改如下:(不使用库里的HID_ReadItem函数,数据提取繁锁,浪费时间)0 I& |% [( o' I8 e- V
  1. static USBH_StatusTypeDef USBH_HID_MouseDecode(USBH_HandleTypeDef *phost)
      `, q. \, [9 O1 {6 N( x
  2. {% f3 e& P: `: W' \
  3.   HID_HandleTypeDef *HID_Handle = (HID_HandleTypeDef *) phost->pActiveClass->pData;
    3 D$ T9 T. L* @8 `' z
  4.   8 S; l; @4 H* |/ {! A& E3 Z
  5.   if(HID_Handle->length == 0)/ Z, J/ A! h* ?( z
  6.   {/ K( h! G6 y. d
  7.     return USBH_FAIL;
    4 d2 z. b- s2 u2 e
  8.   }
    : f- F# p" b. s) s
  9.   /*Fill report */  i8 `! J; I$ X+ q9 H4 U$ S3 y
  10.   if(fifo_read(&HID_Handle->fifo, &mouse_report_data, HID_Handle->length) ==  HID_Handle->length)- Q* j0 l' u3 u. l! T* k; G  F: G
  11.   {
    " @0 I. h( v8 K" n! c
  12.    
    " ^" z0 K  u5 T% ?
  13.     /*Decode report */( x, L2 K8 ]3 D1 O
  14.       /*LDS
    ( I, E1 h( f0 o) }, C$ R
  15.     mouse_info.x = (int16_t )HID_ReadItem((HID_Report_ItemTypedef *) &prop_x, 0);  {1 k; e- _! F
  16.     mouse_info.y = (int16_t )HID_ReadItem((HID_Report_ItemTypedef *) &prop_y, 0);
    8 p0 c) m; @% L
  17.     2 B. P6 ]- P7 t7 R
  18.     mouse_info.buttons[0]=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &prop_b1, 0);. L  ~. W1 O' B: H2 M; h4 F
  19.     mouse_info.buttons[1]=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &prop_b2, 0);
    0 R/ z1 Y& L( ~  v# t" t- {* b5 ?
  20.     mouse_info.buttons[2]=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &prop_b3, 0);
    / O" h$ M2 h$ J3 t- p6 N
  21.       */+ j, s( I  q6 O/ l' o9 m2 h
  22.       % u. I4 c) A* }% _, F9 K
  23.       //LDS:
    0 l9 K4 K3 M9 v: ?6 ]$ m
  24.       
    8 ^) F" {- I/ \; [
  25.     mouse_info.buttons[0]= mouse_report_data[0];
    2 u; _' _! k/ W( u# Q9 v# ]
  26.     if(HID_Handle->length>4) //5/6/8 ×Ö½Ú³¤¶ÈµÄ USB Êý¾Ý´¦Àí
    ; u! M# W3 _1 o8 _" ]: w1 L
  27.     {
    . M+ c" Q- n+ Y4 K/ \- W
  28.         mouse_info.x = mouse_report_data[1];& m! U. P6 s* w! ~1 s3 g$ Y
  29.         mouse_info.y = mouse_report_data[3]<<4|mouse_report_data[2]>>4;
    7 I3 `1 g5 z. d& w$ `: c+ {8 x
  30.     }+ M$ {0 l2 R8 }3 m* M) U
  31.     else if(HID_Handle->length==4) //4×Ö½Ú³¤¶ÈµÄ USB Êý¾Ý´¦Àí
    & _& L% N  y5 y; n
  32.     {, O2 C5 V2 d' K
  33.         mouse_info.x = mouse_report_data[1];3 B1 k* E9 [1 f; M
  34.         mouse_info.y = mouse_report_data[2];2 w( C  m2 Z0 @+ H1 D! h
  35.     }7 }. y1 _+ q% A" I8 ^
  36.     ; a4 u# v% D4 [5 o: b7 e( X
  37.     return USBH_OK;  2 _. }1 Q+ k9 _/ b# g
  38.   }2 `, ~" D5 ?) R7 I) v" b" a
  39.   return   USBH_FAIL;
    2 v+ X) n& f5 F! t5 I
  40. }
复制代码
. B7 p" A  e; W
; n$ j5 b% A( f; M) J* M1 K9 r

7 @$ d  ?  G! q* P1 y8 H  j发个运行图吧。; `) W+ l* C3 T! z1 W3 s

8 m5 c6 D& V8 d: o0 o* ~
: N; u6 M/ t7 ~

, P& {* r; i, `2 ?/ d9 J
& r# P$ n; _4 q/ \  t0 @6 o
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后继改进。
: a9 S( K' G) L8 K+ z板子也很好,是梦寐以求的板
ldskendy 回答时间:2018-2-5 10:58:28
toofree 发表于 2018-2-5 10:36
: e! S+ P8 F' y3 S; A+ ?不错,参考一下。库有BUG很正常,希望ST后继改进。
3 p* h  b' K0 d9 {板子也很好,是梦寐以求的板 ...
) i0 f- f4 M/ m# M& F& q9 d
梦寐以求 就入手一块吧,
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:264 e3 f* v4 O( \* g) D/ k5 z
至少要200快
+ @; [" H7 E8 F* c) K7 E, E: E
翻一倍吧。400+差不多。。
ldskendy 回答时间:2018-2-5 16:15:30
下行继折腾,搞定了无线鼠标支持。3 K8 |: p; L0 y$ E6 \. c  ^
无线鼠标的报告数据包居然是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 手机版