From 4925e756a624a9d387b0d459a8197f519a246d1d Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Fri, 26 Jan 2018 19:00:47 +0100 Subject: [PATCH] Save memory (move usb mass storage buffer to reusableBuffer) (#5579) * Save 128 byte by moving variable to stack * Make usb mass storage buffer smaller on F2 processors and put into reuseablebuffer - Lower USB mass storage buffer to 512 bytes per default on F2 targets, makes usb speed slightly slower ~600 kB/s instead ~700 KB/s in my tests, saving 3584 bytes - Save another ~300 bytes by putting that buffer into reusableBuffer * Don't put id into reusuableBuffer All uses of id can be on the stack as well. Makes no difference for ram usage but makes it safer to reuse reusableBuffer * Only link cdc serial when needed We always linked usb cdc even in non debug builds. CDC uses about ~600 byte of RAM for its buffers and structures. --- radio/src/gui/128x64/radio_version.cpp | 3 ++- radio/src/gui/212x64/radio_version.cpp | 5 +++-- radio/src/gui/480x272/radio_version.cpp | 5 +++-- radio/src/main_arm.cpp | 2 +- radio/src/mixer.cpp | 2 +- radio/src/opentx.cpp | 7 ++++++- radio/src/opentx.h | 14 ++++++++------ radio/src/serial.cpp | 2 +- .../src/targets/common/arm/stm32/CMakeLists.txt | 16 ++++++++++------ .../common/arm/stm32/bootloader/CMakeLists.txt | 1 + .../src/targets/common/arm/stm32/usb_driver.cpp | 2 ++ radio/src/targets/common/arm/stm32/usb_driver.h | 2 +- radio/src/targets/common/arm/stm32/usbd_conf.h | 7 ++++++- .../Class/msc/inc/usbd_msc_bot.h | 5 +++++ .../Class/msc/src/usbd_msc_bot.c | 4 +++- 15 files changed, 53 insertions(+), 24 deletions(-) diff --git a/radio/src/gui/128x64/radio_version.cpp b/radio/src/gui/128x64/radio_version.cpp index 7334ed96b..387ccb99f 100644 --- a/radio/src/gui/128x64/radio_version.cpp +++ b/radio/src/gui/128x64/radio_version.cpp @@ -32,8 +32,9 @@ void menuRadioVersion(event_t event) #endif #if defined(STM32) + char id[27]; if (event == EVT_ENTRY) { - getCPUUniqueID(reusableBuffer.version.id); + getCPUUniqueID(id); } #endif diff --git a/radio/src/gui/212x64/radio_version.cpp b/radio/src/gui/212x64/radio_version.cpp index c06e52372..7eb6b5ebf 100644 --- a/radio/src/gui/212x64/radio_version.cpp +++ b/radio/src/gui/212x64/radio_version.cpp @@ -22,6 +22,7 @@ void menuRadioVersion(event_t event) { + char id[27]; if (warningResult) { warningResult = 0; showMessageBox(STR_STORAGE_FORMAT); @@ -30,14 +31,14 @@ void menuRadioVersion(event_t event) } if (event == EVT_ENTRY) { - getCPUUniqueID(reusableBuffer.version.id); + getCPUUniqueID(id); } SIMPLE_MENU(STR_MENUVERSION, menuTabGeneral, MENU_RADIO_VERSION, 1); lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+1, vers_stamp); lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+4*FH+1, "UID\037\033:"); - lcdDrawText(5*FW+3, MENU_HEADER_HEIGHT+4*FH+1, reusableBuffer.version.id); + lcdDrawText(5*FW+3, MENU_HEADER_HEIGHT+4*FH+1, id); lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+5*FH+1, STR_EEBACKUP); lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+6*FH+1, STR_FACTORYRESET); diff --git a/radio/src/gui/480x272/radio_version.cpp b/radio/src/gui/480x272/radio_version.cpp index 2af42c988..e441a446b 100644 --- a/radio/src/gui/480x272/radio_version.cpp +++ b/radio/src/gui/480x272/radio_version.cpp @@ -22,6 +22,7 @@ bool menuRadioVersion(event_t event) { + char id[27]; #if 0 if (warningResult) { warningResult = 0; @@ -32,7 +33,7 @@ bool menuRadioVersion(event_t event) #endif if (event == EVT_ENTRY) { - getCPUUniqueID(reusableBuffer.version.id); + getCPUUniqueID(id); } SIMPLE_MENU(STR_MENUVERSION, RADIO_ICONS, menuTabGeneral, MENU_RADIO_VERSION, 0); @@ -42,7 +43,7 @@ bool menuRadioVersion(event_t event) lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 3*FH, time_stamp); lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 4*FH, eeprom_stamp); lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 5*FH, "UID:"); - lcdDrawText(MENUS_MARGIN_LEFT + 64, MENU_CONTENT_TOP + 5*FH, reusableBuffer.version.id); + lcdDrawText(MENUS_MARGIN_LEFT + 64, MENU_CONTENT_TOP + 5*FH, id); #if 0 if (event == EVT_KEY_LONG(KEY_ENTER)) { diff --git a/radio/src/main_arm.cpp b/radio/src/main_arm.cpp index 49476aa82..bc59d620e 100644 --- a/radio/src/main_arm.cpp +++ b/radio/src/main_arm.cpp @@ -58,7 +58,7 @@ void handleUsbConnection() #endif POPUP_MENU_START(onUSBConnectMenu); } - if (g_eeGeneral.USBMode != USB_UNSELECTED_MODE) { + if (g_eeGeneral.USBMode != USB_UNSELECTED_MODE && g_eeGeneral.USBMode <= USB_MAX_MODE) { setSelectedUsbMode(g_eeGeneral.USBMode); } } diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index a6d22568d..5c8695517 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -1089,7 +1089,6 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms) mixWarning = lv_mixWarning; } -int32_t sum_chans512[MAX_OUTPUT_CHANNELS] = {0}; #define MAX_ACT 0xffff @@ -1102,6 +1101,7 @@ uint8_t flightModeTransitionLast = 255; void evalMixes(uint8_t tick10ms) { + int32_t sum_chans512[MAX_OUTPUT_CHANNELS] = {0}; #if defined(PCBMEGA2560) && defined(DEBUG) && !defined(VOICE) PORTH |= 0x40; // PORTH:6 LOW->HIGH signals start of mixer interrupt #endif diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 3dd40b2fc..1c3481ef0 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -49,7 +49,12 @@ uint8_t heartbeat; safetych_t safetyCh[MAX_OUTPUT_CHANNELS]; #endif -union ReusableBuffer reusableBuffer; +// __DMA for the MSC_BOT_Data member +union ReusableBuffer reusableBuffer __DMA; + +#if defined(STM32) +uint8_t* MSC_BOT_Data = reusableBuffer.MSC_BOT_Data; +#endif const pm_uint8_t bchout_ar[] PROGMEM = { 0x1B, 0x1E, 0x27, 0x2D, 0x36, 0x39, diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 24d02f8b8..5d983a6a3 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -27,6 +27,9 @@ #include #include "definitions.h" #include "opentx_types.h" +#if defined(STM32) +#include "usbd_conf.h" +#endif #if defined(SIMU) #define SWITCH_SIMU(a, b) (a) @@ -1495,16 +1498,15 @@ union ReusableBuffer } sdmanager; #endif -#if defined(STM32) - struct - { - char id[27]; - } version; -#endif struct { uint8_t stickMode; } generalSettings; + +#if defined(STM32) + // Data for the USB mass storage driver. If USB mass storage runs no menu is not allowed to be displayed + uint8_t MSC_BOT_Data[MSC_MEDIA_PACKET]; +#endif }; extern union ReusableBuffer reusableBuffer; diff --git a/radio/src/serial.cpp b/radio/src/serial.cpp index 1fa789765..dc49c2d10 100644 --- a/radio/src/serial.cpp +++ b/radio/src/serial.cpp @@ -26,7 +26,7 @@ #define PRINTF_BUFFER_SIZE 128 void serialPutc(char c) { -#if !defined(BOOT) +#if !defined(BOOT) && defined(USB_SERIAL) if (getSelectedUsbMode() == USB_SERIAL_MODE) usbSerialPutc(c); #endif diff --git a/radio/src/targets/common/arm/stm32/CMakeLists.txt b/radio/src/targets/common/arm/stm32/CMakeLists.txt index 2db6d0ed4..78917813d 100644 --- a/radio/src/targets/common/arm/stm32/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/CMakeLists.txt @@ -38,14 +38,18 @@ set(FIRMWARE_TARGET_SRC ../common/arm/stm32/usb_driver.cpp ../common/arm/stm32/flash_driver.cpp ) -set(FIRMWARE_TARGET_SRC - ${FIRMWARE_TARGET_SRC} - ../common/arm/stm32/usbd_cdc.cpp + +if(DEBUG) + set(STM32USB_SRC + ${STM32USB_SRC} + STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c ) -set(STM32USB_SRC - ${STM32USB_SRC} - STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c + set(FIRMWARE_TARGET_SRC + ${FIRMWARE_TARGET_SRC} + ../common/arm/stm32/usbd_cdc.cpp ) + add_definitions(-DUSB_SERIAL) +endif() set(STM32USB_SRC ${STM32USB_SRC} STM32_USB_Device_Library/Class/msc/src/usbd_msc_data.c diff --git a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt index 3e88f4296..48f15d29f 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt @@ -109,6 +109,7 @@ endif() remove_definitions(-DDISK_CACHE) remove_definitions(-DLUA) remove_definitions(-DCLI) +remove_definitions(-DUSB_SERIAL) add_definitions(-DBOOT) set(CMAKE_EXE_LINKER_FLAGS "-mcpu=${MCU} -mthumb -nostartfiles -lm -T${RADIO_SRC_DIRECTORY}/targets/${TARGET_DIR}/stm32_ramboot.ld -Wl,-Map=bootloader.map,--cref,--no-warn-mismatch,--gc-sections") diff --git a/radio/src/targets/common/arm/stm32/usb_driver.cpp b/radio/src/targets/common/arm/stm32/usb_driver.cpp index 946da0414..7e31ce5d0 100644 --- a/radio/src/targets/common/arm/stm32/usb_driver.cpp +++ b/radio/src/targets/common/arm/stm32/usb_driver.cpp @@ -91,6 +91,8 @@ void usbStart() // initialize USB as HID device USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_HID_cb, &USR_cb); break; +#endif +#if defined(USB_SERIAL) case USB_SERIAL_MODE: // 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); diff --git a/radio/src/targets/common/arm/stm32/usb_driver.h b/radio/src/targets/common/arm/stm32/usb_driver.h index 2d26fa930..90e1ccd84 100644 --- a/radio/src/targets/common/arm/stm32/usb_driver.h +++ b/radio/src/targets/common/arm/stm32/usb_driver.h @@ -27,7 +27,7 @@ enum usbMode { USB_JOYSTICK_MODE, USB_MASS_STORAGE_MODE, USB_SERIAL_MODE, -#if defined(DEBUG) +#if defined(USB_SERIAL) USB_MAX_MODE=USB_SERIAL_MODE #else USB_MAX_MODE=USB_MASS_STORAGE_MODE diff --git a/radio/src/targets/common/arm/stm32/usbd_conf.h b/radio/src/targets/common/arm/stm32/usbd_conf.h index 7feff433f..594d061f1 100644 --- a/radio/src/targets/common/arm/stm32/usbd_conf.h +++ b/radio/src/targets/common/arm/stm32/usbd_conf.h @@ -23,7 +23,7 @@ #define _USBD_CONF_H_ /* Includes ------------------------------------------------------------------*/ -#include "usb_conf.h" +#include #define USBD_CFG_MAX_NUM 1 #define USBD_ITF_MAX_NUM 1 @@ -37,7 +37,12 @@ #define MSC_OUT_EP 0x01 #define MSC_MAX_PACKET 64 +// Save some RAM on smaller STM32 processors. Slightly lowers USB mass storage speed +#if defined(STM32F2) && !defined(BOOT) +#define MSC_MEDIA_PACKET 512 +#else #define MSC_MEDIA_PACKET 4096 +#endif #define HID_IN_EP 0x81 #define HID_OUT_EP 0x01 diff --git a/radio/src/thirdparty/STM32_USB-Host-Device_Lib_V2.2.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_bot.h b/radio/src/thirdparty/STM32_USB-Host-Device_Lib_V2.2.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_bot.h index cf960ad4f..e8e8c99ab 100644 --- a/radio/src/thirdparty/STM32_USB-Host-Device_Lib_V2.2.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_bot.h +++ b/radio/src/thirdparty/STM32_USB-Host-Device_Lib_V2.2.0/Libraries/STM32_USB_Device_Library/Class/msc/inc/usbd_msc_bot.h @@ -27,6 +27,7 @@ /* Define to prevent recursive inclusion -------------------------------------*/ +#include "usb_conf.h" #include "usbd_core.h" /* Define to prevent recursive inclusion -------------------------------------*/ @@ -111,7 +112,11 @@ MSC_BOT_CSW_TypeDef; * @{ */ +#if defined(BOOT) extern uint8_t MSC_BOT_Data[]; +#else +extern uint8_t* MSC_BOT_Data; +#endif extern uint16_t MSC_BOT_DataLen; extern uint8_t MSC_BOT_State; extern uint8_t MSC_BOT_BurstMode; diff --git a/radio/src/thirdparty/STM32_USB-Host-Device_Lib_V2.2.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_bot.c b/radio/src/thirdparty/STM32_USB-Host-Device_Lib_V2.2.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_bot.c index 5aff1a9c4..e1e9a2536 100644 --- a/radio/src/thirdparty/STM32_USB-Host-Device_Lib_V2.2.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_bot.c +++ b/radio/src/thirdparty/STM32_USB-Host-Device_Lib_V2.2.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_bot.c @@ -80,7 +80,9 @@ uint8_t MSC_BOT_Status; #endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ #include "definitions.h" -uint8_t MSC_BOT_Data[MSC_MEDIA_PACKET] __DMA; // modified by OpenTX +#if defined(BOOT) +uint8_t MSC_BOT_Data[MSC_MEDIA_PACKET] __DMA; // modified by OpenTX +#endif #ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED #if defined ( __ICCARM__ ) /*!< IAR Compiler */