diff --git a/features/unsupported/USBHost/USBHost/TARGET_STM/USBHALHost_DISCOL476VG.h b/features/unsupported/USBHost/USBHost/TARGET_STM/USBHALHost_DISCOL476VG.h new file mode 100644 index 0000000000..3e443f55ca --- /dev/null +++ b/features/unsupported/USBHost/USBHost/TARGET_STM/USBHALHost_DISCOL476VG.h @@ -0,0 +1,118 @@ +/* Copyright (c) 2016 mbed.org, MIT License +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software +* and associated documentation files (the "Software"), to deal in the Software without +* restriction, including without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +#ifndef USBHALHOST_DISCOL476VG +#define USBHALHOST_DISCOL476VG + +#define USBHAL_IRQn OTG_FS_IRQn + +#define HCCA_SIZE sizeof(HCD_HandleTypeDef) +#define ED_SIZE sizeof(HCED) +#define TD_SIZE sizeof(HCTD) + +#define TOTAL_SIZE (HCCA_SIZE + (MAX_ENDPOINT*ED_SIZE) + (MAX_TD*TD_SIZE)) +/* STM device FS have 11 channels (definition is for 60 channels) */ +static volatile uint8_t usb_buf[TOTAL_SIZE]; +typedef struct +{ + /* store the request ongoing on each endpoit */ + /* 1st field of structure avoid giving knowledge of all structure to + * endpoint */ + volatile uint32_t addr[MAX_ENDPOINT]; + USBHALHost *inst; + void (USBHALHost::*deviceConnected)(int hub, int port, bool lowSpeed, USBHostHub * hub_parent); + void (USBHALHost::*deviceDisconnected)(int hub, int port, USBHostHub * hub_parent, volatile uint32_t addr); + void (USBHALHost::*transferCompleted)(volatile uint32_t addr); +}USBHALHost_Private_t; + +static gpio_t gpio_vbus; + +#define VBUS_OFF 1 +#define VBUS_ON 0 +#define USB_VBUS_CONFIG \ + do {\ + gpio_init_out_ex(&gpio_vbus, PC_9, VBUS_OFF);\ + }while(0); + + +void usb_vbus( uint8_t state) +{ + if(state == 0) + { + gpio_write(&gpio_vbus, VBUS_OFF); + } + else + { + gpio_write(&gpio_vbus, VBUS_ON); + } + wait(0.2); +} + + +USBHALHost::USBHALHost() { + instHost = this; + HCD_HandleTypeDef *hhcd; + USBHALHost_Private_t *HALPriv = new(USBHALHost_Private_t); + memset(HALPriv, 0, sizeof(USBHALHost_Private_t)); + memInit(); + memset((void*)usb_hcca, 0, HCCA_SIZE); + hhcd = (HCD_HandleTypeDef *)usb_hcca; + hhcd->Instance = USB_OTG_FS; + hhcd->pData = (void*)HALPriv; + hhcd->Init.Host_channels = 11; + /* for now failed with dma */ + hhcd->Init.dma_enable = 0; + hhcd->Init.speed = HCD_SPEED_FULL; + hhcd->Init.phy_itface = HCD_PHY_EMBEDDED; + hhcd->Init.use_external_vbus = 1; + HALPriv->inst = this; + HALPriv->deviceConnected = &USBHALHost::deviceConnected; + HALPriv->deviceDisconnected = &USBHALHost::deviceDisconnected; + HALPriv->transferCompleted = &USBHALHost::transferCompleted; + for (int i = 0; i < MAX_ENDPOINT; i++) { + edBufAlloc[i] = false; + HALPriv->addr[i]=(uint32_t)-1; + } + for (int i = 0; i < MAX_TD; i++) { + tdBufAlloc[i] = false; + } + __HAL_RCC_PWR_CLK_ENABLE(); +#ifdef TARGET_STM32L4 + HAL_PWREx_EnableVddUSB(); +#endif + + /* Configure USB HS GPIOs */ + __HAL_RCC_GPIOA_CLK_ENABLE(); + + /*USB DM and DP */ + pin_function(PA_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_FS)); + pin_function(PA_12, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_FS)); + + /* Configure VBUS Pin */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + pin_function(PC_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_FS)); + /* Configure POWER_SWITCH IO pin */ + USB_VBUS_CONFIG; + __HAL_RCC_SYSCFG_CLK_ENABLE(); + + /* Enable USB FS Clocks */ + __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); + /* Set USBFS Interrupt priority */ + HAL_NVIC_SetPriority(USBHAL_IRQn, 5, 0); + NVIC_SetVector(USBHAL_IRQn, (uint32_t)&_usbisr); +} +#endif diff --git a/features/unsupported/USBHost/USBHost/TARGET_STM/USBHALHost_STM_144_64pins.h b/features/unsupported/USBHost/USBHost/TARGET_STM/USBHALHost_STM_144_64pins.h index 21e83c0a50..305b928d53 100644 --- a/features/unsupported/USBHost/USBHost/TARGET_STM/USBHALHost_STM_144_64pins.h +++ b/features/unsupported/USBHost/USBHost/TARGET_STM/USBHALHost_STM_144_64pins.h @@ -96,6 +96,10 @@ USBHALHost::USBHALHost() { for (int i = 0; i < MAX_TD; i++) { tdBufAlloc[i] = false; } + __HAL_RCC_PWR_CLK_ENABLE(); +#ifdef TARGET_STM32L4 + HAL_PWREx_EnableVddUSB(); +#endif /* Configure USB FS GPIOs */ __HAL_RCC_GPIOA_CLK_ENABLE(); @@ -105,6 +109,7 @@ USBHALHost::USBHALHost() { /*USB ID */ pin_function(PA_10, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)); + __HAL_RCC_SYSCFG_CLK_ENABLE(); /* Configure POWER_SWITCH IO pin */ USB_VBUS_CONFIG; /* Enable USB FS Clocks */ diff --git a/features/unsupported/USBHost/USBHost/TARGET_STM/USBHALHost_STM_TARGET.h b/features/unsupported/USBHost/USBHost/TARGET_STM/USBHALHost_STM_TARGET.h index a6cbb1619d..1cde2f384d 100644 --- a/features/unsupported/USBHost/USBHost/TARGET_STM/USBHALHost_STM_TARGET.h +++ b/features/unsupported/USBHost/USBHost/TARGET_STM/USBHALHost_STM_TARGET.h @@ -18,12 +18,12 @@ /* 144 pins boards */ #if defined(TARGET_NUCLEO_F429ZI) || defined(TARGET_NUCLEO_F446ZE) || defined(TARGET_NUCLEO_F207ZG) \ -|| defined(TARGET_NUCLEO_F767ZI) +|| defined(TARGET_NUCLEO_F767ZI) || defined(TARGET_NUCLEO_F746ZG) #include "USBHALHost_STM_144_64pins.h" #endif /* 64 pins boards */ -#if defined(TARGET_NUCLEO_F401RE) +#if defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_L476RG) || defined(TARGET_NUCLEO_F411RE) #define USBHALHOST_64pins #include "USBHALHost_STM_144_64pins.h" #endif @@ -33,3 +33,7 @@ #ifdef TARGET_DISCO_F429ZI #include "USBHALHost_DISCOF429ZI.h" #endif + +#ifdef TARGET_DISCO_L476VG +#include "USBHALHost_DISCOL476VG.h" +#endif diff --git a/targets/targets.json b/targets/targets.json index 50ea134ecc..b3132ec1b8 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -842,7 +842,7 @@ "supported_toolchains": ["ARM", "uARM", "GCC_ARM", "IAR"], "inherits": ["Target"], "detect_code": ["0740"], - "macros": ["TRANSACTION_QUEUE_SIZE_SPI=2", "USB_STM_HAL"], + "macros": ["TRANSACTION_QUEUE_SIZE_SPI=2", "USB_STM_HAL", "USBHOST_OTHER"], "device_has": ["ANALOGIN", "ERROR_RED", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"], "release_versions": ["2", "5"], "device_name": "STM32F411RE" @@ -949,7 +949,7 @@ "extra_labels": ["STM", "STM32F7", "STM32F746", "STM32F746ZG", "F746_F756"], "supported_toolchains": ["ARM", "uARM", "GCC_ARM", "IAR"], "default_toolchain": "ARM", - "macros": ["TRANSACTION_QUEUE_SIZE_SPI=2"], + "macros": ["TRANSACTION_QUEUE_SIZE_SPI=2", "USBHOST_OTHER"], "supported_form_factors": ["ARDUINO"], "detect_code": ["0816"], "device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES", "TRNG"], @@ -1068,7 +1068,7 @@ "supported_toolchains": ["ARM", "uARM", "IAR", "GCC_ARM"], "inherits": ["Target"], "detect_code": ["0765"], - "macros": ["TRANSACTION_QUEUE_SIZE_SPI=2"], + "macros": ["TRANSACTION_QUEUE_SIZE_SPI=2","USBHOST_OTHER"], "device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES", "TRNG"], "release_versions": ["2", "5"], "device_name": "stm32l476rg" @@ -1233,7 +1233,7 @@ "extra_labels": ["STM", "STM32L4", "STM32L476VG"], "supported_toolchains": ["ARM", "uARM", "IAR", "GCC_ARM"], "detect_code": ["0820"], - "macros": ["TRANSACTION_QUEUE_SIZE_SPI=2"], + "macros": ["TRANSACTION_QUEUE_SIZE_SPI=2", "USBHOST_OTHER"], "device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES", "TRNG"], "release_versions": ["2", "5"], "device_name": "stm32l476vg" diff --git a/tools/build_travis.py b/tools/build_travis.py index 779635c142..408d7dc32e 100644 --- a/tools/build_travis.py +++ b/tools/build_travis.py @@ -53,17 +53,17 @@ build_list = ( { "target": "NUCLEO_F334R8", "toolchains": "GCC_ARM", "libs": ["dsp", "rtos", "fat"] }, { "target": "NUCLEO_F401RE", "toolchains": "GCC_ARM", "libs": ["dsp", "rtos", "usb", "fat", "usb_host"] }, { "target": "NUCLEO_F410RB", "toolchains": "GCC_ARM", "libs": ["dsp", "rtos", "fat"] }, - { "target": "NUCLEO_F411RE", "toolchains": "GCC_ARM", "libs": ["dsp", "rtos", "usb", "fat"] }, + { "target": "NUCLEO_F411RE", "toolchains": "GCC_ARM", "libs": ["dsp", "rtos", "usb", "fat", "usb_host"] }, { "target": "NUCLEO_F412ZG", "toolchains": "GCC_ARM", "libs": ["dsp", "rtos", "fat"] }, { "target": "NUCLEO_L432KC", "toolchains": "GCC_ARM", "libs": ["dsp", "fat"] }, - { "target": "NUCLEO_L476RG", "toolchains": "GCC_ARM", "libs": ["dsp", "fat"] }, + { "target": "NUCLEO_L476RG", "toolchains": "GCC_ARM", "libs": ["dsp", "fat", "rtos", "usb_host"] }, { "target": "NUCLEO_L011K4", "toolchains": "GCC_ARM", "libs": ["dsp"] }, { "target": "NUCLEO_L031K6", "toolchains": "GCC_ARM", "libs": ["dsp"] }, { "target": "NUCLEO_L073RZ", "toolchains": "GCC_ARM", "libs": ["dsp", "fat"] }, { "target": "NUCLEO_F429ZI", "toolchains": "GCC_ARM", "libs": ["dsp", "rtos", "usb", "fat", "usb_host"] }, { "target": "NUCLEO_F446RE", "toolchains": "GCC_ARM", "libs": ["dsp", "fat"] }, { "target": "NUCLEO_F446ZE", "toolchains": "GCC_ARM", "libs": ["dsp", "rtos", "usb", "fat", "usb_host"] }, - { "target": "NUCLEO_F746ZG", "toolchains": "GCC_ARM", "libs": ["dsp", "rtos", "usb", "fat" ] }, + { "target": "NUCLEO_F746ZG", "toolchains": "GCC_ARM", "libs": ["dsp", "rtos", "usb", "fat", "usb_host" ] }, { "target": "NUCLEO_F767ZI", "toolchains": "GCC_ARM", "libs": ["dsp", "rtos", "usb", "fat", "usb_host"] }, { "target": "MOTE_L152RC", "toolchains": "GCC_ARM", "libs": ["dsp", "rtos", "fat"] }, @@ -126,7 +126,7 @@ build_list = ( { "target": "SAMD21J18A", "toolchains": "GCC_ARM", "libs": ["dsp", "fat"] }, { "target": "SAMD21G18A", "toolchains": "GCC_ARM", "libs": ["dsp", "fat"] }, { "target": "SAML21J18A", "toolchains": "GCC_ARM", "libs": ["dsp", "fat"] }, - { "target": "DISCO_L476VG", "toolchains": "GCC_ARM", "libs": ["dsp", "rtos", "usb", "fat"] }, + { "target": "DISCO_L476VG", "toolchains": "GCC_ARM", "libs": ["dsp", "rtos", "usb", "fat", "usb_host"] }, { "target": "NUMAKER_PFM_NUC472", "toolchains": "GCC_ARM", "libs": ["dsp", "rtos", "usb", "fat"] }, { "target": "NUMAKER_PFM_M453", "toolchains": "GCC_ARM", "libs": ["dsp", "rtos", "usb", "fat"] }, @@ -187,7 +187,7 @@ linking_list = [ "toolchains": "GCC_ARM", "tests": {"" : ["MBED_2", "MBED_10", "MBED_11", "MBED_16"], "rtos" : ["RTOS_1", "RTOS_2", "RTOS_3"], - "usb" : ["USB_1", "USB_2" ,"USB_3"], + "usb" : ["USB_1", "USB_2" ,"USB_3", "USB_10", "USB_11"], } }, {"target": "NUCLEO_F429ZI", @@ -208,7 +208,7 @@ linking_list = [ "toolchains": "GCC_ARM", "tests": {"" : ["MBED_2", "MBED_10", "MBED_11", "MBED_16"], "rtos" : ["RTOS_1", "RTOS_2", "RTOS_3"], - "usb" : ["USB_1", "USB_2" ,"USB_3"], + "usb" : ["USB_1", "USB_2" ,"USB_3", "USB_10", "USB_11"], } }, {"target": "NUCLEO_F767ZI", @@ -218,6 +218,13 @@ linking_list = [ "usb" : ["USB_1", "USB_2" ,"USB_3", "USB_10", "USB_11"], } }, + {"target": "NUCLEO_L476RG", + "toolchains": "GCC_ARM", + "tests": {"" : ["MBED_2", "MBED_10", "MBED_11", "MBED_16"], + "rtos" : ["RTOS_1", "RTOS_2", "RTOS_3"], + "usb" : [ "USB_10", "USB_11"], + } + }, {"target": "DISCO_F429ZI", "toolchains": "GCC_ARM", "tests": {"" : ["MBED_2", "MBED_10", "MBED_11", "MBED_16"], @@ -243,7 +250,7 @@ linking_list = [ "toolchains": "GCC_ARM", "tests": {"" : ["MBED_2", "MBED_10", "MBED_11", "MBED_16"], "rtos" : ["RTOS_1", "RTOS_2", "RTOS_3"], - "usb" : ["USB_1", "USB_2" ,"USB_3"], + "usb" : ["USB_1", "USB_2" ,"USB_3", "USB_10", "USB_11"], } }, {"target": "NUMAKER_PFM_NUC472",