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

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 ***/1 W% c# {& z/ \; E: s
  2.   else if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)), ?' j. t( u7 W
  3.            && RequestNo == GET_PROTOCOL)
    $ ~9 i* T# c1 ^7 q, M. P* z- Q
  4.   {. Y0 L6 x8 C/ w1 p  l! ^
  5.     CopyRoutine = CustomHID_GetProtocolValue;
    2 v, R" K0 _* ^
  6.   } /* 以上代码为原有例程中的代码 */
    7 y( V; {" Y: M8 @; H
  7.   /*** GET_REPORT ***/ /* 以下代码支持GET_REPORT */) ~' O7 g2 A- G
  8.   else if((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))$ v3 a( K0 M( c. d* [1 K" r+ d
  9.         && RequestNo == GET_REPORT)
    1 l  t. P* ?& Y; f& N
  10.   {
    5 b" D+ o8 {- e0 w  ]
  11.     CopyRoutine = CustomHID_GetReport;
    ) l6 e8 W% A: D# o1 X: ]6 N
  12.   }
复制代码

3 p9 V9 `3 l8 @3 z$ F' Y* m- g% j

2)再增加一个函数:

  1. uint8_t *CustomHID_GetReport(uint16_t Length)# m. V+ @7 [( }* e/ @7 `* P) X0 z0 W
  2. {
    8 d" H7 ^' q: U( D; p3 d
  3.   if (Length == 0)
    : i( [9 i8 i2 Y" T
  4.   {
    + @: k& R2 K# w  h) c
  5.     return 10;
    - }+ P9 E& t) M7 {: t& _1 `
  6.   }
    & s7 w, o# ?7 [' @: V
  7.   return &Report_Buffer[pInformation->Ctrl_Info.Usb_wOffset];$ h7 X0 ]. s0 y3 t
  8. }
复制代码

) q( f% A3 Q) z' m, `  ?

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


* Q6 T/ ^* q+ w. Q$ i! p

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

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

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

  1.   /*** GET_REPORT ***/ , C8 F  Z. {9 f6 g% t) F9 Q% R# `) `
  2.   else if((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)) ! |0 j3 t& x5 t
  3.         && RequestNo == GET_REPORT) ' N9 B5 Y; p- }; W$ Y
  4.   {
    $ w$ g/ w2 \. x5 L1 H; [
  5.     if (数据未准备好) ( `  \& o! m: z! d/ L8 h
  6.       return USB_NOT_READY;
    , f' z7 B2 L0 \, K; N* ^# x
  7.     CopyRoutine = CustomHID_GetReport;
      W- {: _- S. w; @; F& [
  8.   }
复制代码

& {1 F% t" {) y+ l: s+ |
这样,STM32将以NAK回应PC端的IN请求。

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

3)在数据准备好之后(注意准备数据的时间不能太长,否则PC端会做超时处理),执行下述操作: 6 m7 ~- U4 O0 \7 q& z' d; K. d2 n
    pInformation->Ctrl_Info.CopyData = CustomHID_GetReport;
( Y# O$ x5 {- a    pInformation->Ctrl_Info.Usb_wOffset = 0; $ \9 P# Q( Z3 {/ G
    CustomHID_GetReport(0); / L+ {8 K8 @- ~1 A2 q) Y3 O( [; O. B9 p
    pInformation->Ctrl_Info.PacketSize = pProperty->MaxPacketSize; 5 b7 g+ B$ F6 ~9 |! p
    DataStageIn();


/ O4 Q9 s7 g2 {( ?; |
转载自:shench88
1 ~1 y- [: Z/ @; x/ _: }1 O& _9 U. O( W- j0 P
赞 收藏 评论0 发布时间:2023-1-7 11:57

举报

0个回答

所属标签

相似技术帖

官网相关资源

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