打印

STM32 USB问题????

[复制链接]
3981|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jeffkuang|  楼主 | 2009-7-8 17:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问哪位大侠有使用STM32的USB?小弟有一个问题请问:
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;
  }


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

  pInformation->Ctrl_Info.CopyData = CopyRoutine;
  pInformation->Ctrl_Info.Usb_wOffset = 0;
  (*CopyRoutine)(0);
  return USB_SUCCESS;
}
在ST提供的代码里只有,GET_DESCRIPTOR 与GET_PROTOCOL 的处理,请问SET_REPORT与GET_REPORT怎么处理呢?
沙发
香水城| | 2009-7-8 18:04 | 只看该作者

很简单,这个例子中没有处理SET_REPORT与GET_REPORT

从描述符看,不会有GET_REPORT请求,因为Input Report是通过Interrupt端点送出的。

对于简单的游戏手柄,通常不会有SET_REPORT,因为不需要有PC至设备的数据输出。

虽然例子中的HID描述符中有Output Report的描述,但程序中没有处理。估计写例子的人从哪里抄了一个HID描述符,没有删掉Output Report的描述,既然用不到也就没管它,结果保留了下来。

使用特权

评论回复
板凳
jeffkuang|  楼主 | 2009-7-8 18:56 | 只看该作者

STM32 USB问题????

谢谢,那请问我要处理SET_REPORT的话,是不是在这个函数里增加:
/*** SET_REPORT ***/
else if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
           && RequestNo == SET_REPORT)
  {
    
  }
还有一个问题,这样的话我在哪里能得到报告的资料呢?

使用特权

评论回复
地板
香水城| | 2009-7-8 21:11 | 只看该作者
5
jeffkuang|  楼主 | 2009-7-9 09:07 | 只看该作者

STM32 USB问题????

香主,你是不是链接错了贴子呀,

4楼: 我以前有一个很详细的帖子就是讲SET_REPORT的 

 
以HID的SET REPORT为例说明如何使用STM32的USB库支持控制端点0

这是一个SD卡方面的.再帮我找找那个贴子,小弟不胜感激呀!!!

使用特权

评论回复
6
香水城| | 2009-7-9 09:37 | 只看该作者

链接已经更正

其实我已经给出了足够的信息,如果你会使用版面的搜索功能,很容易就找到了:

使用特权

评论回复
7
jeffkuang|  楼主 | 2009-7-9 10:19 | 只看该作者

STM32 USB问题????

非常感谢香主的快速回答,看来我以后要经常来支持一下香主呀!

使用特权

评论回复
8
jeffkuang|  楼主 | 2009-7-9 11:36 | 只看该作者

有进展了!!!!


RESULT HID_Data_Setup(u8 RequestNo)
{
    u8 *(*CopyRoutine)(u16 length);
    CopyRoutine = NULL;
    if (pInformation->USBbmRequestType == CLASS_REQUEST|INTERFACE_RECIPIENT
            && RequestNo == SET_REPORT)
        CopyRoutine = My_Data_Request;

    if (CopyRoutine == NULL)
        return USB_UNSUPPORT;

    pInformation->Ctrl_Info.CopyData = CopyRoutine;
    pInformation->Ctrl_Info.Usb_wOffset = 0;
    pInformation->Usb_wLength = (*CopyRoutine)(0);

    return USB_SUCCESS;
} // End of HID_Data_Setup()

u8 My_Buffer[10];
u8 *My_Data_Request(u16 length)
{
    if (length == 0)
        return (u8*)10;    // 假定你的REPORT长度和Buffer长度为10

    return My_Buffer;
}


--------------------------------------------------------------------------------
上面介绍的CopyRoutine用于把多次传输的数据包合并到一个完整的缓冲区中,因此只有到STATUS阶段才能够指导一次SETUP传输是否结束,所以用户程序需要在回调函数Process_Status_IN中处理从SET_REPORT接收到的数据。因为所有的回调函数都是USB中断处理的一部分,所以更好的办法是在Process_Status_IN中设置一个标记,然后在用户主程序中判断这个标记并做处理。


--------------------------------------------------------------------------------
注意,STM32的USB库设计成以回调函数处理用户命令请求,包含类命令请求,是为了能够清晰地区分库程序和用户程序,使这两者不会混在一起,这样的好处是非常明显的,当USB库需要更新升级时,只需替换掉相应的程序模块,而不必修改用户已经完成的程序。


香主,上面的Process_Status_IN,在USB_PROC.C里是不是对应
/*******************************************************************************
* Function Name  : Joystick_Status_In.
* Description    : Joystick status IN routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Joystick_Status_In(void)
{}

/*******************************************************************************
* Function Name  : Joystick_Status_Out
* Description    : Joystick status OUT routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Joystick_Status_Out (void)
{}

两个函数?

香主,我很菜的,如果问题很简单的话请不要笑话我呀!
嘿嘿......

使用特权

评论回复
9
香水城| | 2009-7-9 22:15 | 只看该作者

是的

请对照看Joystick这个例子中的DEVICE_PROP Device_Property这个结构体的初始化(usb_prop.c),和DEVICE_PROP结构体的定义(usb_core.h)。

使用特权

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

本版积分规则

15

主题

120

帖子

0

粉丝