diff --git a/libraries/USB/usb_sil.c b/libraries/USB/usb_sil.c
new file mode 100644
--- /dev/null
+++ b/libraries/USB/usb_sil.c
@@ -0,0 +1,103 @@
+/**
+ ******************************************************************************
+ * @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
+ *
+ *
© COPYRIGHT 2012 STMicroelectronics
+ *
+ * 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****/