发新帖我要提问
12
返回列表
打印

求助:端点0处理函数

[复制链接]
楼主: shangelaila
手机看帖
扫描二维码
随时随地手机跟帖
21
你自己的命令也是SET_REPORT吗?

使用特权

评论回复
22
shangelaila|  楼主 | 2010-7-5 13:30 | 只看该作者
21# 香水城
嗯,主机发送的是21 09 04 03 00 00 08 00  ,通过BUS HOUND 看是SET REPORT

使用特权

评论回复
23
香水城| | 2010-7-5 13:37 | 只看该作者
17# 香水城
以前函数写错了,所以有些问题。现在已经好了。

按照您博客中所写的,增加了处理函数,主机发送了SET REPORT之后,我也在Process_Status_IN函数里将数据读出了,为什么还是STALL PID呢? ...
shangelaila 发表于 2010-7-5 13:04


既然已经收到数据,STALL PID出现在哪里?哪个阶段?

使用特权

评论回复
24
shangelaila|  楼主 | 2010-7-5 13:39 | 只看该作者
23# 香水城
在收到了主机的SET REPORT之后就STALL PID了,我的主机会给设备连续发送五次SET REPORT,会不会是这个原因?

使用特权

评论回复
25
香水城| | 2010-7-5 13:53 | 只看该作者
17# 香水城
以前函数写错了,所以有些问题。现在已经好了。

按照您博客中所写的,增加了处理函数,主机发送了SET REPORT之后,我也在Process_Status_IN函数里将数据读出了,为什么还是STALL PID呢? ...
shangelaila 发表于 2010-7-5 13:04

23# 香水城
在收到了主机的SET REPORT之后就STALL PID了,我的主机会给设备连续发送五次SET REPORT,会不会是这个原因?
shangelaila 发表于 2010-7-5 13:39


如果在Process_Status_IN函数里收到数据,则收到主机的SET REPORT之后就不可能有STALL PID;反之,如果有STALL PID,则不可能进到Process_Status_IN函数里。

肯定是你哪里搞错了。

使用特权

评论回复
26
shangelaila|  楼主 | 2010-7-5 14:02 | 只看该作者
25# 香水城
在SETUP函数里增加
if (pInformation->USBbmRequestType == CLASS_REQUEST|INTERFACE_RECIPIENT
            && RequestNo == SET_REPORT)
  {
        CopyRoutine = My_GetReport;
  }


GetReport的定义:
u8 *My_GetReport(u16 Length)
{
   if (Length == 0)
        return (u8*)8;   

    return My_AliData;

}
然后再Status_IN中把My_AliData数组里面的数据取出,整个过程是这样吗?

使用特权

评论回复
27
香水城| | 2010-7-5 14:21 | 只看该作者
不管前后的程序,这部分是对的。

使用特权

评论回复
28
shangelaila|  楼主 | 2010-7-5 14:32 | 只看该作者
27# 香水城
我把函数修改成这样之后,就不会STALL PID了,不知道为什么
u8 *My_GetReport(u16 Length)
{
   if(Length == 0)
   {
     pInformation->Ctrl_Info.Usb_wLength = 8;
     return (u8*)8;   

   }
   else
   {
    return My_AliData;
   }
}

使用特权

评论回复
29
香水城| | 2010-7-5 14:35 | 只看该作者
看不到你的xxxx_Data_Setup函数中其他部分,我也不知道为什么!

使用特权

评论回复
30
shangelaila|  楼主 | 2010-7-5 14:42 | 只看该作者
29# 香水城
RESULT Joystick_Data_Setup(u8 RequestNo)
{
  u8 *(*CopyRoutine)(u16);
    CopyRoutine = NULL;

  if ((RequestNo == GET_DESCRIPTOR)
      && (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT))
      && (pInformation->USBwIndex0 == 0))
  {

    if (pInformation->USBwValue1 == REPORT_DESCRIPTOR)
    {
      CopyRoutine = Joystick_GetReportDescriptor;
    }
    else if (pInformation->USBwValue1 == HID_DESCRIPTOR_TYPE)
    {
      CopyRoutine = Joystick_GetHIDDescriptor;
    }

  } /* End of GET_DESCRIPTOR */

  /*** GET_PROTOCOL ***/
  else if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
           && RequestNo == GET_PROTOCOL)
  {
    CopyRoutine = Joystick_GetProtocolValue;
  }
 /***********************************************************
 上面是已有的,下面是我添加的 
*****************/
  else if (pInformation->USBbmRequestType == CLASS_REQUEST|INTERFACE_RECIPIENT
            && RequestNo == SET_REPORT)
  { 
        CopyRoutine = My_GetReport;
  }
  else if(pInformation->USBbmRequestType == 0xa1)    
  {
    CopyRoutine = My_Cmd;
  }
  
  else
  {
  }

  if (CopyRoutine == NULL)
  {
    return USB_UNSUPPORT;
  }

  pInformation->Ctrl_Info.CopyData = CopyRoutine;
  pInformation->Ctrl_Info.Usb_wOffset = 0;
  (*CopyRoutine)(0);
  return USB_SUCCESS;
}

使用特权

评论回复
31
香水城| | 2010-7-5 14:48 | 只看该作者
你看看我的博客,在return之前的最后一句话是:pInformation->Usb_wLength = (*CopyRoutine)(0);

原有的例子在这里明显错误,单独执行(*CopyRoutine)(0)没有意义!

使用特权

评论回复
32
shangelaila|  楼主 | 2010-7-5 14:59 | 只看该作者
31# 香水城
修改之后编译报错:Error[Pe513]: a value of type "unsigned char *" cannot be assigned to an entity of type "u16"  

使用特权

评论回复
33
香水城| | 2010-7-5 15:11 | 只看该作者
31# 香水城
修改之后编译报错:Error[Pe513]: a value of type "unsigned char *" cannot be assigned to an entity of type "u16"  
shangelaila 发表于 2010-7-5 14:59


这种问题还要问?自己做个强制类型转换就好了。

使用特权

评论回复
34
shangelaila|  楼主 | 2010-7-5 15:18 | 只看该作者
33# 香水城
小白了呵呵,问题终于解决,十分感谢香版这么多天的耐心解答!

使用特权

评论回复
35
香水城| | 2010-7-5 15:32 | 只看该作者
问题解决了,你就结帖吧,:lol

使用特权

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

本版积分规则