亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? usb_core.c

?? EK_STM32F開發板測試程序.實現USB的測試咖啡.
?? C
?? 第 1 頁 / 共 2 頁
字號:
    goto Expect_Status_Out;
  }

  Length = pEPinfo->PacketSize;
  ControlState = (save_wLength <= Length) ? LAST_IN_DATA : IN_DATA;

  if (Length > save_wLength)
  {
    Length = save_wLength;
  }

  DataBuffer = (*pEPinfo->CopyData)(Length);

  UserToPMABufferCopy(DataBuffer, GetEPTxAddr(ENDP0), Length);

  SetEPTxCount(ENDP0, Length);

  pEPinfo->Usb_wLength -= Length;
  pEPinfo->Usb_wOffset += Length;
  vSetEPTxStatus(EP_TX_VALID);

  USB_StatusOut();/* Expect the host to abort the data IN stage */

Expect_Status_Out:
  pInformation->ControlState = ControlState;
}

/*******************************************************************************
* Function Name  : NoData_Setup0.
* Description    : Proceed the processing of setup request without data stage.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void NoData_Setup0(void)
{
  RESULT Result = USB_UNSUPPORT;
  u32 RequestNo = pInformation->USBbRequest;
  u32 ControlState;

  if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT))
  {
    /* Device Request*/
    /* SET_CONFIGURATION*/
    if (RequestNo == SET_CONFIGURATION)
    {
      Result = Standard_SetConfiguration();
    }

    /*SET ADDRESS*/
    else if (RequestNo == SET_ADDRESS)
    {
      if ((pInformation->USBwValue0 > 127) || (pInformation->USBwValue1 != 0)
          || (pInformation->USBwIndex != 0)
          || (pInformation->Current_Configuration != 0))
        /* Device Address should be 127 or less*/
      {
        ControlState = STALLED;
        goto exit_NoData_Setup0;
      }
      else
      {
        Result = USB_SUCCESS;
      }
    }
    /*SET FEATURE for Device*/
    else if (RequestNo == SET_FEATURE)
    {
      if ((pInformation->USBwValue0 == DEVICE_REMOTE_WAKEUP)
          && (pInformation->USBwIndex == 0)
          && (ValBit(pInformation->Current_Feature, 5)))
      {
        Result = Standard_SetDeviceFeature();
      }
      else
      {
        Result = USB_UNSUPPORT;
      }
    }
    /*Clear FEATURE for Device */
    else if (RequestNo == CLEAR_FEATURE)
    {
      if (pInformation->USBwValue0 == DEVICE_REMOTE_WAKEUP
          && pInformation->USBwIndex == 0
          && ValBit(pInformation->Current_Feature, 5))
      {
        Result = Standard_ClearFeature();
      }
      else
      {
        Result = USB_UNSUPPORT;
      }
    }

  }

  /* Interface Request*/
  else if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT))
  {
    /*SET INTERFACE*/
    if (RequestNo == SET_INTERFACE)
    {
      Result = Standard_SetInterface();
    }
  }

  /* EndPoint Request*/
  else if (Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT))
  {
    /*CLEAR FEATURE for EndPoint*/
    if (RequestNo == CLEAR_FEATURE)
    {
      Result = Standard_ClearFeature();
    }
    /* SET FEATURE for EndPoint*/
    else if (RequestNo == SET_FEATURE)
    {
      Result = Standard_SetEndPointFeature();
    }
  }
  else
  {
    Result = USB_UNSUPPORT;
  }


  if (Result != USB_SUCCESS)
  {
    Result = (*pProperty->Class_NoData_Setup)(RequestNo);
    if (Result == USB_NOT_READY)
    {
      ControlState = PAUSE;
      goto exit_NoData_Setup0;
    }
  }

  if (Result != USB_SUCCESS)
  {
    ControlState = STALLED;
    goto exit_NoData_Setup0;
  }

  ControlState = WAIT_STATUS_IN;/* After no data stage SETUP */

  USB_StatusIn();

exit_NoData_Setup0:
  pInformation->ControlState = ControlState;
  return;
}

/*******************************************************************************
* Function Name  : Data_Setup0.
* Description    : Proceed the processing of setup request with data stage.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Data_Setup0(void)
{
  u8 *(*CopyRoutine)(u16);
  RESULT Result;
  u32 Request_No = pInformation->USBbRequest;

  u32 Related_Endpoint, Reserved;
  u32 wOffset, Status;



  CopyRoutine = NULL;
  wOffset = 0;

  if (Request_No == GET_DESCRIPTOR)
  {
    if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT))
    {
      u8 wValue1 = pInformation->USBwValue1;
      if (wValue1 == DEVICE_DESCRIPTOR)
      {
        CopyRoutine = pProperty->GetDeviceDescriptor;
      }
      else if (wValue1 == CONFIG_DESCRIPTOR)
      {
        CopyRoutine = pProperty->GetConfigDescriptor;
      }
      else if (wValue1 == STRING_DESCRIPTOR)
      {
        CopyRoutine = pProperty->GetStringDescriptor;
      }  /* End of GET_DESCRIPTOR */
    }
  }

  /*GET STATUS*/
  else if ((Request_No == GET_STATUS) && (pInformation->USBwValue == 0)
           && (pInformation->USBwLength == 0x0002)
           && (pInformation->USBwIndex1 == 0))
  {
    /* GET STATUS for Device*/
    if ((Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT))
        && (pInformation->USBwIndex == 0))
    {
      CopyRoutine = Standard_GetStatus;
    }

    /* GET STATUS for Interface*/
    else if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT))
    {
      if (((*pProperty->Class_Get_Interface_Setting)(pInformation->USBwIndex0, 0) == USB_SUCCESS)
          && (pInformation->Current_Configuration != 0))
      {
        CopyRoutine = Standard_GetStatus;
      }
    }

    /* GET STATUS for EndPoint*/
    else if (Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT))
    {
      Related_Endpoint = (pInformation->USBwIndex0 & 0x0f);
      Reserved = pInformation->USBwIndex0 & 0x70;

      if (ValBit(pInformation->USBwIndex0, 7))
      {
        /*Get Status of endpoint & stall the request if the related_ENdpoint
        is Disabled*/
        Status = _GetEPTxStatus(Related_Endpoint);
      }
      else
      {
        Status = _GetEPRxStatus(Related_Endpoint);
      }

      if ((Related_Endpoint < Device_Table.Total_Endpoint) && (Reserved == 0)
          && (Status != 0))
      {
        CopyRoutine = Standard_GetStatus;
      }
    }

  }

  /*GET CONFIGURATION*/
  else if (Request_No == GET_CONFIGURATION)
  {
    if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT))
    {
      CopyRoutine = Standard_GetConfiguration;
    }
  }
  /*GET INTERFACE*/
  else if (Request_No == GET_INTERFACE)
  {
    if ((Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT))
        && (pInformation->Current_Configuration != 0) && (pInformation->USBwValue == 0)
        && (pInformation->USBwIndex1 == 0) && (pInformation->USBwLength == 0x0001)
        && ((*pProperty->Class_Get_Interface_Setting)(pInformation->USBwIndex0, 0) == USB_SUCCESS))
    {
      CopyRoutine = Standard_GetInterface;
    }

  }


  if (CopyRoutine)
  {
    pInformation->Ctrl_Info.Usb_wOffset = wOffset;
    pInformation->Ctrl_Info.CopyData = CopyRoutine;
    /* sb in the original the cast to word was directly */
    /* now the cast is made step by step */
    (*CopyRoutine)(0);
    Result = USB_SUCCESS;
  }
  else
  {
    Result = (*pProperty->Class_Data_Setup)(pInformation->USBbRequest);
    if (Result == USB_NOT_READY)
    {
      pInformation->ControlState = PAUSE;
      return;
    }
  }

  if (pInformation->Ctrl_Info.Usb_wLength == 0xFFFF)
  {
    /* Data is not ready, wait it */
    pInformation->ControlState = PAUSE;
    return;
  }
  if ((Result == USB_UNSUPPORT) || (pInformation->Ctrl_Info.Usb_wLength == 0))
  {
    /* Unsupported request */
    pInformation->ControlState = STALLED;
    return;
  }


  if (ValBit(pInformation->USBbmRequestType, 7))
  {
    /* Device ==> Host */
    u32 wLength = pInformation->USBwLength;

    /* Restrict the data length to be the one host asks */
    if (pInformation->Ctrl_Info.Usb_wLength > wLength)
    {
      pInformation->Ctrl_Info.Usb_wLength = wLength;
    }

    pInformation->Ctrl_Info.PacketSize = pProperty->MaxPacketSize;
    DataStageIn();
  }
  else
  {
    pInformation->ControlState = OUT_DATA;
    vSetEPRxStatus(EP_RX_VALID);/* enable for next data reception */
  }

  return;
}

/*******************************************************************************
* Function Name  : Setup0_Process
* Description    : Get the device request data and dispatch to individual process.
* Input          : None.
* Output         : None.
* Return         : Post0_Process.
*******************************************************************************/
u8 Setup0_Process(void)
{

  union
  {
    u8* b;
    u16* w;
  } pBuf;

  pBuf.b = PMAAddr + (u8 *)(_GetEPRxAddr(ENDP0) * 2); /* *2 for 32 bits addr */

  if (pInformation->ControlState != PAUSE)
  {
    pInformation->USBbmRequestType = *pBuf.b++; /* bmRequestType */
    pInformation->USBbRequest = *pBuf.b++; /* bRequest */
    pBuf.w++;  /* word not accessed because of 32 bits addressing */
    pInformation->USBwValue = ByteSwap(*pBuf.w++); /* wValue */
    pBuf.w++;  /* word not accessed because of 32 bits addressing */
    pInformation->USBwIndex  = ByteSwap(*pBuf.w++); /* wIndex */
    pBuf.w++;  /* 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();
}

/*******************************************************************************
* Function Name  : In0_Process
* Description    : Process the IN token on all default endpoint.
* Input          : None.
* Output         : None.
* Return         : Post0_Process.
*******************************************************************************/
u8 In0_Process(void)
{
  u32 ControlState = pInformation->ControlState;

  if ((ControlState == IN_DATA) || (ControlState == LAST_IN_DATA))
  {
    DataStageIn();
    /* ControlState may be changed outside the function */
    ControlState = pInformation->ControlState;
  }

  else if (ControlState == WAIT_STATUS_IN)
  {
    if ((pInformation->USBbRequest == SET_ADDRESS) &&
        (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)))
    {
      SetDeviceAddress(pInformation->USBwValue0);
      pUser_Standard_Requests->User_SetDeviceAddress();
    }
    (*pProperty->Process_Status_IN)();
    ControlState = STALLED;
  }

  else
  {
    ControlState = STALLED;
  }

  pInformation->ControlState = ControlState;

  return Post0_Process();
}

/*******************************************************************************
* Function Name  : Out0_Process
* Description    : Process the OUT token on all default endpoint.
* Input          : None.
* Output         : None.
* Return         : Post0_Process.
*******************************************************************************/
u8 Out0_Process(void)
{
  u32 ControlState = pInformation->ControlState;

  if ((ControlState == OUT_DATA) || (ControlState == LAST_OUT_DATA))
  {
    DataStageOut();
    ControlState = pInformation->ControlState; /* may be changed outside the function */
  }

  else if (ControlState == WAIT_STATUS_OUT)
  {
    (*pProperty->Process_Status_OUT)();
    ControlState = STALLED;
  }

  else if ((ControlState == IN_DATA) || (ControlState == LAST_IN_DATA))
  {
    /* host aborts the transfer before finish */
    ControlState = STALLED;
  }

  /* Unexpect state, STALL the endpoint */
  else
  {
    ControlState = STALLED;
  }

  pInformation->ControlState = ControlState;

  return Post0_Process();
}

/*******************************************************************************
* Function Name  : Post0_Process
* Description    : Stall the Endpoint 0 in case of error.
* Input          : None.
* Output         : None.
* Return         : - 0 if the control State is in PAUSE
*                  - 1 if not.
*******************************************************************************/
u8 Post0_Process(void)
{
  SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);

  if (pInformation->ControlState == STALLED)
  {
    vSetEPRxStatus(EP_RX_STALL);
    vSetEPTxStatus(EP_TX_STALL);
  }

  return (pInformation->ControlState == PAUSE);
}

/*******************************************************************************
* Function Name  : SetDeviceAddress.
* Description    : Set the device and all the used Endpoints addresses.
* Input          : - Val: device adress.
* Output         : None.
* Return         : None.
*******************************************************************************/
void SetDeviceAddress(u8 Val)
{
  u32 i;
  u32 nEP = Device_Table.Total_Endpoint;

  /* set address in every used endpoint */
  for (i = 0; i < nEP; i++)
  {
    _SetEPAddress((u8)i, (u8)i);
  } /* for */
  _SetDADDR(Val | DADDR_EF); /* set device address and enable function */
}

/*******************************************************************************
* Function Name  : NOP_Process
* Description    : No operation function.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void NOP_Process(void)
{
}

/******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产无人区一区二区三区| 在线免费精品视频| 久久九九久久九九| 国产成人精品免费视频网站| 精品动漫一区二区三区在线观看| 国产综合成人久久大片91| 久久精品视频一区二区| av电影一区二区| 亚洲激情图片qvod| 在线播放/欧美激情| 久久99九九99精品| 国产精品热久久久久夜色精品三区| 成人免费黄色在线| 亚洲高清在线精品| 日韩精品在线一区二区| 国产成人日日夜夜| 亚洲一区在线观看网站| 精品免费视频一区二区| 丁香桃色午夜亚洲一区二区三区| 亚洲三级在线播放| 欧美精品久久天天躁| 狠狠色狠狠色综合| 亚洲精品精品亚洲| 日韩欧美国产成人一区二区| 高清不卡在线观看av| 亚洲成av人片在线观看无码| 久久免费美女视频| 色噜噜狠狠色综合欧洲selulu | 中文字幕视频一区| 欧美日韩成人一区| 国产成人一区在线| 一卡二卡欧美日韩| 久久久久免费观看| 欧美三区在线观看| 成人av资源在线| 蜜桃精品视频在线观看| 一区二区三区在线视频观看58| 欧美一卡2卡三卡4卡5免费| 91视频免费看| 韩国v欧美v日本v亚洲v| 一级日本不卡的影视| 国产亚洲欧美日韩日本| 欧美精品vⅰdeose4hd| 99国产精品国产精品久久| 久久成人羞羞网站| 亚洲不卡在线观看| 亚洲精品免费视频| 欧美激情资源网| 欧美大肚乱孕交hd孕妇| 欧美欧美欧美欧美首页| 91免费版在线| 国产成人免费视频 | 国产麻豆成人精品| 午夜视频在线观看一区二区三区 | 一区二区三区在线免费观看| 久久久.com| 久久综合九色综合欧美98| 91精品国产综合久久精品性色| 色噜噜夜夜夜综合网| 波多野结衣一区二区三区 | av一二三不卡影片| 国产一区在线不卡| 蜜桃av一区二区在线观看| 午夜精品久久久久久久久久久| 亚洲综合在线电影| 亚洲三级久久久| 亚洲视频免费观看| 国产精品丝袜久久久久久app| 久久婷婷国产综合精品青草| 欧美一区二区三区视频| 欧美一区日本一区韩国一区| 欧美日韩国产成人在线91| 欧美精品久久一区二区三区| 欧美老女人在线| 欧美日韩aaaaaa| 91精选在线观看| 日韩一区二区三区在线观看| 91麻豆精品国产91久久久资源速度 | 一区二区三区欧美在线观看| 亚洲日本一区二区三区| 亚洲精品精品亚洲| 亚洲成av人片一区二区梦乃| 亚洲风情在线资源站| 天天综合网天天综合色| 丝袜美腿亚洲色图| 久久精品免费看| 国产九色精品成人porny| 国产精品一区二区久久不卡 | 99久久精品国产毛片| 91丝袜美女网| 欧美撒尿777hd撒尿| 欧美一区二区三区日韩视频| 精品国产1区二区| 国产免费观看久久| 亚洲天堂精品在线观看| 一区二区三区日韩欧美精品| 日韩电影一区二区三区四区| 国产一区 二区| 一本大道综合伊人精品热热 | 精品国产欧美一区二区| 欧美国产成人精品| 亚洲国产精品久久人人爱| 蜜臀av一区二区| www.欧美日韩国产在线| 欧美日韩中文精品| 久久蜜桃av一区二区天堂| 国产精品国产馆在线真实露脸| 亚洲国产成人tv| 精东粉嫩av免费一区二区三区| 成人看片黄a免费看在线| 欧洲一区二区三区在线| 欧美精品一区二区三区高清aⅴ | 亚洲在线成人精品| 久久精品国产99| 一本色道久久综合亚洲91| 在线不卡免费av| 中文字幕av一区二区三区免费看| ...xxx性欧美| 美国十次了思思久久精品导航| 国产福利一区二区三区在线视频| 色综合色综合色综合| 精品久久久久久久久久久久久久久久久 | 日韩精品一区二区三区四区视频 | 国产精品午夜免费| 日韩专区在线视频| 北条麻妃国产九九精品视频| 337p亚洲精品色噜噜狠狠| 国产精品高潮久久久久无| 蜜桃视频在线一区| 欧美在线不卡一区| 亚洲国产精品精华液2区45| 水野朝阳av一区二区三区| 91在线精品一区二区三区| 久久综合色播五月| 婷婷亚洲久悠悠色悠在线播放 | 国产原创一区二区| 欧美日韩精品福利| 亚洲色图另类专区| 成人性生交大片免费看视频在线| 日韩欧美成人激情| 亚洲国产精品一区二区尤物区| 大尺度一区二区| 欧美精品一区视频| 视频一区二区三区入口| 日本乱码高清不卡字幕| 国产精品视频yy9299一区| 精品一区二区国语对白| 欧美一级在线免费| 日韩精品视频网站| 91麻豆.com| 国产精品不卡一区二区三区| 国产高清不卡二三区| 久久久99精品免费观看| 韩国欧美国产1区| 91精品国产高清一区二区三区| 亚洲小说欧美激情另类| 在线观看视频欧美| 一区二区在线观看不卡| 日本电影欧美片| 亚洲精品乱码久久久久| 91久久久免费一区二区| 亚洲图片你懂的| 一本久久精品一区二区| 亚洲视频免费观看| 91福利国产精品| 亚洲高清在线视频| 欧美精品一级二级三级| 蜜臂av日日欢夜夜爽一区| 日韩一区二区三区电影| 国产福利精品一区二区| 国产欧美一区二区精品婷婷 | 国产精品久久久久影视| 国产69精品久久久久毛片| 久久一留热品黄| 风流少妇一区二区| 国产精品成人一区二区艾草| 色综合视频一区二区三区高清| 亚洲精品欧美专区| 欧洲精品一区二区三区在线观看| 亚洲男人的天堂av| 欧美日韩一级大片网址| 蜜臀久久99精品久久久久宅男| 日韩欧美第一区| 成人免费视频播放| 亚洲精品国产第一综合99久久| 欧美日韩第一区日日骚| 免费成人在线观看| 国产午夜亚洲精品理论片色戒 | 国产亲近乱来精品视频| 99精品久久免费看蜜臀剧情介绍| 亚洲黄色av一区| 制服.丝袜.亚洲.中文.综合 | 色婷婷av一区二区三区大白胸| 亚洲一区二区三区在线播放| 日韩午夜激情av| 成人精品免费网站| 亚洲mv在线观看| 国产欧美日韩不卡| 欧美无人高清视频在线观看| 久久国产精品72免费观看|