打印

香版主 STM32 USB HID 问题

[复制链接]
4286|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lbbobo|  楼主 | 2012-2-6 23:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
香版主,你好,请帮忙看一下,问题是在pc机在发送完成SET_REPORT后无法进入CustomHID_Status_In这个函数,后查看pInformation->ControlStat值为STALLED,不清楚是怎么会产生STALLED的值。程序代码如下:

RESULT CustomHID_Data_Setup(uint8_t RequestNo)
{
  uint8_t *(*CopyRoutine)(uint16_t);
  CopyRoutine = NULL;
  if ((RequestNo == GET_DESCRIPTOR)
      && (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT))
      && (pInformation->USBwIndex0 == 0))
  {
    if (pInformation->USBwValue1 == REPORT_DESCRIPTOR)
    {
      CopyRoutine = CustomHID_GetReportDescriptor;
    }
    else if (pInformation->USBwValue1 == HID_DESCRIPTOR_TYPE)
    {
      CopyRoutine = CustomHID_GetHIDDescriptor;
    }
  } /* End of GET_DESCRIPTOR */
  if (pInformation->USBbmRequestType == CLASS_REQUEST|INTERFACE_RECIPIENT//处理SET_REPORT请求
            && RequestNo == SET_REPORT)
  {
        CopyRoutine = CustomHID_SetReport;
  }
   else if((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))//处理GET_REPORT请求
        && RequestNo == GET_REPORT)
  {
    CopyRoutine = CustomHID_GetReport;
  }
  if (CopyRoutine == NULL)
  {
    return USB_UNSUPPORT;
  }
  pInformation->Ctrl_Info.CopyData = CopyRoutine;
  pInformation->Ctrl_Info.Usb_wOffset = 0;
  (*CopyRoutine)(0);
  return USB_SUCCESS;
}

回调函数代码如下:

uint8_t *CustomHID_SetReport(uint16_t length)
{
if (length == 0)
{
   pInformation->Ctrl_Info.Usb_wLength = 1024-pInformation->Ctrl_Info.Usb_wOffset;
   return NULL;
}
            
    return &My_Buffer[pInformation->Ctrl_Info.Usb_wOffset];
}

uint8_t *CustomHID_GetReport(uint16_t Length)
{
  if (Length == 0)
  {
    pInformation->Ctrl_Info.Usb_wLength = 1024-pInformation->Ctrl_Info.Usb_wOffset
  return NULL;   
  }
  return &My_Buffer[pInformation->Ctrl_Info.Usb_wOffset
}

包的大小为16个字节。
如果按照你的说法,在CustomHID_Data_Setup函数RETURN之前将(*CopyRoutine)(0)改成pInformation->Usb_wLength = (*CopyRoutine)(0);
但是编译后,报错该成员不存在,不知是笔误,还是另有其它的结构体。
谢谢,请帮忙解决一下
沙发
lbbobo|  楼主 | 2012-2-6 23:55 | 只看该作者
这是CustomHID_Status_In的源码
void CustomHID_Status_In(void)
{
   if (Type_Recipient == (CLASS_REQUEST|INTERFACE_RECIPIENT)            && (pInformation->USBbRequest) == SET_REPORT)
{
        if (pInformation->ControlState == WAIT_STATUS_IN)       
//
  {
                 data_process_flag= 1;
  }
}

}

使用特权

评论回复
板凳
香水城| | 2012-2-7 10:24 | 只看该作者
函数CustomHID_SetReport()是否被调用过?什么时候被调用?被调用过几次?

使用特权

评论回复
地板
lbbobo|  楼主 | 2012-2-7 20:40 | 只看该作者
问题找到了,调用了两次,每次16个字节,所有应该是32-pInformation->Ctrl_Info.Usb_wOffset
SETREPORT每次发32个字节,谢谢

使用特权

评论回复
5
gongjian32| | 2014-3-11 16:01 | 只看该作者
楼主,能否把你的这个代码公布出来看一下。我现在是 input id 2个,output id 2个,并且每个的大小都不一样。
就是不会知道,GET_REPORT,SET_REPORT的处理流程。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝