summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-03-14 00:30:37 +0000
committerDamien George <damien.p.george@gmail.com>2014-03-14 00:30:37 +0000
commitb30c02afa078f7713faa14087ae28433dee49027 (patch)
tree55fceb0630addde69dd52a3e2f8e8dc2f1be2015
parent536dde254be99e19700a0934af38b913256475e3 (diff)
downloadmicropython-b30c02afa078f7713faa14087ae28433dee49027.tar.gz
micropython-b30c02afa078f7713faa14087ae28433dee49027.zip
stmhal: Get USB enumerating a CDC device.
Enumerates CDC device over USB, but doesn't transmit/receive yet.
-rw-r--r--stmhal/Makefile31
-rw-r--r--stmhal/boards/PYBOARD4/stm32f4xx_hal_conf.h1
-rw-r--r--stmhal/main.c28
-rw-r--r--stmhal/pendsv.c83
-rw-r--r--stmhal/pendsv.h3
-rw-r--r--stmhal/stm32f4xx_it.c77
-rw-r--r--stmhal/stm32f4xx_it.h5
-rw-r--r--stmhal/usb.c240
-rw-r--r--stmhal/usb.h23
-rw-r--r--stmhal/usbd_cdc_interface.c461
-rw-r--r--stmhal/usbd_cdc_interface.h87
-rw-r--r--stmhal/usbd_conf.c565
-rw-r--r--stmhal/usbd_conf.h87
-rw-r--r--stmhal/usbd_desc.c228
-rw-r--r--stmhal/usbd_desc.h43
-rw-r--r--stmhal/usbdev/class/AUDIO/Inc/usbd_audio.h (renamed from stmhal/usbdev/Class/AUDIO/Inc/usbd_audio.h)0
-rw-r--r--stmhal/usbdev/class/AUDIO/Inc/usbd_audio_if_template.h (renamed from stmhal/usbdev/Class/AUDIO/Inc/usbd_audio_if_template.h)0
-rw-r--r--stmhal/usbdev/class/AUDIO/Src/usbd_audio.c (renamed from stmhal/usbdev/Class/AUDIO/Src/usbd_audio.c)0
-rw-r--r--stmhal/usbdev/class/AUDIO/Src/usbd_audio_if_template.c (renamed from stmhal/usbdev/Class/AUDIO/Src/usbd_audio_if_template.c)0
-rw-r--r--stmhal/usbdev/class/CustomHID/Inc/usbd_customhid.h (renamed from stmhal/usbdev/Class/CustomHID/Inc/usbd_customhid.h)0
-rw-r--r--stmhal/usbdev/class/CustomHID/Src/usbd_customhid.c (renamed from stmhal/usbdev/Class/CustomHID/Src/usbd_customhid.c)0
-rw-r--r--stmhal/usbdev/class/DFU/Inc/usbd_dfu.h (renamed from stmhal/usbdev/Class/DFU/Inc/usbd_dfu.h)0
-rw-r--r--stmhal/usbdev/class/DFU/Inc/usbd_dfu_media_template.h (renamed from stmhal/usbdev/Class/DFU/Inc/usbd_dfu_media_template.h)0
-rw-r--r--stmhal/usbdev/class/DFU/Src/usbd_dfu.c (renamed from stmhal/usbdev/Class/DFU/Src/usbd_dfu.c)0
-rw-r--r--stmhal/usbdev/class/DFU/Src/usbd_dfu_media_template.c (renamed from stmhal/usbdev/Class/DFU/Src/usbd_dfu_media_template.c)0
-rw-r--r--stmhal/usbdev/class/HID/Inc/usbd_hid.h (renamed from stmhal/usbdev/Class/HID/Inc/usbd_hid.h)0
-rw-r--r--stmhal/usbdev/class/HID/Src/usbd_hid.c (renamed from stmhal/usbdev/Class/HID/Src/usbd_hid.c)0
-rw-r--r--stmhal/usbdev/class/MSC/Inc/usbd_msc.h (renamed from stmhal/usbdev/Class/MSC/Inc/usbd_msc.h)0
-rw-r--r--stmhal/usbdev/class/MSC/Inc/usbd_msc_bot.h (renamed from stmhal/usbdev/Class/MSC/Inc/usbd_msc_bot.h)0
-rw-r--r--stmhal/usbdev/class/MSC/Inc/usbd_msc_data.h (renamed from stmhal/usbdev/Class/MSC/Inc/usbd_msc_data.h)0
-rw-r--r--stmhal/usbdev/class/MSC/Inc/usbd_msc_scsi.h (renamed from stmhal/usbdev/Class/MSC/Inc/usbd_msc_scsi.h)0
-rw-r--r--stmhal/usbdev/class/MSC/Inc/usbd_msc_storage_template.h (renamed from stmhal/usbdev/Class/MSC/Inc/usbd_msc_storage_template.h)0
-rw-r--r--stmhal/usbdev/class/MSC/Src/usbd_msc.c (renamed from stmhal/usbdev/Class/MSC/Src/usbd_msc.c)0
-rw-r--r--stmhal/usbdev/class/MSC/Src/usbd_msc_bot.c (renamed from stmhal/usbdev/Class/MSC/Src/usbd_msc_bot.c)0
-rw-r--r--stmhal/usbdev/class/MSC/Src/usbd_msc_data.c (renamed from stmhal/usbdev/Class/MSC/Src/usbd_msc_data.c)0
-rw-r--r--stmhal/usbdev/class/MSC/Src/usbd_msc_scsi.c (renamed from stmhal/usbdev/Class/MSC/Src/usbd_msc_scsi.c)0
-rw-r--r--stmhal/usbdev/class/MSC/Src/usbd_msc_storage_template.c (renamed from stmhal/usbdev/Class/MSC/Src/usbd_msc_storage_template.c)0
-rw-r--r--stmhal/usbdev/class/Template/Inc/usbd_template.h (renamed from stmhal/usbdev/Class/Template/Inc/usbd_template.h)0
-rw-r--r--stmhal/usbdev/class/Template/Src/usbd_template.c (renamed from stmhal/usbdev/Class/Template/Src/usbd_template.c)0
-rw-r--r--stmhal/usbdev/class/cdc/inc/usbd_cdc.h (renamed from stmhal/usbdev/Class/CDC/Inc/usbd_cdc.h)0
-rw-r--r--stmhal/usbdev/class/cdc/inc/usbd_cdc_if_template.h (renamed from stmhal/usbdev/Class/CDC/Inc/usbd_cdc_if_template.h)0
-rw-r--r--stmhal/usbdev/class/cdc/src/usbd_cdc.c (renamed from stmhal/usbdev/Class/CDC/Src/usbd_cdc.c)2
-rw-r--r--stmhal/usbdev/class/cdc/src/usbd_cdc_if_template.c (renamed from stmhal/usbdev/Class/CDC/Src/usbd_cdc_if_template.c)0
-rw-r--r--stmhal/usbdev/core/inc/usbd_conf_template.h (renamed from stmhal/usbdev/Core/Inc/usbd_conf_template.h)0
-rw-r--r--stmhal/usbdev/core/inc/usbd_core.h (renamed from stmhal/usbdev/Core/Inc/usbd_core.h)0
-rw-r--r--stmhal/usbdev/core/inc/usbd_ctlreq.h (renamed from stmhal/usbdev/Core/Inc/usbd_ctlreq.h)0
-rw-r--r--stmhal/usbdev/core/inc/usbd_def.h (renamed from stmhal/usbdev/Core/Inc/usbd_def.h)0
-rw-r--r--stmhal/usbdev/core/inc/usbd_ioreq.h (renamed from stmhal/usbdev/Core/Inc/usbd_ioreq.h)0
-rw-r--r--stmhal/usbdev/core/src/usbd_conf_template.c (renamed from stmhal/usbdev/Core/Src/usbd_conf_template.c)0
-rw-r--r--stmhal/usbdev/core/src/usbd_core.c (renamed from stmhal/usbdev/Core/Src/usbd_core.c)0
-rw-r--r--stmhal/usbdev/core/src/usbd_ctlreq.c (renamed from stmhal/usbdev/Core/Src/usbd_ctlreq.c)0
-rw-r--r--stmhal/usbdev/core/src/usbd_ioreq.c (renamed from stmhal/usbdev/Core/Src/usbd_ioreq.c)0
52 files changed, 1947 insertions, 17 deletions
diff --git a/stmhal/Makefile b/stmhal/Makefile
index 5ec7728083..1c044055c1 100644
--- a/stmhal/Makefile
+++ b/stmhal/Makefile
@@ -8,9 +8,8 @@ include ../py/py.mk
CMSIS_DIR=cmsis
HAL_DIR=hal
-#STMUSB_DIR=stmusb
-#STMUSBD_DIR=stmusbd
-#STMUSBH_DIR=stmusbh
+USBDEV_DIR=usbdev
+#USBHOST_DIR=usbhost
#FATFS_DIR=fatfs
#CC3K_DIR=cc3k
DFU=../tools/dfu.py
@@ -22,9 +21,8 @@ INC += -I$(PY_SRC)
INC += -I$(CMSIS_DIR)/inc
INC += -I$(CMSIS_DIR)/devinc
INC += -I$(HAL_DIR)/inc
-#INC += -I$(STMUSB_DIR)
-#INC += -I$(STMUSBD_DIR)
-#INC += -I$(STMUSBH_DIR)
+INC += -I$(USBDEV_DIR)/core/inc -I$(USBDEV_DIR)/class/cdc/inc
+#INC += -I$(USBHOST_DIR)
#INC += -I$(FATFS_DIR)
#INC += -I$(CC3K_DIR)
@@ -57,10 +55,15 @@ SRC_C = \
system_stm32f4xx.c \
stm32f4xx_it.c \
stm32f4xx_hal_msp.c \
+ usbd_conf.c \
+ usbd_desc.c \
+ usbd_cdc_interface.c \
+ pendsv.c \
systick.c \
led.c \
pin.c \
usart.c \
+ usb.c \
printf.c \
math.c \
malloc0.c \
@@ -70,14 +73,12 @@ SRC_C = \
import.c \
lexerfatfs.c \
-# pendsv.c \
# gpio.c \
# lcd.c \
# servo.c \
# flash.c \
# storage.c \
# accel.c \
-# usb.c \
# timer.c \
# audio.c \
# sdcard.c \
@@ -100,8 +101,10 @@ SRC_HAL = $(addprefix $(HAL_DIR)/src/,\
stm32f4xx_hal_cortex.c \
stm32f4xx_hal_dma.c \
stm32f4xx_hal_gpio.c \
+ stm32f4xx_hal_pcd.c \
stm32f4xx_hal_rcc.c \
stm32f4xx_hal_uart.c \
+ stm32f4xx_ll_usb.c \
)
SRC_STMPERIPH = $(addprefix $(STMPERIPH_DIR)/,\
@@ -136,8 +139,14 @@ SRC_STMUSB = $(addprefix $(STMUSB_DIR)/,\
)
# usb_otg.c \
-SRC_STMUSBD = $(addprefix $(STMUSBD_DIR)/,\
- usbd_core.c \
+SRC_USBDEV = $(addprefix $(USBDEV_DIR)/,\
+ core/src/usbd_core.c \
+ core/src/usbd_ctlreq.c \
+ core/src/usbd_ioreq.c \
+ class/cdc/src/usbd_cdc.c \
+ )
+
+# usbd_core.c \
usbd_ioreq.c \
usbd_req.c \
usbd_usr.c \
@@ -186,7 +195,7 @@ OBJ += $(PY_O)
OBJ += $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
OBJ += $(addprefix $(BUILD)/, $(SRC_S:.s=.o))
OBJ += $(addprefix $(BUILD)/, $(SRC_HAL:.c=.o))
-#OBJ += $(addprefix $(BUILD)/, $(SRC_STMUSB:.c=.o))
+OBJ += $(addprefix $(BUILD)/, $(SRC_USBDEV:.c=.o))
#OBJ += $(addprefix $(BUILD)/, $(SRC_STMUSBD:.c=.o))
#OBJ += $(addprefix $(BUILD)/, $(SRC_STMUSBH:.c=.o))
#OBJ += $(addprefix $(BUILD)/, $(SRC_FATFS:.c=.o))
diff --git a/stmhal/boards/PYBOARD4/stm32f4xx_hal_conf.h b/stmhal/boards/PYBOARD4/stm32f4xx_hal_conf.h
index bc13ac2c3a..315c24dc67 100644
--- a/stmhal/boards/PYBOARD4/stm32f4xx_hal_conf.h
+++ b/stmhal/boards/PYBOARD4/stm32f4xx_hal_conf.h
@@ -47,6 +47,7 @@
/* Exported constants --------------------------------------------------------*/
#define STM32F405xx
+#define USE_USB_FS
/* ########################## Module Selection ############################## */
/**
diff --git a/stmhal/main.c b/stmhal/main.c
index 97a512cda7..4b502fcf24 100644
--- a/stmhal/main.c
+++ b/stmhal/main.c
@@ -20,6 +20,7 @@
#include "misc.h"
#include "systick.h"
+#include "pendsv.h"
#include "led.h"
#include "usart.h"
#include "mpconfig.h"
@@ -37,16 +38,15 @@
#include "gccollect.h"
#include "pyexec.h"
#include "pybmodule.h"
+#include "usb.h"
#if 0
#include "ff.h"
#include "lexerfatfs.h"
-#include "pendsv.h"
#include "servo.h"
#include "lcd.h"
#include "storage.h"
#include "sdcard.h"
#include "accel.h"
-#include "usb.h"
#include "timer.h"
#include "pybwlan.h"
#include "usrsw.h"
@@ -82,9 +82,11 @@ void flash_error(int n) {
void __fatal_error(const char *msg) {
#if MICROPY_HW_HAS_LCD
+#if 0
lcd_print_strn("\nFATAL ERROR:\n", 14);
lcd_print_strn(msg, strlen(msg));
#endif
+#endif
for (;;) {
flash_error(1);
}
@@ -116,6 +118,9 @@ void fatality(void) {
led_state(PYB_LED_G1, 1);
led_state(PYB_LED_R2, 1);
led_state(PYB_LED_G2, 1);
+ for (;;) {
+ flash_error(1);
+ }
}
static const char fresh_boot_py[] =
@@ -244,9 +249,7 @@ int main(void) {
// basic sub-system init
sys_tick_init();
-#if 0
pendsv_init();
-#endif
led_init();
#if 0
@@ -469,6 +472,7 @@ soft_reset:
}
}
#endif
+#endif
#ifdef USE_HOST_MODE
// USB host
@@ -478,6 +482,22 @@ soft_reset:
pyb_usb_dev_init(PYB_USB_DEV_VCP_MSC);
#endif
+#if 0
+ // test USB CDC
+ extern uint8_t UserTxBuffer[];/* Received Data over UART (CDC interface) are stored in this buffer */
+ extern uint32_t UserTxBufPtrOut; /* Increment this pointer or roll it back to
+ start address when data are sent over USB */
+ for (;;) {
+ UserTxBuffer[UserTxBufPtrOut++] = 'a';
+ UserTxBuffer[UserTxBufPtrOut++] = 'b';
+ UserTxBuffer[UserTxBufPtrOut++] = 'c';
+ UserTxBuffer[UserTxBufPtrOut++] = 'd';
+ HAL_Delay(500);
+ led_toggle(PYB_LED_BLUE);
+ }
+#endif
+
+#if 0
// run main script
{
vstr_t *vstr = vstr_new();
diff --git a/stmhal/pendsv.c b/stmhal/pendsv.c
new file mode 100644
index 0000000000..706f9011ff
--- /dev/null
+++ b/stmhal/pendsv.c
@@ -0,0 +1,83 @@
+#include <stdlib.h>
+#include <stm32f4xx_hal.h>
+
+#include "misc.h"
+#include "mpconfig.h"
+#include "qstr.h"
+#include "obj.h"
+#include "pendsv.h"
+
+static void *pendsv_object = NULL;
+
+void pendsv_init(void) {
+ // set PendSV interrupt at lowest priority
+ HAL_NVIC_SetPriority(PendSV_IRQn, 0xf, 0xf);
+}
+
+// call this function to raise a pending exception during an interrupt
+// it will wait until all interrupts are finished then raise the given
+// exception object using nlr_jump in the context of the top-level thread
+void pendsv_nlr_jump(void *o) {
+ pendsv_object = o;
+ SCB->ICSR = SCB_ICSR_PENDSVSET_Msk;
+}
+
+// since we play tricks with the stack, the compiler must not generate a
+// prelude for this function
+void pendsv_isr_handler(void) __attribute__((naked));
+
+void pendsv_isr_handler(void) {
+ // re-jig the stack so that when we return from this interrupt handler
+ // it returns instead to nlr_jump with argument pendsv_object
+ // note that stack has a different layout if DEBUG is enabled
+ //
+ // on entry to this (naked) function, stack has the following layout:
+ //
+ // stack layout with DEBUG disabled:
+ // sp[6]: pc
+ // sp[5]: ?
+ // sp[4]: ?
+ // sp[3]: ?
+ // sp[2]: ?
+ // sp[1]: ?
+ // sp[0]: r0
+ //
+ // stack layout with DEBUG enabled:
+ // sp[8]: pc
+ // sp[7]: lr
+ // sp[6]: ?
+ // sp[5]: ?
+ // sp[4]: ?
+ // sp[3]: ?
+ // sp[2]: r0
+ // sp[1]: 0xfffffff9
+ // sp[0]: ?
+
+ __asm volatile (
+ "ldr r0, pendsv_object_ptr\n"
+ "ldr r0, [r0]\n"
+#if defined(PENDSV_DEBUG)
+ "str r0, [sp, #8]\n"
+#else
+ "str r0, [sp, #0]\n"
+#endif
+ "ldr r0, nlr_jump_ptr\n"
+#if defined(PENDSV_DEBUG)
+ "str r0, [sp, #32]\n"
+#else
+ "str r0, [sp, #24]\n"
+#endif
+ "bx lr\n"
+ ".align 2\n"
+ "pendsv_object_ptr: .word pendsv_object\n"
+ "nlr_jump_ptr: .word nlr_jump\n"
+ );
+
+ /*
+ uint32_t x[2] = {0x424242, 0xdeaddead};
+ printf("PendSV: %p\n", x);
+ for (uint32_t *p = (uint32_t*)(((uint32_t)x - 15) & 0xfffffff0), i = 64; i > 0; p += 4, i -= 4) {
+ printf(" %p: %08x %08x %08x %08x\n", p, (uint)p[0], (uint)p[1], (uint)p[2], (uint)p[3]);
+ }
+ */
+}
diff --git a/stmhal/pendsv.h b/stmhal/pendsv.h
new file mode 100644
index 0000000000..f13cb182f5
--- /dev/null
+++ b/stmhal/pendsv.h
@@ -0,0 +1,3 @@
+void pendsv_init(void);
+void pendsv_nlr_jump(void *val);
+void pendsv_isr_handler(void);
diff --git a/stmhal/stm32f4xx_it.c b/stmhal/stm32f4xx_it.c
index 96b12bfe4a..4be78deddb 100644
--- a/stmhal/stm32f4xx_it.c
+++ b/stmhal/stm32f4xx_it.c
@@ -56,6 +56,9 @@
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
+extern void fatality();
+extern PCD_HandleTypeDef hpcd;
+
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
@@ -82,6 +85,7 @@ void HardFault_Handler(void)
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
+ fatality();
}
}
@@ -95,6 +99,7 @@ void MemManage_Handler(void)
/* Go to infinite loop when Memory Manage exception occurs */
while (1)
{
+ fatality();
}
}
@@ -108,6 +113,7 @@ void BusFault_Handler(void)
/* Go to infinite loop when Bus Fault exception occurs */
while (1)
{
+ fatality();
}
}
@@ -121,6 +127,7 @@ void UsageFault_Handler(void)
/* Go to infinite loop when Usage Fault exception occurs */
while (1)
{
+ fatality();
}
}
@@ -149,6 +156,8 @@ void DebugMon_Handler(void)
*/
void PendSV_Handler(void)
{
+ extern void pendsv_isr_handler(void);
+ pendsv_isr_handler();
}
/**
@@ -158,7 +167,7 @@ void PendSV_Handler(void)
*/
void SysTick_Handler(void)
{
- HAL_IncTick();
+ HAL_IncTick();
}
/******************************************************************************/
@@ -169,6 +178,72 @@ void SysTick_Handler(void)
/******************************************************************************/
/**
+ * @brief This function handles USB-On-The-Go FS global interrupt request.
+ * @param None
+ * @retval None
+ */
+#ifdef USE_USB_FS
+void OTG_FS_IRQHandler(void)
+#elif defined(USE_USB_HS)
+void OTG_HS_IRQHandler(void)
+#endif
+{
+ HAL_PCD_IRQHandler(&hpcd);
+}
+
+/**
+ * @brief This function handles USB OTG FS or HS Wakeup IRQ Handler.
+ * @param None
+ * @retval None
+ */
+#ifdef USE_USB_FS
+void OTG_FS_WKUP_IRQHandler(void)
+#elif defined(USE_USB_HS)
+void OTG_HS_WKUP_IRQHandler(void)
+#endif
+{
+
+ if((&hpcd)->Init.low_power_enable)
+ {
+ /* Reset SLEEPDEEP bit of Cortex System Control Register */
+ SCB->SCR &= (uint32_t)~((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk));
+
+ /* Configures system clock after wake-up from STOP: enable HSE, PLL and select
+ PLL as system clock source (HSE and PLL are disabled in STOP mode) */
+
+ __HAL_RCC_HSE_CONFIG(RCC_HSE_ON);
+
+ /* Wait till HSE is ready */
+ while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET)
+ {}
+
+ /* Enable the main PLL. */
+ __HAL_RCC_PLL_ENABLE();
+
+ /* Wait till PLL is ready */
+ while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET)
+ {}
+
+ /* Select PLL as SYSCLK */
+ MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, RCC_SYSCLKSOURCE_PLLCLK);
+
+ while (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL)
+ {}
+
+ /* ungate PHY clock */
+ __HAL_PCD_UNGATE_PHYCLOCK((&hpcd));
+ }
+#ifdef USE_USB_FS
+ /* Clear EXTI pending Bit*/
+ __HAL_USB_FS_EXTI_CLEAR_FLAG();
+#elif defined(USE_USB_HS)
+ /* Clear EXTI pending Bit*/
+ __HAL_USB_HS_EXTI_CLEAR_FLAG();
+#endif
+
+}
+
+/**
* @brief This function handles PPP interrupt request.
* @param None
* @retval None
diff --git a/stmhal/stm32f4xx_it.h b/stmhal/stm32f4xx_it.h
index c2aabfadd0..2bdab3f805 100644
--- a/stmhal/stm32f4xx_it.h
+++ b/stmhal/stm32f4xx_it.h
@@ -58,6 +58,11 @@ void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
+#ifdef USE_USB_FS
+void OTG_FS_IRQHandler(void);
+#elif defined(USE_USB_HS)
+void OTG_HS_IRQHandler(void);
+#endif
#ifdef __cplusplus
}
diff --git a/stmhal/usb.c b/stmhal/usb.c
new file mode 100644
index 0000000000..8cfb0e7dfd
--- /dev/null
+++ b/stmhal/usb.c
@@ -0,0 +1,240 @@
+#include <string.h>
+
+/*
+#include "usb_core.h"
+#include "usbd_cdc_core.h"
+#include "usbd_pyb_core.h"
+#include "usbd_usr.h"
+*/
+#include "usbd_core.h"
+#include "usbd_desc.h"
+#include "usbd_cdc.h"
+#include "usbd_cdc_interface.h"
+
+#include "misc.h"
+#include "mpconfig.h"
+#include "qstr.h"
+#include "obj.h"
+#include "pendsv.h"
+#include "usb.h"
+
+#ifdef USE_DEVICE_MODE
+//extern CDC_IF_Prop_TypeDef VCP_fops;
+USBD_HandleTypeDef hUSBDDevice;
+#endif
+
+static int dev_is_enabled = 0;
+uint32_t APP_dev_is_connected = 0; /* used by usbd_cdc_vcp */
+static char rx_buf[64];
+static int rx_buf_in;
+static int rx_buf_out;
+static int interrupt_char = VCP_CHAR_NONE;
+mp_obj_t mp_const_vcp_interrupt = MP_OBJ_NULL;
+
+void pyb_usb_dev_init(int usb_dev_type) {
+#ifdef USE_DEVICE_MODE
+ if (!dev_is_enabled) {
+ // only init USB once in the device's power-lifetime
+ switch (usb_dev_type) {
+ case PYB_USB_DEV_VCP_MSC:
+ // XXX USBD_CDC_Init (called by one of these functions below) uses malloc,
+ // so the memory is invalid after a soft reset (which resets the GC).
+ USBD_Init(&hUSBDDevice, &VCP_Desc, 0);
+ USBD_RegisterClass(&hUSBDDevice, &USBD_CDC);
+ USBD_CDC_RegisterInterface(&hUSBDDevice, &USBD_CDC_fops);
+ USBD_Start(&hUSBDDevice);
+ //USBD_Init(&USB_OTG_Core, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_PYB_cb, &USR_cb);
+ break;
+
+ case PYB_USB_DEV_HID:
+ //USBD_Init(&USB_OTG_Core, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_PYB_HID_cb, &USR_cb);
+ // TODO
+ break;
+ }
+ }
+ rx_buf_in = 0;
+ rx_buf_out = 0;
+ interrupt_char = VCP_CHAR_NONE;
+ dev_is_enabled = 1;
+
+ // create an exception object for interrupting by VCP
+ mp_const_vcp_interrupt = mp_obj_new_exception_msg(&mp_type_OSError, "VCPInterrupt");
+#endif
+}
+
+bool usb_vcp_is_enabled(void) {
+ return dev_is_enabled;
+}
+
+bool usb_vcp_is_connected(void) {
+ return APP_dev_is_connected;
+}
+
+void usb_vcp_set_interrupt_char(int c) {
+ if (dev_is_enabled) {
+ interrupt_char = c;
+ }
+}
+
+void usb_vcp_receive(const char *buf, uint32_t len) {
+ if (dev_is_enabled) {
+ for (int i = 0; i < len; i++) {
+
+ // catch special interrupt character
+ if (buf[i] == interrupt_char) {
+ // raise exception when interrupts are finished
+ mp_obj_exception_clear_traceback(mp_const_vcp_interrupt);
+ pendsv_nlr_jump(mp_const_vcp_interrupt);
+ interrupt_char = VCP_CHAR_NONE;
+ continue;
+ }
+
+ rx_buf[rx_buf_in++] = buf[i];
+ if (rx_buf_in >= sizeof(rx_buf)) {
+ rx_buf_in = 0;
+ }
+ if (rx_buf_in == rx_buf_out) {
+ rx_buf_out = rx_buf_in + 1;
+ if (rx_buf_out >= sizeof(rx_buf)) {
+ rx_buf_out = 0;
+ }
+ }
+ }
+ }
+}
+
+int usb_vcp_rx_any(void) {
+ if (rx_buf_in >= rx_buf_out) {
+ return rx_buf_in - rx_buf_out;
+ } else {
+ return rx_buf_in + sizeof(rx_buf) - rx_buf_out;
+ }
+}
+
+char usb_vcp_rx_get(void) {
+ while (rx_buf_out == rx_buf_in) {
+ }
+ char c = rx_buf[rx_buf_out];
+ rx_buf_out += 1;
+ if (rx_buf_out >= sizeof(rx_buf)) {
+ rx_buf_out = 0;
+ }
+ return c;
+}
+
+void usb_vcp_send_str(const char *str) {
+ usb_vcp_send_strn(str, strlen(str));
+}
+
+void usb_vcp_send_strn(const char *str, int len) {
+#ifdef USE_DEVICE_MODE
+ if (dev_is_enabled) {
+ #if 0
+ USBD_CDC_fops.pIf_DataTx((const uint8_t*)str, len);
+ #endif
+ }
+#endif
+}
+
+#include "usbd_conf.h"
+
+/* These are external variables imported from CDC core to be used for IN
+ transfer management. */
+#ifdef USE_DEVICE_MODE
+extern uint8_t UserRxBuffer[];/* Received Data over USB are stored in this buffer */
+extern uint8_t UserTxBuffer[];/* Received Data over UART (CDC interface) are stored in this buffer */
+extern uint32_t BuffLength;
+extern uint32_t UserTxBufPtrIn;/* Increment this pointer or roll it back to
+ start address when data are received over USART */
+extern uint32_t UserTxBufPtrOut; /* Increment this pointer or roll it back to
+ start address when data are sent over USB */
+#endif
+
+void usb_vcp_send_strn_cooked(const char *str, int len) {
+#ifdef USE_DEVICE_MODE
+ #if 0
+ for (const char *top = str + len; str < top; str++) {
+ if (*str == '\n') {
+ APP_Rx_Buffer[APP_Rx_ptr_in] = '\r';
+ APP_Rx_ptr_in = (APP_Rx_ptr_in + 1) & (APP_RX_DATA_SIZE - 1);
+ }
+ APP_Rx_Buffer[APP_Rx_ptr_in] = *str;
+ APP_Rx_ptr_in = (APP_Rx_ptr_in + 1) & (APP_RX_DATA_SIZE - 1);
+ }
+ #endif
+#endif
+}
+
+void usb_hid_send_report(uint8_t *buf) {
+#ifdef USE_DEVICE_MODE
+ #if 0
+ USBD_HID_SendReport(&USB_OTG_Core, buf, 4);
+ #endif
+#endif
+}
+
+/******************************************************************************/
+// code for experimental USB OTG support
+
+#ifdef USE_HOST_MODE
+
+#include "led.h"
+#include "usbh_core.h"
+#include "usbh_usr.h"
+#include "usbh_hid_core.h"
+#include "usbh_hid_keybd.h"
+#include "usbh_hid_mouse.h"
+
+__ALIGN_BEGIN USBH_HOST USB_Host __ALIGN_END ;
+
+static int host_is_enabled = 0;
+
+void pyb_usb_host_init(void) {
+ if (!host_is_enabled) {
+ // only init USBH once in the device's power-lifetime
+ /* Init Host Library */
+ USBH_Init(&USB_OTG_Core, USB_OTG_FS_CORE_ID, &USB_Host, &HID_cb, &USR_Callbacks);
+ }
+ host_is_enabled = 1;
+}
+
+void pyb_usb_host_process(void) {
+ USBH_Process(&USB_OTG_Core, &USB_Host);
+}
+
+uint8_t usb_keyboard_key = 0;
+
+// TODO this is an ugly hack to get key presses
+uint pyb_usb_host_get_keyboard(void) {
+ uint key = usb_keyboard_key;
+ usb_keyboard_key = 0;
+ return key;
+}
+
+void USR_MOUSE_Init(void) {
+ led_state(4, 1);
+ USB_OTG_BSP_mDelay(100);
+ led_state(4, 0);
+}
+
+void USR_MOUSE_ProcessData(HID_MOUSE_Data_TypeDef *data) {
+ led_state(4, 1);
+ USB_OTG_BSP_mDelay(50);
+ led_state(4, 0);
+}
+
+void USR_KEYBRD_Init(void) {
+ led_state(4, 1);
+ USB_OTG_BSP_mDelay(100);
+ led_state(4, 0);
+}
+
+void USR_KEYBRD_ProcessData(uint8_t pbuf) {
+ led_state(4, 1);
+ USB_OTG_BSP_mDelay(50);
+ led_state(4, 0);
+ //lcd_print_strn((char*)&pbuf, 1);
+ usb_keyboard_key = pbuf;
+}
+
+#endif // USE_HOST_MODE
diff --git a/stmhal/usb.h b/stmhal/usb.h
new file mode 100644
index 0000000000..a0fb153240
--- /dev/null
+++ b/stmhal/usb.h
@@ -0,0 +1,23 @@
+#define VCP_CHAR_NONE (0)
+#define VCP_CHAR_CTRL_A (1)
+#define VCP_CHAR_CTRL_B (2)
+#define VCP_CHAR_CTRL_C (3)
+#define VCP_CHAR_CTRL_D (4)
+
+#define PYB_USB_DEV_VCP_MSC (0)
+#define PYB_USB_DEV_HID (1)
+
+void pyb_usb_dev_init(int usb_dev_type);
+bool usb_vcp_is_enabled(void);
+bool usb_vcp_is_connected(void);
+void usb_vcp_set_interrupt_char(int c);
+int usb_vcp_rx_any(void);
+char usb_vcp_rx_get(void);
+void usb_vcp_send_str(const char* str);
+void usb_vcp_send_strn(const char* str, int len);
+void usb_vcp_send_strn_cooked(const char *str, int len);
+void usb_hid_send_report(uint8_t *buf); // 4 bytes for mouse: ?, x, y, ?
+
+void pyb_usb_host_init(void);
+void pyb_usb_host_process(void);
+uint pyb_usb_host_get_keyboard(void);
diff --git a/stmhal/usbd_cdc_interface.c b/stmhal/usbd_cdc_interface.c
new file mode 100644
index 0000000000..cb1c41f24f
--- /dev/null
+++ b/stmhal/usbd_cdc_interface.c
@@ -0,0 +1,461 @@
+/**
+ ******************************************************************************
+ * @file USB_Device/CDC_Standalone/Src/usbd_cdc_interface.c
+ * @author MCD Application Team
+ * @version V1.0.1
+ * @date 26-February-2014
+ * @brief Source file for USBD CDC interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT(c) 2014 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 "stm32f4xx_hal.h"
+#include "usbd_cdc_interface.h"
+
+/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
+ * @{
+ */
+
+/** @defgroup USBD_CDC
+ * @brief usbd core module
+ * @{
+ */
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+#define APP_RX_DATA_SIZE 2048
+#define APP_TX_DATA_SIZE 2048
+
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+USBD_CDC_LineCodingTypeDef LineCoding =
+ {
+ 115200, /* baud rate*/
+ 0x00, /* stop bits-1*/
+ 0x00, /* parity - none*/
+ 0x08 /* nb. of bits 8*/
+ };
+
+uint8_t UserRxBuffer[APP_RX_DATA_SIZE];/* Received Data over USB are stored in this buffer */
+uint8_t UserTxBuffer[APP_TX_DATA_SIZE];/* Received Data over UART (CDC interface) are stored in this buffer */
+uint32_t BuffLength;
+uint32_t UserTxBufPtrIn = 0;/* Increment this pointer or roll it back to
+ start address when data are received over USART */
+uint32_t UserTxBufPtrOut = 0; /* Increment this pointer or roll it back to
+ start address when data are sent over USB */
+
+/* UART handler declaration */
+UART_HandleTypeDef UartHandle;
+/* TIM handler declaration */
+TIM_HandleTypeDef TimHandle;
+/* USB handler declaration */
+extern USBD_HandleTypeDef hUSBDDevice;
+
+/* Private function prototypes -----------------------------------------------*/
+static int8_t CDC_Itf_Init (void);
+static int8_t CDC_Itf_DeInit (void);
+static int8_t CDC_Itf_Control (uint8_t cmd, uint8_t* pbuf, uint16_t length);
+static int8_t CDC_Itf_Receive (uint8_t* pbuf, uint32_t *Len);
+
+static void Error_Handler(void);
+static void ComPort_Config(void);
+//static void TIM_Config(void);
+
+USBD_CDC_ItfTypeDef USBD_CDC_fops =
+{
+ CDC_Itf_Init,
+ CDC_Itf_DeInit,
+ CDC_Itf_Control,
+ CDC_Itf_Receive
+};
+
+/* Private functions ---------------------------------------------------------*/
+
+/**
+ * @brief CDC_Itf_Init
+ * Initializes the CDC media low layer
+ * @param None
+ * @retval Result of the opeartion: USBD_OK if all operations are OK else USBD_FAIL
+ */
+static int8_t CDC_Itf_Init(void)
+{
+#if 0
+ /*##-1- Configure the UART peripheral ######################################*/
+ /* Put the USART peripheral in the Asynchronous mode (UART Mode) */
+ /* USART configured as follow:
+ - Word Length = 8 Bits
+ - Stop Bit = One Stop bit
+ - Parity = No parity
+ - BaudRate = 115200 baud
+ - Hardware flow control disabled (RTS and CTS signals) */
+ UartHandle.Instance = USARTx;
+ UartHandle.Init.BaudRate = 115200;
+ UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
+ UartHandle.Init.StopBits = UART_STOPBITS_1;
+ UartHandle.Init.Parity = UART_PARITY_NONE;
+ UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ UartHandle.Init.Mode = UART_MODE_TX_RX;
+
+ if(HAL_UART_Init(&UartHandle) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+
+ /*##-2- Put UART peripheral in IT reception process ########################*/
+ /* Any data received will be stored in "UserTxBuffer" buffer */
+ if(HAL_UART_Receive_IT(&UartHandle, (uint8_t *)UserTxBuffer, 1) != HAL_OK)
+ {
+ /* Transfer error in reception process */
+ Error_Handler();
+ }
+
+ /*##-3- Configure the TIM Base generation #################################*/
+ TIM_Config();
+
+ /*##-4- Start the TIM Base generation in interrupt mode ####################*/
+ /* Start Channel1 */
+ if(HAL_TIM_Base_Start_IT(&TimHandle) != HAL_OK)
+ {
+ /* Starting Error */
+ Error_Handler();
+ }
+#endif
+
+ /*##-5- Set Application Buffers ############################################*/
+ USBD_CDC_SetTxBuffer(&hUSBDDevice, UserTxBuffer, 0);
+ USBD_CDC_SetRxBuffer(&hUSBDDevice, UserRxBuffer);
+
+ return (USBD_OK);
+}
+
+/**
+ * @brief CDC_Itf_DeInit
+ * DeInitializes the CDC media low layer
+ * @param None
+ * @retval Result of the opeartion: USBD_OK if all operations are OK else USBD_FAIL
+ */
+static int8_t CDC_Itf_DeInit(void)
+{
+#if 0
+ /* DeInitialize the UART peripheral */
+ if(HAL_UART_DeInit(&UartHandle) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+#endif
+ return (USBD_OK);
+}
+
+/**
+ * @brief CDC_Itf_Control
+ * Manage the CDC class requests
+ * @param Cmd: Command code
+ * @param Buf: Buffer containing command data (request parameters)
+ * @param Len: Number of data to be sent (in bytes)
+ * @retval Result of the opeartion: USBD_OK if all operations are OK else USBD_FAIL
+ */
+static int8_t CDC_Itf_Control (uint8_t cmd, uint8_t* pbuf, uint16_t length)
+{
+ switch (cmd)
+ {
+ case CDC_SEND_ENCAPSULATED_COMMAND:
+ /* Add your code here */
+ break;
+
+ case CDC_GET_ENCAPSULATED_RESPONSE:
+ /* Add your code here */
+ break;
+
+ case CDC_SET_COMM_FEATURE:
+ /* Add your code here */
+ break;
+
+ case CDC_GET_COMM_FEATURE:
+ /* Add your code here */
+ break;
+
+ case CDC_CLEAR_COMM_FEATURE:
+ /* Add your code here */
+ break;
+
+ case CDC_SET_LINE_CODING:
+ LineCoding.bitrate = (uint32_t)(pbuf[0] | (pbuf[1] << 8) |\
+ (pbuf[2] << 16) | (pbuf[3] << 24));
+ LineCoding.format = pbuf[4];
+ LineCoding.paritytype = pbuf[5];
+ LineCoding.datatype = pbuf[6];
+
+ /* Set the new configuration */
+ ComPort_Config();
+ break;
+
+ case CDC_GET_LINE_CODING:
+ pbuf[0] = (uint8_t)(LineCoding.bitrate);
+ pbuf[1] = (uint8_t)(LineCoding.bitrate >> 8);
+ pbuf[2] = (uint8_t)(LineCoding.bitrate >> 16);
+ pbuf[3] = (uint8_t)(LineCoding.bitrate >> 24);
+ pbuf[4] = LineCoding.format;
+ pbuf[5] = LineCoding.paritytype;
+ pbuf[6] = LineCoding.datatype;
+
+ /* Add your code here */
+ break;
+
+ case CDC_SET_CONTROL_LINE_STATE:
+ /* Add your code here */
+ break;
+
+ case CDC_SEND_BREAK:
+ /* Add your code here */
+ break;
+
+ default:
+ break;
+ }
+
+ return (USBD_OK);
+}
+
+/**
+ * @brief TIM period elapsed callback
+ * @param htim: TIM handle
+ * @retval None
+ */
+void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
+{
+ uint32_t buffptr;
+ uint32_t buffsize;
+
+ if(UserTxBufPtrOut != UserTxBufPtrIn)
+ {
+ if(UserTxBufPtrOut > UserTxBufPtrIn) /* rollback */
+ {
+ buffsize = APP_RX_DATA_SIZE - UserTxBufPtrOut;
+ }
+ else
+ {
+ buffsize = UserTxBufPtrIn - UserTxBufPtrOut;
+ }
+
+ buffptr = UserTxBufPtrOut;
+
+ USBD_CDC_SetTxBuffer(&hUSBDDevice, (uint8_t*)&UserTxBuffer[buffptr], buffsize);
+
+ if(USBD_CDC_TransmitPacket(&hUSBDDevice) == USBD_OK)
+ {
+ UserTxBufPtrOut += buffsize;
+ if (UserTxBufPtrOut == APP_RX_DATA_SIZE)
+ {
+ UserTxBufPtrOut = 0;
+ }
+ }
+ }
+}
+
+/**
+ * @brief Rx Transfer completed callback
+ * @param huart: UART handle
+ * @retval None
+ */
+void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+ /* Increment Index for buffer writing */
+ UserTxBufPtrIn++;
+
+ /* To avoid buffer overflow */
+ if(UserTxBufPtrIn == APP_RX_DATA_SIZE)
+ {
+ UserTxBufPtrIn = 0;
+ }
+
+ /* Start another reception: provide the buffer pointer with offset and the buffer size */
+ HAL_UART_Receive_IT(huart, (uint8_t *)(UserTxBuffer + UserTxBufPtrIn), 1);
+}
+
+/**
+ * @brief CDC_Itf_DataRx
+ * Data received over USB OUT endpoint are sent over CDC interface
+ * through this function.
+ * @param Buf: Buffer of data to be transmitted
+ * @param Len: Number of data received (in bytes)
+ * @retval Result of the opeartion: USBD_OK if all operations are OK else USBD_FAIL
+ */
+static int8_t CDC_Itf_Receive(uint8_t* Buf, uint32_t *Len)
+{
+ HAL_UART_Transmit_DMA(&UartHandle, Buf, *Len);
+ return (USBD_OK);
+}
+
+/**
+ * @brief Tx Transfer completed callback
+ * @param huart: UART handle
+ * @retval None
+ */
+void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
+{
+ /* Initiate next USB packet transfer once UART completes transfer (transmitting data over Tx line) */
+ USBD_CDC_ReceivePacket(&hUSBDDevice);
+}
+
+/**
+ * @brief ComPort_Config
+ * Configure the COM Port with the parameters received from host.
+ * @param None.
+ * @retval None.
+ * @note When a configuration is not supported, a default value is used.
+ */
+static void ComPort_Config(void)
+{
+ if(HAL_UART_DeInit(&UartHandle) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+
+ /* set the Stop bit */
+ switch (LineCoding.format)
+ {
+ case 0:
+ UartHandle.Init.StopBits = UART_STOPBITS_1;
+ break;
+ case 2:
+ UartHandle.Init.StopBits = UART_STOPBITS_2;
+ break;
+ default :
+ UartHandle.Init.StopBits = UART_STOPBITS_1;
+ break;
+ }
+
+ /* set the parity bit*/
+ switch (LineCoding.paritytype)
+ {
+ case 0:
+ UartHandle.Init.Parity = UART_PARITY_NONE;
+ break;
+ case 1:
+ UartHandle.Init.Parity = UART_PARITY_ODD;
+ break;
+ case 2:
+ UartHandle.Init.Parity = UART_PARITY_EVEN;
+ break;
+ default :
+ UartHandle.Init.Parity = UART_PARITY_NONE;
+ break;
+ }
+
+ /*set the data type : only 8bits and 9bits is supported */
+ switch (LineCoding.datatype)
+ {
+ case 0x07:
+ /* With this configuration a parity (Even or Odd) must be set */
+ UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
+ break;
+ case 0x08:
+ if(UartHandle.Init.Parity == UART_PARITY_NONE)
+ {
+ UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
+ }
+ else
+ {
+ UartHandle.Init.WordLength = UART_WORDLENGTH_9B;
+ }
+
+ break;
+ default :
+ UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
+ break;
+ }
+
+ UartHandle.Init.BaudRate = LineCoding.bitrate;
+ UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ UartHandle.Init.Mode = UART_MODE_TX_RX;
+
+ if(HAL_UART_Init(&UartHandle) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+
+ /* Start reception: provide the buffer pointer with offset and the buffer size */
+ HAL_UART_Receive_IT(&UartHandle, (uint8_t *)(UserTxBuffer + UserTxBufPtrIn), 1);
+}
+
+/**
+ * @brief TIM_Config: Configure TIMx timer
+ * @param None.
+ * @retval None.
+ */
+#if 0
+static void TIM_Config(void)
+{
+ /* Set TIMx instance */
+ TimHandle.Instance = TIMx;
+
+ /* Initialize TIM3 peripheral as follow:
+ + Period = 10000 - 1
+ + Prescaler = ((SystemCoreClock/2)/10000) - 1
+ + ClockDivision = 0
+ + Counter direction = Up
+ */
+ TimHandle.Init.Period = (CDC_POLLING_INTERVAL*1000) - 1;
+ TimHandle.Init.Prescaler = 84-1;
+ TimHandle.Init.ClockDivision = 0;
+ TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
+ if(HAL_TIM_Base_Init(&TimHandle) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+}
+#endif
+
+/**
+ * @brief UART error callbacks
+ * @param UartHandle: UART handle
+ * @retval None
+ */
+void HAL_UART_ErrorCallback(UART_HandleTypeDef *UartHandle)
+{
+ /* Transfer error occured in reception and/or transmission process */
+ Error_Handler();
+}
+
+/**
+ * @brief This function is executed in case of error occurrence.
+ * @param None
+ * @retval None
+ */
+static void Error_Handler(void)
+{
+ /* Add your own code here */
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/stmhal/usbd_cdc_interface.h b/stmhal/usbd_cdc_interface.h
new file mode 100644
index 0000000000..140ea06f16
--- /dev/null
+++ b/stmhal/usbd_cdc_interface.h
@@ -0,0 +1,87 @@
+/**
+ ******************************************************************************
+ * @file USB_Device/CDC_Standalone/Inc/usbd_cdc_interface.h
+ * @author MCD Application Team
+ * @version V1.0.1
+ * @date 26-February-2014
+ * @brief Header for usbd_cdc_interface.c file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT(c) 2014 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 __USBD_CDC_IF_H
+#define __USBD_CDC_IF_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "usbd_cdc.h"
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* User can use this section to tailor USARTx/UARTx instance used and associated
+ resources */
+/* Definition for USARTx clock resources */
+#define USARTx USART3
+#define USARTx_CLK_ENABLE() __USART3_CLK_ENABLE();
+#define DMAx_CLK_ENABLE() __DMA1_CLK_ENABLE()
+#define USARTx_RX_GPIO_CLK_ENABLE() __GPIOC_CLK_ENABLE()
+#define USARTx_TX_GPIO_CLK_ENABLE() __GPIOC_CLK_ENABLE()
+
+#define USARTx_FORCE_RESET() __USART3_FORCE_RESET()
+#define USARTx_RELEASE_RESET() __USART3_RELEASE_RESET()
+
+/* Definition for USARTx Pins */
+#define USARTx_TX_PIN GPIO_PIN_10
+#define USARTx_TX_GPIO_PORT GPIOC
+#define USARTx_TX_AF GPIO_AF7_USART3
+#define USARTx_RX_PIN GPIO_PIN_11
+#define USARTx_RX_GPIO_PORT GPIOC
+#define USARTx_RX_AF GPIO_AF7_USART3
+
+/* Definition for USARTx's NVIC: used for receiving data over Rx pin */
+#define USARTx_IRQn USART3_IRQn
+#define USARTx_IRQHandler USART3_IRQHandler
+
+/* Definition for USARTx's DMA: used for transmitting data over Tx pin */
+#define USARTx_TX_DMA_CHANNEL DMA_CHANNEL_4
+#define USARTx_TX_DMA_STREAM DMA1_Stream3
+#define USARTx_DMA_TX_IRQHandler DMA1_Stream3_IRQHandler
+#define USARTx_DMA_TX_IRQn DMA1_Stream3_IRQn
+
+/* Definition for TIMx clock resources */
+#define TIMx TIM3
+#define TIMx_CLK_ENABLE __TIM3_CLK_ENABLE
+#define TIMx_FORCE_RESET() __USART3_FORCE_RESET()
+#define TIMx_RELEASE_RESET() __USART3_RELEASE_RESET()
+
+/* Definition for TIMx's NVIC */
+#define TIMx_IRQn TIM3_IRQn
+#define TIMx_IRQHandler TIM3_IRQHandler
+
+/* Periodically, the state of the buffer "UserTxBuffer" is checked.
+ The period depends on CDC_POLLING_INTERVAL */
+#define CDC_POLLING_INTERVAL 5 /* in ms. The max is 65 and the min is 1 */
+
+extern USBD_CDC_ItfTypeDef USBD_CDC_fops;
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+#endif /* __USBD_CDC_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/stmhal/usbd_conf.c b/stmhal/usbd_conf.c
new file mode 100644
index 0000000000..8594db13af
--- /dev/null
+++ b/stmhal/usbd_conf.c
@@ -0,0 +1,565 @@
+/**
+ ******************************************************************************
+ * @file USB_Device/CDC_Standalone/Src/usbd_conf.c
+ * @author MCD Application Team
+ * @version V1.0.1
+ * @date 26-February-2014
+ * @brief This file implements the USB Device library callbacks and MSP
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT(c) 2014 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 "stm32f4xx_hal.h"
+#include "usbd_core.h"
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+PCD_HandleTypeDef hpcd;
+
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/*******************************************************************************
+ PCD BSP Routines
+*******************************************************************************/
+/**
+ * @brief Initializes the PCD MSP.
+ * @param hpcd: PCD handle
+ * @retval None
+ */
+void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)
+{
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ if(hpcd->Instance == USB_OTG_FS)
+ {
+ /* Configure USB FS GPIOs */
+ __GPIOA_CLK_ENABLE();
+
+ GPIO_InitStruct.Pin = (GPIO_PIN_11 | GPIO_PIN_12);
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /* Configure VBUS Pin */
+ GPIO_InitStruct.Pin = GPIO_PIN_9;
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = GPIO_PIN_10;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /* Enable USB FS Clocks */
+ __USB_OTG_FS_CLK_ENABLE();
+
+ /* Set USBFS Interrupt priority */
+ HAL_NVIC_SetPriority(OTG_FS_IRQn, 6, 0);
+
+ /* Enable USBFS Interrupt */
+ HAL_NVIC_EnableIRQ(OTG_FS_IRQn);
+ }
+
+ else if(hpcd->Instance == USB_OTG_HS)
+ {
+ /* Configure USB FS GPIOs */
+ __GPIOA_CLK_ENABLE();
+ __GPIOB_CLK_ENABLE();
+ __GPIOC_CLK_ENABLE();
+ __GPIOH_CLK_ENABLE();
+ __GPIOI_CLK_ENABLE();
+
+ /* CLK */
+ GPIO_InitStruct.Pin = GPIO_PIN_5;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /* D0 */
+ GPIO_InitStruct.Pin = GPIO_PIN_3;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /* D1 D2 D3 D4 D5 D6 D7 */
+ GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_5 |\
+ GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /* STP */
+ GPIO_InitStruct.Pin = GPIO_PIN_0;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+
+ /* NXT */
+ GPIO_InitStruct.Pin = GPIO_PIN_4;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;
+ HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
+
+ /* DIR */
+ GPIO_InitStruct.Pin = GPIO_PIN_11;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;
+ HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
+
+ /* Enable USB HS Clocks */
+ __USB_OTG_HS_CLK_ENABLE();
+ __USB_OTG_HS_ULPI_CLK_ENABLE();
+
+ /* Set USBHS Interrupt to the lowest priority */
+ HAL_NVIC_SetPriority(OTG_HS_IRQn, 6, 0);
+
+ /* Enable USBHS Interrupt */
+ HAL_NVIC_EnableIRQ(OTG_HS_IRQn);
+ }
+}
+/**
+ * @brief DeInitializes the PCD MSP.
+ * @param hpcd: PCD handle
+ * @retval None
+ */
+void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd)
+{
+ if(hpcd->Instance == USB_OTG_FS)
+ {
+ /* Disable USB FS Clocks */
+ __USB_OTG_FS_CLK_DISABLE();
+ __SYSCFG_CLK_DISABLE();
+ }
+ else if(hpcd->Instance == USB_OTG_HS)
+ {
+ /* Disable USB FS Clocks */
+ __USB_OTG_HS_CLK_DISABLE();
+ __SYSCFG_CLK_DISABLE();
+ }
+}
+
+/*******************************************************************************
+ LL Driver Callbacks (PCD -> USB Device Library)
+*******************************************************************************/
+
+
+/**
+ * @brief Setup stage callback.
+ * @param hpcd: PCD handle
+ * @retval None
+ */
+void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
+{
+ USBD_LL_SetupStage(hpcd->pData, (uint8_t *)hpcd->Setup);
+}
+
+/**
+ * @brief Data Out stage callback.
+ * @param hpcd: PCD handle
+ * @param epnum: Endpoint Number
+ * @retval None
+ */
+void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
+{
+ USBD_LL_DataOutStage(hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff);
+}
+
+/**
+ * @brief Data In stage callback.
+ * @param hpcd: PCD handle
+ * @param epnum: Endpoint Number
+ * @retval None
+ */
+void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
+{
+ USBD_LL_DataInStage(hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff);
+}
+
+/**
+ * @brief SOF callback.
+ * @param hpcd: PCD handle
+ * @retval None
+ */
+void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
+{
+ USBD_LL_SOF(hpcd->pData);
+}
+
+/**
+ * @brief Reset callback.
+ * @param hpcd: PCD handle
+ * @retval None
+ */
+void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
+{
+ USBD_SpeedTypeDef speed = USBD_SPEED_FULL;
+
+ /* Set USB Current Speed */
+ switch(hpcd->Init.speed)
+ {
+ case PCD_SPEED_HIGH:
+ speed = USBD_SPEED_HIGH;
+ break;
+
+ case PCD_SPEED_FULL:
+ speed = USBD_SPEED_FULL;
+ break;
+
+ default:
+ speed = USBD_SPEED_FULL;
+ break;
+ }
+ USBD_LL_SetSpeed(hpcd->pData, speed);
+
+ /* Reset Device */
+ USBD_LL_Reset(hpcd->pData);
+}
+
+/**
+ * @brief Suspend callback.
+ * @param hpcd: PCD handle
+ * @retval None
+ */
+void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
+{
+ USBD_LL_Suspend(hpcd->pData);
+}
+
+/**
+ * @brief Resume callback.
+ * @param hpcd: PCD handle
+ * @retval None
+ */
+void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
+{
+ USBD_LL_Resume(hpcd->pData);
+}
+
+/**
+ * @brief ISOC Out Incomplete callback.
+ * @param hpcd: PCD handle
+ * @param epnum: Endpoint Number
+ * @retval None
+ */
+void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
+{
+ USBD_LL_IsoOUTIncomplete(hpcd->pData, epnum);
+}
+
+/**
+ * @brief ISOC In Incomplete callback.
+ * @param hpcd: PCD handle
+ * @param epnum: Endpoint Number
+ * @retval None
+ */
+void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
+{
+ USBD_LL_IsoINIncomplete(hpcd->pData, epnum);
+}
+
+/**
+ * @brief Connect callback.
+ * @param hpcd: PCD handle
+ * @retval None
+ */
+void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
+{
+ USBD_LL_DevConnected(hpcd->pData);
+}
+
+/**
+ * @brief Disconnect callback.
+ * @param hpcd: PCD handle
+ * @retval None
+ */
+void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
+{
+ USBD_LL_DevDisconnected(hpcd->pData);
+}
+
+/*******************************************************************************
+ LL Driver Interface (USB Device Library --> PCD)
+*******************************************************************************/
+/**
+ * @brief Initializes the Low Level portion of the Device driver.
+ * @param pdev: Device handle
+ * @retval USBD Status
+ */
+USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev)
+{
+#ifdef USE_USB_FS
+ /*Set LL Driver parameters */
+ hpcd.Instance = USB_OTG_FS;
+ hpcd.Init.dev_endpoints = 4;
+ hpcd.Init.use_dedicated_ep1 = 0;
+ hpcd.Init.ep0_mps = 0x40;
+ hpcd.Init.dma_enable = 0;
+ hpcd.Init.low_power_enable = 0;
+ hpcd.Init.phy_itface = PCD_PHY_EMBEDDED;
+ hpcd.Init.Sof_enable = 0;
+ hpcd.Init.speed = PCD_SPEED_FULL;
+ hpcd.Init.vbus_sensing_enable = 1;
+ /* Link The driver to the stack */
+ hpcd.pData = pdev;
+ pdev->pData = &hpcd;
+ /*Initialize LL Driver */
+ HAL_PCD_Init(&hpcd);
+
+ HAL_PCD_SetRxFiFo(&hpcd, 0x80);
+ HAL_PCD_SetTxFiFo(&hpcd, 0, 0x40);
+ HAL_PCD_SetTxFiFo(&hpcd, 1, 0x80);
+
+
+#endif
+#ifdef USE_USB_HS
+ /*Set LL Driver parameters */
+ hpcd.Instance = USB_OTG_HS;
+ hpcd.Init.dev_endpoints = 6;
+ hpcd.Init.use_dedicated_ep1 = 0;
+ hpcd.Init.ep0_mps = 0x40;
+
+ /* Be aware that enabling USB-DMA mode will result in data being sent only by
+ multiple of 4 packet sizes. This is due to the fact that USB-DMA does
+ not allow sending data from non word-aligned addresses.
+ For this specific application, it is advised to not enable this option
+ unless required. */
+ hpcd.Init.dma_enable = 0;
+
+ hpcd.Init.low_power_enable = 0;
+ hpcd.Init.phy_itface = PCD_PHY_ULPI;
+ hpcd.Init.Sof_enable = 0;
+ hpcd.Init.speed = PCD_SPEED_HIGH;
+ hpcd.Init.vbus_sensing_enable = 1;
+ /* Link The driver to the stack */
+ hpcd.pData = pdev;
+ pdev->pData = &hpcd;
+ /*Initialize LL Driver */
+ HAL_PCD_Init(&hpcd);
+
+ HAL_PCD_SetRxFiFo(&hpcd, 0x200);
+ HAL_PCD_SetTxFiFo(&hpcd, 0, 0x80);
+ HAL_PCD_SetTxFiFo(&hpcd, 1, 0x174);
+
+
+#endif
+ return USBD_OK;
+}
+
+/**
+ * @brief De-Initializes the Low Level portion of the Device driver.
+ * @param pdev: Device handle
+ * @retval USBD Status
+ */
+USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev)
+{
+ HAL_PCD_DeInit(pdev->pData);
+ return USBD_OK;
+}
+
+/**
+ * @brief Starts the Low Level portion of the Device driver.
+ * @param pdev: Device handle
+ * @retval USBD Status
+ */
+USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev)
+{
+ HAL_PCD_Start(pdev->pData);
+ return USBD_OK;
+}
+
+/**
+ * @brief Stops the Low Level portion of the Device driver.
+ * @param pdev: Device handle
+ * @retval USBD Status
+ */
+USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev)
+{
+ HAL_PCD_Stop(pdev->pData);
+ return USBD_OK;
+}
+
+/**
+ * @brief Opens an endpoint of the Low Level Driver.
+ * @param pdev: Device handle
+ * @param ep_addr: Endpoint Number
+ * @param ep_type: Endpoint Type
+ * @param ep_mps: Endpoint Max Packet Size
+ * @retval USBD Status
+ */
+USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev,
+ uint8_t ep_addr,
+ uint8_t ep_type,
+ uint16_t ep_mps)
+{
+ HAL_PCD_EP_Open(pdev->pData, ep_addr, ep_mps, ep_type);
+ return USBD_OK;
+}
+
+/**
+ * @brief Closes an endpoint of the Low Level Driver.
+ * @param pdev: Device handle
+ * @param ep_addr: Endpoint Number
+ * @retval USBD Status
+ */
+USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
+{
+ HAL_PCD_EP_Close(pdev->pData, ep_addr);
+ return USBD_OK;
+}
+
+/**
+ * @brief Flushes an endpoint of the Low Level Driver.
+ * @param pdev: Device handle
+ * @param ep_addr: Endpoint Number
+ * @retval USBD Status
+ */
+USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
+{
+ HAL_PCD_EP_Flush(pdev->pData, ep_addr);
+ return USBD_OK;
+}
+
+/**
+ * @brief Sets a Stall condition on an endpoint of the Low Level Driver.
+ * @param pdev: Device handle
+ * @param ep_addr: Endpoint Number
+ * @retval USBD Status
+ */
+USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
+{
+ HAL_PCD_EP_SetStall(pdev->pData, ep_addr);
+ return USBD_OK;
+}
+
+/**
+ * @brief Clears a Stall condition on an endpoint of the Low Level Driver.
+ * @param pdev: Device handle
+ * @param ep_addr: Endpoint Number
+ * @retval USBD Status
+ */
+USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
+{
+ HAL_PCD_EP_ClrStall(pdev->pData, ep_addr);
+ return USBD_OK;
+}
+
+/**
+ * @brief Returns Stall condition.
+ * @param pdev: Device handle
+ * @param ep_addr: Endpoint Number
+ * @retval Stall (1: yes, 0: No)
+ */
+uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
+{
+ PCD_HandleTypeDef *hpcd = pdev->pData;
+
+ if((ep_addr & 0x80) == 0x80)
+ {
+ return hpcd->IN_ep[ep_addr & 0x7F].is_stall;
+ }
+ else
+ {
+ return hpcd->OUT_ep[ep_addr & 0x7F].is_stall;
+ }
+}
+
+/**
+ * @brief Assigns an USB address to the device
+ * @param pdev: Device handle
+ * @param dev_addr: USB address
+ * @retval USBD Status
+ */
+USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr)
+{
+ HAL_PCD_SetAddress(pdev->pData, dev_addr);
+ return USBD_OK;
+}
+
+/**
+ * @brief Transmits data over an endpoint
+ * @param pdev: Device handle
+ * @param ep_addr: Endpoint Number
+ * @param pbuf: Pointer to data to be sent
+ * @param size: Data size
+ * @retval USBD Status
+ */
+USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev,
+ uint8_t ep_addr,
+ uint8_t *pbuf,
+ uint16_t size)
+{
+ HAL_PCD_EP_Transmit(pdev->pData, ep_addr, pbuf, size);
+ return USBD_OK;
+}
+
+/**
+ * @brief Prepares an endpoint for reception
+ * @param pdev: Device handle
+ * @param ep_addr: Endpoint Number
+ * @param pbuf:pointer to data to be received
+ * @param size: data size
+ * @retval USBD Status
+ */
+USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev,
+ uint8_t ep_addr,
+ uint8_t *pbuf,
+ uint16_t size)
+{
+ HAL_PCD_EP_Receive(pdev->pData, ep_addr, pbuf, size);
+ return USBD_OK;
+}
+
+/**
+ * @brief Returns the last transfered packet size.
+ * @param pdev: Device handle
+ * @param ep_addr: Endpoint Number
+ * @retval Recived Data Size
+ */
+uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
+{
+ return HAL_PCD_EP_GetRxCount(pdev->pData, ep_addr);
+}
+
+/**
+ * @brief Delay routine for the USB Device Library
+ * @param Delay: Delay in ms
+ * @retval None
+ */
+void USBD_LL_Delay(uint32_t Delay)
+{
+ HAL_Delay(Delay);
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/stmhal/usbd_conf.h b/stmhal/usbd_conf.h
new file mode 100644
index 0000000000..8c02ad0ec2
--- /dev/null
+++ b/stmhal/usbd_conf.h
@@ -0,0 +1,87 @@
+/**
+ ******************************************************************************
+ * @file USB_Device/CDC_Standalone/Inc/usbd_conf.h
+ * @author MCD Application Team
+ * @version V1.0.1
+ * @date 26-February-2014
+ * @brief General low level driver configuration
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT(c) 2014 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 __USBD_CONF_H
+#define __USBD_CONF_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f4xx_hal.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "mpconfig.h"
+#include "gc.h" // for gc_alloc and gc_free
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* Common Config */
+#define USBD_MAX_NUM_INTERFACES 1
+#define USBD_MAX_NUM_CONFIGURATION 1
+#define USBD_MAX_STR_DESC_SIZ 0x100
+#define USBD_SUPPORT_USER_STRING 0
+#define USBD_SELF_POWERED 0
+#define USBD_DEBUG_LEVEL 0
+
+/* Exported macro ------------------------------------------------------------*/
+/* Memory management macros */
+#define USBD_malloc gc_alloc
+#define USBD_free gc_free
+#define USBD_memset memset
+#define USBD_memcpy memcpy
+
+/* DEBUG macros */
+#if (USBD_DEBUG_LEVEL > 0)
+#define USBD_UsrLog(...) printf(__VA_ARGS__);\
+ printf("\n");
+#else
+#define USBD_UsrLog(...)
+#endif
+
+#if (USBD_DEBUG_LEVEL > 1)
+
+#define USBD_ErrLog(...) printf("ERROR: ") ;\
+ printf(__VA_ARGS__);\
+ printf("\n");
+#else
+#define USBD_ErrLog(...)
+#endif
+
+#if (USBD_DEBUG_LEVEL > 2)
+#define USBD_DbgLog(...) printf("DEBUG : ") ;\
+ printf(__VA_ARGS__);\
+ printf("\n");
+#else
+#define USBD_DbgLog(...)
+#endif
+
+/* Exported functions ------------------------------------------------------- */
+
+#endif /* __USBD_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/stmhal/usbd_desc.c b/stmhal/usbd_desc.c
new file mode 100644
index 0000000000..ca9ea487d9
--- /dev/null
+++ b/stmhal/usbd_desc.c
@@ -0,0 +1,228 @@
+/**
+ ******************************************************************************
+ * @file USB_Device/CDC_Standalone/Src/usbd_desc.c
+ * @author MCD Application Team
+ * @version V1.0.1
+ * @date 26-February-2014
+ * @brief This file provides the USBD descriptors and string formating method.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT(c) 2014 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 "usbd_core.h"
+#include "usbd_desc.h"
+#include "usbd_conf.h"
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+#define USBD_VID 0x0483
+#define USBD_PID 0x5740
+#define USBD_LANGID_STRING 0x409
+#define USBD_MANUFACTURER_STRING "STMicroelectronics"
+#define USBD_PRODUCT_HS_STRING "STM32 Virtual ComPort in HS Mode"
+#define USBD_SERIALNUMBER_HS_STRING "00000000001A"
+#define USBD_PRODUCT_FS_STRING "STM32 Virtual ComPort in FS Mode"
+#define USBD_SERIALNUMBER_FS_STRING "00000000001B"
+#define USBD_CONFIGURATION_HS_STRING "VCP Config"
+#define USBD_INTERFACE_HS_STRING "VCP Interface"
+#define USBD_CONFIGURATION_FS_STRING "VCP Config"
+#define USBD_INTERFACE_FS_STRING "VCP Interface"
+
+/* Private macro -------------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+uint8_t *USBD_VCP_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
+uint8_t *USBD_VCP_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
+uint8_t *USBD_VCP_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
+uint8_t *USBD_VCP_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
+uint8_t *USBD_VCP_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
+uint8_t *USBD_VCP_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
+uint8_t *USBD_VCP_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
+#ifdef USB_SUPPORT_USER_STRING_DESC
+uint8_t *USBD_VCP_USRStringDesc (USBD_SpeedTypeDef speed, uint8_t idx, uint16_t *length);
+#endif /* USB_SUPPORT_USER_STRING_DESC */
+
+/* Private variables ---------------------------------------------------------*/
+USBD_DescriptorsTypeDef VCP_Desc = {
+ USBD_VCP_DeviceDescriptor,
+ USBD_VCP_LangIDStrDescriptor,
+ USBD_VCP_ManufacturerStrDescriptor,
+ USBD_VCP_ProductStrDescriptor,
+ USBD_VCP_SerialStrDescriptor,
+ USBD_VCP_ConfigStrDescriptor,
+ USBD_VCP_InterfaceStrDescriptor,
+};
+
+/* USB Standard Device Descriptor */
+#if defined ( __ICCARM__ ) /*!< IAR Compiler */
+ #pragma data_alignment=4
+#endif
+__ALIGN_BEGIN uint8_t hUSBDDeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = {
+ 0x12, /* bLength */
+ USB_DESC_TYPE_DEVICE, /* bDescriptorType */
+ 0x00, /* bcdUSB */
+ 0x02,
+ 0x00, /* bDeviceClass */
+ 0x00, /* bDeviceSubClass */
+ 0x00, /* bDeviceProtocol */
+ USB_MAX_EP0_SIZE, /* bMaxPacketSize */
+ LOBYTE(USBD_VID), /* idVendor */
+ HIBYTE(USBD_VID), /* idVendor */
+ LOBYTE(USBD_PID), /* idVendor */
+ HIBYTE(USBD_PID), /* idVendor */
+ 0x00, /* bcdDevice rel. 2.00 */
+ 0x02,
+ USBD_IDX_MFC_STR, /* Index of manufacturer string */
+ USBD_IDX_PRODUCT_STR, /* Index of product string */
+ USBD_IDX_SERIAL_STR, /* Index of serial number string */
+ USBD_MAX_NUM_CONFIGURATION /* bNumConfigurations */
+}; /* USB_DeviceDescriptor */
+
+/* USB Standard Device Descriptor */
+#if defined ( __ICCARM__ ) /*!< IAR Compiler */
+ #pragma data_alignment=4
+#endif
+__ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC] __ALIGN_END = {
+ USB_LEN_LANGID_STR_DESC,
+ USB_DESC_TYPE_STRING,
+ LOBYTE(USBD_LANGID_STRING),
+ HIBYTE(USBD_LANGID_STRING),
+};
+
+#if defined ( __ICCARM__ ) /*!< IAR Compiler */
+ #pragma data_alignment=4
+#endif
+__ALIGN_BEGIN uint8_t USBD_StrDesc[USBD_MAX_STR_DESC_SIZ] __ALIGN_END;
+
+/* Private functions ---------------------------------------------------------*/
+
+/**
+ * @brief Returns the device descriptor.
+ * @param speed: Current device speed
+ * @param length: Pointer to data length variable
+ * @retval Pointer to descriptor buffer
+ */
+uint8_t *USBD_VCP_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
+{
+ *length = sizeof(hUSBDDeviceDesc);
+ return hUSBDDeviceDesc;
+}
+
+/**
+ * @brief Returns the LangID string descriptor.
+ * @param speed: Current device speed
+ * @param length: Pointer to data length variable
+ * @retval Pointer to descriptor buffer
+ */
+uint8_t *USBD_VCP_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
+{
+ *length = sizeof(USBD_LangIDDesc);
+ return USBD_LangIDDesc;
+}
+
+/**
+ * @brief Returns the product string descriptor.
+ * @param speed: Current device speed
+ * @param length: Pointer to data length variable
+ * @retval Pointer to descriptor buffer
+ */
+uint8_t *USBD_VCP_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
+{
+ if(speed == 0)
+ {
+ USBD_GetString((uint8_t *)USBD_PRODUCT_HS_STRING, USBD_StrDesc, length);
+ }
+ else
+ {
+ USBD_GetString((uint8_t *)USBD_PRODUCT_FS_STRING, USBD_StrDesc, length);
+ }
+ return USBD_StrDesc;
+}
+
+/**
+ * @brief Returns the manufacturer string descriptor.
+ * @param speed: Current device speed
+ * @param length: Pointer to data length variable
+ * @retval Pointer to descriptor buffer
+ */
+uint8_t *USBD_VCP_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
+{
+ USBD_GetString((uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc, length);
+ return USBD_StrDesc;
+}
+
+/**
+ * @brief Returns the serial number string descriptor.
+ * @param speed: Current device speed
+ * @param length: Pointer to data length variable
+ * @retval Pointer to descriptor buffer
+ */
+uint8_t *USBD_VCP_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
+{
+ if(speed == USBD_SPEED_HIGH)
+ {
+ USBD_GetString((uint8_t *)USBD_SERIALNUMBER_HS_STRING, USBD_StrDesc, length);
+ }
+ else
+ {
+ USBD_GetString((uint8_t *)USBD_SERIALNUMBER_FS_STRING, USBD_StrDesc, length);
+ }
+ return USBD_StrDesc;
+}
+
+/**
+ * @brief Returns the configuration string descriptor.
+ * @param speed: Current device speed
+ * @param length: Pointer to data length variable
+ * @retval Pointer to descriptor buffer
+ */
+uint8_t *USBD_VCP_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
+{
+ if(speed == USBD_SPEED_HIGH)
+ {
+ USBD_GetString((uint8_t *)USBD_CONFIGURATION_HS_STRING, USBD_StrDesc, length);
+ }
+ else
+ {
+ USBD_GetString((uint8_t *)USBD_CONFIGURATION_FS_STRING, USBD_StrDesc, length);
+ }
+ return USBD_StrDesc;
+}
+
+/**
+ * @brief Returns the interface string descriptor.
+ * @param speed: Current device speed
+ * @param length: Pointer to data length variable
+ * @retval Pointer to descriptor buffer
+ */
+uint8_t *USBD_VCP_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
+{
+ if(speed == 0)
+ {
+ USBD_GetString((uint8_t *)USBD_INTERFACE_HS_STRING, USBD_StrDesc, length);
+ }
+ else
+ {
+ USBD_GetString((uint8_t *)USBD_INTERFACE_FS_STRING, USBD_StrDesc, length);
+ }
+ return USBD_StrDesc;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/stmhal/usbd_desc.h b/stmhal/usbd_desc.h
new file mode 100644
index 0000000000..8b2d8f1034
--- /dev/null
+++ b/stmhal/usbd_desc.h
@@ -0,0 +1,43 @@
+/**
+ ******************************************************************************
+ * @file USB_Device/CDC_Standalone/Inc/usbd_desc.h
+ * @author MCD Application Team
+ * @version V1.0.1
+ * @date 26-February-2014
+ * @brief Header for usbd_desc.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT(c) 2014 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 __USBD_DESC_H
+#define __USBD_DESC_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "usbd_def.h"
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* Exported macro ------------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+extern USBD_DescriptorsTypeDef VCP_Desc;
+
+#endif /* __USBD_DESC_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/stmhal/usbdev/Class/AUDIO/Inc/usbd_audio.h b/stmhal/usbdev/class/AUDIO/Inc/usbd_audio.h
index b9a225f20b..b9a225f20b 100644
--- a/stmhal/usbdev/Class/AUDIO/Inc/usbd_audio.h
+++ b/stmhal/usbdev/class/AUDIO/Inc/usbd_audio.h
diff --git a/stmhal/usbdev/Class/AUDIO/Inc/usbd_audio_if_template.h b/stmhal/usbdev/class/AUDIO/Inc/usbd_audio_if_template.h
index cf407a4846..cf407a4846 100644
--- a/stmhal/usbdev/Class/AUDIO/Inc/usbd_audio_if_template.h
+++ b/stmhal/usbdev/class/AUDIO/Inc/usbd_audio_if_template.h
diff --git a/stmhal/usbdev/Class/AUDIO/Src/usbd_audio.c b/stmhal/usbdev/class/AUDIO/Src/usbd_audio.c
index 32565320a2..32565320a2 100644
--- a/stmhal/usbdev/Class/AUDIO/Src/usbd_audio.c
+++ b/stmhal/usbdev/class/AUDIO/Src/usbd_audio.c
diff --git a/stmhal/usbdev/Class/AUDIO/Src/usbd_audio_if_template.c b/stmhal/usbdev/class/AUDIO/Src/usbd_audio_if_template.c
index 63ac8fed03..63ac8fed03 100644
--- a/stmhal/usbdev/Class/AUDIO/Src/usbd_audio_if_template.c
+++ b/stmhal/usbdev/class/AUDIO/Src/usbd_audio_if_template.c
diff --git a/stmhal/usbdev/Class/CustomHID/Inc/usbd_customhid.h b/stmhal/usbdev/class/CustomHID/Inc/usbd_customhid.h
index 91ff70630e..91ff70630e 100644
--- a/stmhal/usbdev/Class/CustomHID/Inc/usbd_customhid.h
+++ b/stmhal/usbdev/class/CustomHID/Inc/usbd_customhid.h
diff --git a/stmhal/usbdev/Class/CustomHID/Src/usbd_customhid.c b/stmhal/usbdev/class/CustomHID/Src/usbd_customhid.c
index 358f2b7d2c..358f2b7d2c 100644
--- a/stmhal/usbdev/Class/CustomHID/Src/usbd_customhid.c
+++ b/stmhal/usbdev/class/CustomHID/Src/usbd_customhid.c
diff --git a/stmhal/usbdev/Class/DFU/Inc/usbd_dfu.h b/stmhal/usbdev/class/DFU/Inc/usbd_dfu.h
index 21d73a8dca..21d73a8dca 100644
--- a/stmhal/usbdev/Class/DFU/Inc/usbd_dfu.h
+++ b/stmhal/usbdev/class/DFU/Inc/usbd_dfu.h
diff --git a/stmhal/usbdev/Class/DFU/Inc/usbd_dfu_media_template.h b/stmhal/usbdev/class/DFU/Inc/usbd_dfu_media_template.h
index a2bf65968e..a2bf65968e 100644
--- a/stmhal/usbdev/Class/DFU/Inc/usbd_dfu_media_template.h
+++ b/stmhal/usbdev/class/DFU/Inc/usbd_dfu_media_template.h
diff --git a/stmhal/usbdev/Class/DFU/Src/usbd_dfu.c b/stmhal/usbdev/class/DFU/Src/usbd_dfu.c
index 14de9dff8b..14de9dff8b 100644
--- a/stmhal/usbdev/Class/DFU/Src/usbd_dfu.c
+++ b/stmhal/usbdev/class/DFU/Src/usbd_dfu.c
diff --git a/stmhal/usbdev/Class/DFU/Src/usbd_dfu_media_template.c b/stmhal/usbdev/class/DFU/Src/usbd_dfu_media_template.c
index 25606fdb4e..25606fdb4e 100644
--- a/stmhal/usbdev/Class/DFU/Src/usbd_dfu_media_template.c
+++ b/stmhal/usbdev/class/DFU/Src/usbd_dfu_media_template.c
diff --git a/stmhal/usbdev/Class/HID/Inc/usbd_hid.h b/stmhal/usbdev/class/HID/Inc/usbd_hid.h
index 811de0b5af..811de0b5af 100644
--- a/stmhal/usbdev/Class/HID/Inc/usbd_hid.h
+++ b/stmhal/usbdev/class/HID/Inc/usbd_hid.h
diff --git a/stmhal/usbdev/Class/HID/Src/usbd_hid.c b/stmhal/usbdev/class/HID/Src/usbd_hid.c
index 11dca78d5a..11dca78d5a 100644
--- a/stmhal/usbdev/Class/HID/Src/usbd_hid.c
+++ b/stmhal/usbdev/class/HID/Src/usbd_hid.c
diff --git a/stmhal/usbdev/Class/MSC/Inc/usbd_msc.h b/stmhal/usbdev/class/MSC/Inc/usbd_msc.h
index 9329278ded..9329278ded 100644
--- a/stmhal/usbdev/Class/MSC/Inc/usbd_msc.h
+++ b/stmhal/usbdev/class/MSC/Inc/usbd_msc.h
diff --git a/stmhal/usbdev/Class/MSC/Inc/usbd_msc_bot.h b/stmhal/usbdev/class/MSC/Inc/usbd_msc_bot.h
index 41f8ab5a53..41f8ab5a53 100644
--- a/stmhal/usbdev/Class/MSC/Inc/usbd_msc_bot.h
+++ b/stmhal/usbdev/class/MSC/Inc/usbd_msc_bot.h
diff --git a/stmhal/usbdev/Class/MSC/Inc/usbd_msc_data.h b/stmhal/usbdev/class/MSC/Inc/usbd_msc_data.h
index f468267f43..f468267f43 100644
--- a/stmhal/usbdev/Class/MSC/Inc/usbd_msc_data.h
+++ b/stmhal/usbdev/class/MSC/Inc/usbd_msc_data.h
diff --git a/stmhal/usbdev/Class/MSC/Inc/usbd_msc_scsi.h b/stmhal/usbdev/class/MSC/Inc/usbd_msc_scsi.h
index dea247bca8..dea247bca8 100644
--- a/stmhal/usbdev/Class/MSC/Inc/usbd_msc_scsi.h
+++ b/stmhal/usbdev/class/MSC/Inc/usbd_msc_scsi.h
diff --git a/stmhal/usbdev/Class/MSC/Inc/usbd_msc_storage_template.h b/stmhal/usbdev/class/MSC/Inc/usbd_msc_storage_template.h
index 1fc030eea6..1fc030eea6 100644
--- a/stmhal/usbdev/Class/MSC/Inc/usbd_msc_storage_template.h
+++ b/stmhal/usbdev/class/MSC/Inc/usbd_msc_storage_template.h
diff --git a/stmhal/usbdev/Class/MSC/Src/usbd_msc.c b/stmhal/usbdev/class/MSC/Src/usbd_msc.c
index 7817c98b1c..7817c98b1c 100644
--- a/stmhal/usbdev/Class/MSC/Src/usbd_msc.c
+++ b/stmhal/usbdev/class/MSC/Src/usbd_msc.c
diff --git a/stmhal/usbdev/Class/MSC/Src/usbd_msc_bot.c b/stmhal/usbdev/class/MSC/Src/usbd_msc_bot.c
index a430ce7709..a430ce7709 100644
--- a/stmhal/usbdev/Class/MSC/Src/usbd_msc_bot.c
+++ b/stmhal/usbdev/class/MSC/Src/usbd_msc_bot.c
diff --git a/stmhal/usbdev/Class/MSC/Src/usbd_msc_data.c b/stmhal/usbdev/class/MSC/Src/usbd_msc_data.c
index 4d72bd5fce..4d72bd5fce 100644
--- a/stmhal/usbdev/Class/MSC/Src/usbd_msc_data.c
+++ b/stmhal/usbdev/class/MSC/Src/usbd_msc_data.c
diff --git a/stmhal/usbdev/Class/MSC/Src/usbd_msc_scsi.c b/stmhal/usbdev/class/MSC/Src/usbd_msc_scsi.c
index ab94d89665..ab94d89665 100644
--- a/stmhal/usbdev/Class/MSC/Src/usbd_msc_scsi.c
+++ b/stmhal/usbdev/class/MSC/Src/usbd_msc_scsi.c
diff --git a/stmhal/usbdev/Class/MSC/Src/usbd_msc_storage_template.c b/stmhal/usbdev/class/MSC/Src/usbd_msc_storage_template.c
index f75f11a9e5..f75f11a9e5 100644
--- a/stmhal/usbdev/Class/MSC/Src/usbd_msc_storage_template.c
+++ b/stmhal/usbdev/class/MSC/Src/usbd_msc_storage_template.c
diff --git a/stmhal/usbdev/Class/Template/Inc/usbd_template.h b/stmhal/usbdev/class/Template/Inc/usbd_template.h
index 5571dbd1b4..5571dbd1b4 100644
--- a/stmhal/usbdev/Class/Template/Inc/usbd_template.h
+++ b/stmhal/usbdev/class/Template/Inc/usbd_template.h
diff --git a/stmhal/usbdev/Class/Template/Src/usbd_template.c b/stmhal/usbdev/class/Template/Src/usbd_template.c
index 144faa2179..144faa2179 100644
--- a/stmhal/usbdev/Class/Template/Src/usbd_template.c
+++ b/stmhal/usbdev/class/Template/Src/usbd_template.c
diff --git a/stmhal/usbdev/Class/CDC/Inc/usbd_cdc.h b/stmhal/usbdev/class/cdc/inc/usbd_cdc.h
index e60fa2de5a..e60fa2de5a 100644
--- a/stmhal/usbdev/Class/CDC/Inc/usbd_cdc.h
+++ b/stmhal/usbdev/class/cdc/inc/usbd_cdc.h
diff --git a/stmhal/usbdev/Class/CDC/Inc/usbd_cdc_if_template.h b/stmhal/usbdev/class/cdc/inc/usbd_cdc_if_template.h
index d29a6ff384..d29a6ff384 100644
--- a/stmhal/usbdev/Class/CDC/Inc/usbd_cdc_if_template.h
+++ b/stmhal/usbdev/class/cdc/inc/usbd_cdc_if_template.h
diff --git a/stmhal/usbdev/Class/CDC/Src/usbd_cdc.c b/stmhal/usbdev/class/cdc/src/usbd_cdc.c
index c398342dc9..50179a2dea 100644
--- a/stmhal/usbdev/Class/CDC/Src/usbd_cdc.c
+++ b/stmhal/usbdev/class/cdc/src/usbd_cdc.c
@@ -64,7 +64,7 @@
*/
/* Includes ------------------------------------------------------------------*/
-#include "USBD_CDC.h"
+#include "usbd_cdc.h"
#include "usbd_desc.h"
#include "usbd_ctlreq.h"
diff --git a/stmhal/usbdev/Class/CDC/Src/usbd_cdc_if_template.c b/stmhal/usbdev/class/cdc/src/usbd_cdc_if_template.c
index b6fa5115c0..b6fa5115c0 100644
--- a/stmhal/usbdev/Class/CDC/Src/usbd_cdc_if_template.c
+++ b/stmhal/usbdev/class/cdc/src/usbd_cdc_if_template.c
diff --git a/stmhal/usbdev/Core/Inc/usbd_conf_template.h b/stmhal/usbdev/core/inc/usbd_conf_template.h
index d80c1da61b..d80c1da61b 100644
--- a/stmhal/usbdev/Core/Inc/usbd_conf_template.h
+++ b/stmhal/usbdev/core/inc/usbd_conf_template.h
diff --git a/stmhal/usbdev/Core/Inc/usbd_core.h b/stmhal/usbdev/core/inc/usbd_core.h
index 5360680b92..5360680b92 100644
--- a/stmhal/usbdev/Core/Inc/usbd_core.h
+++ b/stmhal/usbdev/core/inc/usbd_core.h
diff --git a/stmhal/usbdev/Core/Inc/usbd_ctlreq.h b/stmhal/usbdev/core/inc/usbd_ctlreq.h
index 9edf079247..9edf079247 100644
--- a/stmhal/usbdev/Core/Inc/usbd_ctlreq.h
+++ b/stmhal/usbdev/core/inc/usbd_ctlreq.h
diff --git a/stmhal/usbdev/Core/Inc/usbd_def.h b/stmhal/usbdev/core/inc/usbd_def.h
index 5c0506a145..5c0506a145 100644
--- a/stmhal/usbdev/Core/Inc/usbd_def.h
+++ b/stmhal/usbdev/core/inc/usbd_def.h
diff --git a/stmhal/usbdev/Core/Inc/usbd_ioreq.h b/stmhal/usbdev/core/inc/usbd_ioreq.h
index 04e01b854b..04e01b854b 100644
--- a/stmhal/usbdev/Core/Inc/usbd_ioreq.h
+++ b/stmhal/usbdev/core/inc/usbd_ioreq.h
diff --git a/stmhal/usbdev/Core/Src/usbd_conf_template.c b/stmhal/usbdev/core/src/usbd_conf_template.c
index 8f4608d1f0..8f4608d1f0 100644
--- a/stmhal/usbdev/Core/Src/usbd_conf_template.c
+++ b/stmhal/usbdev/core/src/usbd_conf_template.c
diff --git a/stmhal/usbdev/Core/Src/usbd_core.c b/stmhal/usbdev/core/src/usbd_core.c
index bb44513d7b..bb44513d7b 100644
--- a/stmhal/usbdev/Core/Src/usbd_core.c
+++ b/stmhal/usbdev/core/src/usbd_core.c
diff --git a/stmhal/usbdev/Core/Src/usbd_ctlreq.c b/stmhal/usbdev/core/src/usbd_ctlreq.c
index 80b1da8ea5..80b1da8ea5 100644
--- a/stmhal/usbdev/Core/Src/usbd_ctlreq.c
+++ b/stmhal/usbdev/core/src/usbd_ctlreq.c
diff --git a/stmhal/usbdev/Core/Src/usbd_ioreq.c b/stmhal/usbdev/core/src/usbd_ioreq.c
index 9e396ba566..9e396ba566 100644
--- a/stmhal/usbdev/Core/Src/usbd_ioreq.c
+++ b/stmhal/usbdev/core/src/usbd_ioreq.c