USB枚举过程之如何进行标准设备请求~~~

2019-03-23 18:33发布

这是一个USB枚举建立过程中的一个函数,小弟对这个函数不是很理解,恳请大神指教~~~
uint8_t Setup0_Process(void)
{

  union
  {
    uint8_t* b;
    uint16_t* w;
  } pBuf;

#ifdef STM32F10X_CL
  USB_OTG_EP *ep;
  uint16_t offset = 0;

  ep = PCD_GetOutEP(ENDP0);
  pBuf.b = ep->xfer_buff;
#else  
  uint16_t offset = 1;

  pBuf.b = PMAAddr + (uint8_t *)(_GetEPRxAddr(ENDP0) * 2); /*½óêÕ»o3åÇø¶Ëμã0μØÖ·*/
#endif /* STM32F10X_CL */

  if (pInformation->ControlState != PAUSE)
  { /*ÕaêÇò»¸öUSB±ê×¼é豸ÇëÇó*/
    pInformation->USBbmRequestType = *pBuf.b++; /* pBuf是刚刚建立的一个union,它首地址指向接收缓冲器端点0的起始地址
问题1:标准设备请求是由主机给设备发送的,由设备返还给主机它本身的设备信息,那这个请求代码是由主机提供的,对吧?
问题2:*pBuf.b++的指向指向的接收缓冲器的首地址,把这个值赋给pInformation->USBbmRequestType 有什么意义? */
    pInformation->USBbRequest = *pBuf.b++; /* bRequest */
    pBuf.w += offset;  /* word not accessed because of 32 bits addressing */
    pInformation->USBwValue = ByteSwap(*pBuf.w++); /* wValue */
    pBuf.w += offset;  /* word not accessed because of 32 bits addressing */
    pInformation->USBwIndex  = ByteSwap(*pBuf.w++); /* wIndex */
    pBuf.w += offset;  /* word not accessed because of 32 bits addressing */
    pInformation->USBwLength = *pBuf.w; /* wLength */
  }

  pInformation->ControlState = SETTING_UP;
  if (pInformation->USBwLength == 0)
  {
    /* Setup with no data stage */
    NoData_Setup0();
  }
  else
  {
    /* Setup with data stage */
    Data_Setup0();
  }
  return Post0_Process();
}



此帖出自小平头技术问答
0条回答

一周热门 更多>