OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3202|回复: 4

STM32 USB的一些问题(*CopyRoutine)(0)

[复制链接]

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
发表于 2015-9-29 18:39:07 | 显示全部楼层 |阅读模式
5金钱
原子哥,例程中(*CopyRoutine)(0);这句话的作用,网上查是返回用户缓冲区的长度,但是不知道怎么实现的,C语言水平差,望原子哥解释一下。

最佳答案

查看完整内容[请看2#楼]

回复【3楼】原味_郭: --------------------------------- (*CopyRoutine)(0);的意思,实际上就是等效:  pProperty->GetDeviceDescriptor(0);
努力?奋斗
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-9-29 18:39:08 | 显示全部楼层
回复【3楼】原味_郭:
---------------------------------
(*CopyRoutine)(0);的意思,实际上就是等效:
 pProperty->GetDeviceDescriptor(0);
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-9-29 21:21:35 | 显示全部楼层
但看这个,我也看不出问题.
结合上下文看代码.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2015-9-30 11:32:19 | 显示全部楼层

void Data_Setup0(void)
{
  uint8_t *(*CopyRoutine)(uint16_t);

  RESULT Result;
  uint32_t Request_No = pInformation->USBbRequest;

  uint32_t Related_Endpoint, Reserved;
  uint32_t wOffset, Status;



  CopyRoutine = NULL;
  wOffset = 0;

  /*GET DESCRIPTOR*/
  if (Request_No == GET_DESCRIPTOR)
  {
    if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT))
    {
      uint8_t wValue1 = pInformation->USBwValue1;
      if (wValue1 == DEVICE_DESCRIPTOR)
      {
       CopyRoutine = pProperty->GetDeviceDescriptor; //获取设备描述符
      }
      else if (wValue1 == CONFIG_DESCRIPTOR)
      {
//pDescr=(uint8_t *)(&My_FS_CfgDescr[0]);
//len=32;
        CopyRoutine = pProperty->GetConfigDescriptor;
      }
      else if (wValue1 == STRING_DESCRIPTOR)
      {
        CopyRoutine = pProperty->GetStringDescriptor;
      }  /* End of GET_DESCRIPTOR */
    }
  }
................
.................
.................
if (CopyRoutine)
  {
    pInformation->Ctrl_Info.Usb_wOffset = wOffset;
    pInformation->Ctrl_Info.CopyData = CopyRoutine;
    (*CopyRoutine)(0);

    Result = USB_SUCCESS;
  }

............
............
就是上面红色部分,CopyRoutine是返回指针值得指针型函数, CopyRoutine = pProperty->GetDeviceDescriptor;这句话的意思是CopyRoutine 指向设备描述缓冲区地址。
不明白   (*CopyRoutine)(0);这句话的意思,调试时发现运行了这句话后pInformation->Ctrl_Info.Usb_wLength 会被赋值。

努力?奋斗
回复

使用道具 举报

115

主题

548

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2099
金钱
2099
注册时间
2013-11-27
在线时间
518 小时
发表于 2015-10-2 16:59:08 | 显示全部楼层
就是一个函数指针,方便调用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 12:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表