Changeset - 675c16cde5b1
[Not reviewed]
Makefile
Show inline comments
 
@@ -9,7 +9,7 @@ TOP:=$(shell readlink -f "../..")
 
DISCOVERY:=Utilities/STM32L100C-Discovery
 
STMLIB:=libraries
 
OLEDDRV:=oleddrv
 
USBDRV:=/STM32_USB-FS-Device_Driver/inc
 
USBDRV:=libraries/USB
 
STD_PERIPH:=$(STMLIB)/STM32L1xx_StdPeriph_Driver
 
STARTUP:=$(STMLIB)/CMSIS/Device/ST/STM32L1xx/Source/Templates/gcc_ride7
 
LINKER_SCRIPT:=$(CURDIR)/stm32-flash.ld
hw_config.c
Show inline comments
 
@@ -40,31 +40,11 @@
 
/* Private variables ---------------------------------------------------------*/
 
ErrorStatus HSEStartUpStatus;
 
EXTI_InitTypeDef EXTI_InitStructure;
 
uint32_t packet_sent;
 
extern __IO uint32_t packet_sent;
 
extern __IO uint8_t Send_Buffer[VIRTUAL_COM_PORT_DATA_SIZE] ;
 
uint32_t packet_receive;
 
extern __IO  uint32_t packet_receive;
 
extern __IO uint8_t Receive_length;
 

	
 
void set_packet_sent() {
 
	packet_sent = 1;
 
}
 
uint32_t get_packet_sent() {
 
	return packet_sent;
 
}
 
void clear_packet_sent() {
 
	packet_sent = 0;
 
}
 
void set_packet_receive() {
 
	packet_receive = 1;
 
}
 
uint32_t get_packet_receive() {
 
	return packet_receive;
 
}
 
void clear_packet_receive() {
 
	packet_receive = 0;
 
}
 

	
 

	
 
uint8_t Receive_Buffer[64];
 
uint32_t Send_length;
 
static void IntToUnicode (uint32_t value , uint8_t *pbuf , uint8_t len);
 
@@ -368,7 +348,7 @@ uint32_t CDC_Send_DATA (uint8_t *ptrBuff
 
  if(Send_length < VIRTUAL_COM_PORT_DATA_SIZE)     
 
  {
 
    /*Sent flag*/
 
    clear_packet_sent();
 
    packet_sent = 0;
 
    /* send  packet to PMA*/
 
    UserToPMABufferCopy((unsigned char*)ptrBuffer, ENDP1_TXADDR, Send_length);
 
    SetEPTxCount(ENDP1, Send_length);
 
@@ -391,10 +371,9 @@ uint32_t CDC_Send_DATA (uint8_t *ptrBuff
 
uint32_t CDC_Receive_DATA(void)
 
{ 
 
  /*Receive flag*/
 
  clear_packet_receive();
 
  packet_receive = 0;
 
  SetEPRxValid(ENDP3); 
 
  return 1 ;
 
}
 

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

	
hw_config.h
Show inline comments
 
@@ -44,16 +44,7 @@
 
#define LED_OFF               0xFF
 
 
/* Exported functions ------------------------------------------------------- */
 
 
 
 
void set_packet_sent();
 
uint32_t get_packet_sent();
 
void clear_packet_sent();
 
 
void set_packet_receive();
 
uint32_t get_packet_receive();
 
void clear_packet_receive();
 
 
void Set_System(void);
 
void Set_USBClock(void);
 
void Enter_LowPowerMode(void);
 
void Leave_LowPowerMode(void);
libraries/USB/usb_core.c
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_core.c
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    28-August-2012
 
  * @brief   Standard protocol processing (USB v2.0)
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
 
/* Includes ------------------------------------------------------------------*/
 
#include "usb_lib.h"
 
/* Private typedef -----------------------------------------------------------*/
 
/* Private define ------------------------------------------------------------*/
 
#define ValBit(VAR,Place)    (VAR & (1 << Place))
 
#define SetBit(VAR,Place)    (VAR |= (1 << Place))
 
#define ClrBit(VAR,Place)    (VAR &= ((1 << Place) ^ 255))
 
#define Send0LengthData() { _SetEPTxCount(ENDP0, 0); \
 
    vSetEPTxStatus(EP_TX_VALID); \
 
  }
 
 
#define vSetEPRxStatus(st) (SaveRState = st)
 
#define vSetEPTxStatus(st) (SaveTState = st)
 
 
#define USB_StatusIn() Send0LengthData()
 
#define USB_StatusOut() vSetEPRxStatus(EP_RX_VALID)
 
 
#define StatusInfo0 StatusInfo.bw.bb1 /* Reverse bb0 & bb1 */
 
#define StatusInfo1 StatusInfo.bw.bb0
 
 
/* Private macro -------------------------------------------------------------*/
 
/* Private variables ---------------------------------------------------------*/
 
uint16_t_uint8_t StatusInfo;
 
 
bool Data_Mul_MaxPacketSize = FALSE;
 
/* Private function prototypes -----------------------------------------------*/
 
static void DataStageOut(void);
 
static void DataStageIn(void);
 
static void NoData_Setup0(void);
 
static void Data_Setup0(void);
 
/* Private functions ---------------------------------------------------------*/
 
 
/*******************************************************************************
 
* Function Name  : Standard_GetConfiguration.
 
* Description    : Return the current configuration variable address.
 
* Input          : Length - How many bytes are needed.
 
* Output         : None.
 
* Return         : Return 1 , if the request is invalid when "Length" is 0.
 
*                  Return "Buffer" if the "Length" is not 0.
 
*******************************************************************************/
 
uint8_t *Standard_GetConfiguration(uint16_t Length)
 
{
 
  if (Length == 0)
 
  {
 
    pInformation->Ctrl_Info.Usb_wLength =
 
      sizeof(pInformation->Current_Configuration);
 
    return 0;
 
  }
 
  pUser_Standard_Requests->User_GetConfiguration();
 
  return (uint8_t *)&pInformation->Current_Configuration;
 
}
 
 
/*******************************************************************************
 
* Function Name  : Standard_SetConfiguration.
 
* Description    : This routine is called to set the configuration value
 
*                  Then each class should configure device itself.
 
* Input          : None.
 
* Output         : None.
 
* Return         : Return USB_SUCCESS, if the request is performed.
 
*                  Return USB_UNSUPPORT, if the request is invalid.
 
*******************************************************************************/
 
RESULT Standard_SetConfiguration(void)
 
{
 
 
  if ((pInformation->USBwValue0 <=
 
      Device_Table.Total_Configuration) && (pInformation->USBwValue1 == 0)
 
      && (pInformation->USBwIndex == 0)) /*call Back usb spec 2.0*/
 
  {
 
    pInformation->Current_Configuration = pInformation->USBwValue0;
 
    pUser_Standard_Requests->User_SetConfiguration();
 
    return USB_SUCCESS;
 
  }
 
  else
 
  {
 
    return USB_UNSUPPORT;
 
  }
 
}
 
 
/*******************************************************************************
 
* Function Name  : Standard_GetInterface.
 
* Description    : Return the Alternate Setting of the current interface.
 
* Input          : Length - How many bytes are needed.
 
* Output         : None.
 
* Return         : Return 0, if the request is invalid when "Length" is 0.
 
*                  Return "Buffer" if the "Length" is not 0.
 
*******************************************************************************/
 
uint8_t *Standard_GetInterface(uint16_t Length)
 
{
 
  if (Length == 0)
 
  {
 
    pInformation->Ctrl_Info.Usb_wLength =
 
      sizeof(pInformation->Current_AlternateSetting);
 
    return 0;
 
  }
 
  pUser_Standard_Requests->User_GetInterface();
 
  return (uint8_t *)&pInformation->Current_AlternateSetting;
 
}
 
 
/*******************************************************************************
 
* Function Name  : Standard_SetInterface.
 
* Description    : This routine is called to set the interface.
 
*                  Then each class should configure the interface them self.
 
* Input          : None.
 
* Output         : None.
 
* Return         : - Return USB_SUCCESS, if the request is performed.
 
*                  - Return USB_UNSUPPORT, if the request is invalid.
 
*******************************************************************************/
 
RESULT Standard_SetInterface(void)
 
{
 
  RESULT Re;
 
  /*Test if the specified Interface and Alternate Setting are supported by
 
    the application Firmware*/
 
  Re = (*pProperty->Class_Get_Interface_Setting)(pInformation->USBwIndex0, pInformation->USBwValue0);
 
 
  if (pInformation->Current_Configuration != 0)
 
  {
 
    if ((Re != USB_SUCCESS) || (pInformation->USBwIndex1 != 0)
 
        || (pInformation->USBwValue1 != 0))
 
    {
 
      return  USB_UNSUPPORT;
 
    }
 
    else if (Re == USB_SUCCESS)
 
    {
 
      pUser_Standard_Requests->User_SetInterface();
 
      pInformation->Current_Interface = pInformation->USBwIndex0;
 
      pInformation->Current_AlternateSetting = pInformation->USBwValue0;
 
      return USB_SUCCESS;
 
    }
 
 
  }
 
 
  return USB_UNSUPPORT;
 
}
 
 
/*******************************************************************************
 
* Function Name  : Standard_GetStatus.
 
* Description    : Copy the device request data to "StatusInfo buffer".
 
* Input          : - Length - How many bytes are needed.
 
* Output         : None.
 
* Return         : Return 0, if the request is at end of data block,
 
*                  or is invalid when "Length" is 0.
 
*******************************************************************************/
 
uint8_t *Standard_GetStatus(uint16_t Length)
 
{
 
  if (Length == 0)
 
  {
 
    pInformation->Ctrl_Info.Usb_wLength = 2;
 
    return 0;
 
  }
 
 
  /* Reset Status Information */
 
  StatusInfo.w = 0;
 
 
  if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT))
 
  {
 
    /*Get Device Status */
 
    uint8_t Feature = pInformation->Current_Feature;
 
 
    /* Remote Wakeup enabled */
 
    if (ValBit(Feature, 5))
 
    {
 
      SetBit(StatusInfo0, 1);
 
    }
 
    else
 
    {
 
      ClrBit(StatusInfo0, 1);
 
    }      
 
 
    /* Bus-powered */
 
    if (ValBit(Feature, 6))
 
    {
 
      SetBit(StatusInfo0, 0);
 
    }
 
    else /* Self-powered */
 
    {
 
      ClrBit(StatusInfo0, 0);
 
    }
 
  }
 
  /*Interface Status*/
 
  else if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT))
 
  {
 
    return (uint8_t *)&StatusInfo;
 
  }
 
  /*Get EndPoint Status*/
 
  else if (Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT))
 
  {
 
    uint8_t Related_Endpoint;
 
    uint8_t wIndex0 = pInformation->USBwIndex0;
 
 
    Related_Endpoint = (wIndex0 & 0x0f);
 
    if (ValBit(wIndex0, 7))
 
    {
 
      /* IN endpoint */
 
      if (_GetTxStallStatus(Related_Endpoint))
 
      {
 
        SetBit(StatusInfo0, 0); /* IN Endpoint stalled */
 
      }
 
    }
 
    else
 
    {
 
      /* OUT endpoint */
 
      if (_GetRxStallStatus(Related_Endpoint))
 
      {
 
        SetBit(StatusInfo0, 0); /* OUT Endpoint stalled */
 
      }
 
    }
 
 
  }
 
  else
 
  {
 
    return NULL;
 
  }
 
  pUser_Standard_Requests->User_GetStatus();
 
  return (uint8_t *)&StatusInfo;
 
}
 
 
/*******************************************************************************
 
* Function Name  : Standard_ClearFeature.
 
* Description    : Clear or disable a specific feature.
 
* Input          : None.
 
* Output         : None.
 
* Return         : - Return USB_SUCCESS, if the request is performed.
 
*                  - Return USB_UNSUPPORT, if the request is invalid.
 
*******************************************************************************/
 
RESULT Standard_ClearFeature(void)
 
{
 
  uint32_t     Type_Rec = Type_Recipient;
 
  uint32_t     Status;
 
 
 
  if (Type_Rec == (STANDARD_REQUEST | DEVICE_RECIPIENT))
 
  {/*Device Clear Feature*/
 
    ClrBit(pInformation->Current_Feature, 5);
 
    return USB_SUCCESS;
 
  }
 
  else if (Type_Rec == (STANDARD_REQUEST | ENDPOINT_RECIPIENT))
 
  {/*EndPoint Clear Feature*/
 
    DEVICE* pDev;
 
    uint32_t Related_Endpoint;
 
    uint32_t wIndex0;
 
    uint32_t rEP;
 
 
    if ((pInformation->USBwValue != ENDPOINT_STALL)
 
        || (pInformation->USBwIndex1 != 0))
 
    {
 
      return USB_UNSUPPORT;
 
    }
 
 
    pDev = &Device_Table;
 
    wIndex0 = pInformation->USBwIndex0;
 
    rEP = wIndex0 & ~0x80;
 
    Related_Endpoint = ENDP0 + rEP;
 
 
    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 ((rEP >= pDev->Total_Endpoint) || (Status == 0)
 
        || (pInformation->Current_Configuration == 0))
 
    {
 
      return USB_UNSUPPORT;
 
    }
 
 
 
    if (wIndex0 & 0x80)
 
    {
 
      /* IN endpoint */
 
      if (_GetTxStallStatus(Related_Endpoint ))
 
      {
 
        ClearDTOG_TX(Related_Endpoint);
 
        SetEPTxStatus(Related_Endpoint, EP_TX_VALID);
 
      }
 
    }
 
    else
 
    {
 
      /* OUT endpoint */
 
      if (_GetRxStallStatus(Related_Endpoint))
 
      {
 
        if (Related_Endpoint == ENDP0)
 
        {
 
          /* After clear the STALL, enable the default endpoint receiver */
 
          SetEPRxCount(Related_Endpoint, Device_Property.MaxPacketSize);
 
          _SetEPRxStatus(Related_Endpoint, EP_RX_VALID);
 
        }
 
        else
 
        {
 
          ClearDTOG_RX(Related_Endpoint);
 
          _SetEPRxStatus(Related_Endpoint, EP_RX_VALID);
 
        }
 
      }
 
    }
 
    pUser_Standard_Requests->User_ClearFeature();
 
    return USB_SUCCESS;
 
  }
 
 
  return USB_UNSUPPORT;
 
}
 
 
/*******************************************************************************
 
* Function Name  : Standard_SetEndPointFeature
 
* Description    : Set or enable a specific feature of EndPoint
 
* Input          : None.
 
* Output         : None.
 
* Return         : - Return USB_SUCCESS, if the request is performed.
 
*                  - Return USB_UNSUPPORT, if the request is invalid.
 
*******************************************************************************/
 
RESULT Standard_SetEndPointFeature(void)
 
{
 
  uint32_t    wIndex0;
 
  uint32_t    Related_Endpoint;
 
  uint32_t    rEP;
 
  uint32_t    Status;
 
 
  wIndex0 = pInformation->USBwIndex0;
 
  rEP = wIndex0 & ~0x80;
 
  Related_Endpoint = ENDP0 + rEP;
 
 
  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
 
      || pInformation->USBwValue != 0 || Status == 0
 
      || pInformation->Current_Configuration == 0)
 
  {
 
    return USB_UNSUPPORT;
 
  }
 
  else
 
  {
 
    if (wIndex0 & 0x80)
 
    {
 
      /* IN endpoint */
 
      _SetEPTxStatus(Related_Endpoint, EP_TX_STALL);
 
    }
 
 
    else
 
    {
 
      /* OUT endpoint */
 
      _SetEPRxStatus(Related_Endpoint, EP_RX_STALL);
 
    }
 
  }
 
  pUser_Standard_Requests->User_SetEndPointFeature();
 
  return USB_SUCCESS;
 
}
 
 
/*******************************************************************************
 
* Function Name  : Standard_SetDeviceFeature.
 
* Description    : Set or enable a specific feature of Device.
 
* Input          : None.
 
* Output         : None.
 
* Return         : - Return USB_SUCCESS, if the request is performed.
 
*                  - Return USB_UNSUPPORT, if the request is invalid.
 
*******************************************************************************/
 
RESULT Standard_SetDeviceFeature(void)
 
{
 
  SetBit(pInformation->Current_Feature, 5);
 
  pUser_Standard_Requests->User_SetDeviceFeature();
 
  return USB_SUCCESS;
 
}
 
 
/*******************************************************************************
 
* Function Name  : Standard_GetDescriptorData.
 
* Description    : Standard_GetDescriptorData is used for descriptors transfer.
 
*                : This routine is used for the descriptors resident in Flash
 
*                  or RAM
 
*                  pDesc can be in either Flash or RAM
 
*                  The purpose of this routine is to have a versatile way to
 
*                  response descriptors request. It allows user to generate
 
*                  certain descriptors with software or read descriptors from
 
*                  external storage part by part.
 
* Input          : - Length - Length of the data in this transfer.
 
*                  - pDesc - A pointer points to descriptor struct.
 
*                  The structure gives the initial address of the descriptor and
 
*                  its original size.
 
* Output         : None.
 
* Return         : Address of a part of the descriptor pointed by the Usb_
 
*                  wOffset The buffer pointed by this address contains at least
 
*                  Length bytes.
 
*******************************************************************************/
 
uint8_t *Standard_GetDescriptorData(uint16_t Length, ONE_DESCRIPTOR *pDesc)
 
{
 
  uint32_t  wOffset;
 
 
  wOffset = pInformation->Ctrl_Info.Usb_wOffset;
 
  if (Length == 0)
 
  {
 
    pInformation->Ctrl_Info.Usb_wLength = pDesc->Descriptor_Size - wOffset;
 
    return 0;
 
  }
 
 
  return pDesc->Descriptor + wOffset;
 
}
 
 
/*******************************************************************************
 
* Function Name  : DataStageOut.
 
* Description    : Data stage of a Control Write Transfer.
 
* Input          : None.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void DataStageOut(void)
 
{
 
  ENDPOINT_INFO *pEPinfo = &pInformation->Ctrl_Info;
 
  uint32_t save_rLength;
 
 
  save_rLength = pEPinfo->Usb_rLength;
 
 
  if (pEPinfo->CopyData && save_rLength)
 
  {
 
    uint8_t *Buffer;
 
    uint32_t Length;
 
 
    Length = pEPinfo->PacketSize;
 
    if (Length > save_rLength)
 
    {
 
      Length = save_rLength;
 
    }
 
 
    Buffer = (*pEPinfo->CopyData)(Length);
 
    pEPinfo->Usb_rLength -= Length;
 
    pEPinfo->Usb_rOffset += Length;
 
    PMAToUserBufferCopy(Buffer, GetEPRxAddr(ENDP0), Length);
 
 
  }
 
 
  if (pEPinfo->Usb_rLength != 0)
 
  {
 
    vSetEPRxStatus(EP_RX_VALID);/* re-enable for next data reception */
 
    SetEPTxCount(ENDP0, 0);
 
    vSetEPTxStatus(EP_TX_VALID);/* Expect the host to abort the data OUT stage */
 
  }
 
  /* Set the next State*/
 
  if (pEPinfo->Usb_rLength >= pEPinfo->PacketSize)
 
  {
 
    pInformation->ControlState = OUT_DATA;
 
  }
 
  else
 
  {
 
    if (pEPinfo->Usb_rLength > 0)
 
    {
 
      pInformation->ControlState = LAST_OUT_DATA;
 
    }
 
    else if (pEPinfo->Usb_rLength == 0)
 
    {
 
      pInformation->ControlState = WAIT_STATUS_IN;
 
      USB_StatusIn();
 
    }
 
  }
 
}
 
 
/*******************************************************************************
 
* Function Name  : DataStageIn.
 
* Description    : Data stage of a Control Read Transfer.
 
* Input          : None.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void DataStageIn(void)
 
{
 
  ENDPOINT_INFO *pEPinfo = &pInformation->Ctrl_Info;
 
  uint32_t save_wLength = pEPinfo->Usb_wLength;
 
  uint32_t ControlState = pInformation->ControlState;
 
 
  uint8_t *DataBuffer;
 
  uint32_t Length;
 
 
  if ((save_wLength == 0) && (ControlState == LAST_IN_DATA))
 
  {
 
    if(Data_Mul_MaxPacketSize == TRUE)
 
    {
 
      /* No more data to send and empty packet */
 
      Send0LengthData();
 
      ControlState = LAST_IN_DATA;
 
      Data_Mul_MaxPacketSize = FALSE;
 
    }
 
    else 
 
    {
 
      /* No more data to send so STALL the TX Status*/
 
      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;
 
  uint32_t RequestNo = pInformation->USBbRequest;
 
  uint32_t 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))
 
      {
 
        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)
 
{
 
  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)
 
      {
 
        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 */
 
    __IO uint32_t wLength = pInformation->USBwLength;
 
     
 
    /* Restrict the data length to be the one host asks for */
 
    if (pInformation->Ctrl_Info.Usb_wLength > wLength)
 
    {
 
      pInformation->Ctrl_Info.Usb_wLength = wLength;
 
    }
 
    
 
    else if (pInformation->Ctrl_Info.Usb_wLength < pInformation->USBwLength)
 
    {
 
      if (pInformation->Ctrl_Info.Usb_wLength < pProperty->MaxPacketSize)
 
      {
 
        Data_Mul_MaxPacketSize = FALSE;
 
      }
 
      else if ((pInformation->Ctrl_Info.Usb_wLength % pProperty->MaxPacketSize) == 0)
 
      {
 
        Data_Mul_MaxPacketSize = TRUE;
 
      }
 
    }   
 
 
    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.
 
*******************************************************************************/
 
uint8_t Setup0_Process(void)
 
{
 
 
  union
 
  {
 
    uint8_t* b;
 
    uint16_t* w;
 
  } pBuf;
 
  uint16_t offset = 1;
 
  
 
  pBuf.b = PMAAddr + (uint8_t *)(_GetEPRxAddr(ENDP0) * 2); /* *2 for 32 bits addr */
 
 
  if (pInformation->ControlState != PAUSE)
 
  {
 
    pInformation->USBbmRequestType = *pBuf.b++; /* bmRequestType */
 
    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();
 
}
 
 
/*******************************************************************************
 
* Function Name  : In0_Process
 
* Description    : Process the IN token on all default endpoint.
 
* Input          : None.
 
* Output         : None.
 
* Return         : Post0_Process.
 
*******************************************************************************/
 
uint8_t In0_Process(void)
 
{
 
  uint32_t 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.
 
*******************************************************************************/
 
uint8_t Out0_Process(void)
 
{
 
  uint32_t ControlState = pInformation->ControlState;
 
 
  if ((ControlState == IN_DATA) || (ControlState == LAST_IN_DATA))
 
  {
 
    /* host aborts the transfer before finish */
 
    ControlState = STALLED;
 
  }
 
  else 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;
 
  }
 
 
 
  /* 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.
 
*******************************************************************************/
 
uint8_t 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 address.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetDeviceAddress(uint8_t Val)
 
{
 
  uint32_t i;
 
  uint32_t nEP = Device_Table.Total_Endpoint;
 
 
  /* set address in every used endpoint */
 
  for (i = 0; i < nEP; i++)
 
  {
 
    _SetEPAddress((uint8_t)i, (uint8_t)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 STMicroelectronics *****END OF FILE****/
libraries/USB/usb_core.h
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_core.h
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    28-August-2012
 
  * @brief   Standard protocol processing functions prototypes
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
 
/* Define to prevent recursive inclusion -------------------------------------*/
 
#ifndef __USB_CORE_H
 
#define __USB_CORE_H
 
 
/* Includes ------------------------------------------------------------------*/
 
/* Exported types ------------------------------------------------------------*/
 
typedef enum _CONTROL_STATE
 
{
 
  WAIT_SETUP,       /* 0 */
 
  SETTING_UP,       /* 1 */
 
  IN_DATA,          /* 2 */
 
  OUT_DATA,         /* 3 */
 
  LAST_IN_DATA,     /* 4 */
 
  LAST_OUT_DATA,    /* 5 */
 
  WAIT_STATUS_IN,   /* 7 */
 
  WAIT_STATUS_OUT,  /* 8 */
 
  STALLED,          /* 9 */
 
  PAUSE             /* 10 */
 
} CONTROL_STATE;    /* The state machine states of a control pipe */
 
 
typedef struct OneDescriptor
 
{
 
  uint8_t *Descriptor;
 
  uint16_t Descriptor_Size;
 
}
 
ONE_DESCRIPTOR, *PONE_DESCRIPTOR;
 
/* All the request process routines return a value of this type
 
   If the return value is not SUCCESS or NOT_READY,
 
   the software will STALL the correspond endpoint */
 
typedef enum _RESULT
 
{
 
  USB_SUCCESS = 0,    /* Process successfully */
 
  USB_ERROR,
 
  USB_UNSUPPORT,
 
  USB_NOT_READY       /* The process has not been finished, endpoint will be
 
                         NAK to further request */
 
} RESULT;
 
 
 
/*-*-*-*-*-*-*-*-*-*-* Definitions for endpoint level -*-*-*-*-*-*-*-*-*-*-*-*/
 
typedef struct _ENDPOINT_INFO
 
{
 
  /* When send data out of the device,
 
   CopyData() is used to get data buffer 'Length' bytes data
 
   if Length is 0,
 
    CopyData() returns the total length of the data
 
    if the request is not supported, returns 0
 
    (NEW Feature )
 
     if CopyData() returns -1, the calling routine should not proceed
 
     further and will resume the SETUP process by the class device
 
   if Length is not 0,
 
    CopyData() returns a pointer to indicate the data location
 
   Usb_wLength is the data remain to be sent,
 
   Usb_wOffset is the Offset of original data
 
  When receive data from the host,
 
   CopyData() is used to get user data buffer which is capable
 
   of Length bytes data to copy data from the endpoint buffer.
 
   if Length is 0,
 
    CopyData() returns the available data length,
 
   if Length is not 0,
 
    CopyData() returns user buffer address
 
   Usb_rLength is the data remain to be received,
 
   Usb_rPointer is the Offset of data buffer
 
  */
 
  uint16_t  Usb_wLength;
 
  uint16_t  Usb_wOffset;
 
  uint16_t  PacketSize;
 
  uint8_t   *(*CopyData)(uint16_t Length);
 
}ENDPOINT_INFO;
 
 
/*-*-*-*-*-*-*-*-*-*-*-* Definitions for device level -*-*-*-*-*-*-*-*-*-*-*-*/
 
 
typedef struct _DEVICE
 
{
 
  uint8_t Total_Endpoint;     /* Number of endpoints that are used */
 
  uint8_t Total_Configuration;/* Number of configuration available */
 
}
 
DEVICE;
 
 
typedef union
 
{
 
  uint16_t w;
 
  struct BW
 
  {
 
    uint8_t bb1;
 
    uint8_t bb0;
 
  }
 
  bw;
 
} uint16_t_uint8_t;
 
 
typedef struct _DEVICE_INFO
 
{
 
  uint8_t USBbmRequestType;       /* bmRequestType */
 
  uint8_t USBbRequest;            /* bRequest */
 
  uint16_t_uint8_t USBwValues;         /* wValue */
 
  uint16_t_uint8_t USBwIndexs;         /* wIndex */
 
  uint16_t_uint8_t USBwLengths;        /* wLength */
 
 
  uint8_t ControlState;           /* of type CONTROL_STATE */
 
  uint8_t Current_Feature;
 
  uint8_t Current_Configuration;   /* Selected configuration */
 
  uint8_t Current_Interface;       /* Selected interface of current configuration */
 
  uint8_t Current_AlternateSetting;/* Selected Alternate Setting of current
 
                                     interface*/
 
 
  ENDPOINT_INFO Ctrl_Info;
 
}DEVICE_INFO;
 
 
typedef struct _DEVICE_PROP
 
{
 
  void (*Init)(void);        /* Initialize the device */
 
  void (*Reset)(void);       /* Reset routine of this device */
 
 
  /* Device dependent process after the status stage */
 
  void (*Process_Status_IN)(void);
 
  void (*Process_Status_OUT)(void);
 
 
  /* Procedure of process on setup stage of a class specified request with data stage */
 
  /* All class specified requests with data stage are processed in Class_Data_Setup
 
   Class_Data_Setup()
 
    responses to check all special requests and fills ENDPOINT_INFO
 
    according to the request
 
    If IN tokens are expected, then wLength & wOffset will be filled
 
    with the total transferring bytes and the starting position
 
    If OUT tokens are expected, then rLength & rOffset will be filled
 
    with the total expected bytes and the starting position in the buffer
 
 
    If the request is valid, Class_Data_Setup returns SUCCESS, else UNSUPPORT
 
 
   CAUTION:
 
    Since GET_CONFIGURATION & GET_INTERFACE are highly related to
 
    the individual classes, they will be checked and processed here.
 
  */
 
  RESULT (*Class_Data_Setup)(uint8_t RequestNo);
 
 
  /* Procedure of process on setup stage of a class specified request without data stage */
 
  /* All class specified requests without data stage are processed in Class_NoData_Setup
 
   Class_NoData_Setup
 
    responses to check all special requests and perform the request
 
 
   CAUTION:
 
    Since SET_CONFIGURATION & SET_INTERFACE are highly related to
 
    the individual classes, they will be checked and processed here.
 
  */
 
  RESULT (*Class_NoData_Setup)(uint8_t RequestNo);
 
 
  /*Class_Get_Interface_Setting
 
   This function is used by the file usb_core.c to test if the selected Interface
 
   and Alternate Setting (uint8_t Interface, uint8_t AlternateSetting) are supported by
 
   the application.
 
   This function is writing by user. It should return "SUCCESS" if the Interface
 
   and Alternate Setting are supported by the application or "UNSUPPORT" if they
 
   are not supported. */
 
 
  RESULT  (*Class_Get_Interface_Setting)(uint8_t Interface, uint8_t AlternateSetting);
 
 
  uint8_t* (*GetDeviceDescriptor)(uint16_t Length);
 
  uint8_t* (*GetConfigDescriptor)(uint16_t Length);
 
  uint8_t* (*GetStringDescriptor)(uint16_t Length);
 
 
  /* This field is not used in current library version. It is kept only for 
 
   compatibility with previous versions */
 
  void* RxEP_buffer;
 
   
 
  uint8_t MaxPacketSize;
 
 
}DEVICE_PROP;
 
 
typedef struct _USER_STANDARD_REQUESTS
 
{
 
  void (*User_GetConfiguration)(void);       /* Get Configuration */
 
  void (*User_SetConfiguration)(void);       /* Set Configuration */
 
  void (*User_GetInterface)(void);           /* Get Interface */
 
  void (*User_SetInterface)(void);           /* Set Interface */
 
  void (*User_GetStatus)(void);              /* Get Status */
 
  void (*User_ClearFeature)(void);           /* Clear Feature */
 
  void (*User_SetEndPointFeature)(void);     /* Set Endpoint Feature */
 
  void (*User_SetDeviceFeature)(void);       /* Set Device Feature */
 
  void (*User_SetDeviceAddress)(void);       /* Set Device Address */
 
}
 
USER_STANDARD_REQUESTS;
 
 
/* Exported constants --------------------------------------------------------*/
 
#define Type_Recipient (pInformation->USBbmRequestType & (REQUEST_TYPE | RECIPIENT))
 
 
#define Usb_rLength Usb_wLength
 
#define Usb_rOffset Usb_wOffset
 
 
#define USBwValue USBwValues.w
 
#define USBwValue0 USBwValues.bw.bb0
 
#define USBwValue1 USBwValues.bw.bb1
 
#define USBwIndex USBwIndexs.w
 
#define USBwIndex0 USBwIndexs.bw.bb0
 
#define USBwIndex1 USBwIndexs.bw.bb1
 
#define USBwLength USBwLengths.w
 
#define USBwLength0 USBwLengths.bw.bb0
 
#define USBwLength1 USBwLengths.bw.bb1
 
 
/* Exported macro ------------------------------------------------------------*/
 
/* Exported functions ------------------------------------------------------- */
 
uint8_t Setup0_Process(void);
 
uint8_t Post0_Process(void);
 
uint8_t Out0_Process(void);
 
uint8_t In0_Process(void);
 
 
RESULT Standard_SetEndPointFeature(void);
 
RESULT Standard_SetDeviceFeature(void);
 
 
uint8_t *Standard_GetConfiguration(uint16_t Length);
 
RESULT Standard_SetConfiguration(void);
 
uint8_t *Standard_GetInterface(uint16_t Length);
 
RESULT Standard_SetInterface(void);
 
uint8_t *Standard_GetDescriptorData(uint16_t Length, PONE_DESCRIPTOR pDesc);
 
 
uint8_t *Standard_GetStatus(uint16_t Length);
 
RESULT Standard_ClearFeature(void);
 
void SetDeviceAddress(uint8_t);
 
void NOP_Process(void);
 
 
extern DEVICE_PROP Device_Property;
 
extern  USER_STANDARD_REQUESTS User_Standard_Requests;
 
extern  DEVICE  Device_Table;
 
extern DEVICE_INFO Device_Info;
 
 
/* cells saving status during interrupt servicing */
 
extern __IO uint16_t SaveRState;
 
extern __IO uint16_t SaveTState;
 
 
#endif /* __USB_CORE_H */
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
libraries/USB/usb_def.h
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_def.h
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    28-August-2012
 
  * @brief   Definitions related to USB Core
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
/* Define to prevent recursive inclusion -------------------------------------*/
 
#ifndef __USB_DEF_H
 
#define __USB_DEF_H
 
 
/* Includes ------------------------------------------------------------------*/
 
/* Exported types ------------------------------------------------------------*/
 
typedef enum _RECIPIENT_TYPE
 
{
 
  DEVICE_RECIPIENT,     /* Recipient device */
 
  INTERFACE_RECIPIENT,  /* Recipient interface */
 
  ENDPOINT_RECIPIENT,   /* Recipient endpoint */
 
  OTHER_RECIPIENT
 
} RECIPIENT_TYPE;
 
 
 
typedef enum _STANDARD_REQUESTS
 
{
 
  GET_STATUS = 0,
 
  CLEAR_FEATURE,
 
  RESERVED1,
 
  SET_FEATURE,
 
  RESERVED2,
 
  SET_ADDRESS,
 
  GET_DESCRIPTOR,
 
  SET_DESCRIPTOR,
 
  GET_CONFIGURATION,
 
  SET_CONFIGURATION,
 
  GET_INTERFACE,
 
  SET_INTERFACE,
 
  TOTAL_sREQUEST,  /* Total number of Standard request */
 
  SYNCH_FRAME = 12
 
} STANDARD_REQUESTS;
 
 
/* Definition of "USBwValue" */
 
typedef enum _DESCRIPTOR_TYPE
 
{
 
  DEVICE_DESCRIPTOR = 1,
 
  CONFIG_DESCRIPTOR,
 
  STRING_DESCRIPTOR,
 
  INTERFACE_DESCRIPTOR,
 
  ENDPOINT_DESCRIPTOR
 
} DESCRIPTOR_TYPE;
 
 
/* Feature selector of a SET_FEATURE or CLEAR_FEATURE */
 
typedef enum _FEATURE_SELECTOR
 
{
 
  ENDPOINT_STALL,
 
  DEVICE_REMOTE_WAKEUP
 
} FEATURE_SELECTOR;
 
 
/* Exported constants --------------------------------------------------------*/
 
/* Definition of "USBbmRequestType" */
 
#define REQUEST_TYPE      0x60  /* Mask to get request type */
 
#define STANDARD_REQUEST  0x00  /* Standard request */
 
#define CLASS_REQUEST     0x20  /* Class request */
 
#define VENDOR_REQUEST    0x40  /* Vendor request */
 
 
#define RECIPIENT         0x1F  /* Mask to get recipient */
 
 
/* Exported macro ------------------------------------------------------------*/
 
/* Exported functions ------------------------------------------------------- */
 
 
#endif /* __USB_DEF_H */
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
libraries/USB/usb_init.c
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_init.c
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    28-August-2012
 
  * @brief   Initialization routines & global variables
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
 
/* Includes ------------------------------------------------------------------*/
 
#include "usb_lib.h"
 
 
/* Private typedef -----------------------------------------------------------*/
 
/* Private define ------------------------------------------------------------*/
 
/* Private macro -------------------------------------------------------------*/
 
/* Private variables ---------------------------------------------------------*/
 
/*  The number of current endpoint, it will be used to specify an endpoint */
 
 uint8_t	EPindex;
 
/*  The number of current device, it is an index to the Device_Table */
 
/* uint8_t	Device_no; */
 
/*  Points to the DEVICE_INFO structure of current device */
 
/*  The purpose of this register is to speed up the execution */
 
DEVICE_INFO *pInformation;
 
/*  Points to the DEVICE_PROP structure of current device */
 
/*  The purpose of this register is to speed up the execution */
 
DEVICE_PROP *pProperty;
 
/*  Temporary save the state of Rx & Tx status. */
 
/*  Whenever the Rx or Tx state is changed, its value is saved */
 
/*  in this variable first and will be set to the EPRB or EPRA */
 
/*  at the end of interrupt process */
 
uint16_t	SaveState ;
 
uint16_t  wInterrupt_Mask;
 
DEVICE_INFO	Device_Info;
 
USER_STANDARD_REQUESTS  *pUser_Standard_Requests;
 
 
/* Extern variables ----------------------------------------------------------*/
 
/* Private function prototypes -----------------------------------------------*/
 
/* Private functions ---------------------------------------------------------*/
 
 
/*******************************************************************************
 
* Function Name  : USB_Init
 
* Description    : USB system initialization
 
* Input          : None.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void USB_Init(void)
 
{
 
  pInformation = &Device_Info;
 
  pInformation->ControlState = 2;
 
  pProperty = &Device_Property;
 
  pUser_Standard_Requests = &User_Standard_Requests;
 
  /* Initialize devices one by one */
 
  pProperty->Init();
 
}
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
libraries/USB/usb_init.h
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_init.h
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    28-August-2012
 
  * @brief   Initialization routines & global variables
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
 
/* Define to prevent recursive inclusion -------------------------------------*/
 
#ifndef __USB_INIT_H
 
#define __USB_INIT_H
 
 
/* Includes ------------------------------------------------------------------*/
 
/* Exported types ------------------------------------------------------------*/
 
/* Exported constants --------------------------------------------------------*/
 
/* Exported macro ------------------------------------------------------------*/
 
/* Exported functions ------------------------------------------------------- */
 
void USB_Init(void);
 
 
/* External variables --------------------------------------------------------*/
 
/*  The number of current endpoint, it will be used to specify an endpoint */
 
extern uint8_t	EPindex;
 
/*  The number of current device, it is an index to the Device_Table */
 
/*extern uint8_t	Device_no; */
 
/*  Points to the DEVICE_INFO structure of current device */
 
/*  The purpose of this register is to speed up the execution */
 
extern DEVICE_INFO*	pInformation;
 
/*  Points to the DEVICE_PROP structure of current device */
 
/*  The purpose of this register is to speed up the execution */
 
extern DEVICE_PROP*	pProperty;
 
/*  Temporary save the state of Rx & Tx status. */
 
/*  Whenever the Rx or Tx state is changed, its value is saved */
 
/*  in this variable first and will be set to the EPRB or EPRA */
 
/*  at the end of interrupt process */
 
extern USER_STANDARD_REQUESTS *pUser_Standard_Requests;
 
 
extern uint16_t	SaveState ;
 
extern uint16_t wInterrupt_Mask;
 
 
#endif /* __USB_INIT_H */
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
libraries/USB/usb_int.c
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_int.c
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    28-August-2012
 
  * @brief   Endpoint CTR (Low and High) interrupt's service routines
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
/* Includes ------------------------------------------------------------------*/
 
#include "usb_lib.h"
 
 
/* Private typedef -----------------------------------------------------------*/
 
/* Private define ------------------------------------------------------------*/
 
/* Private macro -------------------------------------------------------------*/
 
/* Private variables ---------------------------------------------------------*/
 
__IO uint16_t SaveRState;
 
__IO uint16_t SaveTState;
 
 
/* Extern variables ----------------------------------------------------------*/
 
extern void (*pEpInt_IN[7])(void);    /*  Handles IN  interrupts   */
 
extern void (*pEpInt_OUT[7])(void);   /*  Handles OUT interrupts   */
 
 
/* Private function prototypes -----------------------------------------------*/
 
/* Private functions ---------------------------------------------------------*/
 
 
/*******************************************************************************
 
* Function Name  : CTR_LP.
 
* Description    : Low priority Endpoint Correct Transfer interrupt's service
 
*                  routine.
 
* Input          : None.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void CTR_LP(void)
 
{
 
  __IO uint16_t wEPVal = 0;
 
  /* stay in loop while pending interrupts */
 
  while (((wIstr = _GetISTR()) & ISTR_CTR) != 0)
 
  {
 
    /* extract highest priority endpoint number */
 
    EPindex = (uint8_t)(wIstr & ISTR_EP_ID);
 
    if (EPindex == 0)
 
    {
 
      /* Decode and service control endpoint interrupt */
 
      /* calling related service routine */
 
      /* (Setup0_Process, In0_Process, Out0_Process) */
 
 
      /* save RX & TX status */
 
      /* and set both to NAK */
 
      
 
	    SaveRState = _GetENDPOINT(ENDP0);
 
	    SaveTState = SaveRState & EPTX_STAT;
 
	    SaveRState &=  EPRX_STAT;	
 
 
	    _SetEPRxTxStatus(ENDP0,EP_RX_NAK,EP_TX_NAK);
 
 
      /* DIR bit = origin of the interrupt */
 
 
      if ((wIstr & ISTR_DIR) == 0)
 
      {
 
        /* DIR = 0 */
 
 
        /* DIR = 0      => IN  int */
 
        /* DIR = 0 implies that (EP_CTR_TX = 1) always  */
 
 
        _ClearEP_CTR_TX(ENDP0);
 
        In0_Process();
 
 
           /* before terminate set Tx & Rx status */
 
 
            _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState);
 
		  return;
 
      }
 
      else
 
      {
 
        /* DIR = 1 */
 
 
        /* DIR = 1 & CTR_RX       => SETUP or OUT int */
 
        /* DIR = 1 & (CTR_TX | CTR_RX) => 2 int pending */
 
 
        wEPVal = _GetENDPOINT(ENDP0);
 
        
 
        if ((wEPVal &EP_SETUP) != 0)
 
        {
 
          _ClearEP_CTR_RX(ENDP0); /* SETUP bit kept frozen while CTR_RX = 1 */
 
          Setup0_Process();
 
          /* before terminate set Tx & Rx status */
 
 
		      _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState);
 
          return;
 
        }
 
 
        else if ((wEPVal & EP_CTR_RX) != 0)
 
        {
 
          _ClearEP_CTR_RX(ENDP0);
 
          Out0_Process();
 
          /* before terminate set Tx & Rx status */
 
     
 
		     _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState);
 
          return;
 
        }
 
      }
 
    }/* if(EPindex == 0) */
 
    else
 
    {
 
      /* Decode and service non control endpoints interrupt  */
 
 
      /* process related endpoint register */
 
      wEPVal = _GetENDPOINT(EPindex);
 
      if ((wEPVal & EP_CTR_RX) != 0)
 
      {
 
        /* clear int flag */
 
        _ClearEP_CTR_RX(EPindex);
 
 
        /* call OUT service function */
 
        (*pEpInt_OUT[EPindex-1])();
 
 
      } /* if((wEPVal & EP_CTR_RX) */
 
 
      if ((wEPVal & EP_CTR_TX) != 0)
 
      {
 
        /* clear int flag */
 
        _ClearEP_CTR_TX(EPindex);
 
 
        /* call IN service function */
 
        (*pEpInt_IN[EPindex-1])();
 
      } /* if((wEPVal & EP_CTR_TX) != 0) */
 
 
    }/* if(EPindex == 0) else */
 
 
  }/* while(...) */
 
}
 
 
/*******************************************************************************
 
* Function Name  : CTR_HP.
 
* Description    : High Priority Endpoint Correct Transfer interrupt's service 
 
*                  routine.
 
* Input          : None.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void CTR_HP(void)
 
{
 
  uint32_t wEPVal = 0;
 
 
  while (((wIstr = _GetISTR()) & ISTR_CTR) != 0)
 
  {
 
    _SetISTR((uint16_t)CLR_CTR); /* clear CTR flag */
 
    /* extract highest priority endpoint number */
 
    EPindex = (uint8_t)(wIstr & ISTR_EP_ID);
 
    /* process related endpoint register */
 
    wEPVal = _GetENDPOINT(EPindex);
 
    if ((wEPVal & EP_CTR_RX) != 0)
 
    {
 
      /* clear int flag */
 
      _ClearEP_CTR_RX(EPindex);
 
 
      /* call OUT service function */
 
      (*pEpInt_OUT[EPindex-1])();
 
 
    } /* if((wEPVal & EP_CTR_RX) */
 
    else if ((wEPVal & EP_CTR_TX) != 0)
 
    {
 
      /* clear int flag */
 
      _ClearEP_CTR_TX(EPindex);
 
 
      /* call IN service function */
 
      (*pEpInt_IN[EPindex-1])();
 
 
 
    } /* if((wEPVal & EP_CTR_TX) != 0) */
 
 
  }/* while(...) */
 
}
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
libraries/USB/usb_int.h
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_int.h
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    28-August-2012
 
  * @brief   Endpoint CTR (Low and High) interrupt's service routines prototypes
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
 
/* Define to prevent recursive inclusion -------------------------------------*/
 
#ifndef __USB_INT_H
 
#define __USB_INT_H
 
 
/* Includes ------------------------------------------------------------------*/
 
/* Exported types ------------------------------------------------------------*/
 
/* Exported constants --------------------------------------------------------*/
 
/* Exported macro ------------------------------------------------------------*/
 
/* Exported functions ------------------------------------------------------- */
 
void CTR_LP(void);
 
void CTR_HP(void);
 
 
/* External variables --------------------------------------------------------*/
 
 
#endif /* __USB_INT_H */
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
libraries/USB/usb_lib.h
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_lib.h
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    28-August-2012
 
  * @brief   USB library include files
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
 
/* Define to prevent recursive inclusion -------------------------------------*/
 
#ifndef __USB_LIB_H
 
#define __USB_LIB_H
 
 
/* Includes ------------------------------------------------------------------*/
 
#include "hw_config.h"
 
#include "usb_type.h"
 
#include "usb_regs.h"
 
#include "usb_def.h"
 
#include "usb_core.h"
 
#include "usb_init.h"
 
#include "usb_sil.h"
 
#include "usb_mem.h"
 
#include "usb_int.h"
 
 
/* Exported types ------------------------------------------------------------*/
 
/* Exported constants --------------------------------------------------------*/
 
/* Exported macro ------------------------------------------------------------*/
 
/* Exported functions ------------------------------------------------------- */
 
/* External variables --------------------------------------------------------*/
 
 
#endif /* __USB_LIB_H */
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
libraries/USB/usb_mem.c
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_mem.c
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    28-August-2012
 
  * @brief   Utility functions for memory transfers to/from PMA
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
/* Includes ------------------------------------------------------------------*/
 
#include "usb_lib.h"
 
 
/* Private typedef -----------------------------------------------------------*/
 
/* Private define ------------------------------------------------------------*/
 
/* Private macro -------------------------------------------------------------*/
 
/* Private variables ---------------------------------------------------------*/
 
/* Extern variables ----------------------------------------------------------*/
 
/* Private function prototypes -----------------------------------------------*/
 
/* Private functions ---------------------------------------------------------*/
 
 
/*******************************************************************************
 
* Function Name  : UserToPMABufferCopy
 
* Description    : Copy a buffer from user memory area to packet memory area (PMA)
 
* Input          : - pbUsrBuf: pointer to user memory area.
 
*                  - wPMABufAddr: address into PMA.
 
*                  - wNBytes: no. of bytes to be copied.
 
* Output         : None.
 
* Return         : None	.
 
*******************************************************************************/
 
void UserToPMABufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes)
 
{
 
  uint32_t n = (wNBytes + 1) >> 1;   /* n = (wNBytes + 1) / 2 */
 
  uint32_t i, temp1, temp2;
 
  uint16_t *pdwVal;
 
  pdwVal = (uint16_t *)(wPMABufAddr * 2 + PMAAddr);
 
  for (i = n; i != 0; i--)
 
  {
 
    temp1 = (uint16_t) * pbUsrBuf;
 
    pbUsrBuf++;
 
    temp2 = temp1 | (uint16_t) * pbUsrBuf << 8;
 
    *pdwVal++ = temp2;
 
    pdwVal++;
 
    pbUsrBuf++;
 
  }
 
}
 
 
/*******************************************************************************
 
* Function Name  : PMAToUserBufferCopy
 
* Description    : Copy a buffer from user memory area to packet memory area (PMA)
 
* Input          : - pbUsrBuf    = pointer to user memory area.
 
*                  - wPMABufAddr = address into PMA.
 
*                  - wNBytes     = no. of bytes to be copied.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void PMAToUserBufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes)
 
{
 
  uint32_t n = (wNBytes + 1) >> 1;/* /2*/
 
  uint32_t i;
 
  uint32_t *pdwVal;
 
  pdwVal = (uint32_t *)(wPMABufAddr * 2 + PMAAddr);
 
  for (i = n; i != 0; i--)
 
  {
 
    *(uint16_t*)pbUsrBuf++ = *pdwVal++;
 
    pbUsrBuf++;
 
  }
 
}
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
libraries/USB/usb_mem.h
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_mem.h
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    28-August-2012
 
  * @brief   Utility prototypes functions for memory/PMA transfers
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
 
/* Define to prevent recursive inclusion -------------------------------------*/
 
#ifndef __USB_MEM_H
 
#define __USB_MEM_H
 
 
/* Includes ------------------------------------------------------------------*/
 
/* Exported types ------------------------------------------------------------*/
 
/* Exported constants --------------------------------------------------------*/
 
/* Exported macro ------------------------------------------------------------*/
 
/* Exported functions ------------------------------------------------------- */
 
void UserToPMABufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes);
 
void PMAToUserBufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes);
 
 
/* External variables --------------------------------------------------------*/
 
 
#endif  /*__USB_MEM_H*/
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
libraries/USB/usb_regs.c
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_regs.c
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    28-August-2012
 
  * @brief   Interface functions to USB cell registers
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
/* Includes ------------------------------------------------------------------*/
 
#include "usb_lib.h"
 
 
/* Private typedef -----------------------------------------------------------*/
 
/* Private define ------------------------------------------------------------*/
 
/* Private macro -------------------------------------------------------------*/
 
/* Private variables ---------------------------------------------------------*/
 
/* Extern variables ----------------------------------------------------------*/
 
/* Private function prototypes -----------------------------------------------*/
 
/* Private functions ---------------------------------------------------------*/
 
 
/*******************************************************************************
 
* Function Name  : SetCNTR.
 
* Description    : Set the CNTR register value.
 
* Input          : wRegValue: new register value.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetCNTR(uint16_t wRegValue)
 
{
 
  _SetCNTR(wRegValue);
 
}
 
 
/*******************************************************************************
 
* Function Name  : GetCNTR.
 
* Description    : returns the CNTR register value.
 
* Input          : None.
 
* Output         : None.
 
* Return         : CNTR register Value.
 
*******************************************************************************/
 
uint16_t GetCNTR(void)
 
{
 
  return(_GetCNTR());
 
}
 
 
/*******************************************************************************
 
* Function Name  : SetISTR.
 
* Description    : Set the ISTR register value.
 
* Input          : wRegValue: new register value.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetISTR(uint16_t wRegValue)
 
{
 
  _SetISTR(wRegValue);
 
}
 
 
/*******************************************************************************
 
* Function Name  : GetISTR
 
* Description    : Returns the ISTR register value.
 
* Input          : None.
 
* Output         : None.
 
* Return         : ISTR register Value
 
*******************************************************************************/
 
uint16_t GetISTR(void)
 
{
 
  return(_GetISTR());
 
}
 
 
/*******************************************************************************
 
* Function Name  : GetFNR
 
* Description    : Returns the FNR register value.
 
* Input          : None.
 
* Output         : None.
 
* Return         : FNR register Value
 
*******************************************************************************/
 
uint16_t GetFNR(void)
 
{
 
  return(_GetFNR());
 
}
 
 
/*******************************************************************************
 
* Function Name  : SetDADDR
 
* Description    : Set the DADDR register value.
 
* Input          : wRegValue: new register value.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetDADDR(uint16_t wRegValue)
 
{
 
  _SetDADDR(wRegValue);
 
}
 
 
/*******************************************************************************
 
* Function Name  : GetDADDR
 
* Description    : Returns the DADDR register value.
 
* Input          : None.
 
* Output         : None.
 
* Return         : DADDR register Value
 
*******************************************************************************/
 
uint16_t GetDADDR(void)
 
{
 
  return(_GetDADDR());
 
}
 
 
/*******************************************************************************
 
* Function Name  : SetBTABLE
 
* Description    : Set the BTABLE.
 
* Input          : wRegValue: New register value.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetBTABLE(uint16_t wRegValue)
 
{
 
  _SetBTABLE(wRegValue);
 
}
 
 
/*******************************************************************************
 
* Function Name  : GetBTABLE.
 
* Description    : Returns the BTABLE register value.
 
* Input          : None. 
 
* Output         : None.
 
* Return         : BTABLE address.
 
*******************************************************************************/
 
uint16_t GetBTABLE(void)
 
{
 
  return(_GetBTABLE());
 
}
 
 
/*******************************************************************************
 
* Function Name  : SetENDPOINT
 
* Description    : Set the Endpoint register value.
 
* Input          : bEpNum: Endpoint Number. 
 
*                  wRegValue.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetENDPOINT(uint8_t bEpNum, uint16_t wRegValue)
 
{
 
  _SetENDPOINT(bEpNum, wRegValue);
 
}
 
 
/*******************************************************************************
 
* Function Name  : GetENDPOINT
 
* Description    : Return the Endpoint register value.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : Endpoint register value.
 
*******************************************************************************/
 
uint16_t GetENDPOINT(uint8_t bEpNum)
 
{
 
  return(_GetENDPOINT(bEpNum));
 
}
 
 
/*******************************************************************************
 
* Function Name  : SetEPType
 
* Description    : sets the type in the endpoint register.
 
* Input          : bEpNum: Endpoint Number. 
 
*                  wType: type definition.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetEPType(uint8_t bEpNum, uint16_t wType)
 
{
 
  _SetEPType(bEpNum, wType);
 
}
 
 
/*******************************************************************************
 
* Function Name  : GetEPType
 
* Description    : Returns the endpoint type.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : Endpoint Type
 
*******************************************************************************/
 
uint16_t GetEPType(uint8_t bEpNum)
 
{
 
  return(_GetEPType(bEpNum));
 
}
 
 
/*******************************************************************************
 
* Function Name  : SetEPTxStatus
 
* Description    : Set the status of Tx endpoint.
 
* Input          : bEpNum: Endpoint Number. 
 
*                  wState: new state.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetEPTxStatus(uint8_t bEpNum, uint16_t wState)
 
{
 
  _SetEPTxStatus(bEpNum, wState);
 
}
 
 
/*******************************************************************************
 
* Function Name  : SetEPRxStatus
 
* Description    : Set the status of Rx endpoint.
 
* Input          : bEpNum: Endpoint Number. 
 
*                  wState: new state.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetEPRxStatus(uint8_t bEpNum, uint16_t wState)
 
{
 
  _SetEPRxStatus(bEpNum, wState);
 
}
 
 
/*******************************************************************************
 
* Function Name  : SetDouBleBuffEPStall
 
* Description    : sets the status for Double Buffer Endpoint to STALL
 
* Input          : bEpNum: Endpoint Number. 
 
*                  bDir: Endpoint direction.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetDouBleBuffEPStall(uint8_t bEpNum, uint8_t bDir)
 
{
 
  uint16_t Endpoint_DTOG_Status;
 
  Endpoint_DTOG_Status = GetENDPOINT(bEpNum);
 
  if (bDir == EP_DBUF_OUT)
 
  { /* OUT double buffered endpoint */
 
    _SetENDPOINT(bEpNum, Endpoint_DTOG_Status & ~EPRX_DTOG1);
 
  }
 
  else if (bDir == EP_DBUF_IN)
 
  { /* IN double buffered endpoint */
 
    _SetENDPOINT(bEpNum, Endpoint_DTOG_Status & ~EPTX_DTOG1);
 
  }
 
}
 
 
/*******************************************************************************
 
* Function Name  : GetEPTxStatus
 
* Description    : Returns the endpoint Tx status.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : Endpoint TX Status
 
*******************************************************************************/
 
uint16_t GetEPTxStatus(uint8_t bEpNum)
 
{
 
  return(_GetEPTxStatus(bEpNum));
 
}
 
 
/*******************************************************************************
 
* Function Name  : GetEPRxStatus
 
* Description    : Returns the endpoint Rx status.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : Endpoint RX Status
 
*******************************************************************************/
 
uint16_t GetEPRxStatus(uint8_t bEpNum)
 
{
 
  return(_GetEPRxStatus(bEpNum));
 
}
 
 
/*******************************************************************************
 
* Function Name  : SetEPTxValid
 
* Description    : Valid the endpoint Tx Status.
 
* Input          : bEpNum: Endpoint Number.  
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetEPTxValid(uint8_t bEpNum)
 
{
 
  _SetEPTxStatus(bEpNum, EP_TX_VALID);
 
}
 
 
/*******************************************************************************
 
* Function Name  : SetEPRxValid
 
* Description    : Valid the endpoint Rx Status.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetEPRxValid(uint8_t bEpNum)
 
{
 
  _SetEPRxStatus(bEpNum, EP_RX_VALID);
 
}
 
 
/*******************************************************************************
 
* Function Name  : SetEP_KIND
 
* Description    : Clear the EP_KIND bit.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetEP_KIND(uint8_t bEpNum)
 
{
 
  _SetEP_KIND(bEpNum);
 
}
 
 
/*******************************************************************************
 
* Function Name  : ClearEP_KIND
 
* Description    : set the  EP_KIND bit.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void ClearEP_KIND(uint8_t bEpNum)
 
{
 
  _ClearEP_KIND(bEpNum);
 
}
 
/*******************************************************************************
 
* Function Name  : Clear_Status_Out
 
* Description    : Clear the Status Out of the related Endpoint
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void Clear_Status_Out(uint8_t bEpNum)
 
{
 
  _ClearEP_KIND(bEpNum);
 
}
 
/*******************************************************************************
 
* Function Name  : Set_Status_Out
 
* Description    : Set the Status Out of the related Endpoint
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void Set_Status_Out(uint8_t bEpNum)
 
{
 
  _SetEP_KIND(bEpNum);
 
}
 
/*******************************************************************************
 
* Function Name  : SetEPDoubleBuff
 
* Description    : Enable the double buffer feature for the endpoint. 
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetEPDoubleBuff(uint8_t bEpNum)
 
{
 
  _SetEP_KIND(bEpNum);
 
}
 
/*******************************************************************************
 
* Function Name  : ClearEPDoubleBuff
 
* Description    : Disable the double buffer feature for the endpoint. 
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void ClearEPDoubleBuff(uint8_t bEpNum)
 
{
 
  _ClearEP_KIND(bEpNum);
 
}
 
/*******************************************************************************
 
* Function Name  : GetTxStallStatus
 
* Description    : Returns the Stall status of the Tx endpoint.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : Tx Stall status.
 
*******************************************************************************/
 
uint16_t GetTxStallStatus(uint8_t bEpNum)
 
{
 
  return(_GetTxStallStatus(bEpNum));
 
}
 
/*******************************************************************************
 
* Function Name  : GetRxStallStatus
 
* Description    : Returns the Stall status of the Rx endpoint. 
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : Rx Stall status.
 
*******************************************************************************/
 
uint16_t GetRxStallStatus(uint8_t bEpNum)
 
{
 
  return(_GetRxStallStatus(bEpNum));
 
}
 
/*******************************************************************************
 
* Function Name  : ClearEP_CTR_RX
 
* Description    : Clear the CTR_RX bit.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void ClearEP_CTR_RX(uint8_t bEpNum)
 
{
 
  _ClearEP_CTR_RX(bEpNum);
 
}
 
/*******************************************************************************
 
* Function Name  : ClearEP_CTR_TX
 
* Description    : Clear the CTR_TX bit.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void ClearEP_CTR_TX(uint8_t bEpNum)
 
{
 
  _ClearEP_CTR_TX(bEpNum);
 
}
 
/*******************************************************************************
 
* Function Name  : ToggleDTOG_RX
 
* Description    : Toggle the DTOG_RX bit.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void ToggleDTOG_RX(uint8_t bEpNum)
 
{
 
  _ToggleDTOG_RX(bEpNum);
 
}
 
/*******************************************************************************
 
* Function Name  : ToggleDTOG_TX
 
* Description    : Toggle the DTOG_TX bit.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void ToggleDTOG_TX(uint8_t bEpNum)
 
{
 
  _ToggleDTOG_TX(bEpNum);
 
}
 
/*******************************************************************************
 
* Function Name  : ClearDTOG_RX.
 
* Description    : Clear the DTOG_RX bit.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void ClearDTOG_RX(uint8_t bEpNum)
 
{
 
  _ClearDTOG_RX(bEpNum);
 
}
 
/*******************************************************************************
 
* Function Name  : ClearDTOG_TX.
 
* Description    : Clear the DTOG_TX bit.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void ClearDTOG_TX(uint8_t bEpNum)
 
{
 
  _ClearDTOG_TX(bEpNum);
 
}
 
/*******************************************************************************
 
* Function Name  : SetEPAddress
 
* Description    : Set the endpoint address.
 
* Input          : bEpNum: Endpoint Number.
 
*                  bAddr: New endpoint address.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetEPAddress(uint8_t bEpNum, uint8_t bAddr)
 
{
 
  _SetEPAddress(bEpNum, bAddr);
 
}
 
/*******************************************************************************
 
* Function Name  : GetEPAddress
 
* Description    : Get the endpoint address.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : Endpoint address.
 
*******************************************************************************/
 
uint8_t GetEPAddress(uint8_t bEpNum)
 
{
 
  return(_GetEPAddress(bEpNum));
 
}
 
/*******************************************************************************
 
* Function Name  : SetEPTxAddr
 
* Description    : Set the endpoint Tx buffer address.
 
* Input          : bEpNum: Endpoint Number.
 
*                  wAddr: new address. 
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetEPTxAddr(uint8_t bEpNum, uint16_t wAddr)
 
{
 
  _SetEPTxAddr(bEpNum, wAddr);
 
}
 
/*******************************************************************************
 
* Function Name  : SetEPRxAddr
 
* Description    : Set the endpoint Rx buffer address.
 
* Input          : bEpNum: Endpoint Number.
 
*                  wAddr: new address.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetEPRxAddr(uint8_t bEpNum, uint16_t wAddr)
 
{
 
  _SetEPRxAddr(bEpNum, wAddr);
 
}
 
/*******************************************************************************
 
* Function Name  : GetEPTxAddr
 
* Description    : Returns the endpoint Tx buffer address.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : Rx buffer address. 
 
*******************************************************************************/
 
uint16_t GetEPTxAddr(uint8_t bEpNum)
 
{
 
  return(_GetEPTxAddr(bEpNum));
 
}
 
/*******************************************************************************
 
* Function Name  : GetEPRxAddr.
 
* Description    : Returns the endpoint Rx buffer address.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : Rx buffer address.
 
*******************************************************************************/
 
uint16_t GetEPRxAddr(uint8_t bEpNum)
 
{
 
  return(_GetEPRxAddr(bEpNum));
 
}
 
/*******************************************************************************
 
* Function Name  : SetEPTxCount.
 
* Description    : Set the Tx count.
 
* Input          : bEpNum: Endpoint Number.
 
*                  wCount: new count value.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetEPTxCount(uint8_t bEpNum, uint16_t wCount)
 
{
 
  _SetEPTxCount(bEpNum, wCount);
 
}
 
/*******************************************************************************
 
* Function Name  : SetEPCountRxReg.
 
* Description    : Set the Count Rx Register value.
 
* Input          : *pdwReg: point to the register.
 
*                  wCount: the new register value.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetEPCountRxReg(uint32_t *pdwReg, uint16_t wCount)
 
{
 
  _SetEPCountRxReg(dwReg, wCount);
 
}
 
/*******************************************************************************
 
* Function Name  : SetEPRxCount
 
* Description    : Set the Rx count.
 
* Input          : bEpNum: Endpoint Number. 
 
*                  wCount: the new count value.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetEPRxCount(uint8_t bEpNum, uint16_t wCount)
 
{
 
  _SetEPRxCount(bEpNum, wCount);
 
}
 
/*******************************************************************************
 
* Function Name  : GetEPTxCount
 
* Description    : Get the Tx count.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None
 
* Return         : Tx count value.
 
*******************************************************************************/
 
uint16_t GetEPTxCount(uint8_t bEpNum)
 
{
 
  return(_GetEPTxCount(bEpNum));
 
}
 
/*******************************************************************************
 
* Function Name  : GetEPRxCount
 
* Description    : Get the Rx count.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : Rx count value.
 
*******************************************************************************/
 
uint16_t GetEPRxCount(uint8_t bEpNum)
 
{
 
  return(_GetEPRxCount(bEpNum));
 
}
 
/*******************************************************************************
 
* Function Name  : SetEPDblBuffAddr
 
* Description    : Set the addresses of the buffer 0 and 1.
 
* Input          : bEpNum: Endpoint Number.  
 
*                  wBuf0Addr: new address of buffer 0. 
 
*                  wBuf1Addr: new address of buffer 1.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetEPDblBuffAddr(uint8_t bEpNum, uint16_t wBuf0Addr, uint16_t wBuf1Addr)
 
{
 
  _SetEPDblBuffAddr(bEpNum, wBuf0Addr, wBuf1Addr);
 
}
 
/*******************************************************************************
 
* Function Name  : SetEPDblBuf0Addr
 
* Description    : Set the Buffer 1 address.
 
* Input          : bEpNum: Endpoint Number
 
*                  wBuf0Addr: new address.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetEPDblBuf0Addr(uint8_t bEpNum, uint16_t wBuf0Addr)
 
{
 
  _SetEPDblBuf0Addr(bEpNum, wBuf0Addr);
 
}
 
/*******************************************************************************
 
* Function Name  : SetEPDblBuf1Addr
 
* Description    : Set the Buffer 1 address.
 
* Input          : bEpNum: Endpoint Number
 
*                  wBuf1Addr: new address.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetEPDblBuf1Addr(uint8_t bEpNum, uint16_t wBuf1Addr)
 
{
 
  _SetEPDblBuf1Addr(bEpNum, wBuf1Addr);
 
}
 
/*******************************************************************************
 
* Function Name  : GetEPDblBuf0Addr
 
* Description    : Returns the address of the Buffer 0.
 
* Input          : bEpNum: Endpoint Number.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
uint16_t GetEPDblBuf0Addr(uint8_t bEpNum)
 
{
 
  return(_GetEPDblBuf0Addr(bEpNum));
 
}
 
/*******************************************************************************
 
* Function Name  : GetEPDblBuf1Addr
 
* Description    : Returns the address of the Buffer 1.
 
* Input          : bEpNum: Endpoint Number.
 
* Output         : None.
 
* Return         : Address of the Buffer 1.
 
*******************************************************************************/
 
uint16_t GetEPDblBuf1Addr(uint8_t bEpNum)
 
{
 
  return(_GetEPDblBuf1Addr(bEpNum));
 
}
 
/*******************************************************************************
 
* Function Name  : SetEPDblBuffCount
 
* Description    : Set the number of bytes for a double Buffer 
 
*                  endpoint.
 
* Input          : bEpNum,bDir, wCount
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetEPDblBuffCount(uint8_t bEpNum, uint8_t bDir, uint16_t wCount)
 
{
 
  _SetEPDblBuffCount(bEpNum, bDir, wCount);
 
}
 
/*******************************************************************************
 
* Function Name  : SetEPDblBuf0Count
 
* Description    : Set the number of bytes in the buffer 0 of a double Buffer 
 
*                  endpoint.
 
* Input          : bEpNum, bDir,  wCount
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetEPDblBuf0Count(uint8_t bEpNum, uint8_t bDir, uint16_t wCount)
 
{
 
  _SetEPDblBuf0Count(bEpNum, bDir, wCount);
 
}
 
/*******************************************************************************
 
* Function Name  : SetEPDblBuf1Count
 
* Description    : Set the number of bytes in the buffer 0 of a double Buffer 
 
*                  endpoint.
 
* Input          : bEpNum,  bDir,  wCount
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void SetEPDblBuf1Count(uint8_t bEpNum, uint8_t bDir, uint16_t wCount)
 
{
 
  _SetEPDblBuf1Count(bEpNum, bDir, wCount);
 
}
 
/*******************************************************************************
 
* Function Name  : GetEPDblBuf0Count
 
* Description    : Returns the number of byte received in the buffer 0 of a double
 
*                  Buffer endpoint.
 
* Input          : bEpNum: Endpoint Number.
 
* Output         : None.
 
* Return         : Endpoint Buffer 0 count
 
*******************************************************************************/
 
uint16_t GetEPDblBuf0Count(uint8_t bEpNum)
 
{
 
  return(_GetEPDblBuf0Count(bEpNum));
 
}
 
/*******************************************************************************
 
* Function Name  : GetEPDblBuf1Count
 
* Description    : Returns the number of data received in the buffer 1 of a double
 
*                  Buffer endpoint.
 
* Input          : bEpNum: Endpoint Number.
 
* Output         : None.
 
* Return         : Endpoint Buffer 1 count.
 
*******************************************************************************/
 
uint16_t GetEPDblBuf1Count(uint8_t bEpNum)
 
{
 
  return(_GetEPDblBuf1Count(bEpNum));
 
}
 
/*******************************************************************************
 
* Function Name  : GetEPDblBufDir
 
* Description    : gets direction of the double buffered endpoint
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : EP_DBUF_OUT, EP_DBUF_IN,
 
*                  EP_DBUF_ERR if the endpoint counter not yet programmed.
 
*******************************************************************************/
 
EP_DBUF_DIR GetEPDblBufDir(uint8_t bEpNum)
 
{
 
  if ((uint16_t)(*_pEPRxCount(bEpNum) & 0xFC00) != 0)
 
    return(EP_DBUF_OUT);
 
  else if (((uint16_t)(*_pEPTxCount(bEpNum)) & 0x03FF) != 0)
 
    return(EP_DBUF_IN);
 
  else
 
    return(EP_DBUF_ERR);
 
}
 
/*******************************************************************************
 
* Function Name  : FreeUserBuffer
 
* Description    : free buffer used from the application realizing it to the line
 
                   toggles bit SW_BUF in the double buffered endpoint register
 
* Input          : bEpNum, bDir
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void FreeUserBuffer(uint8_t bEpNum, uint8_t bDir)
 
{
 
  if (bDir == EP_DBUF_OUT)
 
  { /* OUT double buffered endpoint */
 
    _ToggleDTOG_TX(bEpNum);
 
  }
 
  else if (bDir == EP_DBUF_IN)
 
  { /* IN double buffered endpoint */
 
    _ToggleDTOG_RX(bEpNum);
 
  }
 
}
 
 
/*******************************************************************************
 
* Function Name  : ToWord
 
* Description    : merge two byte in a word.
 
* Input          : bh: byte high, bl: bytes low.
 
* Output         : None.
 
* Return         : resulted word.
 
*******************************************************************************/
 
uint16_t ToWord(uint8_t bh, uint8_t bl)
 
{
 
  uint16_t wRet;
 
  wRet = (uint16_t)bl | ((uint16_t)bh << 8);
 
  return(wRet);
 
}
 
/*******************************************************************************
 
* Function Name  : ByteSwap
 
* Description    : Swap two byte in a word.
 
* Input          : wSwW: word to Swap.
 
* Output         : None.
 
* Return         : resulted word.
 
*******************************************************************************/
 
uint16_t ByteSwap(uint16_t wSwW)
 
{
 
  uint8_t bTemp;
 
  uint16_t wRet;
 
  bTemp = (uint8_t)(wSwW & 0xff);
 
  wRet =  (wSwW >> 8) | ((uint16_t)bTemp << 8);
 
  return(wRet);
 
}
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
libraries/USB/usb_regs.h
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_regs.h
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    28-August-2012
 
  * @brief   Interface prototype functions to USB cell registers
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
 
/* Define to prevent recursive inclusion -------------------------------------*/
 
#ifndef __USB_REGS_H
 
#define __USB_REGS_H
 
 
/* Includes ------------------------------------------------------------------*/
 
/* Exported types ------------------------------------------------------------*/
 
typedef enum _EP_DBUF_DIR
 
{
 
  /* double buffered endpoint direction */
 
  EP_DBUF_ERR,
 
  EP_DBUF_OUT,
 
  EP_DBUF_IN
 
}EP_DBUF_DIR;
 
 
/* endpoint buffer number */
 
enum EP_BUF_NUM
 
{
 
  EP_NOBUF,
 
  EP_BUF0,
 
  EP_BUF1
 
};
 
 
/* Exported constants --------------------------------------------------------*/
 
#define RegBase  (0x40005C00L)  /* USB_IP Peripheral Registers base address */
 
#define PMAAddr  (0x40006000L)  /* USB_IP Packet Memory Area base address   */
 
 
/******************************************************************************/
 
/*                         General registers                                  */
 
/******************************************************************************/
 
 
/* Control register */
 
#define CNTR    ((__IO unsigned *)(RegBase + 0x40))
 
/* Interrupt status register */
 
#define ISTR    ((__IO unsigned *)(RegBase + 0x44))
 
/* Frame number register */
 
#define FNR     ((__IO unsigned *)(RegBase + 0x48))
 
/* Device address register */
 
#define DADDR   ((__IO unsigned *)(RegBase + 0x4C))
 
/* Buffer Table address register */
 
#define BTABLE  ((__IO unsigned *)(RegBase + 0x50))
 
/******************************************************************************/
 
/*                         Endpoint registers                                 */
 
/******************************************************************************/
 
#define EP0REG  ((__IO unsigned *)(RegBase)) /* endpoint 0 register address */
 
 
/* Endpoint Addresses (w/direction) */
 
#define EP0_OUT     ((uint8_t)0x00)  
 
#define EP0_IN      ((uint8_t)0x80) 
 
#define EP1_OUT     ((uint8_t)0x01)  
 
#define EP1_IN      ((uint8_t)0x81)  
 
#define EP2_OUT     ((uint8_t)0x02)  
 
#define EP2_IN      ((uint8_t)0x82)  
 
#define EP3_OUT     ((uint8_t)0x03)  
 
#define EP3_IN      ((uint8_t)0x83) 
 
#define EP4_OUT     ((uint8_t)0x04)  
 
#define EP4_IN      ((uint8_t)0x84)
 
#define EP5_OUT     ((uint8_t)0x05)  
 
#define EP5_IN      ((uint8_t)0x85)
 
#define EP6_OUT     ((uint8_t)0x06)  
 
#define EP6_IN      ((uint8_t)0x86)
 
#define EP7_OUT     ((uint8_t)0x07)  
 
#define EP7_IN      ((uint8_t)0x87)
 
 
/* endpoints enumeration */
 
#define ENDP0       ((uint8_t)0)
 
#define ENDP1       ((uint8_t)1)
 
#define ENDP2       ((uint8_t)2)
 
#define ENDP3       ((uint8_t)3)
 
#define ENDP4       ((uint8_t)4)
 
#define ENDP5       ((uint8_t)5)
 
#define ENDP6       ((uint8_t)6)
 
#define ENDP7       ((uint8_t)7)
 
 
/******************************************************************************/
 
/*                       ISTR interrupt events                                */
 
/******************************************************************************/
 
#define ISTR_CTR    (0x8000) /* Correct TRansfer (clear-only bit) */
 
#define ISTR_DOVR   (0x4000) /* DMA OVeR/underrun (clear-only bit) */
 
#define ISTR_ERR    (0x2000) /* ERRor (clear-only bit) */
 
#define ISTR_WKUP   (0x1000) /* WaKe UP (clear-only bit) */
 
#define ISTR_SUSP   (0x0800) /* SUSPend (clear-only bit) */
 
#define ISTR_RESET  (0x0400) /* RESET (clear-only bit) */
 
#define ISTR_SOF    (0x0200) /* Start Of Frame (clear-only bit) */
 
#define ISTR_ESOF   (0x0100) /* Expected Start Of Frame (clear-only bit) */
 
 
 
#define ISTR_DIR    (0x0010)  /* DIRection of transaction (read-only bit)  */
 
#define ISTR_EP_ID  (0x000F)  /* EndPoint IDentifier (read-only bit)  */
 
 
#define CLR_CTR    (~ISTR_CTR)   /* clear Correct TRansfer bit */
 
#define CLR_DOVR   (~ISTR_DOVR)  /* clear DMA OVeR/underrun bit*/
 
#define CLR_ERR    (~ISTR_ERR)   /* clear ERRor bit */
 
#define CLR_WKUP   (~ISTR_WKUP)  /* clear WaKe UP bit     */
 
#define CLR_SUSP   (~ISTR_SUSP)  /* clear SUSPend bit     */
 
#define CLR_RESET  (~ISTR_RESET) /* clear RESET bit      */
 
#define CLR_SOF    (~ISTR_SOF)   /* clear Start Of Frame bit   */
 
#define CLR_ESOF   (~ISTR_ESOF)  /* clear Expected Start Of Frame bit */
 
 
/******************************************************************************/
 
/*             CNTR control register bits definitions                         */
 
/******************************************************************************/
 
#define CNTR_CTRM   (0x8000) /* Correct TRansfer Mask */
 
#define CNTR_DOVRM  (0x4000) /* DMA OVeR/underrun Mask */
 
#define CNTR_ERRM   (0x2000) /* ERRor Mask */
 
#define CNTR_WKUPM  (0x1000) /* WaKe UP Mask */
 
#define CNTR_SUSPM  (0x0800) /* SUSPend Mask */
 
#define CNTR_RESETM (0x0400) /* RESET Mask   */
 
#define CNTR_SOFM   (0x0200) /* Start Of Frame Mask */
 
#define CNTR_ESOFM  (0x0100) /* Expected Start Of Frame Mask */
 
 
 
#define CNTR_RESUME (0x0010) /* RESUME request */
 
#define CNTR_FSUSP  (0x0008) /* Force SUSPend */
 
#define CNTR_LPMODE (0x0004) /* Low-power MODE */
 
#define CNTR_PDWN   (0x0002) /* Power DoWN */
 
#define CNTR_FRES   (0x0001) /* Force USB RESet */
 
 
/******************************************************************************/
 
/*                FNR Frame Number Register bit definitions                   */
 
/******************************************************************************/
 
#define FNR_RXDP (0x8000) /* status of D+ data line */
 
#define FNR_RXDM (0x4000) /* status of D- data line */
 
#define FNR_LCK  (0x2000) /* LoCKed */
 
#define FNR_LSOF (0x1800) /* Lost SOF */
 
#define FNR_FN  (0x07FF) /* Frame Number */
 
/******************************************************************************/
 
/*               DADDR Device ADDRess bit definitions                         */
 
/******************************************************************************/
 
#define DADDR_EF (0x80)
 
#define DADDR_ADD (0x7F)
 
/******************************************************************************/
 
/*                            Endpoint register                               */
 
/******************************************************************************/
 
/* bit positions */
 
#define EP_CTR_RX      (0x8000) /* EndPoint Correct TRansfer RX */
 
#define EP_DTOG_RX     (0x4000) /* EndPoint Data TOGGLE RX */
 
#define EPRX_STAT      (0x3000) /* EndPoint RX STATus bit field */
 
#define EP_SETUP       (0x0800) /* EndPoint SETUP */
 
#define EP_T_FIELD     (0x0600) /* EndPoint TYPE */
 
#define EP_KIND        (0x0100) /* EndPoint KIND */
 
#define EP_CTR_TX      (0x0080) /* EndPoint Correct TRansfer TX */
 
#define EP_DTOG_TX     (0x0040) /* EndPoint Data TOGGLE TX */
 
#define EPTX_STAT      (0x0030) /* EndPoint TX STATus bit field */
 
#define EPADDR_FIELD   (0x000F) /* EndPoint ADDRess FIELD */
 
 
/* EndPoint REGister MASK (no toggle fields) */
 
#define EPREG_MASK     (EP_CTR_RX|EP_SETUP|EP_T_FIELD|EP_KIND|EP_CTR_TX|EPADDR_FIELD)
 
 
/* EP_TYPE[1:0] EndPoint TYPE */
 
#define EP_TYPE_MASK   (0x0600) /* EndPoint TYPE Mask */
 
#define EP_BULK        (0x0000) /* EndPoint BULK */
 
#define EP_CONTROL     (0x0200) /* EndPoint CONTROL */
 
#define EP_ISOCHRONOUS (0x0400) /* EndPoint ISOCHRONOUS */
 
#define EP_INTERRUPT   (0x0600) /* EndPoint INTERRUPT */
 
#define EP_T_MASK      (~EP_T_FIELD & EPREG_MASK)
 
 
 
/* EP_KIND EndPoint KIND */
 
#define EPKIND_MASK    (~EP_KIND & EPREG_MASK)
 
 
/* STAT_TX[1:0] STATus for TX transfer */
 
#define EP_TX_DIS      (0x0000) /* EndPoint TX DISabled */
 
#define EP_TX_STALL    (0x0010) /* EndPoint TX STALLed */
 
#define EP_TX_NAK      (0x0020) /* EndPoint TX NAKed */
 
#define EP_TX_VALID    (0x0030) /* EndPoint TX VALID */
 
#define EPTX_DTOG1     (0x0010) /* EndPoint TX Data TOGgle bit1 */
 
#define EPTX_DTOG2     (0x0020) /* EndPoint TX Data TOGgle bit2 */
 
#define EPTX_DTOGMASK  (EPTX_STAT|EPREG_MASK)
 
 
/* STAT_RX[1:0] STATus for RX transfer */
 
#define EP_RX_DIS      (0x0000) /* EndPoint RX DISabled */
 
#define EP_RX_STALL    (0x1000) /* EndPoint RX STALLed */
 
#define EP_RX_NAK      (0x2000) /* EndPoint RX NAKed */
 
#define EP_RX_VALID    (0x3000) /* EndPoint RX VALID */
 
#define EPRX_DTOG1     (0x1000) /* EndPoint RX Data TOGgle bit1 */
 
#define EPRX_DTOG2     (0x2000) /* EndPoint RX Data TOGgle bit1 */
 
#define EPRX_DTOGMASK  (EPRX_STAT|EPREG_MASK)
 
/* Exported macro ------------------------------------------------------------*/
 
/* SetCNTR */
 
#define _SetCNTR(wRegValue)  (*CNTR   = (uint16_t)wRegValue)
 
 
/* SetISTR */
 
#define _SetISTR(wRegValue)  (*ISTR   = (uint16_t)wRegValue)
 
 
/* SetDADDR */
 
#define _SetDADDR(wRegValue) (*DADDR  = (uint16_t)wRegValue)
 
 
/* SetBTABLE */
 
#define _SetBTABLE(wRegValue)(*BTABLE = (uint16_t)(wRegValue & 0xFFF8))
 
 
/* GetCNTR */
 
#define _GetCNTR()   ((uint16_t) *CNTR)
 
 
/* GetISTR */
 
#define _GetISTR()   ((uint16_t) *ISTR)
 
 
/* GetFNR */
 
#define _GetFNR()    ((uint16_t) *FNR)
 
 
/* GetDADDR */
 
#define _GetDADDR()  ((uint16_t) *DADDR)
 
 
/* GetBTABLE */
 
#define _GetBTABLE() ((uint16_t) *BTABLE)
 
 
/* SetENDPOINT */
 
#define _SetENDPOINT(bEpNum,wRegValue)  (*(EP0REG + bEpNum)= \
 
    (uint16_t)wRegValue)
 
 
/* GetENDPOINT */
 
#define _GetENDPOINT(bEpNum)        ((uint16_t)(*(EP0REG + bEpNum)))
 
 
/*******************************************************************************
 
* Macro Name     : SetEPType
 
* Description    : sets the type in the endpoint register(bits EP_TYPE[1:0])
 
* Input          : bEpNum: Endpoint Number. 
 
*                  wType											 
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
#define _SetEPType(bEpNum,wType) (_SetENDPOINT(bEpNum,\
 
                                  ((_GetENDPOINT(bEpNum) & EP_T_MASK) | wType )))
 
 
/*******************************************************************************
 
* Macro Name     : GetEPType
 
* Description    : gets the type in the endpoint register(bits EP_TYPE[1:0]) 
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : Endpoint Type
 
*******************************************************************************/
 
#define _GetEPType(bEpNum) (_GetENDPOINT(bEpNum) & EP_T_FIELD)
 
 
/*******************************************************************************
 
* Macro Name     : SetEPTxStatus
 
* Description    : sets the status for tx transfer (bits STAT_TX[1:0]).
 
* Input          : bEpNum: Endpoint Number. 
 
*                  wState: new state
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
#define _SetEPTxStatus(bEpNum,wState) {\
 
    register uint16_t _wRegVal;       \
 
    _wRegVal = _GetENDPOINT(bEpNum) & EPTX_DTOGMASK;\
 
    /* toggle first bit ? */     \
 
    if((EPTX_DTOG1 & wState)!= 0)      \
 
      _wRegVal ^= EPTX_DTOG1;        \
 
    /* toggle second bit ?  */         \
 
    if((EPTX_DTOG2 & wState)!= 0)      \
 
      _wRegVal ^= EPTX_DTOG2;        \
 
    _SetENDPOINT(bEpNum, (_wRegVal | EP_CTR_RX|EP_CTR_TX));    \
 
  } /* _SetEPTxStatus */
 
 
/*******************************************************************************
 
* Macro Name     : SetEPRxStatus
 
* Description    : sets the status for rx transfer (bits STAT_TX[1:0])
 
* Input          : bEpNum: Endpoint Number. 
 
*                  wState: new state.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
#define _SetEPRxStatus(bEpNum,wState) {\
 
    register uint16_t _wRegVal;   \
 
    \
 
    _wRegVal = _GetENDPOINT(bEpNum) & EPRX_DTOGMASK;\
 
    /* toggle first bit ? */  \
 
    if((EPRX_DTOG1 & wState)!= 0) \
 
      _wRegVal ^= EPRX_DTOG1;  \
 
    /* toggle second bit ? */  \
 
    if((EPRX_DTOG2 & wState)!= 0) \
 
      _wRegVal ^= EPRX_DTOG2;  \
 
    _SetENDPOINT(bEpNum, (_wRegVal | EP_CTR_RX|EP_CTR_TX)); \
 
  } /* _SetEPRxStatus */
 
 
/*******************************************************************************
 
* Macro Name     : SetEPRxTxStatus
 
* Description    : sets the status for rx & tx (bits STAT_TX[1:0] & STAT_RX[1:0])
 
* Input          : bEpNum: Endpoint Number. 
 
*                  wStaterx: new state.
 
*                  wStatetx: new state.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
#define _SetEPRxTxStatus(bEpNum,wStaterx,wStatetx) {\
 
    register uint32_t _wRegVal;   \
 
    \
 
    _wRegVal = _GetENDPOINT(bEpNum) & (EPRX_DTOGMASK |EPTX_STAT) ;\
 
    /* toggle first bit ? */  \
 
    if((EPRX_DTOG1 & wStaterx)!= 0) \
 
      _wRegVal ^= EPRX_DTOG1;  \
 
    /* toggle second bit ? */  \
 
    if((EPRX_DTOG2 & wStaterx)!= 0) \
 
      _wRegVal ^= EPRX_DTOG2;  \
 
    /* toggle first bit ? */     \
 
    if((EPTX_DTOG1 & wStatetx)!= 0)      \
 
      _wRegVal ^= EPTX_DTOG1;        \
 
    /* toggle second bit ?  */         \
 
    if((EPTX_DTOG2 & wStatetx)!= 0)      \
 
      _wRegVal ^= EPTX_DTOG2;        \
 
    _SetENDPOINT(bEpNum, _wRegVal | EP_CTR_RX|EP_CTR_TX);    \
 
  } /* _SetEPRxTxStatus */
 
/*******************************************************************************
 
* Macro Name     : GetEPTxStatus / GetEPRxStatus 
 
* Description    : gets the status for tx/rx transfer (bits STAT_TX[1:0]
 
*                  /STAT_RX[1:0])
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : status .
 
*******************************************************************************/
 
#define _GetEPTxStatus(bEpNum) ((uint16_t)_GetENDPOINT(bEpNum) & EPTX_STAT)
 
 
#define _GetEPRxStatus(bEpNum) ((uint16_t)_GetENDPOINT(bEpNum) & EPRX_STAT)
 
 
/*******************************************************************************
 
* Macro Name     : SetEPTxValid / SetEPRxValid 
 
* Description    : sets directly the VALID tx/rx-status into the enpoint register
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
#define _SetEPTxValid(bEpNum)     (_SetEPTxStatus(bEpNum, EP_TX_VALID))
 
 
#define _SetEPRxValid(bEpNum)     (_SetEPRxStatus(bEpNum, EP_RX_VALID))
 
 
/*******************************************************************************
 
* Macro Name     : GetTxStallStatus / GetRxStallStatus.
 
* Description    : checks stall condition in an endpoint.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : TRUE = endpoint in stall condition.
 
*******************************************************************************/
 
#define _GetTxStallStatus(bEpNum) (_GetEPTxStatus(bEpNum) \
 
                                   == EP_TX_STALL)
 
#define _GetRxStallStatus(bEpNum) (_GetEPRxStatus(bEpNum) \
 
                                   == EP_RX_STALL)
 
 
/*******************************************************************************
 
* Macro Name     : SetEP_KIND / ClearEP_KIND.
 
* Description    : set & clear EP_KIND bit.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
#define _SetEP_KIND(bEpNum)    (_SetENDPOINT(bEpNum, \
 
                                (EP_CTR_RX|EP_CTR_TX|((_GetENDPOINT(bEpNum) | EP_KIND) & EPREG_MASK))))
 
#define _ClearEP_KIND(bEpNum)  (_SetENDPOINT(bEpNum, \
 
                                (EP_CTR_RX|EP_CTR_TX|(_GetENDPOINT(bEpNum) & EPKIND_MASK))))
 
 
/*******************************************************************************
 
* Macro Name     : Set_Status_Out / Clear_Status_Out.
 
* Description    : Sets/clears directly STATUS_OUT bit in the endpoint register.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
#define _Set_Status_Out(bEpNum)    _SetEP_KIND(bEpNum)
 
#define _Clear_Status_Out(bEpNum)  _ClearEP_KIND(bEpNum)
 
 
/*******************************************************************************
 
* Macro Name     : SetEPDoubleBuff / ClearEPDoubleBuff.
 
* Description    : Sets/clears directly EP_KIND bit in the endpoint register.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
#define _SetEPDoubleBuff(bEpNum)   _SetEP_KIND(bEpNum)
 
#define _ClearEPDoubleBuff(bEpNum) _ClearEP_KIND(bEpNum)
 
 
/*******************************************************************************
 
* Macro Name     : ClearEP_CTR_RX / ClearEP_CTR_TX.
 
* Description    : Clears bit CTR_RX / CTR_TX in the endpoint register.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
#define _ClearEP_CTR_RX(bEpNum)   (_SetENDPOINT(bEpNum,\
 
                                   _GetENDPOINT(bEpNum) & 0x7FFF & EPREG_MASK))
 
#define _ClearEP_CTR_TX(bEpNum)   (_SetENDPOINT(bEpNum,\
 
                                   _GetENDPOINT(bEpNum) & 0xFF7F & EPREG_MASK))
 
 
/*******************************************************************************
 
* Macro Name     : ToggleDTOG_RX / ToggleDTOG_TX .
 
* Description    : Toggles DTOG_RX / DTOG_TX bit in the endpoint register.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
#define _ToggleDTOG_RX(bEpNum)    (_SetENDPOINT(bEpNum, \
 
                                   EP_CTR_RX|EP_CTR_TX|EP_DTOG_RX | (_GetENDPOINT(bEpNum) & EPREG_MASK)))
 
#define _ToggleDTOG_TX(bEpNum)    (_SetENDPOINT(bEpNum, \
 
                                   EP_CTR_RX|EP_CTR_TX|EP_DTOG_TX | (_GetENDPOINT(bEpNum) & EPREG_MASK)))
 
 
/*******************************************************************************
 
* Macro Name     : ClearDTOG_RX / ClearDTOG_TX.
 
* Description    : Clears DTOG_RX / DTOG_TX bit in the endpoint register.
 
* Input          : bEpNum: Endpoint Number. 
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
#define _ClearDTOG_RX(bEpNum)  if((_GetENDPOINT(bEpNum) & EP_DTOG_RX) != 0)\
 
    _ToggleDTOG_RX(bEpNum)
 
#define _ClearDTOG_TX(bEpNum)  if((_GetENDPOINT(bEpNum) & EP_DTOG_TX) != 0)\
 
    _ToggleDTOG_TX(bEpNum)
 
/*******************************************************************************
 
* Macro Name     : SetEPAddress.
 
* Description    : Sets address in an endpoint register.
 
* Input          : bEpNum: Endpoint Number.
 
*                  bAddr: Address. 
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
#define _SetEPAddress(bEpNum,bAddr) _SetENDPOINT(bEpNum,\
 
    EP_CTR_RX|EP_CTR_TX|(_GetENDPOINT(bEpNum) & EPREG_MASK) | bAddr)
 
 
/*******************************************************************************
 
* Macro Name     : GetEPAddress.
 
* Description    : Gets address in an endpoint register.
 
* Input          : bEpNum: Endpoint Number.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
#define _GetEPAddress(bEpNum) ((uint8_t)(_GetENDPOINT(bEpNum) & EPADDR_FIELD))
 
 
#define _pEPTxAddr(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8  )*2 + PMAAddr))
 
#define _pEPTxCount(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8+2)*2 + PMAAddr))
 
#define _pEPRxAddr(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8+4)*2 + PMAAddr))
 
#define _pEPRxCount(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8+6)*2 + PMAAddr))
 
 
/*******************************************************************************
 
* Macro Name     : SetEPTxAddr / SetEPRxAddr.
 
* Description    : sets address of the tx/rx buffer.
 
* Input          : bEpNum: Endpoint Number.
 
*                  wAddr: address to be set (must be word aligned).
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
#define _SetEPTxAddr(bEpNum,wAddr) (*_pEPTxAddr(bEpNum) = ((wAddr >> 1) << 1))
 
#define _SetEPRxAddr(bEpNum,wAddr) (*_pEPRxAddr(bEpNum) = ((wAddr >> 1) << 1))
 
 
/*******************************************************************************
 
* Macro Name     : GetEPTxAddr / GetEPRxAddr.
 
* Description    : Gets address of the tx/rx buffer.
 
* Input          : bEpNum: Endpoint Number.
 
* Output         : None.
 
* Return         : address of the buffer.
 
*******************************************************************************/
 
#define _GetEPTxAddr(bEpNum) ((uint16_t)*_pEPTxAddr(bEpNum))
 
#define _GetEPRxAddr(bEpNum) ((uint16_t)*_pEPRxAddr(bEpNum))
 
 
/*******************************************************************************
 
* Macro Name     : SetEPCountRxReg.
 
* Description    : Sets counter of rx buffer with no. of blocks.
 
* Input          : pdwReg: pointer to counter.
 
*                  wCount: Counter.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
#define _BlocksOf32(dwReg,wCount,wNBlocks) {\
 
    wNBlocks = wCount >> 5;\
 
    if((wCount & 0x1f) == 0)\
 
      wNBlocks--;\
 
    *pdwReg = (uint32_t)((wNBlocks << 10) | 0x8000);\
 
  }/* _BlocksOf32 */
 
 
#define _BlocksOf2(dwReg,wCount,wNBlocks) {\
 
    wNBlocks = wCount >> 1;\
 
    if((wCount & 0x1) != 0)\
 
      wNBlocks++;\
 
    *pdwReg = (uint32_t)(wNBlocks << 10);\
 
  }/* _BlocksOf2 */
 
 
#define _SetEPCountRxReg(dwReg,wCount)  {\
 
    uint16_t wNBlocks;\
 
    if(wCount > 62){_BlocksOf32(dwReg,wCount,wNBlocks);}\
 
    else {_BlocksOf2(dwReg,wCount,wNBlocks);}\
 
  }/* _SetEPCountRxReg */
 
 
 
 
#define _SetEPRxDblBuf0Count(bEpNum,wCount) {\
 
    uint32_t *pdwReg = _pEPTxCount(bEpNum); \
 
    _SetEPCountRxReg(pdwReg, wCount);\
 
  }
 
/*******************************************************************************
 
* Macro Name     : SetEPTxCount / SetEPRxCount.
 
* Description    : sets counter for the tx/rx buffer.
 
* Input          : bEpNum: endpoint number.
 
*                  wCount: Counter value.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
#define _SetEPTxCount(bEpNum,wCount) (*_pEPTxCount(bEpNum) = wCount)
 
#define _SetEPRxCount(bEpNum,wCount) {\
 
    uint32_t *pdwReg = _pEPRxCount(bEpNum); \
 
    _SetEPCountRxReg(pdwReg, wCount);\
 
  }
 
/*******************************************************************************
 
* Macro Name     : GetEPTxCount / GetEPRxCount.
 
* Description    : gets counter of the tx buffer.
 
* Input          : bEpNum: endpoint number.
 
* Output         : None.
 
* Return         : Counter value.
 
*******************************************************************************/
 
#define _GetEPTxCount(bEpNum)((uint16_t)(*_pEPTxCount(bEpNum)) & 0x3ff)
 
#define _GetEPRxCount(bEpNum)((uint16_t)(*_pEPRxCount(bEpNum)) & 0x3ff)
 
 
/*******************************************************************************
 
* Macro Name     : SetEPDblBuf0Addr / SetEPDblBuf1Addr.
 
* Description    : Sets buffer 0/1 address in a double buffer endpoint.
 
* Input          : bEpNum: endpoint number.
 
*                : wBuf0Addr: buffer 0 address.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
#define _SetEPDblBuf0Addr(bEpNum,wBuf0Addr) {_SetEPTxAddr(bEpNum, wBuf0Addr);}
 
#define _SetEPDblBuf1Addr(bEpNum,wBuf1Addr) {_SetEPRxAddr(bEpNum, wBuf1Addr);}
 
 
/*******************************************************************************
 
* Macro Name     : SetEPDblBuffAddr.
 
* Description    : Sets addresses in a double buffer endpoint.
 
* Input          : bEpNum: endpoint number.
 
*                : wBuf0Addr: buffer 0 address.
 
*                : wBuf1Addr = buffer 1 address.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
#define _SetEPDblBuffAddr(bEpNum,wBuf0Addr,wBuf1Addr) { \
 
    _SetEPDblBuf0Addr(bEpNum, wBuf0Addr);\
 
    _SetEPDblBuf1Addr(bEpNum, wBuf1Addr);\
 
  } /* _SetEPDblBuffAddr */
 
 
/*******************************************************************************
 
* Macro Name     : GetEPDblBuf0Addr / GetEPDblBuf1Addr.
 
* Description    : Gets buffer 0/1 address of a double buffer endpoint.
 
* Input          : bEpNum: endpoint number.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
#define _GetEPDblBuf0Addr(bEpNum) (_GetEPTxAddr(bEpNum))
 
#define _GetEPDblBuf1Addr(bEpNum) (_GetEPRxAddr(bEpNum))
 
 
/*******************************************************************************
 
* Macro Name     : SetEPDblBuffCount / SetEPDblBuf0Count / SetEPDblBuf1Count.
 
* Description    : Gets buffer 0/1 address of a double buffer endpoint.
 
* Input          : bEpNum: endpoint number.
 
*                : bDir: endpoint dir  EP_DBUF_OUT = OUT 
 
*                                      EP_DBUF_IN  = IN 
 
*                : wCount: Counter value    
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
#define _SetEPDblBuf0Count(bEpNum, bDir, wCount)  { \
 
    if(bDir == EP_DBUF_OUT)\
 
      /* OUT endpoint */ \
 
    {_SetEPRxDblBuf0Count(bEpNum,wCount);} \
 
    else if(bDir == EP_DBUF_IN)\
 
      /* IN endpoint */ \
 
      *_pEPTxCount(bEpNum) = (uint32_t)wCount;  \
 
  } /* SetEPDblBuf0Count*/
 
 
#define _SetEPDblBuf1Count(bEpNum, bDir, wCount)  { \
 
    if(bDir == EP_DBUF_OUT)\
 
      /* OUT endpoint */ \
 
    {_SetEPRxCount(bEpNum,wCount);}\
 
    else if(bDir == EP_DBUF_IN)\
 
      /* IN endpoint */\
 
      *_pEPRxCount(bEpNum) = (uint32_t)wCount; \
 
  } /* SetEPDblBuf1Count */
 
 
#define _SetEPDblBuffCount(bEpNum, bDir, wCount) {\
 
    _SetEPDblBuf0Count(bEpNum, bDir, wCount); \
 
    _SetEPDblBuf1Count(bEpNum, bDir, wCount); \
 
  } /* _SetEPDblBuffCount  */
 
 
/*******************************************************************************
 
* Macro Name     : GetEPDblBuf0Count / GetEPDblBuf1Count.
 
* Description    : Gets buffer 0/1 rx/tx counter for double buffering.
 
* Input          : bEpNum: endpoint number.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
#define _GetEPDblBuf0Count(bEpNum) (_GetEPTxCount(bEpNum))
 
#define _GetEPDblBuf1Count(bEpNum) (_GetEPRxCount(bEpNum))
 
 
 
/* External variables --------------------------------------------------------*/
 
extern __IO uint16_t wIstr;  /* ISTR register last read value */
 
 
/* Exported functions ------------------------------------------------------- */
 
void SetCNTR(uint16_t /*wRegValue*/);
 
void SetISTR(uint16_t /*wRegValue*/);
 
void SetDADDR(uint16_t /*wRegValue*/);
 
void SetBTABLE(uint16_t /*wRegValue*/);
 
void SetBTABLE(uint16_t /*wRegValue*/);
 
uint16_t GetCNTR(void);
 
uint16_t GetISTR(void);
 
uint16_t GetFNR(void);
 
uint16_t GetDADDR(void);
 
uint16_t GetBTABLE(void);
 
void SetENDPOINT(uint8_t /*bEpNum*/, uint16_t /*wRegValue*/);
 
uint16_t GetENDPOINT(uint8_t /*bEpNum*/);
 
void SetEPType(uint8_t /*bEpNum*/, uint16_t /*wType*/);
 
uint16_t GetEPType(uint8_t /*bEpNum*/);
 
void SetEPTxStatus(uint8_t /*bEpNum*/, uint16_t /*wState*/);
 
void SetEPRxStatus(uint8_t /*bEpNum*/, uint16_t /*wState*/);
 
void SetDouBleBuffEPStall(uint8_t /*bEpNum*/, uint8_t bDir);
 
uint16_t GetEPTxStatus(uint8_t /*bEpNum*/);
 
uint16_t GetEPRxStatus(uint8_t /*bEpNum*/);
 
void SetEPTxValid(uint8_t /*bEpNum*/);
 
void SetEPRxValid(uint8_t /*bEpNum*/);
 
uint16_t GetTxStallStatus(uint8_t /*bEpNum*/);
 
uint16_t GetRxStallStatus(uint8_t /*bEpNum*/);
 
void SetEP_KIND(uint8_t /*bEpNum*/);
 
void ClearEP_KIND(uint8_t /*bEpNum*/);
 
void Set_Status_Out(uint8_t /*bEpNum*/);
 
void Clear_Status_Out(uint8_t /*bEpNum*/);
 
void SetEPDoubleBuff(uint8_t /*bEpNum*/);
 
void ClearEPDoubleBuff(uint8_t /*bEpNum*/);
 
void ClearEP_CTR_RX(uint8_t /*bEpNum*/);
 
void ClearEP_CTR_TX(uint8_t /*bEpNum*/);
 
void ToggleDTOG_RX(uint8_t /*bEpNum*/);
 
void ToggleDTOG_TX(uint8_t /*bEpNum*/);
 
void ClearDTOG_RX(uint8_t /*bEpNum*/);
 
void ClearDTOG_TX(uint8_t /*bEpNum*/);
 
void SetEPAddress(uint8_t /*bEpNum*/, uint8_t /*bAddr*/);
 
uint8_t GetEPAddress(uint8_t /*bEpNum*/);
 
void SetEPTxAddr(uint8_t /*bEpNum*/, uint16_t /*wAddr*/);
 
void SetEPRxAddr(uint8_t /*bEpNum*/, uint16_t /*wAddr*/);
 
uint16_t GetEPTxAddr(uint8_t /*bEpNum*/);
 
uint16_t GetEPRxAddr(uint8_t /*bEpNum*/);
 
void SetEPCountRxReg(uint32_t * /*pdwReg*/, uint16_t /*wCount*/);
 
void SetEPTxCount(uint8_t /*bEpNum*/, uint16_t /*wCount*/);
 
void SetEPRxCount(uint8_t /*bEpNum*/, uint16_t /*wCount*/);
 
uint16_t GetEPTxCount(uint8_t /*bEpNum*/);
 
uint16_t GetEPRxCount(uint8_t /*bEpNum*/);
 
void SetEPDblBuf0Addr(uint8_t /*bEpNum*/, uint16_t /*wBuf0Addr*/);
 
void SetEPDblBuf1Addr(uint8_t /*bEpNum*/, uint16_t /*wBuf1Addr*/);
 
void SetEPDblBuffAddr(uint8_t /*bEpNum*/, uint16_t /*wBuf0Addr*/, uint16_t /*wBuf1Addr*/);
 
uint16_t GetEPDblBuf0Addr(uint8_t /*bEpNum*/);
 
uint16_t GetEPDblBuf1Addr(uint8_t /*bEpNum*/);
 
void SetEPDblBuffCount(uint8_t /*bEpNum*/, uint8_t /*bDir*/, uint16_t /*wCount*/);
 
void SetEPDblBuf0Count(uint8_t /*bEpNum*/, uint8_t /*bDir*/, uint16_t /*wCount*/);
 
void SetEPDblBuf1Count(uint8_t /*bEpNum*/, uint8_t /*bDir*/, uint16_t /*wCount*/);
 
uint16_t GetEPDblBuf0Count(uint8_t /*bEpNum*/);
 
uint16_t GetEPDblBuf1Count(uint8_t /*bEpNum*/);
 
EP_DBUF_DIR GetEPDblBufDir(uint8_t /*bEpNum*/);
 
void FreeUserBuffer(uint8_t bEpNum/*bEpNum*/, uint8_t bDir);
 
uint16_t ToWord(uint8_t, uint8_t);
 
uint16_t ByteSwap(uint16_t);
 
 
#endif /* __USB_REGS_H */
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
libraries/USB/usb_sil.c
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_sil.c
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    28-August-2012
 
  * @brief   Simplified Interface Layer for Global Initialization and Endpoint
 
  *          Rea/Write operations.
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
 
/* Includes ------------------------------------------------------------------*/
 
#include "usb_lib.h"
 
 
/* Private typedef -----------------------------------------------------------*/
 
/* Private define ------------------------------------------------------------*/
 
/* Private macro -------------------------------------------------------------*/
 
/* Private variables ---------------------------------------------------------*/
 
/* Extern variables ----------------------------------------------------------*/
 
/* Private function prototypes -----------------------------------------------*/
 
/* Private functions ---------------------------------------------------------*/
 
 
/*******************************************************************************
 
* Function Name  : USB_SIL_Init
 
* Description    : Initialize the USB Device IP and the Endpoint 0.
 
* Input          : None.
 
* Output         : None.
 
* Return         : Status.
 
*******************************************************************************/
 
uint32_t USB_SIL_Init(void)
 
{
 
  /* USB interrupts initialization */
 
  /* clear pending interrupts */
 
  _SetISTR(0);
 
  wInterrupt_Mask = IMR_MSK;
 
  /* set interrupts mask */
 
  _SetCNTR(wInterrupt_Mask);
 
  return 0;
 
}
 
 
/*******************************************************************************
 
* Function Name  : USB_SIL_Write
 
* Description    : Write a buffer of data to a selected endpoint.
 
* Input          : - bEpAddr: The address of the non control endpoint.
 
*                  - pBufferPointer: The pointer to the buffer of data to be written
 
*                    to the endpoint.
 
*                  - wBufferSize: Number of data to be written (in bytes).
 
* Output         : None.
 
* Return         : Status.
 
*******************************************************************************/
 
uint32_t USB_SIL_Write(uint8_t bEpAddr, uint8_t* pBufferPointer, uint32_t wBufferSize)
 
{
 
  /* Use the memory interface function to write to the selected endpoint */
 
  UserToPMABufferCopy(pBufferPointer, GetEPTxAddr(bEpAddr & 0x7F), wBufferSize);
 
 
  /* Update the data length in the control register */
 
  SetEPTxCount((bEpAddr & 0x7F), wBufferSize);
 
  
 
  return 0;
 
}
 
 
/*******************************************************************************
 
* Function Name  : USB_SIL_Read
 
* Description    : Write a buffer of data to a selected endpoint.
 
* Input          : - bEpAddr: The address of the non control endpoint.
 
*                  - pBufferPointer: The pointer to which will be saved the 
 
*                     received data buffer.
 
* Output         : None.
 
* Return         : Number of received data (in Bytes).
 
*******************************************************************************/
 
uint32_t USB_SIL_Read(uint8_t bEpAddr, uint8_t* pBufferPointer)
 
{
 
  uint32_t DataLength = 0;
 
 
  /* Get the number of received data on the selected Endpoint */
 
  DataLength = GetEPRxCount(bEpAddr & 0x7F);
 
  
 
  /* Use the memory interface function to write to the selected endpoint */
 
  PMAToUserBufferCopy(pBufferPointer, GetEPRxAddr(bEpAddr & 0x7F), DataLength);
 
 
  /* Return the number of received data */
 
  return DataLength;
 
}
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
libraries/USB/usb_sil.h
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_sil.h
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    28-August-2012
 
  * @brief   Simplified Interface Layer function prototypes.
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
 
/* Define to prevent recursive inclusion -------------------------------------*/
 
#ifndef __USB_SIL_H
 
#define __USB_SIL_H
 
 
/* Includes ------------------------------------------------------------------*/
 
/* Exported types ------------------------------------------------------------*/
 
/* Exported constants --------------------------------------------------------*/
 
/* Exported macro ------------------------------------------------------------*/
 
/* Exported functions ------------------------------------------------------- */
 
 
uint32_t USB_SIL_Init(void);
 
uint32_t USB_SIL_Write(uint8_t bEpAddr, uint8_t* pBufferPointer, uint32_t wBufferSize);
 
uint32_t USB_SIL_Read(uint8_t bEpAddr, uint8_t* pBufferPointer);
 
 
/* External variables --------------------------------------------------------*/
 
 
#endif /* __USB_SIL_H */
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
libraries/USB/usb_type.h
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_type.h
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    28-August-2012
 
  * @brief   Type definitions used by the USB Library
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
 
/* Define to prevent recursive inclusion -------------------------------------*/
 
#ifndef __USB_TYPE_H
 
#define __USB_TYPE_H
 
 
/* Includes ------------------------------------------------------------------*/
 
#include "usb_conf.h"
 
 
/* Exported types ------------------------------------------------------------*/
 
/* Exported constants --------------------------------------------------------*/
 
#ifndef NULL
 
#define NULL ((void *)0)
 
#endif
 
 
typedef enum
 
{
 
  FALSE = 0, TRUE  = !FALSE
 
}
 
bool;
 
 
/* Exported macro ------------------------------------------------------------*/
 
/* Exported functions ------------------------------------------------------- */
 
/* External variables --------------------------------------------------------*/
 
 
#endif /* __USB_TYPE_H */
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
platform_config.h
Show inline comments
 
@@ -30,19 +30,16 @@
 
#ifndef __PLATFORM_CONFIG_H
 
#define __PLATFORM_CONFIG_H
 
 
#define STM32L1XX_MD
 
 
/* Includes ------------------------------------------------------------------*/
 
#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)|| defined(STM32L1XX_MD_PLUS)
 
 #include "stm32l1xx.h"
 
 #include "evalcompat.h"
 
// #if defined (USE_STM32L152_EVAL)
 
//  #include "stm32l152_eval.h"
 
// #elif defined (USE_STM32L152D_EVAL)
 
//  #include "stm32l152d_eval.h"
 
// #else
 
//  #error "Missing define: USE_STM32L152_EVAL or USE_STM32L152D_EVAL"
 
// #endif /* USE_STM32L152_EVAL */
 
 #if defined (USE_STM32L152_EVAL)
 
  #include "stm32l152_eval.h"
 
 #elif defined (USE_STM32L152D_EVAL)
 
  #include "stm32l152d_eval.h"
 
 #else
 
  #error "Missing define: USE_STM32L152_EVAL or USE_STM32L152D_EVAL"
 
 #endif /* USE_STM32L152_EVAL */
 
#elif defined (STM32F10X_MD) || defined (STM32F10X_HD) || defined (STM32F10X_XL)
 
 #include "stm32f10x.h"
 
 #if defined (USE_STM3210B_EVAL)
 
@@ -67,12 +64,13 @@
 
#if !defined (USE_STM3210B_EVAL) &&  !defined (USE_STM3210E_EVAL)  && !defined (USE_STM32L152_EVAL) &&  !defined (USE_STM32L152D_EVAL) &&  !defined (USE_STM32373C_EVAL) && !defined (USE_STM32303C_EVAL)
 
//#define USE_STM3210B_EVAL
 
//#define USE_STM3210E_EVAL
 
#define USE_STM32L152_EVAL
 
//#define USE_STM32L152_EVAL
 
//#define USE_STM32L152D_EVAL
 
//#define (USE_STM32373C_EVAL)
 
//#define USE_STM32303C_EVAL
 
#define (USE_STM32303C_EVAL)
 
#endif
 
 
 
/*Unique Devices IDs register set*/
 
 
#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD) || defined(STM32L1XX_MD_PLUS) 
 
@@ -95,10 +93,59 @@
 
 
#endif
 
 
 
/* Define the STM32F10x hardware depending on the used evaluation board */
 
#ifdef USE_STM3210B_EVAL
 
  #define USB_DISCONNECT                      GPIOD  
 
  #define USB_DISCONNECT_PIN                  GPIO_Pin_9
 
  #define RCC_APB2Periph_GPIO_DISCONNECT      RCC_APB2Periph_GPIOD
 
 
#elif defined (USE_STM3210E_EVAL)
 
  #define USB_DISCONNECT                      GPIOB  
 
  #define USB_DISCONNECT_PIN                  GPIO_Pin_14
 
  #define RCC_APB2Periph_GPIO_DISCONNECT      RCC_APB2Periph_GPIOB
 
 
 
#elif defined (USE_STM32L152_EVAL) || defined (USE_STM32L152D_EVAL)
 
 /* 
 
   For STM32L15xx devices it is possible to use the internal USB pullup
 
   controlled by register SYSCFG_PMC (refer to RM0038 reference manual for
 
   more details).
 
   It is also possible to use external pullup (and disable the internal pullup)
 
   by setting the define USB_USE_EXTERNAL_PULLUP in file platform_config.h
 
   and configuring the right pin to be used for the external pull up configuration.
 
   To have more details on how to use an external pull up, please refer to 
 
   STM3210E-EVAL evaluation board manuals.
 
   */
 
 /* Uncomment the following define to use an external pull up instead of the 
 
    integrated STM32L15xx internal pull up. In this case make sure to set up
 
    correctly the external required hardware and the GPIO defines below.*/
 
/* #define USB_USE_EXTERNAL_PULLUP */
 
 
 #if !defined(USB_USE_EXTERNAL_PULLUP)
 
  #define STM32L15_USB_CONNECT                SYSCFG_USBPuCmd(ENABLE)
 
  #define STM32L15_USB_DISCONNECT             SYSCFG_USBPuCmd(DISABLE)
 
 
 #elif defined(USB_USE_EXTERNAL_PULLUP)
 
  /* PA0 is chosen just as illustrating example, you should modify the defines
 
    below according to your hardware configuration. */ 
 
#define USB_DISCONNECT                      GPIOA  
 
#define USB_DISCONNECT_PIN                  GPIO_Pin_10
 
#define RCC_APB2Periph_GPIO_DISCONNECT      RCC_APB2Periph_GPIOA
 
  #define USB_DISCONNECT_PIN                  GPIO_Pin_0
 
  #define RCC_AHBPeriph_GPIO_DISCONNECT       RCC_AHBPeriph_GPIOA
 
  #define STM32L15_USB_CONNECT                GPIO_ResetBits(USB_DISCONNECT, USB_DISCONNECT_PIN)
 
  #define STM32L15_USB_DISCONNECT             GPIO_SetBits(USB_DISCONNECT, USB_DISCONNECT_PIN)
 
 #endif /* USB_USE_EXTERNAL_PULLUP */
 
 
#elif defined (USE_STM32373C_EVAL)
 
  #define USB_DISCONNECT                      GPIOC  
 
  #define USB_DISCONNECT_PIN                  GPIO_Pin_5
 
  #define RCC_AHBPeriph_GPIO_DISCONNECT       RCC_AHBPeriph_GPIOC
 
 
#elif defined (USE_STM32303C_EVAL)
 
  #define USB_DISCONNECT                      GPIOB  
 
  #define USB_DISCONNECT_PIN                  GPIO_Pin_8
 
 
  #define RCC_AHBPeriph_GPIO_DISCONNECT       RCC_AHBPeriph_GPIOB
 
#endif /* USE_STM3210B_EVAL */
 
 
/* Exported macro ------------------------------------------------------------*/
 
/* Exported functions ------------------------------------------------------- */
stm32l1xx_it.c
Show inline comments
 
@@ -28,8 +28,11 @@
 
  */
 
 
/* Includes ------------------------------------------------------------------*/
 
#include "hw_config.h"
 
#include "stm32l1xx_it.h"
 
#include "main.h"
 
#include "usb_lib.h"
 
#include "usb_istr.h"
 
 
/** @addtogroup STM32L100C-Discovery_Demo
 
  * @{
 
@@ -144,6 +147,50 @@ void SysTick_Handler(void)
 
  TimingDelay_Decrement();
 
}
 
 
 
 
 
 
 
/*******************************************************************************
 
* Function Name  : USB_IRQHandler
 
* Description    : This function handles USB Low Priority interrupts
 
*                  requests.
 
* Input          : None
 
* Output         : None
 
* Return         : None
 
*******************************************************************************/
 
#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)|| defined(STM32L1XX_MD_PLUS)|| defined (STM32F37X)
 
void USB_LP_IRQHandler(void)
 
#else
 
void USB_LP_CAN1_RX0_IRQHandler(void)
 
#endif
 
{
 
  USB_Istr();
 
}
 
 
/*******************************************************************************
 
* Function Name  : USB_FS_WKUP_IRQHandler
 
* Description    : This function handles USB WakeUp interrupt request.
 
* Input          : None
 
* Output         : None
 
* Return         : None
 
*******************************************************************************/
 
 
#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)|| defined(STM32L1XX_MD_PLUS)
 
void USB_FS_WKUP_IRQHandler(void)
 
#else
 
void USBWakeUp_IRQHandler(void)
 
#endif
 
{
 
  EXTI_ClearITPendingBit(EXTI_Line18);
 
}
 
 
 
 
 
 
 
/******************************************************************************/
 
/*                 STM32L1xx Peripherals Interrupt Handlers                   */
 
/*  Add here the Interrupt Handler for the used peripheral(s) (PPP), for the  */
 
@@ -165,4 +212,7 @@ void SysTick_Handler(void)
 
  */ 
 
 
 
 
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
stm32l1xx_it.h
Show inline comments
 
@@ -35,6 +35,8 @@
 
 
/* Includes ------------------------------------------------------------------*/
 
#include "stm32l1xx.h"
 
#include "platform_config.h"
 
 
 
/* Exported types ------------------------------------------------------------*/
 
/* Exported constants --------------------------------------------------------*/
 
@@ -50,6 +52,9 @@ void SVC_Handler(void);
 
void DebugMon_Handler(void);
 
void PendSV_Handler(void);
 
void SysTick_Handler(void);
 
void USBWakeUp_IRQHandler(void);
 
void USB_FS_WKUP_IRQHandler(void);
 
 
 
#ifdef __cplusplus
 
}
usb_conf.h
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_conf.h
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    21-January-2013
 
  * @brief   Virtual COM Port Demo configuration  header
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
 
/* Define to prevent recursive inclusion -------------------------------------*/
 
#ifndef __USB_CONF_H
 
#define __USB_CONF_H
 
 
/* Includes ------------------------------------------------------------------*/
 
/* Exported types ------------------------------------------------------------*/
 
/* Exported constants --------------------------------------------------------*/
 
/* Exported macro ------------------------------------------------------------*/
 
/* Exported functions ------------------------------------------------------- */
 
/* External variables --------------------------------------------------------*/
 
 
/*-------------------------------------------------------------*/
 
/* EP_NUM */
 
/* defines how many endpoints are used by the device */
 
/*-------------------------------------------------------------*/
 
 
#define EP_NUM                          (4)
 
 
/*-------------------------------------------------------------*/
 
/* --------------   Buffer Description Table  -----------------*/
 
/*-------------------------------------------------------------*/
 
/* buffer table base address */
 
/* buffer table base address */
 
#define BTABLE_ADDRESS      (0x00)
 
 
/* EP0  */
 
/* rx/tx buffer base address */
 
#define ENDP0_RXADDR        (0x40)
 
#define ENDP0_TXADDR        (0x80)
 
 
/* EP1  */
 
/* tx buffer base address */
 
#define ENDP1_TXADDR        (0xC0)
 
#define ENDP2_TXADDR        (0x100)
 
#define ENDP3_RXADDR        (0x110)
 
 
 
/*-------------------------------------------------------------*/
 
/* -------------------   ISTR events  -------------------------*/
 
/*-------------------------------------------------------------*/
 
/* IMR_MSK */
 
/* mask defining which events has to be handled */
 
/* by the device application software */
 
#define IMR_MSK (CNTR_CTRM  | CNTR_WKUPM | CNTR_SUSPM | CNTR_ERRM  | CNTR_SOFM \
 
                 | CNTR_ESOFM | CNTR_RESETM )
 
 
/*#define CTR_CALLBACK*/
 
/*#define DOVR_CALLBACK*/
 
/*#define ERR_CALLBACK*/
 
/*#define WKUP_CALLBACK*/
 
/*#define SUSP_CALLBACK*/
 
/*#define RESET_CALLBACK*/
 
/*#define SOF_CALLBACK*/
 
/*#define ESOF_CALLBACK*/
 
/* CTR service routines */
 
/* associated to defined endpoints */
 
/*#define  EP1_IN_Callback   NOP_Process*/
 
#define  EP2_IN_Callback   NOP_Process
 
#define  EP3_IN_Callback   NOP_Process
 
#define  EP4_IN_Callback   NOP_Process
 
#define  EP5_IN_Callback   NOP_Process
 
#define  EP6_IN_Callback   NOP_Process
 
#define  EP7_IN_Callback   NOP_Process
 
 
#define  EP1_OUT_Callback   NOP_Process
 
#define  EP2_OUT_Callback   NOP_Process
 
/*#define  EP3_OUT_Callback   NOP_Process*/
 
#define  EP4_OUT_Callback   NOP_Process
 
#define  EP5_OUT_Callback   NOP_Process
 
#define  EP6_OUT_Callback   NOP_Process
 
#define  EP7_OUT_Callback   NOP_Process
 
 
#endif /* __USB_CONF_H */
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
usb_desc.c
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_desc.c
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    21-January-2013
 
  * @brief   Descriptors for Virtual Com Port Demo
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
 
/* Includes ------------------------------------------------------------------*/
 
#include "usb_lib.h"
 
#include "usb_desc.h"
 
 
/* USB Standard Device Descriptor */
 
const uint8_t Virtual_Com_Port_DeviceDescriptor[] =
 
  {
 
    0x12,   /* bLength */
 
    USB_DEVICE_DESCRIPTOR_TYPE,     /* bDescriptorType */
 
    0x00,
 
    0x02,   /* bcdUSB = 2.00 */
 
    0x02,   /* bDeviceClass: CDC */
 
    0x00,   /* bDeviceSubClass */
 
    0x00,   /* bDeviceProtocol */
 
    0x40,   /* bMaxPacketSize0 */
 
    0x83,
 
    0x04,   /* idVendor = 0x0483 */
 
    0x40,
 
    0x57,   /* idProduct = 0x7540 */
 
    0x00,
 
    0x02,   /* bcdDevice = 2.00 */
 
    1,              /* Index of string descriptor describing manufacturer */
 
    2,              /* Index of string descriptor describing product */
 
    3,              /* Index of string descriptor describing the device's serial number */
 
    0x01    /* bNumConfigurations */
 
  };
 
 
const uint8_t Virtual_Com_Port_ConfigDescriptor[] =
 
  {
 
    /*Configuration Descriptor*/
 
    0x09,   /* bLength: Configuration Descriptor size */
 
    USB_CONFIGURATION_DESCRIPTOR_TYPE,      /* bDescriptorType: Configuration */
 
    VIRTUAL_COM_PORT_SIZ_CONFIG_DESC,       /* wTotalLength:no of returned bytes */
 
    0x00,
 
    0x02,   /* bNumInterfaces: 2 interface */
 
    0x01,   /* bConfigurationValue: Configuration value */
 
    0x00,   /* iConfiguration: Index of string descriptor describing the configuration */
 
    0xC0,   /* bmAttributes: self powered */
 
    0x32,   /* MaxPower 0 mA */
 
    /*Interface Descriptor*/
 
    0x09,   /* bLength: Interface Descriptor size */
 
    USB_INTERFACE_DESCRIPTOR_TYPE,  /* bDescriptorType: Interface */
 
    /* Interface descriptor type */
 
    0x00,   /* bInterfaceNumber: Number of Interface */
 
    0x00,   /* bAlternateSetting: Alternate setting */
 
    0x01,   /* bNumEndpoints: One endpoints used */
 
    0x02,   /* bInterfaceClass: Communication Interface Class */
 
    0x02,   /* bInterfaceSubClass: Abstract Control Model */
 
    0x01,   /* bInterfaceProtocol: Common AT commands */
 
    0x00,   /* iInterface: */
 
    /*Header Functional Descriptor*/
 
    0x05,   /* bLength: Endpoint Descriptor size */
 
    0x24,   /* bDescriptorType: CS_INTERFACE */
 
    0x00,   /* bDescriptorSubtype: Header Func Desc */
 
    0x10,   /* bcdCDC: spec release number */
 
    0x01,
 
    /*Call Management Functional Descriptor*/
 
    0x05,   /* bFunctionLength */
 
    0x24,   /* bDescriptorType: CS_INTERFACE */
 
    0x01,   /* bDescriptorSubtype: Call Management Func Desc */
 
    0x00,   /* bmCapabilities: D0+D1 */
 
    0x01,   /* bDataInterface: 1 */
 
    /*ACM Functional Descriptor*/
 
    0x04,   /* bFunctionLength */
 
    0x24,   /* bDescriptorType: CS_INTERFACE */
 
    0x02,   /* bDescriptorSubtype: Abstract Control Management desc */
 
    0x02,   /* bmCapabilities */
 
    /*Union Functional Descriptor*/
 
    0x05,   /* bFunctionLength */
 
    0x24,   /* bDescriptorType: CS_INTERFACE */
 
    0x06,   /* bDescriptorSubtype: Union func desc */
 
    0x00,   /* bMasterInterface: Communication class interface */
 
    0x01,   /* bSlaveInterface0: Data Class Interface */
 
    /*Endpoint 2 Descriptor*/
 
    0x07,   /* bLength: Endpoint Descriptor size */
 
    USB_ENDPOINT_DESCRIPTOR_TYPE,   /* bDescriptorType: Endpoint */
 
    0x82,   /* bEndpointAddress: (IN2) */
 
    0x03,   /* bmAttributes: Interrupt */
 
    VIRTUAL_COM_PORT_INT_SIZE,      /* wMaxPacketSize: */
 
    0x00,
 
    0xFF,   /* bInterval: */
 
    /*Data class interface descriptor*/
 
    0x09,   /* bLength: Endpoint Descriptor size */
 
    USB_INTERFACE_DESCRIPTOR_TYPE,  /* bDescriptorType: */
 
    0x01,   /* bInterfaceNumber: Number of Interface */
 
    0x00,   /* bAlternateSetting: Alternate setting */
 
    0x02,   /* bNumEndpoints: Two endpoints used */
 
    0x0A,   /* bInterfaceClass: CDC */
 
    0x00,   /* bInterfaceSubClass: */
 
    0x00,   /* bInterfaceProtocol: */
 
    0x00,   /* iInterface: */
 
    /*Endpoint 3 Descriptor*/
 
    0x07,   /* bLength: Endpoint Descriptor size */
 
    USB_ENDPOINT_DESCRIPTOR_TYPE,   /* bDescriptorType: Endpoint */
 
    0x03,   /* bEndpointAddress: (OUT3) */
 
    0x02,   /* bmAttributes: Bulk */
 
    VIRTUAL_COM_PORT_DATA_SIZE,             /* wMaxPacketSize: */
 
    0x00,
 
    0x00,   /* bInterval: ignore for Bulk transfer */
 
    /*Endpoint 1 Descriptor*/
 
    0x07,   /* bLength: Endpoint Descriptor size */
 
    USB_ENDPOINT_DESCRIPTOR_TYPE,   /* bDescriptorType: Endpoint */
 
    0x81,   /* bEndpointAddress: (IN1) */
 
    0x02,   /* bmAttributes: Bulk */
 
    VIRTUAL_COM_PORT_DATA_SIZE,             /* wMaxPacketSize: */
 
    0x00,
 
    0x00    /* bInterval */
 
  };
 
 
/* USB String Descriptors */
 
const uint8_t Virtual_Com_Port_StringLangID[VIRTUAL_COM_PORT_SIZ_STRING_LANGID] =
 
  {
 
    VIRTUAL_COM_PORT_SIZ_STRING_LANGID,
 
    USB_STRING_DESCRIPTOR_TYPE,
 
    0x09,
 
    0x04 /* LangID = 0x0409: U.S. English */
 
  };
 
 
const uint8_t Virtual_Com_Port_StringVendor[VIRTUAL_COM_PORT_SIZ_STRING_VENDOR] =
 
  {
 
    VIRTUAL_COM_PORT_SIZ_STRING_VENDOR,     /* Size of Vendor string */
 
    USB_STRING_DESCRIPTOR_TYPE,             /* bDescriptorType*/
 
    /* Manufacturer: "STMicroelectronics" */
 
    'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0,
 
    'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0,
 
    'c', 0, 's', 0
 
  };
 
 
const uint8_t Virtual_Com_Port_StringProduct[VIRTUAL_COM_PORT_SIZ_STRING_PRODUCT] =
 
  {
 
    VIRTUAL_COM_PORT_SIZ_STRING_PRODUCT,          /* bLength */
 
    USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
 
    /* Product name: "STM32 Virtual COM Port" */
 
    'S', 0, 'T', 0, 'M', 0, '3', 0, '2', 0, ' ', 0, 'V', 0, 'i', 0,
 
    'r', 0, 't', 0, 'u', 0, 'a', 0, 'l', 0, ' ', 0, 'C', 0, 'O', 0,
 
    'M', 0, ' ', 0, 'P', 0, 'o', 0, 'r', 0, 't', 0, ' ', 0, ' ', 0
 
  };
 
 
uint8_t Virtual_Com_Port_StringSerial[VIRTUAL_COM_PORT_SIZ_STRING_SERIAL] =
 
  {
 
    VIRTUAL_COM_PORT_SIZ_STRING_SERIAL,           /* bLength */
 
    USB_STRING_DESCRIPTOR_TYPE,                   /* bDescriptorType */
 
    'S', 0, 'T', 0, 'M', 0, '3', 0, '2', 0
 
  };
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
usb_desc.h
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_desc.h
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    21-January-2013
 
  * @brief   Descriptor Header for Virtual COM Port Device
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
 
/* Define to prevent recursive inclusion -------------------------------------*/
 
#ifndef __USB_DESC_H
 
#define __USB_DESC_H
 
 
/* Includes ------------------------------------------------------------------*/
 
/* Exported types ------------------------------------------------------------*/
 
/* Exported constants --------------------------------------------------------*/
 
/* Exported macro ------------------------------------------------------------*/
 
/* Exported define -----------------------------------------------------------*/
 
#define USB_DEVICE_DESCRIPTOR_TYPE              0x01
 
#define USB_CONFIGURATION_DESCRIPTOR_TYPE       0x02
 
#define USB_STRING_DESCRIPTOR_TYPE              0x03
 
#define USB_INTERFACE_DESCRIPTOR_TYPE           0x04
 
#define USB_ENDPOINT_DESCRIPTOR_TYPE            0x05
 
 
#define VIRTUAL_COM_PORT_DATA_SIZE              64
 
#define VIRTUAL_COM_PORT_INT_SIZE               8
 
 
#define VIRTUAL_COM_PORT_SIZ_DEVICE_DESC        18
 
#define VIRTUAL_COM_PORT_SIZ_CONFIG_DESC        67
 
#define VIRTUAL_COM_PORT_SIZ_STRING_LANGID      4
 
#define VIRTUAL_COM_PORT_SIZ_STRING_VENDOR      38
 
#define VIRTUAL_COM_PORT_SIZ_STRING_PRODUCT     50
 
#define VIRTUAL_COM_PORT_SIZ_STRING_SERIAL      26
 
 
#define STANDARD_ENDPOINT_DESC_SIZE             0x09
 
 
/* Exported functions ------------------------------------------------------- */
 
extern const uint8_t Virtual_Com_Port_DeviceDescriptor[VIRTUAL_COM_PORT_SIZ_DEVICE_DESC];
 
extern const uint8_t Virtual_Com_Port_ConfigDescriptor[VIRTUAL_COM_PORT_SIZ_CONFIG_DESC];
 
 
extern const uint8_t Virtual_Com_Port_StringLangID[VIRTUAL_COM_PORT_SIZ_STRING_LANGID];
 
extern const uint8_t Virtual_Com_Port_StringVendor[VIRTUAL_COM_PORT_SIZ_STRING_VENDOR];
 
extern const uint8_t Virtual_Com_Port_StringProduct[VIRTUAL_COM_PORT_SIZ_STRING_PRODUCT];
 
extern uint8_t Virtual_Com_Port_StringSerial[VIRTUAL_COM_PORT_SIZ_STRING_SERIAL];
 
 
#endif /* __USB_DESC_H */
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
usb_endp.c
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_endp.c
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    21-January-2013
 
  * @brief   Endpoint routines
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
 
/* Includes ------------------------------------------------------------------*/
 
#include "usb_lib.h"
 
#include "usb_desc.h"
 
#include "usb_mem.h"
 
#include "hw_config.h"
 
#include "usb_istr.h"
 
#include "usb_pwr.h"
 
 
/* Private typedef -----------------------------------------------------------*/
 
/* Private define ------------------------------------------------------------*/
 
 
/* Interval between sending IN packets in frame number (1 frame = 1ms) */
 
#define VCOMPORT_IN_FRAME_INTERVAL             5
 
/* Private macro -------------------------------------------------------------*/
 
/* Private variables ---------------------------------------------------------*/
 
extern __IO uint32_t packet_sent;
 
extern __IO uint32_t packet_receive;
 
extern __IO uint8_t Receive_Buffer[64];
 
uint32_t Receive_length;
 
/* Private function prototypes -----------------------------------------------*/
 
/* Private functions ---------------------------------------------------------*/
 
 
/*******************************************************************************
 
* Function Name  : EP1_IN_Callback
 
* Description    :
 
* Input          : None.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
 
void EP1_IN_Callback (void)
 
{
 
  packet_sent = 1;
 
}
 
 
/*******************************************************************************
 
* Function Name  : EP3_OUT_Callback
 
* Description    :
 
* Input          : None.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void EP3_OUT_Callback(void)
 
{
 
  packet_receive = 1;
 
  Receive_length = GetEPRxCount(ENDP3);
 
  PMAToUserBufferCopy((unsigned char*)Receive_Buffer, ENDP3_RXADDR, Receive_length);
 
}
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
usb_istr.c
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_istr.c
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    21-January-2013
 
  * @brief   ISTR events interrupt service routines
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
 
/* Includes ------------------------------------------------------------------*/
 
#include "usb_lib.h"
 
#include "usb_prop.h"
 
#include "usb_pwr.h"
 
#include "usb_istr.h"
 
 
/* Private typedef -----------------------------------------------------------*/
 
/* Private define ------------------------------------------------------------*/
 
/* Private macro -------------------------------------------------------------*/
 
/* Private variables ---------------------------------------------------------*/
 
__IO uint16_t wIstr;  /* ISTR register last read value */
 
__IO uint8_t bIntPackSOF = 0;  /* SOFs received between 2 consecutive packets */
 
__IO uint32_t esof_counter =0; /* expected SOF counter */
 
__IO uint32_t wCNTR=0;
 
 
/* Extern variables ----------------------------------------------------------*/
 
/* Private function prototypes -----------------------------------------------*/
 
/* Private functions ---------------------------------------------------------*/
 
/* function pointers to non-control endpoints service routines */
 
void (*pEpInt_IN[7])(void) =
 
  {
 
    EP1_IN_Callback,
 
    EP2_IN_Callback,
 
    EP3_IN_Callback,
 
    EP4_IN_Callback,
 
    EP5_IN_Callback,
 
    EP6_IN_Callback,
 
    EP7_IN_Callback,
 
  };
 
 
void (*pEpInt_OUT[7])(void) =
 
  {
 
    EP1_OUT_Callback,
 
    EP2_OUT_Callback,
 
    EP3_OUT_Callback,
 
    EP4_OUT_Callback,
 
    EP5_OUT_Callback,
 
    EP6_OUT_Callback,
 
    EP7_OUT_Callback,
 
  };
 
 
/*******************************************************************************
 
* Function Name  : USB_Istr
 
* Description    : ISTR events interrupt service routine
 
* Input          :
 
* Output         :
 
* Return         :
 
*******************************************************************************/
 
void USB_Istr(void)
 
{
 
    uint32_t i=0;
 
 __IO uint32_t EP[8];
 
  
 
  wIstr = _GetISTR();
 
 
#if (IMR_MSK & ISTR_SOF)
 
  if (wIstr & ISTR_SOF & wInterrupt_Mask)
 
  {
 
    _SetISTR((uint16_t)CLR_SOF);
 
    bIntPackSOF++;
 
 
#ifdef SOF_CALLBACK
 
    SOF_Callback();
 
#endif
 
  }
 
#endif
 
  /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/  
 
  
 
#if (IMR_MSK & ISTR_CTR)
 
  if (wIstr & ISTR_CTR & wInterrupt_Mask)
 
  {
 
    /* servicing of the endpoint correct transfer interrupt */
 
    /* clear of the CTR flag into the sub */
 
    CTR_LP();
 
#ifdef CTR_CALLBACK
 
    CTR_Callback();
 
#endif
 
  }
 
#endif
 
  /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/  
 
#if (IMR_MSK & ISTR_RESET)
 
  if (wIstr & ISTR_RESET & wInterrupt_Mask)
 
  {
 
    _SetISTR((uint16_t)CLR_RESET);
 
    Device_Property.Reset();
 
#ifdef RESET_CALLBACK
 
    RESET_Callback();
 
#endif
 
  }
 
#endif
 
  /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
 
#if (IMR_MSK & ISTR_DOVR)
 
  if (wIstr & ISTR_DOVR & wInterrupt_Mask)
 
  {
 
    _SetISTR((uint16_t)CLR_DOVR);
 
#ifdef DOVR_CALLBACK
 
    DOVR_Callback();
 
#endif
 
  }
 
#endif
 
  /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
 
#if (IMR_MSK & ISTR_ERR)
 
  if (wIstr & ISTR_ERR & wInterrupt_Mask)
 
  {
 
    _SetISTR((uint16_t)CLR_ERR);
 
#ifdef ERR_CALLBACK
 
    ERR_Callback();
 
#endif
 
  }
 
#endif
 
  /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
 
#if (IMR_MSK & ISTR_WKUP)
 
  if (wIstr & ISTR_WKUP & wInterrupt_Mask)
 
  {
 
    _SetISTR((uint16_t)CLR_WKUP);
 
    Resume(RESUME_EXTERNAL);
 
#ifdef WKUP_CALLBACK
 
    WKUP_Callback();
 
#endif
 
  }
 
#endif
 
  /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
 
#if (IMR_MSK & ISTR_SUSP)
 
  if (wIstr & ISTR_SUSP & wInterrupt_Mask)
 
  {
 
 
    /* check if SUSPEND is possible */
 
    if (fSuspendEnabled)
 
    {
 
      Suspend();
 
    }
 
    else
 
    {
 
      /* if not possible then resume after xx ms */
 
      Resume(RESUME_LATER);
 
    }
 
    /* clear of the ISTR bit must be done after setting of CNTR_FSUSP */
 
    _SetISTR((uint16_t)CLR_SUSP);
 
#ifdef SUSP_CALLBACK
 
    SUSP_Callback();
 
#endif
 
  }
 
#endif
 
  /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
 
 
#if (IMR_MSK & ISTR_ESOF)
 
  if (wIstr & ISTR_ESOF & wInterrupt_Mask)
 
  {
 
    /* clear ESOF flag in ISTR */
 
    _SetISTR((uint16_t)CLR_ESOF);
 
    
 
    if ((_GetFNR()&FNR_RXDP)!=0)
 
    {
 
      /* increment ESOF counter */
 
      esof_counter ++;
 
      
 
      /* test if we enter in ESOF more than 3 times with FSUSP =0 and RXDP =1=>> possible missing SUSP flag*/
 
      if ((esof_counter >3)&&((_GetCNTR()&CNTR_FSUSP)==0))
 
      {           
 
        /* this a sequence to apply a force RESET*/
 
      
 
        /*Store CNTR value */
 
        wCNTR = _GetCNTR(); 
 
      
 
        /*Store endpoints registers status */
 
        for (i=0;i<8;i++) EP[i] = _GetENDPOINT(i);
 
      
 
        /*apply FRES */
 
        wCNTR|=CNTR_FRES;
 
        _SetCNTR(wCNTR);
 
 
 
        /*clear FRES*/
 
        wCNTR&=~CNTR_FRES;
 
        _SetCNTR(wCNTR);
 
      
 
        /*poll for RESET flag in ISTR*/
 
        while((_GetISTR()&ISTR_RESET) == 0);
 
        /* clear RESET flag in ISTR */
 
        _SetISTR((uint16_t)CLR_RESET);
 
   
 
       /*restore Enpoints*/
 
        for (i=0;i<8;i++)
 
        _SetENDPOINT(i, EP[i]);
 
      
 
        esof_counter = 0;
 
      }
 
    }
 
    else
 
    {
 
        esof_counter = 0;
 
    }
 
    
 
    /* resume handling timing is made with ESOFs */
 
    Resume(RESUME_ESOF); /* request without change of the machine state */
 
 
#ifdef ESOF_CALLBACK
 
    ESOF_Callback();
 
#endif
 
  }
 
#endif
 
} /* USB_Istr */
 
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
usb_istr.h
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_istr.h
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    21-January-2013
 
  * @brief   This file includes the peripherals header files in the user application.
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
 
/* Define to prevent recursive inclusion -------------------------------------*/
 
#ifndef __USB_ISTR_H
 
#define __USB_ISTR_H
 
 
/* Includes ------------------------------------------------------------------*/
 
#include "usb_conf.h"
 
 
/* Exported types ------------------------------------------------------------*/
 
/* Exported constants --------------------------------------------------------*/
 
/* Exported macro ------------------------------------------------------------*/
 
/* Exported functions ------------------------------------------------------- */
 
 
 void USB_Istr(void);
 
 
/* function prototypes Automatically built defining related macros */
 
 
void EP1_IN_Callback(void);
 
void EP2_IN_Callback(void);
 
void EP3_IN_Callback(void);
 
void EP4_IN_Callback(void);
 
void EP5_IN_Callback(void);
 
void EP6_IN_Callback(void);
 
void EP7_IN_Callback(void);
 
 
void EP1_OUT_Callback(void);
 
void EP2_OUT_Callback(void);
 
void EP3_OUT_Callback(void);
 
void EP4_OUT_Callback(void);
 
void EP5_OUT_Callback(void);
 
void EP6_OUT_Callback(void);
 
void EP7_OUT_Callback(void);
 
 
#ifdef CTR_CALLBACK
 
void CTR_Callback(void);
 
#endif
 
 
#ifdef DOVR_CALLBACK
 
void DOVR_Callback(void);
 
#endif
 
 
#ifdef ERR_CALLBACK
 
void ERR_Callback(void);
 
#endif
 
 
#ifdef WKUP_CALLBACK
 
void WKUP_Callback(void);
 
#endif
 
 
#ifdef SUSP_CALLBACK
 
void SUSP_Callback(void);
 
#endif
 
 
#ifdef RESET_CALLBACK
 
void RESET_Callback(void);
 
#endif
 
 
#ifdef SOF_CALLBACK
 
void SOF_Callback(void);
 
#endif
 
 
#ifdef ESOF_CALLBACK
 
void ESOF_Callback(void);
 
#endif
 
#endif /*__USB_ISTR_H*/
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
usb_prop.c
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_prop.c
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    21-January-2013
 
  * @brief   All processing related to Virtual Com Port Demo
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
 
/* Includes ------------------------------------------------------------------*/
 
#include "usb_lib.h"
 
#include "usb_conf.h"
 
#include "usb_prop.h"
 
#include "usb_desc.h"
 
#include "usb_pwr.h"
 
#include "hw_config.h"
 
 
/* Private typedef -----------------------------------------------------------*/
 
/* Private define ------------------------------------------------------------*/
 
/* Private macro -------------------------------------------------------------*/
 
/* Private variables ---------------------------------------------------------*/
 
uint8_t Request = 0;
 
 
LINE_CODING linecoding =
 
  {
 
    115200, /* baud rate*/
 
    0x00,   /* stop bits-1*/
 
    0x00,   /* parity - none*/
 
    0x08    /* no. of bits 8*/
 
  };
 
 
/* -------------------------------------------------------------------------- */
 
/*  Structures initializations */
 
/* -------------------------------------------------------------------------- */
 
 
DEVICE Device_Table =
 
  {
 
    EP_NUM,
 
    1
 
  };
 
 
DEVICE_PROP Device_Property =
 
  {
 
    Virtual_Com_Port_init,
 
    Virtual_Com_Port_Reset,
 
    Virtual_Com_Port_Status_In,
 
    Virtual_Com_Port_Status_Out,
 
    Virtual_Com_Port_Data_Setup,
 
    Virtual_Com_Port_NoData_Setup,
 
    Virtual_Com_Port_Get_Interface_Setting,
 
    Virtual_Com_Port_GetDeviceDescriptor,
 
    Virtual_Com_Port_GetConfigDescriptor,
 
    Virtual_Com_Port_GetStringDescriptor,
 
    0,
 
    0x40 /*MAX PACKET SIZE*/
 
  };
 
 
USER_STANDARD_REQUESTS User_Standard_Requests =
 
  {
 
    Virtual_Com_Port_GetConfiguration,
 
    Virtual_Com_Port_SetConfiguration,
 
    Virtual_Com_Port_GetInterface,
 
    Virtual_Com_Port_SetInterface,
 
    Virtual_Com_Port_GetStatus,
 
    Virtual_Com_Port_ClearFeature,
 
    Virtual_Com_Port_SetEndPointFeature,
 
    Virtual_Com_Port_SetDeviceFeature,
 
    Virtual_Com_Port_SetDeviceAddress
 
  };
 
 
ONE_DESCRIPTOR Device_Descriptor =
 
  {
 
    (uint8_t*)Virtual_Com_Port_DeviceDescriptor,
 
    VIRTUAL_COM_PORT_SIZ_DEVICE_DESC
 
  };
 
 
ONE_DESCRIPTOR Config_Descriptor =
 
  {
 
    (uint8_t*)Virtual_Com_Port_ConfigDescriptor,
 
    VIRTUAL_COM_PORT_SIZ_CONFIG_DESC
 
  };
 
 
ONE_DESCRIPTOR String_Descriptor[4] =
 
  {
 
    {(uint8_t*)Virtual_Com_Port_StringLangID, VIRTUAL_COM_PORT_SIZ_STRING_LANGID},
 
    {(uint8_t*)Virtual_Com_Port_StringVendor, VIRTUAL_COM_PORT_SIZ_STRING_VENDOR},
 
    {(uint8_t*)Virtual_Com_Port_StringProduct, VIRTUAL_COM_PORT_SIZ_STRING_PRODUCT},
 
    {(uint8_t*)Virtual_Com_Port_StringSerial, VIRTUAL_COM_PORT_SIZ_STRING_SERIAL}
 
  };
 
 
/* Extern variables ----------------------------------------------------------*/
 
/* Private function prototypes -----------------------------------------------*/
 
/* Extern function prototypes ------------------------------------------------*/
 
/* Private functions ---------------------------------------------------------*/
 
/*******************************************************************************
 
* Function Name  : Virtual_Com_Port_init.
 
* Description    : Virtual COM Port Mouse init routine.
 
* Input          : None.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void Virtual_Com_Port_init(void)
 
{
 
 
  /* Update the serial number string descriptor with the data from the unique
 
  ID*/
 
  Get_SerialNum();
 
 
  pInformation->Current_Configuration = 0;
 
 
  /* Connect the device */
 
  PowerOn();
 
 
  /* Perform basic device initialization operations */
 
  USB_SIL_Init();
 
 
  bDeviceState = UNCONNECTED;
 
}
 
 
/*******************************************************************************
 
* Function Name  : Virtual_Com_Port_Reset
 
* Description    : Virtual_Com_Port Mouse reset routine
 
* Input          : None.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void Virtual_Com_Port_Reset(void)
 
{
 
  /* Set Virtual_Com_Port DEVICE as not configured */
 
  pInformation->Current_Configuration = 0;
 
 
  /* Current Feature initialization */
 
  pInformation->Current_Feature = Virtual_Com_Port_ConfigDescriptor[7];
 
 
  /* Set Virtual_Com_Port DEVICE with the default Interface*/
 
  pInformation->Current_Interface = 0;
 
 
  SetBTABLE(BTABLE_ADDRESS);
 
 
  /* Initialize Endpoint 0 */
 
  SetEPType(ENDP0, EP_CONTROL);
 
  SetEPTxStatus(ENDP0, EP_TX_STALL);
 
  SetEPRxAddr(ENDP0, ENDP0_RXADDR);
 
  SetEPTxAddr(ENDP0, ENDP0_TXADDR);
 
  Clear_Status_Out(ENDP0);
 
  SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);
 
  SetEPRxValid(ENDP0);
 
 
  /* Initialize Endpoint 1 */
 
  SetEPType(ENDP1, EP_BULK);
 
  SetEPTxAddr(ENDP1, ENDP1_TXADDR);
 
  SetEPTxStatus(ENDP1, EP_TX_NAK);
 
  SetEPRxStatus(ENDP1, EP_RX_DIS);
 
 
  /* Initialize Endpoint 2 */
 
  SetEPType(ENDP2, EP_INTERRUPT);
 
  SetEPTxAddr(ENDP2, ENDP2_TXADDR);
 
  SetEPRxStatus(ENDP2, EP_RX_DIS);
 
  SetEPTxStatus(ENDP2, EP_TX_NAK);
 
 
  /* Initialize Endpoint 3 */
 
  SetEPType(ENDP3, EP_BULK);
 
  SetEPRxAddr(ENDP3, ENDP3_RXADDR);
 
  SetEPRxCount(ENDP3, VIRTUAL_COM_PORT_DATA_SIZE);
 
  SetEPRxStatus(ENDP3, EP_RX_VALID);
 
  SetEPTxStatus(ENDP3, EP_TX_DIS);
 
 
  /* Set this device to response on default address */
 
  SetDeviceAddress(0);
 
  
 
  bDeviceState = ATTACHED;
 
}
 
 
/*******************************************************************************
 
* Function Name  : Virtual_Com_Port_SetConfiguration.
 
* Description    : Update the device state to configured.
 
* Input          : None.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void Virtual_Com_Port_SetConfiguration(void)
 
{
 
  DEVICE_INFO *pInfo = &Device_Info;
 
 
  if (pInfo->Current_Configuration != 0)
 
  {
 
    /* Device configured */
 
    bDeviceState = CONFIGURED;
 
  }
 
}
 
 
/*******************************************************************************
 
* Function Name  : Virtual_Com_Port_SetConfiguration.
 
* Description    : Update the device state to addressed.
 
* Input          : None.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void Virtual_Com_Port_SetDeviceAddress (void)
 
{
 
  bDeviceState = ADDRESSED;
 
}
 
 
/*******************************************************************************
 
* Function Name  : Virtual_Com_Port_Status_In.
 
* Description    : Virtual COM Port Status In Routine.
 
* Input          : None.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void Virtual_Com_Port_Status_In(void)
 
{
 
  if (Request == SET_LINE_CODING)
 
  {
 
    Request = 0;
 
  }
 
}
 
 
/*******************************************************************************
 
* Function Name  : Virtual_Com_Port_Status_Out
 
* Description    : Virtual COM Port Status OUT Routine.
 
* Input          : None.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void Virtual_Com_Port_Status_Out(void)
 
{}
 
 
/*******************************************************************************
 
* Function Name  : Virtual_Com_Port_Data_Setup
 
* Description    : handle the data class specific requests
 
* Input          : Request Nb.
 
* Output         : None.
 
* Return         : USB_UNSUPPORT or USB_SUCCESS.
 
*******************************************************************************/
 
RESULT Virtual_Com_Port_Data_Setup(uint8_t RequestNo)
 
{
 
  uint8_t    *(*CopyRoutine)(uint16_t);
 
 
  CopyRoutine = NULL;
 
 
  if (RequestNo == GET_LINE_CODING)
 
  {
 
    if (Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
 
    {
 
      CopyRoutine = Virtual_Com_Port_GetLineCoding;
 
    }
 
  }
 
  else if (RequestNo == SET_LINE_CODING)
 
  {
 
    if (Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
 
    {
 
      CopyRoutine = Virtual_Com_Port_SetLineCoding;
 
    }
 
    Request = SET_LINE_CODING;
 
  }
 
 
  if (CopyRoutine == NULL)
 
  {
 
    return USB_UNSUPPORT;
 
  }
 
 
  pInformation->Ctrl_Info.CopyData = CopyRoutine;
 
  pInformation->Ctrl_Info.Usb_wOffset = 0;
 
  (*CopyRoutine)(0);
 
  return USB_SUCCESS;
 
}
 
 
/*******************************************************************************
 
* Function Name  : Virtual_Com_Port_NoData_Setup.
 
* Description    : handle the no data class specific requests.
 
* Input          : Request Nb.
 
* Output         : None.
 
* Return         : USB_UNSUPPORT or USB_SUCCESS.
 
*******************************************************************************/
 
RESULT Virtual_Com_Port_NoData_Setup(uint8_t RequestNo)
 
{
 
 
  if (Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
 
  {
 
    if (RequestNo == SET_COMM_FEATURE)
 
    {
 
      return USB_SUCCESS;
 
    }
 
    else if (RequestNo == SET_CONTROL_LINE_STATE)
 
    {
 
      return USB_SUCCESS;
 
    }
 
  }
 
 
  return USB_UNSUPPORT;
 
}
 
 
/*******************************************************************************
 
* Function Name  : Virtual_Com_Port_GetDeviceDescriptor.
 
* Description    : Gets the device descriptor.
 
* Input          : Length.
 
* Output         : None.
 
* Return         : The address of the device descriptor.
 
*******************************************************************************/
 
uint8_t *Virtual_Com_Port_GetDeviceDescriptor(uint16_t Length)
 
{
 
  return Standard_GetDescriptorData(Length, &Device_Descriptor);
 
}
 
 
/*******************************************************************************
 
* Function Name  : Virtual_Com_Port_GetConfigDescriptor.
 
* Description    : get the configuration descriptor.
 
* Input          : Length.
 
* Output         : None.
 
* Return         : The address of the configuration descriptor.
 
*******************************************************************************/
 
uint8_t *Virtual_Com_Port_GetConfigDescriptor(uint16_t Length)
 
{
 
  return Standard_GetDescriptorData(Length, &Config_Descriptor);
 
}
 
 
/*******************************************************************************
 
* Function Name  : Virtual_Com_Port_GetStringDescriptor
 
* Description    : Gets the string descriptors according to the needed index
 
* Input          : Length.
 
* Output         : None.
 
* Return         : The address of the string descriptors.
 
*******************************************************************************/
 
uint8_t *Virtual_Com_Port_GetStringDescriptor(uint16_t Length)
 
{
 
  uint8_t wValue0 = pInformation->USBwValue0;
 
  if (wValue0 > 4)
 
  {
 
    return NULL;
 
  }
 
  else
 
  {
 
    return Standard_GetDescriptorData(Length, &String_Descriptor[wValue0]);
 
  }
 
}
 
 
/*******************************************************************************
 
* Function Name  : Virtual_Com_Port_Get_Interface_Setting.
 
* Description    : test the interface and the alternate setting according to the
 
*                  supported one.
 
* Input1         : uint8_t: Interface : interface number.
 
* Input2         : uint8_t: AlternateSetting : Alternate Setting number.
 
* Output         : None.
 
* Return         : The address of the string descriptors.
 
*******************************************************************************/
 
RESULT Virtual_Com_Port_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting)
 
{
 
  if (AlternateSetting > 0)
 
  {
 
    return USB_UNSUPPORT;
 
  }
 
  else if (Interface > 1)
 
  {
 
    return USB_UNSUPPORT;
 
  }
 
  return USB_SUCCESS;
 
}
 
 
/*******************************************************************************
 
* Function Name  : Virtual_Com_Port_GetLineCoding.
 
* Description    : send the linecoding structure to the PC host.
 
* Input          : Length.
 
* Output         : None.
 
* Return         : Linecoding structure base address.
 
*******************************************************************************/
 
uint8_t *Virtual_Com_Port_GetLineCoding(uint16_t Length)
 
{
 
  if (Length == 0)
 
  {
 
    pInformation->Ctrl_Info.Usb_wLength = sizeof(linecoding);
 
    return NULL;
 
  }
 
  return(uint8_t *)&linecoding;
 
}
 
 
/*******************************************************************************
 
* Function Name  : Virtual_Com_Port_SetLineCoding.
 
* Description    : Set the linecoding structure fields.
 
* Input          : Length.
 
* Output         : None.
 
* Return         : Linecoding structure base address.
 
*******************************************************************************/
 
uint8_t *Virtual_Com_Port_SetLineCoding(uint16_t Length)
 
{
 
  if (Length == 0)
 
  {
 
    pInformation->Ctrl_Info.Usb_wLength = sizeof(linecoding);
 
    return NULL;
 
  }
 
  return(uint8_t *)&linecoding;
 
}
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 
usb_prop.h
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_prop.h
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    21-January-2013
 
  * @brief   All processing related to Virtual COM Port Demo (Endpoint 0)
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
 
/* Define to prevent recursive inclusion -------------------------------------*/
 
#ifndef __usb_prop_H
 
#define __usb_prop_H
 
 
/* Includes ------------------------------------------------------------------*/
 
/* Exported types ------------------------------------------------------------*/
 
typedef struct
 
{
 
  uint32_t bitrate;
 
  uint8_t format;
 
  uint8_t paritytype;
 
  uint8_t datatype;
 
}LINE_CODING;
 
 
/* Exported constants --------------------------------------------------------*/
 
/* Exported macro ------------------------------------------------------------*/
 
/* Exported define -----------------------------------------------------------*/
 
 
#define Virtual_Com_Port_GetConfiguration          NOP_Process
 
//#define Virtual_Com_Port_SetConfiguration          NOP_Process
 
#define Virtual_Com_Port_GetInterface              NOP_Process
 
#define Virtual_Com_Port_SetInterface              NOP_Process
 
#define Virtual_Com_Port_GetStatus                 NOP_Process
 
#define Virtual_Com_Port_ClearFeature              NOP_Process
 
#define Virtual_Com_Port_SetEndPointFeature        NOP_Process
 
#define Virtual_Com_Port_SetDeviceFeature          NOP_Process
 
//#define Virtual_Com_Port_SetDeviceAddress          NOP_Process
 
 
#define SEND_ENCAPSULATED_COMMAND   0x00
 
#define GET_ENCAPSULATED_RESPONSE   0x01
 
#define SET_COMM_FEATURE            0x02
 
#define GET_COMM_FEATURE            0x03
 
#define CLEAR_COMM_FEATURE          0x04
 
#define SET_LINE_CODING             0x20
 
#define GET_LINE_CODING             0x21
 
#define SET_CONTROL_LINE_STATE      0x22
 
#define SEND_BREAK                  0x23
 
 
/* Exported functions ------------------------------------------------------- */
 
void Virtual_Com_Port_init(void);
 
void Virtual_Com_Port_Reset(void);
 
void Virtual_Com_Port_SetConfiguration(void);
 
void Virtual_Com_Port_SetDeviceAddress (void);
 
void Virtual_Com_Port_Status_In (void);
 
void Virtual_Com_Port_Status_Out (void);
 
RESULT Virtual_Com_Port_Data_Setup(uint8_t);
 
RESULT Virtual_Com_Port_NoData_Setup(uint8_t);
 
RESULT Virtual_Com_Port_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting);
 
uint8_t *Virtual_Com_Port_GetDeviceDescriptor(uint16_t );
 
uint8_t *Virtual_Com_Port_GetConfigDescriptor(uint16_t);
 
uint8_t *Virtual_Com_Port_GetStringDescriptor(uint16_t);
 
 
uint8_t *Virtual_Com_Port_GetLineCoding(uint16_t Length);
 
uint8_t *Virtual_Com_Port_SetLineCoding(uint16_t Length);
 
 
#endif /* __usb_prop_H */
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 
usb_pwr.c
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_pwr.c
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    21-January-2013
 
  * @brief   Connection/disconnection & power management
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
 
/* Includes ------------------------------------------------------------------*/
 
#include "usb_lib.h"
 
#include "usb_conf.h"
 
#include "usb_pwr.h"
 
#include "hw_config.h"
 
 
/* Private typedef -----------------------------------------------------------*/
 
/* Private define ------------------------------------------------------------*/
 
/* Private macro -------------------------------------------------------------*/
 
/* Private variables ---------------------------------------------------------*/
 
__IO uint32_t bDeviceState = UNCONNECTED; /* USB device status */
 
__IO bool fSuspendEnabled = TRUE;  /* true when suspend is possible */
 
__IO uint32_t EP[8];
 
 
struct
 
{
 
  __IO RESUME_STATE eState;
 
  __IO uint8_t bESOFcnt;
 
}
 
ResumeS;
 
 
__IO uint32_t remotewakeupon=0;
 
 
/* Extern variables ----------------------------------------------------------*/
 
/* Private function prototypes -----------------------------------------------*/
 
/* Extern function prototypes ------------------------------------------------*/
 
/* Private functions ---------------------------------------------------------*/
 
 
/*******************************************************************************
 
* Function Name  : PowerOn
 
* Description    :
 
* Input          : None.
 
* Output         : None.
 
* Return         : USB_SUCCESS.
 
*******************************************************************************/
 
RESULT PowerOn(void)
 
{
 
  uint16_t wRegVal;
 
 
  /*** cable plugged-in ? ***/
 
  USB_Cable_Config(ENABLE);
 
 
  /*** CNTR_PWDN = 0 ***/
 
  wRegVal = CNTR_FRES;
 
  _SetCNTR(wRegVal);
 
 
  /*** CNTR_FRES = 0 ***/
 
  wInterrupt_Mask = 0;
 
  _SetCNTR(wInterrupt_Mask);
 
  /*** Clear pending interrupts ***/
 
  _SetISTR(0);
 
  /*** Set interrupt mask ***/
 
  wInterrupt_Mask = CNTR_RESETM | CNTR_SUSPM | CNTR_WKUPM;
 
  _SetCNTR(wInterrupt_Mask);
 
  
 
  return USB_SUCCESS;
 
}
 
 
/*******************************************************************************
 
* Function Name  : PowerOff
 
* Description    : handles switch-off conditions
 
* Input          : None.
 
* Output         : None.
 
* Return         : USB_SUCCESS.
 
*******************************************************************************/
 
RESULT PowerOff()
 
{
 
  /* disable all interrupts and force USB reset */
 
  _SetCNTR(CNTR_FRES);
 
  /* clear interrupt status register */
 
  _SetISTR(0);
 
  /* Disable the Pull-Up*/
 
  USB_Cable_Config(DISABLE);
 
  /* switch-off device */
 
  _SetCNTR(CNTR_FRES + CNTR_PDWN);
 
  /* sw variables reset */
 
  /* ... */
 
 
  return USB_SUCCESS;
 
}
 
 
/*******************************************************************************
 
* Function Name  : Suspend
 
* Description    : sets suspend mode operating conditions
 
* Input          : None.
 
* Output         : None.
 
* Return         : USB_SUCCESS.
 
*******************************************************************************/
 
void Suspend(void)
 
{
 
	uint32_t i =0;
 
	uint16_t wCNTR;
 
	uint32_t tmpreg = 0;
 
  __IO uint32_t savePWR_CR=0;
 
	/* suspend preparation */
 
	/* ... */
 
	
 
	/*Store CNTR value */
 
	wCNTR = _GetCNTR();  
 
 
    /* This a sequence to apply a force RESET to handle a robustness case */
 
    
 
	/*Store endpoints registers status */
 
    for (i=0;i<8;i++) EP[i] = _GetENDPOINT(i);
 
	
 
	/* unmask RESET flag */
 
	wCNTR|=CNTR_RESETM;
 
	_SetCNTR(wCNTR);
 
	
 
	/*apply FRES */
 
	wCNTR|=CNTR_FRES;
 
	_SetCNTR(wCNTR);
 
	
 
	/*clear FRES*/
 
	wCNTR&=~CNTR_FRES;
 
	_SetCNTR(wCNTR);
 
	
 
	/*poll for RESET flag in ISTR*/
 
	while((_GetISTR()&ISTR_RESET) == 0);
 
	
 
	/* clear RESET flag in ISTR */
 
	_SetISTR((uint16_t)CLR_RESET);
 
	
 
	/*restore Enpoints*/
 
	for (i=0;i<8;i++)
 
	_SetENDPOINT(i, EP[i]);
 
	
 
	/* Now it is safe to enter macrocell in suspend mode */
 
	wCNTR |= CNTR_FSUSP;
 
	_SetCNTR(wCNTR);
 
	
 
	/* force low-power mode in the macrocell */
 
	wCNTR = _GetCNTR();
 
	wCNTR |= CNTR_LPMODE;
 
	_SetCNTR(wCNTR);
 
	
 
	/*prepare entry in low power mode (STOP mode)*/
 
	/* Select the regulator state in STOP mode*/
 
	savePWR_CR = PWR->CR;
 
	tmpreg = PWR->CR;
 
	/* Clear PDDS and LPDS bits */
 
	tmpreg &= ((uint32_t)0xFFFFFFFC);
 
	/* Set LPDS bit according to PWR_Regulator value */
 
	tmpreg |= PWR_Regulator_LowPower;
 
	/* Store the new value */
 
	PWR->CR = tmpreg;
 
	/* Set SLEEPDEEP bit of Cortex System Control Register */
 
#if defined (STM32F30X) || defined (STM32F37X)
 
        SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
 
#else
 
        SCB->SCR |= SCB_SCR_SLEEPDEEP;       
 
#endif
 
	/* enter system in STOP mode, only when wakeup flag in not set */
 
	if((_GetISTR()&ISTR_WKUP)==0)
 
	{
 
		__WFI();
 
		/* Reset SLEEPDEEP bit of Cortex System Control Register */
 
#if defined (STM32F30X) || defined (STM32F37X)
 
                SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); 
 
#else
 
                SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP); 
 
#endif
 
	}
 
	else
 
	{
 
		/* Clear Wakeup flag */
 
		_SetISTR(CLR_WKUP);
 
		/* clear FSUSP to abort entry in suspend mode  */
 
        wCNTR = _GetCNTR();
 
        wCNTR&=~CNTR_FSUSP;
 
        _SetCNTR(wCNTR);
 
		
 
		/*restore sleep mode configuration */ 
 
		/* restore Power regulator config in sleep mode*/
 
		PWR->CR = savePWR_CR;
 
		
 
		/* Reset SLEEPDEEP bit of Cortex System Control Register */
 
#if defined (STM32F30X) || defined (STM32F37X)		
 
                SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk);
 
#else
 
                SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP);
 
#endif
 
              
 
    }
 
}
 
 
/*******************************************************************************
 
* Function Name  : Resume_Init
 
* Description    : Handles wake-up restoring normal operations
 
* Input          : None.
 
* Output         : None.
 
* Return         : USB_SUCCESS.
 
*******************************************************************************/
 
void Resume_Init(void)
 
{
 
  uint16_t wCNTR;
 
  
 
  /* ------------------ ONLY WITH BUS-POWERED DEVICES ---------------------- */
 
  /* restart the clocks */
 
  /* ...  */
 
 
  /* CNTR_LPMODE = 0 */
 
  wCNTR = _GetCNTR();
 
  wCNTR &= (~CNTR_LPMODE);
 
  _SetCNTR(wCNTR);    
 
  
 
  /* restore full power */
 
  /* ... on connected devices */
 
  Leave_LowPowerMode();
 
 
  /* reset FSUSP bit */
 
  _SetCNTR(IMR_MSK);
 
 
  /* reverse suspend preparation */
 
  /* ... */ 
 
 
}
 
 
/*******************************************************************************
 
* Function Name  : Resume
 
* Description    : This is the state machine handling resume operations and
 
*                 timing sequence. The control is based on the Resume structure
 
*                 variables and on the ESOF interrupt calling this subroutine
 
*                 without changing machine state.
 
* Input          : a state machine value (RESUME_STATE)
 
*                  RESUME_ESOF doesn't change ResumeS.eState allowing
 
*                  decrementing of the ESOF counter in different states.
 
* Output         : None.
 
* Return         : None.
 
*******************************************************************************/
 
void Resume(RESUME_STATE eResumeSetVal)
 
{
 
  uint16_t wCNTR;
 
 
  if (eResumeSetVal != RESUME_ESOF)
 
    ResumeS.eState = eResumeSetVal;
 
  switch (ResumeS.eState)
 
  {
 
    case RESUME_EXTERNAL:
 
      if (remotewakeupon ==0)
 
      {
 
        Resume_Init();
 
        ResumeS.eState = RESUME_OFF;
 
      }
 
      else /* RESUME detected during the RemoteWAkeup signalling => keep RemoteWakeup handling*/
 
      {
 
        ResumeS.eState = RESUME_ON;
 
      }
 
      break;
 
    case RESUME_INTERNAL:
 
      Resume_Init();
 
      ResumeS.eState = RESUME_START;
 
      remotewakeupon = 1;
 
      break;
 
    case RESUME_LATER:
 
      ResumeS.bESOFcnt = 2;
 
      ResumeS.eState = RESUME_WAIT;
 
      break;
 
    case RESUME_WAIT:
 
      ResumeS.bESOFcnt--;
 
      if (ResumeS.bESOFcnt == 0)
 
        ResumeS.eState = RESUME_START;
 
      break;
 
    case RESUME_START:
 
      wCNTR = _GetCNTR();
 
      wCNTR |= CNTR_RESUME;
 
      _SetCNTR(wCNTR);
 
      ResumeS.eState = RESUME_ON;
 
      ResumeS.bESOFcnt = 10;
 
      break;
 
    case RESUME_ON:    
 
      ResumeS.bESOFcnt--;
 
      if (ResumeS.bESOFcnt == 0)
 
      {
 
        wCNTR = _GetCNTR();
 
        wCNTR &= (~CNTR_RESUME);
 
        _SetCNTR(wCNTR);
 
        ResumeS.eState = RESUME_OFF;
 
        remotewakeupon = 0;
 
      }
 
      break;
 
    case RESUME_OFF:
 
    case RESUME_ESOF:
 
    default:
 
      ResumeS.eState = RESUME_OFF;
 
      break;
 
  }
 
}
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
usb_pwr.h
Show inline comments
 
new file 100644
 
/**
 
  ******************************************************************************
 
  * @file    usb_pwr.h
 
  * @author  MCD Application Team
 
  * @version V4.0.0
 
  * @date    21-January-2013
 
  * @brief   Connection/disconnection & power management header
 
  ******************************************************************************
 
  * @attention
 
  *
 
  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
 
  *
 
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
 
  * You may not use this file except in compliance with the License.
 
  * You may obtain a copy of the License at:
 
  *
 
  *        http://www.st.com/software_license_agreement_liberty_v2
 
  *
 
  * Unless required by applicable law or agreed to in writing, software 
 
  * distributed under the License is distributed on an "AS IS" BASIS, 
 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  * See the License for the specific language governing permissions and
 
  * limitations under the License.
 
  *
 
  ******************************************************************************
 
  */
 
 
 
/* Define to prevent recursive inclusion -------------------------------------*/
 
#ifndef __USB_PWR_H
 
#define __USB_PWR_H
 
 
/* Includes ------------------------------------------------------------------*/
 
/* Exported types ------------------------------------------------------------*/
 
typedef enum _RESUME_STATE
 
{
 
  RESUME_EXTERNAL,
 
  RESUME_INTERNAL,
 
  RESUME_LATER,
 
  RESUME_WAIT,
 
  RESUME_START,
 
  RESUME_ON,
 
  RESUME_OFF,
 
  RESUME_ESOF
 
} RESUME_STATE;
 
 
typedef enum _DEVICE_STATE
 
{
 
  UNCONNECTED,
 
  ATTACHED,
 
  POWERED,
 
  SUSPENDED,
 
  ADDRESSED,
 
  CONFIGURED
 
} DEVICE_STATE;
 
 
/* Exported constants --------------------------------------------------------*/
 
/* Exported macro ------------------------------------------------------------*/
 
/* Exported functions ------------------------------------------------------- */
 
void Suspend(void);
 
void Resume_Init(void);
 
void Resume(RESUME_STATE eResumeSetVal);
 
RESULT PowerOn(void);
 
RESULT PowerOff(void);
 
 
/* External variables --------------------------------------------------------*/
 
extern  __IO uint32_t bDeviceState; /* USB device status */
 
extern __IO bool fSuspendEnabled;  /* true when suspend is possible */
 
 
#endif  /*__USB_PWR_H*/
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
0 comments (0 inline, 0 general)