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

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

?? usb_core.c

?? STM32f10x ARM USB 通信源代碼 庫函數源碼 例子程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
    ControlState = WAIT_STATUS_OUT;
    vSetEPTxStatus(EP_TX_STALL);
    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一区二区三区免费野_久草精品视频
亚洲一区在线观看免费观看电影高清 | 亚洲欧洲av在线| 韩国精品一区二区| 精品少妇一区二区三区| 久久国产人妖系列| 久久久精品一品道一区| 99视频精品在线| 综合激情成人伊人| 欧美主播一区二区三区| 亚洲成人激情av| 日韩欧美激情在线| 国产精品一区二区x88av| 国产女同互慰高潮91漫画| av在线不卡免费看| 亚洲国产视频直播| 国产成人精品午夜视频免费| 欧美一级日韩免费不卡| 欧美剧情电影在线观看完整版免费励志电影| 激情深爱一区二区| 色哟哟精品一区| 精品理论电影在线观看 | 成人伦理片在线| 欧美在线观看18| 日韩欧美在线网站| 中文字幕久久午夜不卡| 成人va在线观看| 国产精品久久久久久妇女6080| 91丝袜国产在线播放| 亚洲在线一区二区三区| 99久久免费精品高清特色大片| 国产精品久久久久影院亚瑟 | 六月丁香综合在线视频| 精品福利av导航| 成人黄色免费短视频| 一区二区三区中文字幕在线观看| 欧美中文字幕一区| 日产精品久久久久久久性色| 国产日产欧美一区| 欧美在线观看一区| 久久爱www久久做| 亚洲欧洲国产日韩| 欧美视频中文一区二区三区在线观看| 一区二区三区鲁丝不卡| 日韩午夜电影av| av影院午夜一区| 日韩和欧美一区二区| 国产欧美一区二区精品性| 在线精品视频小说1| 精一区二区三区| 亚洲人成精品久久久久| 久久亚洲精精品中文字幕早川悠里 | 国产尤物一区二区| 国产精品激情偷乱一区二区∴| 成人三级伦理片| 美女网站色91| 亚洲精品成人天堂一二三| 日韩亚洲国产中文字幕欧美| 一本一本大道香蕉久在线精品 | 午夜精品久久久久久久久久久| 成人污污视频在线观看| 欧美视频在线一区| 美女视频一区二区三区| 日韩午夜在线观看视频| 91麻豆国产自产在线观看| 亚洲成a人在线观看| 精品少妇一区二区三区在线播放| av成人免费在线观看| 日韩中文字幕av电影| 欧美刺激脚交jootjob| 99这里只有久久精品视频| 麻豆成人综合网| 亚洲精品国产视频| 久久久91精品国产一区二区三区| 欧美日韩中文国产| 91影院在线免费观看| 国产麻豆成人传媒免费观看| 免费久久精品视频| 午夜精品福利久久久| ...av二区三区久久精品| 国产日产亚洲精品系列| 精品剧情在线观看| 欧美一级高清片在线观看| 欧美探花视频资源| 91麻豆自制传媒国产之光| www.亚洲在线| 成人国产亚洲欧美成人综合网| 国产一区在线观看视频| 男女激情视频一区| 秋霞午夜鲁丝一区二区老狼| 五月婷婷激情综合网| 亚洲第一激情av| 亚洲18色成人| 视频一区二区欧美| 亚洲人成在线观看一区二区| 欧美激情一区二区三区蜜桃视频 | 欧美日韩一区二区三区在线| 色欧美日韩亚洲| 99re成人在线| 色综合中文字幕| 欧美做爰猛烈大尺度电影无法无天| 色婷婷av一区| 欧美日韩在线电影| 欧美日本韩国一区二区三区视频| 欧美视频第二页| 欧美亚洲动漫精品| 欧美丰满嫩嫩电影| 久久久天堂av| 亚洲色图在线播放| 2021久久国产精品不只是精品| 精品一区二区久久久| 久久久精品蜜桃| 亚洲一区二区三区四区在线 | 中文字幕的久久| 国产清纯白嫩初高生在线观看91| 国产精品私房写真福利视频| 国产精品超碰97尤物18| 亚洲综合免费观看高清完整版在线| 午夜欧美视频在线观看| 久久精品国产免费| 久久不见久久见免费视频7| 岛国一区二区三区| 欧美日韩免费观看一区三区| 日韩欧美国产电影| 国产精品电影一区二区| 亚洲r级在线视频| 久久97超碰色| 成人激情免费视频| 国产美女视频91| 91免费视频观看| 日韩亚洲欧美综合| 日韩毛片高清在线播放| 日日夜夜精品视频免费| 国产精品羞羞答答xxdd| 色综合久久99| 26uuu亚洲| 亚洲成av人在线观看| 国产美女视频一区| 欧美色图激情小说| 久久蜜桃av一区精品变态类天堂 | 日韩欧美中文字幕公布| 中文字幕在线观看一区二区| 午夜日韩在线观看| 国产91对白在线观看九色| 精品视频1区2区3区| 久久久久久麻豆| 日本vs亚洲vs韩国一区三区| www.综合网.com| 久久夜色精品一区| 日产精品久久久久久久性色| www.视频一区| 精品欧美一区二区三区精品久久| 国产精品毛片久久久久久| 亚洲在线观看免费视频| 国产精品996| 日韩色在线观看| 亚洲国产一区二区三区青草影视| 成人免费视频视频在线观看免费| 亚洲成人自拍网| 欧美怡红院视频| 亚洲午夜电影在线| 成人精品鲁一区一区二区| 国产98色在线|日韩| 亚洲午夜三级在线| 亚洲乱码国产乱码精品精小说| 国产一区二区三区观看| 777午夜精品视频在线播放| 亚洲色图在线视频| 成人国产亚洲欧美成人综合网| 日韩你懂的在线播放| 一区二区三区精品| 99re8在线精品视频免费播放| 欧美日韩国产bt| 国产精品久久久久一区二区三区| 久久精品国产一区二区| 欧美精品三级日韩久久| 亚洲乱码精品一二三四区日韩在线| 不卡一区二区中文字幕| 国产欧美一区二区精品仙草咪 | 国产精品欧美久久久久无广告| 蜜桃精品在线观看| 欧美丰满少妇xxxbbb| 婷婷成人激情在线网| 成人性生交大片免费| 成人福利视频在线| 久久国产视频网| 亚洲国产色一区| 国产色91在线| 欧美性淫爽ww久久久久无| 日韩二区三区在线观看| 一区二区三区在线播放| 亚洲精品欧美在线| 91蜜桃在线免费视频| 久久久久久电影| 丁香一区二区三区| 国产精品少妇自拍| 91丨九色丨国产丨porny| 一区二区三区国产精品| 精品视频999| 精品午夜一区二区三区在线观看| 久久先锋资源网|