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

STM32 USB HID的GET_REPORT 与 SET_REPORT请求

[复制链接]
STMCU小助手 发布时间:2023-1-7 11:57

1)在usb_prop.c的函数CustomHID_Data_Setup()中,GET_PROTOCOL之后增加如下代码:

  1.   /*** GET_PROTOCOL ***/3 x* T$ P9 J% F9 h9 l; {- \
  2.   else if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))$ Y& p1 I2 H+ K8 `4 u0 l
  3.            && RequestNo == GET_PROTOCOL)
    ! M) v3 _4 h. K, L1 Q# {3 T
  4.   {
    3 D6 X2 e4 N6 j# ^
  5.     CopyRoutine = CustomHID_GetProtocolValue;9 F2 p5 A0 t0 n$ @- |  m  S
  6.   } /* 以上代码为原有例程中的代码 */
    " \6 L. K% ?2 V3 k0 A7 ~6 w3 t
  7.   /*** GET_REPORT ***/ /* 以下代码支持GET_REPORT */
    $ E$ c7 X' o% h1 J5 j
  8.   else if((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
    ' e: q# A5 Q, ^3 X
  9.         && RequestNo == GET_REPORT)
    % f- L- Q" T1 O  Z, {
  10.   {. v# r% w% G; [
  11.     CopyRoutine = CustomHID_GetReport;
    4 U/ M& X6 Q. w# ^' J8 |- q/ C3 y
  12.   }
复制代码

+ C. I6 t0 |( \8 S/ I% d

2)再增加一个函数:

  1. uint8_t *CustomHID_GetReport(uint16_t Length); u. _) M4 X3 i. n5 M( l
  2. {
    ! q$ D$ f1 P* u' ]8 Q3 ~
  3.   if (Length == 0)
    7 k( m2 C4 C6 M# _! z1 }& W% |
  4.   {9 V) M, T3 [+ l5 R
  5.     return 10;! b; Y& x3 J) f9 H6 U
  6.   }0 _/ G# \! i& H" v; b
  7.   return &Report_Buffer[pInformation->Ctrl_Info.Usb_wOffset];% a6 b8 l  e5 f. B2 T1 C! }  @+ E
  8. }
复制代码


/ }2 N* D; G) G0 c* ?- R

3)保证在IN Token到来之前,Report_Buffer中包含有效的数据。

2 V) p, N; x& M. N) x$ Q% z

上述过程十分简单,但有时不能保证在IN Token到来之前,Report_Buffer中包含有效的数据,即要发送的数据还没有准备好;这时就希望先设置一个标志,让IN Token返回NAK,让CustomHID_Data_Setup()这个函数返回,待数据准备好之后再继续前述的数据拷贝过程。

这个要求使用STM32的USB开发库也是很容易实现的:

1)在usb_prop.c的函数CustomHID_Data_Setup()中,GET_PROTOCOL之后增加的代码变为这样:

  1.   /*** GET_REPORT ***/
    % D- v5 r' Q4 U
  2.   else if((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
    & E' n5 D, o' `( x4 |2 H
  3.         && RequestNo == GET_REPORT) : ]) w4 a/ Y$ y( l9 K. H
  4.   { 9 C7 G* L- J9 ~8 s0 _
  5.     if (数据未准备好) 3 ?  }% n9 C; _' g. D: o! w
  6.       return USB_NOT_READY;
    8 \9 s. _; D6 a! `; T9 @, a1 w5 `
  7.     CopyRoutine = CustomHID_GetReport;
    : z, k( u1 t/ s9 x' k* ^; m. y' P/ {
  8.   }
复制代码


7 x' o0 M! c: d2 D4 Y& B: i这样,STM32将以NAK回应PC端的IN请求。

2)同样增加一个函数CustomHID_GetReport。

3)在数据准备好之后(注意准备数据的时间不能太长,否则PC端会做超时处理),执行下述操作:
% c5 x- p6 J1 [' B    pInformation->Ctrl_Info.CopyData = CustomHID_GetReport; $ G7 ~- V: _& G' ^. ?
    pInformation->Ctrl_Info.Usb_wOffset = 0;
- d4 J8 x% s: ^3 y7 l" V4 E# [8 W% c( C    CustomHID_GetReport(0);
9 t! n" h% D' g7 c$ z# g  \    pInformation->Ctrl_Info.PacketSize = pProperty->MaxPacketSize;
& Y2 u7 D+ u. M2 ~% t( k/ y    DataStageIn();


/ K7 w/ f( D3 d
转载自:shench888 Y' j2 l. c% C3 F- k4 w
: ?$ ~3 B* @# ?; B
收藏 评论0 发布时间:2023-1-7 11:57

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版