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

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 ***/
  2.   else if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
  3.            && RequestNo == GET_PROTOCOL)
  4.   {
  5.     CopyRoutine = CustomHID_GetProtocolValue;
  6.   } /* 以上代码为原有例程中的代码 */
  7.   /*** GET_REPORT ***/ /* 以下代码支持GET_REPORT */
  8.   else if((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
  9.         && RequestNo == GET_REPORT)
  10.   {
  11.     CopyRoutine = CustomHID_GetReport;
  12.   }
复制代码


2)再增加一个函数:

  1. uint8_t *CustomHID_GetReport(uint16_t Length)
  2. {
  3.   if (Length == 0)
  4.   {
  5.     return 10;
  6.   }
  7.   return &Report_Buffer[pInformation->Ctrl_Info.Usb_wOffset];
  8. }
复制代码


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


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

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

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

  1.   /*** GET_REPORT ***/
  2.   else if((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
  3.         && RequestNo == GET_REPORT)
  4.   {
  5.     if (数据未准备好)
  6.       return USB_NOT_READY;
  7.     CopyRoutine = CustomHID_GetReport;
  8.   }
复制代码


这样,STM32将以NAK回应PC端的IN请求。

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

3)在数据准备好之后(注意准备数据的时间不能太长,否则PC端会做超时处理),执行下述操作:
    pInformation->Ctrl_Info.CopyData = CustomHID_GetReport;
    pInformation->Ctrl_Info.Usb_wOffset = 0;
    CustomHID_GetReport(0);
    pInformation->Ctrl_Info.PacketSize = pProperty->MaxPacketSize;
    DataStageIn();


转载自:shench88

收藏 评论0 发布时间:2023-1-7 11:57

举报

0个回答

所属标签

相似分享

官网相关资源

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