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

基于STM32的USB HID实现键盘鼠标功能

[复制链接]
攻城狮Melo 发布时间:2023-4-2 13:53
由于在报告描述符中使用了两个Report ID,分别是0x01和0x02,前者是键盘的报告描述符的报告ID,后者是鼠标的报告ID,HID的键盘和鼠标发送的数据格式
* A3 M; b  {( M7 I; p. X! J: _6 Q* U" [! J+ {, G) [" t6 k6 J) B) }& _
根据文档编写键盘和鼠标的发送函数如下:. O- O! w9 w# `9 s" r+ E& \
  1. typedef enum
    / m; e7 h- _8 s% I
  2. 5 @/ g: l3 ]0 y1 B, L( O: s  q
  3.         {1 \* @; e9 x  B) N9 O: l
  4. 0 c- ~  O% i1 K& O
  5.                 KEYBOARD        = 0x01,
    ' h: ]8 m6 O# u% Q: A( |$ |

  6. , h& {6 I  G3 o- u* m( ]' n/ A
  7.                 MOUSE                = 0x02,
      I6 G  d$ _" n* I% A6 |# r7 x/ ^

  8. 7 i' J/ \, R/ p
  9.         }Device;
    2 p5 E' I/ p0 ]6 k: s
  10. 6 d3 E5 [! F8 ?' c+ f# j3 U) z
  11.         
    ; z9 F$ R8 ]1 k+ W, f: D

  12. 3 v6 ?- `& `& o9 B4 O
  13.         #define None_Key        0x00
    0 R( `8 e8 D. `! i. w& E# N
  14. ; H$ y) Y& N- O% ~$ l) T% D
  15.         5 |" s0 X: r" w
  16. # V6 T) @# {( M; t: O; T
  17.         typedef enum
    ! W0 ]! Q' O4 _$ l7 ^

  18. , X* g1 J9 y6 c' O6 |! z
  19.         {+ c9 u' e# u1 _' `6 a; O
  20. 0 |, g1 b& d+ ?5 u6 }
  21.                 Left_Control        = 0x01,
    & d2 t& A% H7 {8 X: K' Y! B

  22. / e3 v5 x1 f" u
  23.                 Left_Shift                = 0x02,  K4 [# F" u5 l, ?% W% x
  24. , M* P' h5 M' F& i
  25.                 Left_Alt                = 0x04,
    . S4 Z, R3 s/ y6 l  B' P) E6 _
  26. , H, Y9 M) N, H* P1 p5 V
  27.                 Left_GUI                = 0x08,9 W  V* ^/ E) g
  28. / N% ]/ S! p+ A1 e% V
  29.                 Right_Control        = 0x10,2 r$ C! i8 o- |0 j/ i
  30. 3 u# h* A% e9 t; I
  31.                 Right_Shift                = 0x20,' v3 Z- N  p. h

  32. 3 C( W( n% X* v+ N3 k
  33.                 Right_Alt                = 0x40,
    1 M( l; t# w, J0 U  U( d
  34. / g* x0 G% G& |/ Q0 w/ h2 W
  35.                 Right_GUI                = 0x80,
    1 \8 k2 Z8 Y) ?3 f% K
  36. - _# B  K6 R, d
  37.         }FunctionKey;
    $ l6 `7 ?: B- }. f

  38. ! `$ ^! ~) P1 D5 J6 B% l
  39.         5 T; h' R- j; G( `3 m: }
  40. 6 f1 _4 p' [4 }' v- ~. h0 Y, B3 f
  41.         typedef enum
    1 u$ k3 |* N' Y3 U

  42. 4 C9 g9 \9 q% a+ G. Y
  43.         {
    : r0 [, y- o; A& q
  44. 4 q* I' l* b* E; n' }
  45.                 Left_Key                = 0x01,8 l3 H5 ?. s- @9 s9 V$ }
  46. + `, g( p) }$ U- P
  47.                 Right_Key                = 0x02,
    1 E) r+ Q9 n6 T2 ?
  48. / E0 I9 p9 q1 J6 e* }
  49.                 Mid_Kry                        = 0x04,
    & n. N* H3 P0 X5 T9 G. R

  50. ' R, Q8 o  m2 Y$ K  U
  51.         }MouseKey;" S3 E8 H9 X; N0 Q7 _# [
  52. 3 N  ~  ?) y$ j& ]

  53. # V) t% [. b5 [2 }8 ^8 ^

  54. 0 b, w% B; C( |- H$ p
  55. extern u8 EP1BUSY;
    * E" _5 {% X( c+ O6 j4 p

  56. - E" l- |( ]! x
  57. extern u8 HID_SendBuffer[9];  |  g" |4 d9 F( e4 b8 A4 b
  58. 7 x3 y) c) H; y. G
  59. 3 z! X/ ^- a, W4 N3 ?  I$ a

  60.   ~4 U  ?; ]8 T0 a
  61. void HID_Send(Device device)4 m. ~  W$ N7 @3 C5 _3 T4 F+ l
  62. + X, b* a  }- C' g3 w% _9 D/ H
  63. {
    4 ]+ h* o3 {' P& K" l

  64.   z4 b7 R8 ~0 `
  65.         HID_SendBuffer[0] = (u8)device;2 L* u* @7 z& i

  66. ' _: e, R  a4 b
  67.         9 Q0 _$ {7 @+ ~4 |

  68. ( B2 C! g5 B+ h
  69.     /*copy mouse position info in ENDP1 Tx Packet Memory Area*/. Q% i/ R) p' L4 u! T

  70. 0 w+ J- h8 G1 f7 h! [
  71.     UserToPMABufferCopy(HID_SendBuffer, GetEPTxAddr(ENDP1), 9);& g5 a2 [" y# n/ x  z( n

  72. % D; E# j9 p; [
  73.     /* enable endpoint for transmission */
    9 X( e) |3 u( j8 x* d9 N0 H

  74. ! L7 G. P6 ?* ]$ q7 v
  75.     SetEPTxValid(ENDP1);$ i6 ], \/ C3 h- D, R

  76. : M; N2 m) }9 K* q  J) g
  77. 6 h, Z" N- \! |" O8 T5 \3 u  L
  78. % @7 s" r3 {) u7 m- r
  79.         while(EP1BUSY);
    , d5 v, c3 J2 c' Q
  80. ' V$ ?0 g! o' V. P$ Z& ?
  81.         EP1BUSY = 1;
    ) e6 e7 t5 r4 O6 U5 m, F
  82. , g* U# U$ W% ^' s6 f. U

  83. " e* p/ F, ?% I
  84. $ {/ [. ~$ I$ e# P
  85. }' ]8 t! M6 l8 z& d5 ^- D

  86.   X% E; H) x8 X( z( C- B4 H

  87. / X- @9 k) q. }; z& U" f+ C* N

  88. 5 o5 p- p& e; r- z  F, o
  89. void SendKeyboardData(u8 ctrl_shift,u8 key)
    * c% E. f0 v  ~. i' t+ n) ^0 e, _

  90. ' q% W3 a8 ^% U7 W1 j. k3 v& c
  91. {& T% C. [) m+ I% b4 o2 E
  92. - a% m+ K" O& c3 `/ y, G' L3 N
  93.         HID_SendBuffer[1] = ctrl_shift;! m$ v3 |- C( q& R
  94. # R. ?7 E& i) m  `, Y# E8 G- d
  95.         HID_SendBuffer[3] = key;
    ; N, [- Y# s* f" x7 t$ p
  96. / |1 M  F, {& ~
  97.         HID_Send(KEYBOARD);
      e( t/ `3 e% {4 g/ `# D
  98. . h/ M6 I5 ~9 s6 ^& h/ w# X2 g. T
  99. }5 i3 u- @1 Y4 Q- T

  100. , n8 K- r8 Q! \2 d& P- R6 Z5 H
  101. - t! p" g% D% Z5 F1 f

  102. 4 ], g1 d; S) x$ m
  103. void SendMouseData(u8 key,s8 x,s8 y)
      V  Q5 G: u$ A, g4 E* {" O
  104. . A) i# K* j: o1 _! U' J
  105. {
    2 `7 X1 x" d  d' D+ F+ ?9 z0 S
  106. 0 j1 `9 r' u8 n* I; ?8 M
  107.         HID_SendBuffer[1] = key;2 ~7 \0 v; t1 [- k

  108. # Z9 i6 Q  T  n& a* J
  109.         HID_SendBuffer[2] = (u8)x;
    + ]. h1 I6 {8 t2 R7 D
  110. # B: ~, e* u. Y- p
  111.         HID_SendBuffer[3] = (u8)y;
    4 r0 f' C, [' x0 M* u6 X
  112. 9 s& T" K$ y4 P$ j, k9 F
  113.         HID_Send(MOUSE);) a( L0 ]% q2 [( v1 S- v; R
  114. , K2 _' x4 z5 t0 t5 k3 S. c1 i6 n+ V
  115. }
复制代码

% `; O" L2 {9 B5 a' z! Z

. [$ Z" R: S8 m1 S————————————————% K: E1 S9 b! s" x. o4 L4 u
版权声明:哐哐哐 Quan
, I( Z2 H9 ?1 T% {& v1 {$ V, {如有侵权请联系删除& _1 z' u0 S4 v2 O# n2 O7 u& j
8 W6 b% C! G$ k# n1 T
6 s: O, V% O; i" i6 s
赞 收藏 评论0 发布时间:2023-4-2 13:53

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版