From b30c02afa078f7713faa14087ae28433dee49027 Mon Sep 17 00:00:00 2001 From: Damien George Date: Fri, 14 Mar 2014 00:30:37 +0000 Subject: [PATCH] stmhal: Get USB enumerating a CDC device. Enumerates CDC device over USB, but doesn't transmit/receive yet. --- stmhal/Makefile | 31 +- stmhal/boards/PYBOARD4/stm32f4xx_hal_conf.h | 1 + stmhal/main.c | 28 +- stmhal/pendsv.c | 83 +++ stmhal/pendsv.h | 3 + stmhal/stm32f4xx_it.c | 77 ++- stmhal/stm32f4xx_it.h | 5 + stmhal/usb.c | 240 ++++++++ stmhal/usb.h | 23 + stmhal/usbd_cdc_interface.c | 461 ++++++++++++++ stmhal/usbd_cdc_interface.h | 87 +++ stmhal/usbd_conf.c | 565 ++++++++++++++++++ stmhal/usbd_conf.h | 87 +++ stmhal/usbd_desc.c | 228 +++++++ stmhal/usbd_desc.h | 43 ++ .../{Class => class}/AUDIO/Inc/usbd_audio.h | 0 .../AUDIO/Inc/usbd_audio_if_template.h | 0 .../{Class => class}/AUDIO/Src/usbd_audio.c | 0 .../AUDIO/Src/usbd_audio_if_template.c | 0 .../CustomHID/Inc/usbd_customhid.h | 0 .../CustomHID/Src/usbd_customhid.c | 0 .../{Class => class}/DFU/Inc/usbd_dfu.h | 0 .../DFU/Inc/usbd_dfu_media_template.h | 0 .../{Class => class}/DFU/Src/usbd_dfu.c | 0 .../DFU/Src/usbd_dfu_media_template.c | 0 .../{Class => class}/HID/Inc/usbd_hid.h | 0 .../{Class => class}/HID/Src/usbd_hid.c | 0 .../{Class => class}/MSC/Inc/usbd_msc.h | 0 .../{Class => class}/MSC/Inc/usbd_msc_bot.h | 0 .../{Class => class}/MSC/Inc/usbd_msc_data.h | 0 .../{Class => class}/MSC/Inc/usbd_msc_scsi.h | 0 .../MSC/Inc/usbd_msc_storage_template.h | 0 .../{Class => class}/MSC/Src/usbd_msc.c | 0 .../{Class => class}/MSC/Src/usbd_msc_bot.c | 0 .../{Class => class}/MSC/Src/usbd_msc_data.c | 0 .../{Class => class}/MSC/Src/usbd_msc_scsi.c | 0 .../MSC/Src/usbd_msc_storage_template.c | 0 .../Template/Inc/usbd_template.h | 0 .../Template/Src/usbd_template.c | 0 .../CDC/Inc => class/cdc/inc}/usbd_cdc.h | 0 .../cdc/inc}/usbd_cdc_if_template.h | 0 .../CDC/Src => class/cdc/src}/usbd_cdc.c | 2 +- .../cdc/src}/usbd_cdc_if_template.c | 0 .../Inc => core/inc}/usbd_conf_template.h | 0 .../usbdev/{Core/Inc => core/inc}/usbd_core.h | 0 .../{Core/Inc => core/inc}/usbd_ctlreq.h | 0 .../usbdev/{Core/Inc => core/inc}/usbd_def.h | 0 .../{Core/Inc => core/inc}/usbd_ioreq.h | 0 .../Src => core/src}/usbd_conf_template.c | 0 .../usbdev/{Core/Src => core/src}/usbd_core.c | 0 .../{Core/Src => core/src}/usbd_ctlreq.c | 0 .../{Core/Src => core/src}/usbd_ioreq.c | 0 52 files changed, 1947 insertions(+), 17 deletions(-) create mode 100644 stmhal/pendsv.c create mode 100644 stmhal/pendsv.h create mode 100644 stmhal/usb.c create mode 100644 stmhal/usb.h create mode 100644 stmhal/usbd_cdc_interface.c create mode 100644 stmhal/usbd_cdc_interface.h create mode 100644 stmhal/usbd_conf.c create mode 100644 stmhal/usbd_conf.h create mode 100644 stmhal/usbd_desc.c create mode 100644 stmhal/usbd_desc.h rename stmhal/usbdev/{Class => class}/AUDIO/Inc/usbd_audio.h (100%) rename stmhal/usbdev/{Class => class}/AUDIO/Inc/usbd_audio_if_template.h (100%) rename stmhal/usbdev/{Class => class}/AUDIO/Src/usbd_audio.c (100%) rename stmhal/usbdev/{Class => class}/AUDIO/Src/usbd_audio_if_template.c (100%) rename stmhal/usbdev/{Class => class}/CustomHID/Inc/usbd_customhid.h (100%) rename stmhal/usbdev/{Class => class}/CustomHID/Src/usbd_customhid.c (100%) rename stmhal/usbdev/{Class => class}/DFU/Inc/usbd_dfu.h (100%) rename stmhal/usbdev/{Class => class}/DFU/Inc/usbd_dfu_media_template.h (100%) rename stmhal/usbdev/{Class => class}/DFU/Src/usbd_dfu.c (100%) rename stmhal/usbdev/{Class => class}/DFU/Src/usbd_dfu_media_template.c (100%) rename stmhal/usbdev/{Class => class}/HID/Inc/usbd_hid.h (100%) rename stmhal/usbdev/{Class => class}/HID/Src/usbd_hid.c (100%) rename stmhal/usbdev/{Class => class}/MSC/Inc/usbd_msc.h (100%) rename stmhal/usbdev/{Class => class}/MSC/Inc/usbd_msc_bot.h (100%) rename stmhal/usbdev/{Class => class}/MSC/Inc/usbd_msc_data.h (100%) rename stmhal/usbdev/{Class => class}/MSC/Inc/usbd_msc_scsi.h (100%) rename stmhal/usbdev/{Class => class}/MSC/Inc/usbd_msc_storage_template.h (100%) rename stmhal/usbdev/{Class => class}/MSC/Src/usbd_msc.c (100%) rename stmhal/usbdev/{Class => class}/MSC/Src/usbd_msc_bot.c (100%) rename stmhal/usbdev/{Class => class}/MSC/Src/usbd_msc_data.c (100%) rename stmhal/usbdev/{Class => class}/MSC/Src/usbd_msc_scsi.c (100%) rename stmhal/usbdev/{Class => class}/MSC/Src/usbd_msc_storage_template.c (100%) rename stmhal/usbdev/{Class => class}/Template/Inc/usbd_template.h (100%) rename stmhal/usbdev/{Class => class}/Template/Src/usbd_template.c (100%) rename stmhal/usbdev/{Class/CDC/Inc => class/cdc/inc}/usbd_cdc.h (100%) rename stmhal/usbdev/{Class/CDC/Inc => class/cdc/inc}/usbd_cdc_if_template.h (100%) rename stmhal/usbdev/{Class/CDC/Src => class/cdc/src}/usbd_cdc.c (96%) rename stmhal/usbdev/{Class/CDC/Src => class/cdc/src}/usbd_cdc_if_template.c (100%) rename stmhal/usbdev/{Core/Inc => core/inc}/usbd_conf_template.h (100%) rename stmhal/usbdev/{Core/Inc => core/inc}/usbd_core.h (100%) rename stmhal/usbdev/{Core/Inc => core/inc}/usbd_ctlreq.h (100%) rename stmhal/usbdev/{Core/Inc => core/inc}/usbd_def.h (100%) rename stmhal/usbdev/{Core/Inc => core/inc}/usbd_ioreq.h (100%) rename stmhal/usbdev/{Core/Src => core/src}/usbd_conf_template.c (100%) rename stmhal/usbdev/{Core/Src => core/src}/usbd_core.c (100%) rename stmhal/usbdev/{Core/Src => core/src}/usbd_ctlreq.c (100%) rename stmhal/usbdev/{Core/Src => core/src}/usbd_ioreq.c (100%) 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,8 +82,10 @@ 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 +#include + +#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(); } /******************************************************************************/ @@ -168,6 +177,72 @@ void SysTick_Handler(void) /* file (startup_stm32f4xx.s). */ /******************************************************************************/ +/** + * @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 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 + +/* +#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 + * + *

© COPYRIGHT(c) 2014 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 "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 + * + *

© COPYRIGHT(c) 2014 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. + * + ****************************************************************************** + */ + +/* 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 + * + *

© COPYRIGHT(c) 2014 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 "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 + * + *

© COPYRIGHT(c) 2014 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. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_CONF_H +#define __USBD_CONF_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" +#include +#include +#include + +#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 + * + *

© COPYRIGHT(c) 2014 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 "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 + * + *

© COPYRIGHT(c) 2014 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. + * + ****************************************************************************** + */ + +/* 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 similarity index 100% rename from stmhal/usbdev/Class/AUDIO/Inc/usbd_audio.h rename to 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 similarity index 100% rename from stmhal/usbdev/Class/AUDIO/Inc/usbd_audio_if_template.h rename to 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 similarity index 100% rename from stmhal/usbdev/Class/AUDIO/Src/usbd_audio.c rename to 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 similarity index 100% rename from stmhal/usbdev/Class/AUDIO/Src/usbd_audio_if_template.c rename to 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 similarity index 100% rename from stmhal/usbdev/Class/CustomHID/Inc/usbd_customhid.h rename to 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 similarity index 100% rename from stmhal/usbdev/Class/CustomHID/Src/usbd_customhid.c rename to 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 similarity index 100% rename from stmhal/usbdev/Class/DFU/Inc/usbd_dfu.h rename to 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 similarity index 100% rename from stmhal/usbdev/Class/DFU/Inc/usbd_dfu_media_template.h rename to 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 similarity index 100% rename from stmhal/usbdev/Class/DFU/Src/usbd_dfu.c rename to 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 similarity index 100% rename from stmhal/usbdev/Class/DFU/Src/usbd_dfu_media_template.c rename to 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 similarity index 100% rename from stmhal/usbdev/Class/HID/Inc/usbd_hid.h rename to 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 similarity index 100% rename from stmhal/usbdev/Class/HID/Src/usbd_hid.c rename to 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 similarity index 100% rename from stmhal/usbdev/Class/MSC/Inc/usbd_msc.h rename to 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 similarity index 100% rename from stmhal/usbdev/Class/MSC/Inc/usbd_msc_bot.h rename to 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 similarity index 100% rename from stmhal/usbdev/Class/MSC/Inc/usbd_msc_data.h rename to 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 similarity index 100% rename from stmhal/usbdev/Class/MSC/Inc/usbd_msc_scsi.h rename to 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 similarity index 100% rename from stmhal/usbdev/Class/MSC/Inc/usbd_msc_storage_template.h rename to 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 similarity index 100% rename from stmhal/usbdev/Class/MSC/Src/usbd_msc.c rename to 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 similarity index 100% rename from stmhal/usbdev/Class/MSC/Src/usbd_msc_bot.c rename to 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 similarity index 100% rename from stmhal/usbdev/Class/MSC/Src/usbd_msc_data.c rename to 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 similarity index 100% rename from stmhal/usbdev/Class/MSC/Src/usbd_msc_scsi.c rename to 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 similarity index 100% rename from stmhal/usbdev/Class/MSC/Src/usbd_msc_storage_template.c rename to 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 similarity index 100% rename from stmhal/usbdev/Class/Template/Inc/usbd_template.h rename to 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 similarity index 100% rename from stmhal/usbdev/Class/Template/Src/usbd_template.c rename to 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 similarity index 100% rename from stmhal/usbdev/Class/CDC/Inc/usbd_cdc.h rename to 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 similarity index 100% rename from stmhal/usbdev/Class/CDC/Inc/usbd_cdc_if_template.h rename to 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 similarity index 96% rename from stmhal/usbdev/Class/CDC/Src/usbd_cdc.c rename to 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 similarity index 100% rename from stmhal/usbdev/Class/CDC/Src/usbd_cdc_if_template.c rename to 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 similarity index 100% rename from stmhal/usbdev/Core/Inc/usbd_conf_template.h rename to 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 similarity index 100% rename from stmhal/usbdev/Core/Inc/usbd_core.h rename to 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 similarity index 100% rename from stmhal/usbdev/Core/Inc/usbd_ctlreq.h rename to 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 similarity index 100% rename from stmhal/usbdev/Core/Inc/usbd_def.h rename to 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 similarity index 100% rename from stmhal/usbdev/Core/Inc/usbd_ioreq.h rename to 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 similarity index 100% rename from stmhal/usbdev/Core/Src/usbd_conf_template.c rename to 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 similarity index 100% rename from stmhal/usbdev/Core/Src/usbd_core.c rename to 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 similarity index 100% rename from stmhal/usbdev/Core/Src/usbd_ctlreq.c rename to 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 similarity index 100% rename from stmhal/usbdev/Core/Src/usbd_ioreq.c rename to stmhal/usbdev/core/src/usbd_ioreq.c