diff --git a/radio/src/Makefile b/radio/src/Makefile index 59c0f64f5..59f2dbdc9 100644 --- a/radio/src/Makefile +++ b/radio/src/Makefile @@ -301,9 +301,10 @@ LUA = NO MENUS_LOCK = NO # USB options in the main image -# Values = JOYSTICK, MASSSTORAGE +# Values = JOYSTICK, MASSSTORAGE, SERIAL # JOYSTICK: The TX will appear as a joystick # MASSSTORAGE: The TX will appear as a drive +# SERIAL: The TX will appear as a serial port USB = JOYSTICK # Mixers monitor view added to Channels monitor one @@ -913,8 +914,11 @@ ifeq ($(PCB), TARANIS) LDSCRIPT = targets/taranis/stm32f2_flash.ld endif STM32USBPATH = $(THIRDPARTY)/STM32_USB-Host-Device_Lib_V2.1.0/Libraries - INCDIRS += $(STM32USBPATH)/STM32_USB_OTG_Driver/inc $(STM32USBPATH)/STM32_USB_Device_Library/Core/inc - INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/inc $(STM32USBPATH)/STM32_USB_Device_Library/Class/hid/inc + INCDIRS += $(STM32USBPATH)/STM32_USB_OTG_Driver/inc + INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Core/inc + INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/inc + INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/hid/inc + INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/cdc/inc GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_hardware.cpp BOARDSRC = main_arm.cpp targets/taranis/board_taranis.cpp EXTRABOARDSRC += targets/taranis/configure_pins.cpp targets/taranis/lcd_driver.cpp targets/taranis/flash_driver.cpp targets/taranis/i2c_driver.cpp targets/taranis/aspi.c targets/taranis/delays.c @@ -966,6 +970,10 @@ ifeq ($(PCB), TARANIS) ifeq ($(USB), JOYSTICK) CPPDEFS += -DUSB_JOYSTICK SRC += targets/taranis/usbd_hid_joystick.c + else ifeq ($(USB), SERIAL) + CPPDEFS += -DUSB_SERIAL + SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c + EXTRABOARDSRC += targets/taranis/usbd_cdc.cpp else CPPDEFS += -DUSB_MASS_STORAGE SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_data.c diff --git a/radio/src/gui/Taranis/view_statistics.cpp b/radio/src/gui/Taranis/view_statistics.cpp index 29c01f0ee..015bba569 100755 --- a/radio/src/gui/Taranis/view_statistics.cpp +++ b/radio/src/gui/Taranis/view_statistics.cpp @@ -98,9 +98,15 @@ void menuStatisticsView(uint8_t event) #define MENU_DEBUG_Y_MIXMAX (2*FH-3) #define MENU_DEBUG_Y_LUA (3*FH-2) #define MENU_DEBUG_Y_FREE_RAM (4*FH-1) -#define MENU_DEBUG_Y_STACK (5*FH) +#define MENU_DEBUG_Y_USB (5*FH) #define MENU_DEBUG_Y_RTOS (6*FH) +#if defined(USB_SERIAL) + extern uint16_t usbWraps; + extern uint16_t charsWritten; + extern "C" uint32_t APP_Rx_ptr_in; +#endif + void menuStatisticsDebug(uint8_t event) { TITLE(STR_MENUDEBUG); @@ -154,6 +160,15 @@ void menuStatisticsDebug(uint8_t event) lcd_outdezAtt(MENU_DEBUG_COL1_OFS, MENU_DEBUG_Y_MIXMAX, DURATION_MS_PREC2(maxMixerDuration), PREC2|LEFT); lcd_puts(lcdLastPos, MENU_DEBUG_Y_MIXMAX, "ms"); +#if defined(USB_SERIAL) + lcd_putsLeft(MENU_DEBUG_Y_USB, "Usb"); + lcd_outdezAtt(MENU_DEBUG_COL1_OFS, MENU_DEBUG_Y_USB, charsWritten, LEFT); + lcd_puts(lcdLastPos, MENU_DEBUG_Y_USB, " "); + lcd_outdezAtt(lcdLastPos, MENU_DEBUG_Y_USB, APP_Rx_ptr_in, LEFT); + lcd_puts(lcdLastPos, MENU_DEBUG_Y_USB, " "); + lcd_outdezAtt(lcdLastPos, MENU_DEBUG_Y_USB, usbWraps, LEFT); +#endif + lcd_putsLeft(MENU_DEBUG_Y_RTOS, STR_FREESTACKMINB); lcd_putsAtt(MENU_DEBUG_COL1_OFS, MENU_DEBUG_Y_RTOS+1, "[M]", SMLSIZE); lcd_outdezAtt(lcdLastPos, MENU_DEBUG_Y_RTOS, stack_free(0), UNSIGN|LEFT); diff --git a/radio/src/main_arm.cpp b/radio/src/main_arm.cpp index bfff0b24f..d841b5a12 100644 --- a/radio/src/main_arm.cpp +++ b/radio/src/main_arm.cpp @@ -40,33 +40,62 @@ uint8_t currentSpeakerVolume = 255; uint8_t requiredSpeakerVolume = 255; uint8_t requestScreenshot = false; + +#if defined(USB_SERIAL) + +Fifo<64> cliRxFifo; + +void handleCli() +{ + uint8_t c; + + while(cliRxFifo.pop(c)) { + //send back + sendUsbSerialChar(c); + sendUsbSerialChar('+'); + } + +} +#endif + void handleUsbConnection() { #if defined(PCBTARANIS) && !defined(SIMU) static bool usbStarted = false; + if (!usbStarted && usbPlugged()) { + usbStarted = true; + + /* + We used to initialize USB peripheral and driver here. + According to my tests this is way too late. The USB peripheral + therefore does not have enough information to start responding to + USB host request, which causes very slow USB device recognition, + multiple USB device resets, etc... + + If we want to change the USB profile, the procedure is simple: + * USB cable must be disconnected + * call usbDeInit(); + * call usbUnit(); which initializes USB with the new profile. + Obviously the usbInit() should be modified to have a runtime + selection of the USB profile. + */ + #if defined(USB_MASS_STORAGE) opentxClose(); -#endif - usbStart(); -#if defined(USB_MASS_STORAGE) usbPluggedIn(); #endif - usbStarted = true; + } + if (usbStarted && !usbPlugged()) { + usbStarted = false; } #if defined(USB_JOYSTICK) - if (usbStarted) { - if (!usbPlugged()) { - //disable USB - usbStop(); - usbStarted = false; - } - else { - usbJoystickUpdate(); - } + if (usbStarted ) { + usbJoystickUpdate(); } #endif + #endif //#if defined(PCBTARANIS) && !defined(SIMU) } @@ -100,6 +129,9 @@ void perMain() handleUsbConnection(); checkTrainerSettings(); checkBattery(); +#if defined(USB_SERIAL) + handleCli(); +#endif uint8_t evt = getEvent(false); if (evt && (g_eeGeneral.backlightMode & e_backlight_mode_keys)) backlightOn(); // on keypress turn the light on diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 4b6c424ff..02724d937 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1759,4 +1759,10 @@ extern Clipboard clipboard; extern uint16_t s_anaFilt[NUMBER_ANALOG]; #endif +#if defined(USB_SERIAL) +extern Fifo<64> cliRxFifo; +void sendUsbSerialChar(uint8_t c); +#endif + + #endif diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index 6f108351b..b504584c2 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -1201,7 +1201,6 @@ uint32_t pwrPressed() { return false; } #else uint32_t pwrCheck() { return true; } #endif -void usbStart() { } int usbPlugged() { return false; } void USART_DeInit(USART_TypeDef* ) { } ErrorStatus RTC_SetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct) { return SUCCESS; } diff --git a/radio/src/targets/taranis/board_taranis.h b/radio/src/targets/taranis/board_taranis.h index f10818090..1123eb0fa 100644 --- a/radio/src/targets/taranis/board_taranis.h +++ b/radio/src/targets/taranis/board_taranis.h @@ -74,9 +74,10 @@ extern "C" { #endif #if !defined(SIMU) - #include "STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_core.h" - #include "STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Class/hid/inc/usbd_hid_core.h" - #include "STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Core/inc/usbd_usr.h" + #include "usbd_cdc_core.h" + #include "usbd_msc_core.h" + #include "usbd_hid_core.h" + #include "usbd_usr.h" #include "usbd_desc.h" #include "usb_conf.h" #include "usbd_conf.h" @@ -281,10 +282,7 @@ void backlightInit(void); // USB driver int usbPlugged(void); void usbInit(void); -void usbStart(void); -#if defined(USB_JOYSTICK) -void usbStop(void); -#endif +void usbDeInit(void); #if defined(__cplusplus) && !defined(SIMU) } diff --git a/radio/src/targets/taranis/bootloader/Makefile b/radio/src/targets/taranis/bootloader/Makefile index 84e78cfb6..745ff1c4b 100755 --- a/radio/src/targets/taranis/bootloader/Makefile +++ b/radio/src/targets/taranis/bootloader/Makefile @@ -109,6 +109,8 @@ ifeq ($(PCB), TARANIS) EXTRAINCDIRS += $(STM32USBPATH)/STM32_USB_OTG_Driver/inc EXTRAINCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Core/inc EXTRAINCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/inc + EXTRAINCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/hid/inc + EXTRAINCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/cdc/inc EXTRAINCDIRS += .. ../../.. ../../../fonts/std ifeq ($(PCBREV), REV4a) CPPDEFS += -DREV4a diff --git a/radio/src/targets/taranis/bootloader/boot.cpp b/radio/src/targets/taranis/bootloader/boot.cpp index 8567199e4..2460dd7fe 100755 --- a/radio/src/targets/taranis/bootloader/boot.cpp +++ b/radio/src/targets/taranis/bootloader/boot.cpp @@ -418,7 +418,6 @@ int main() // SD card detect pin sdInit(); usbInit(); - usbStart(); #endif for (;;) { diff --git a/radio/src/targets/taranis/uart3_driver.cpp b/radio/src/targets/taranis/uart3_driver.cpp index d91ec4479..987273740 100644 --- a/radio/src/targets/taranis/uart3_driver.cpp +++ b/radio/src/targets/taranis/uart3_driver.cpp @@ -109,6 +109,10 @@ void debugPutc(const char c) { if (uart3Mode == UART_MODE_DEBUG) { uart3Putc(c); +#if defined(USB_SERIAL) + // also send debug output into USB serial port (if active) + sendUsbSerialChar(c); +#endif } } #endif diff --git a/radio/src/targets/taranis/usb_conf.h b/radio/src/targets/taranis/usb_conf.h index a1e0279d4..a84c15bba 100644 --- a/radio/src/targets/taranis/usb_conf.h +++ b/radio/src/targets/taranis/usb_conf.h @@ -47,7 +47,7 @@ * when FS core is used. *******************************************************************************/ #ifndef USE_USB_OTG_FS - #define USE_USB_OTG_FS + #define USE_USB_OTG_FS // USB2.0 Full Speed == 12 Mbit #endif /* USE_USB_OTG_FS */ #ifdef USE_USB_OTG_FS diff --git a/radio/src/targets/taranis/usb_driver.c b/radio/src/targets/taranis/usb_driver.c index 97963ce06..448752fe3 100644 --- a/radio/src/targets/taranis/usb_driver.c +++ b/radio/src/targets/taranis/usb_driver.c @@ -35,8 +35,6 @@ */ #include "board_taranis.h" -#include "STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_OTG_Driver/inc/usb_dcd_int.h" -#include "STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_OTG_Driver/inc/usb_bsp.h" int usbPlugged(void) { @@ -63,28 +61,24 @@ USB_OTG_CORE_HANDLE USB_OTG_dev; void OTG_FS_IRQHandler(void) { - USBD_OTG_ISR_Handler (&USB_OTG_dev); + USBD_OTG_ISR_Handler(&USB_OTG_dev); } void usbInit(void) -{ - USB_OTG_BSP_Init(&USB_OTG_dev); -} - -void usbStart(void) { #if defined(USB_JOYSTICK) // initialize USB as HID device USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_HID_cb, &USR_cb); +#elif defined(USB_SERIAL) + // initialize USB as CDC device (virtual serial port) + USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_CDC_cb, &USR_cb); #elif defined(USB_MASS_STORAGE) // initialize USB as MSC device USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_MSC_cb, &USR_cb); #endif } -#if defined(USB_JOYSTICK) -void usbStop(void) +void usbDeInit(void) { USBD_DeInit(&USB_OTG_dev); } -#endif diff --git a/radio/src/targets/taranis/usbd_cdc.cpp b/radio/src/targets/taranis/usbd_cdc.cpp new file mode 100644 index 000000000..a79d649d2 --- /dev/null +++ b/radio/src/targets/taranis/usbd_cdc.cpp @@ -0,0 +1,212 @@ +/** + ****************************************************************************** + * @file usbd_cdc_vcp.c + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief Generic media access Layer. + ****************************************************************************** + * @attention + * + *