From 5acaa79c1c18df88ae2d900af578dadec0153f4e Mon Sep 17 00:00:00 2001 From: Risto Date: Thu, 26 Jan 2023 05:39:31 +0100 Subject: [PATCH] feat(fw): Only show SD card in USB storage mode (#3045) * Only attach SD card in USB storage mode * Added compile time option FWDRIVE (default OFF) to enable attaching also the firmware drive via USB, when attached in mass storage mode. * Re-trigger GitHub Actions * chore: Trailing whitespace cleanup --- radio/src/CMakeLists.txt | 5 + .../src/targets/common/arm/stm32/usbd_desc.c | 4 +- .../common/arm/stm32/usbd_storage_msd.cpp | 148 ++++++++++-------- 3 files changed, 88 insertions(+), 69 deletions(-) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 69a5082ed..fa10f2b6c 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -59,6 +59,7 @@ option(TBS_RELEASE "Used to build TBS released firmware" OFF) option(IMRC_RELEASE "Used to build IMRC released firmware" OFF) option(HARDWARE_TRAINER_MULTI "Allow multi trainer" OFF) option(BOOTLOADER "Include Bootloader" ON) +option(FWDRIVE "Attach also firmware drive with USB" OFF) # since we reset all default CMAKE compiler flags for firmware builds, provide an alternate way for user to specify additional flags. set(FIRMWARE_C_FLAGS "" CACHE STRING "Additional flags for firmware target c compiler (note: all CMAKE_C_FLAGS[_*] are ignored for firmware/bootloader).") @@ -453,6 +454,10 @@ else() endif() add_definitions(-DDEFAULT_TEMPLATE_SETUP=${DEFAULT_TEMPLATE_SETUP}) +if(FWDRIVE) + add_definitions(-DFWDRIVE) +endif() + set(SRC ${SRC} opentx.cpp diff --git a/radio/src/targets/common/arm/stm32/usbd_desc.c b/radio/src/targets/common/arm/stm32/usbd_desc.c index 47e322a34..64cb9dedd 100644 --- a/radio/src/targets/common/arm/stm32/usbd_desc.c +++ b/radio/src/targets/common/arm/stm32/usbd_desc.c @@ -58,7 +58,7 @@ #define USBD_VID_PID_CODES 0x1209 // https://pid.codes #define USBD_LANGID_STRING 0x409 -#define USBD_MANUFACTURER_STRING "OpenTX" +#define USBD_MANUFACTURER_STRING "EdgeTX" #define USBD_SERIALNUMBER_FS_STRING "00000000001B" #if defined(BOOT) @@ -294,4 +294,4 @@ uint8_t * USBD_USR_InterfaceStrDescriptor( uint8_t speed , uint16_t *length) return USBD_StrDesc; } -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ \ No newline at end of file +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/radio/src/targets/common/arm/stm32/usbd_storage_msd.cpp b/radio/src/targets/common/arm/stm32/usbd_storage_msd.cpp index 6f3fceb1d..fb5963e8c 100644 --- a/radio/src/targets/common/arm/stm32/usbd_storage_msd.cpp +++ b/radio/src/targets/common/arm/stm32/usbd_storage_msd.cpp @@ -44,68 +44,74 @@ extern "C" { enum MassstorageLuns { STORAGE_SDCARD_LUN, +#if defined(FWDRIVE) STORAGE_EEPROM_LUN, +#endif STORAGE_LUN_NBR }; /* USB Mass storage Standard Inquiry Data */ -const unsigned char STORAGE_Inquirydata[] = { //36 +const unsigned char STORAGE_Inquirydata[] = { /* LUN 0 */ - 0x00, - 0x80, - 0x02, + 0x00, + 0x80, + 0x02, 0x02, (USBD_STD_INQUIRY_LENGTH - 5), 0x00, - 0x00, + 0x00, 0x00, USB_MANUFACTURER, /* Manufacturer : 8 bytes */ USB_PRODUCT, /* Product : 16 Bytes */ 'R', 'a', 'd', 'i', 'o', ' ', ' ', ' ', '1', '.', '0', '0', /* Version : 4 Bytes */ +#if defined(FWDRIVE) /* LUN 1 */ - 0x00, - 0x80, - 0x02, + 0x00, + 0x80, + 0x02, 0x02, (USBD_STD_INQUIRY_LENGTH - 5), 0x00, - 0x00, + 0x00, 0x00, USB_MANUFACTURER, /* Manufacturer : 8 bytes */ USB_PRODUCT, /* Product : 16 Bytes */ 'R', 'a', 'd', 'i', 'o', ' ', ' ', ' ', '1', '.', '0' ,'0', /* Version : 4 Bytes */ +#endif }; -#define RESERVED_SECTORS (1 /*Boot*/ + 2 /*Fat table */ + 1 /*Root dir*/ + 8 /* one cluster for firmware.txt */) +#if defined(FWDRIVE) + #define RESERVED_SECTORS (1 /*Boot*/ + 2 /*Fat table */ + 1 /*Root dir*/ + 8 /* one cluster for firmware.txt */) -int32_t fat12Write(const uint8_t * buffer, uint16_t sector, uint16_t count); -int32_t fat12Read(uint8_t * buffer, uint16_t sector, uint16_t count ); + int32_t fat12Write(const uint8_t * buffer, uint16_t sector, uint16_t count); + int32_t fat12Read(uint8_t * buffer, uint16_t sector, uint16_t count ); +#endif int8_t STORAGE_Init (uint8_t lun); -int8_t STORAGE_GetCapacity (uint8_t lun, - uint32_t *block_num, +int8_t STORAGE_GetCapacity (uint8_t lun, + uint32_t *block_num, uint32_t *block_size); -int8_t STORAGE_IsReady (uint8_t lun); +int8_t STORAGE_IsReady (uint8_t lun); -int8_t STORAGE_IsWriteProtected (uint8_t lun); +int8_t STORAGE_IsWriteProtected (uint8_t lun); -int8_t STORAGE_Read (uint8_t lun, - uint8_t *buf, +int8_t STORAGE_Read (uint8_t lun, + uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); -int8_t STORAGE_Write (uint8_t lun, - uint8_t *buf, +int8_t STORAGE_Write (uint8_t lun, + uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); int8_t STORAGE_GetMaxLun (void); -const USBD_STORAGE_cb_TypeDef USBD_MICRO_SDIO_fops = // modified my OpenTX +const USBD_STORAGE_cb_TypeDef USBD_MICRO_SDIO_fops = { STORAGE_Init, STORAGE_GetCapacity, @@ -117,7 +123,7 @@ const USBD_STORAGE_cb_TypeDef USBD_MICRO_SDIO_fops = // modified my OpenTX (int8_t *)STORAGE_Inquirydata, }; -const USBD_STORAGE_cb_TypeDef * const USBD_STORAGE_fops = &USBD_MICRO_SDIO_fops; // modified my OpenTX +const USBD_STORAGE_cb_TypeDef * const USBD_STORAGE_fops = &USBD_MICRO_SDIO_fops; #if defined(__cplusplus) && !defined(SIMU) } @@ -134,8 +140,8 @@ int8_t STORAGE_Init (uint8_t lun) /* TODO if no SD ... if( SD_Init() != 0) { - return (-1); - } + return (-1); + } */ return (0); } @@ -149,19 +155,21 @@ int8_t STORAGE_Init (uint8_t lun) */ int8_t STORAGE_GetCapacity (uint8_t lun, uint32_t *block_num, uint32_t *block_size) { +#if defined(FWDRIVE) if (lun == STORAGE_EEPROM_LUN) { *block_size = BLOCK_SIZE; -#if defined(EEPROM) + #if defined(EEPROM) *block_num = RESERVED_SECTORS + EEPROM_SIZE/BLOCK_SIZE + FLASHSIZE/BLOCK_SIZE; -#else + #else *block_num = RESERVED_SECTORS + FLASHSIZE/BLOCK_SIZE; -#endif + #endif return 0; } +#endif if (!SD_CARD_PRESENT()) return -1; - + *block_size = BLOCK_SIZE; static DWORD sector_count = 0; @@ -182,7 +190,9 @@ uint8_t lunReady[STORAGE_LUN_NBR]; void usbInitLUNs() { lunReady[STORAGE_SDCARD_LUN] = 1; +#if defined(FWDRIVE) lunReady[STORAGE_EEPROM_LUN] = 1; +#endif } /** @@ -191,13 +201,12 @@ void usbInitLUNs() * @retval Status */ int8_t STORAGE_IsReady (uint8_t lun) -{ -#if defined(EEPROM) +{ +#if defined(FWDRIVE) && defined(EEPROM) if (lun == STORAGE_EEPROM_LUN) { return (lunReady[STORAGE_EEPROM_LUN] != 0) ? 0 : -1; } #endif - return (lunReady[STORAGE_SDCARD_LUN] != 0 && SD_CARD_PRESENT()) ? 0 : -1; } @@ -220,16 +229,18 @@ int8_t STORAGE_IsWriteProtected (uint8_t lun) * @retval Status */ -int8_t STORAGE_Read (uint8_t lun, - uint8_t *buf, - uint32_t blk_addr, +int8_t STORAGE_Read (uint8_t lun, + uint8_t *buf, + uint32_t blk_addr, uint16_t blk_len) { WATCHDOG_SUSPEND(100/*1s*/); - + +#if defined(FWDRIVE) if (lun == STORAGE_EEPROM_LUN) { return (fat12Read(buf, blk_addr, blk_len) == 0) ? 0 : -1; } +#endif // read without cache return (__disk_read(0, buf, blk_addr, blk_len) == RES_OK) ? 0 : -1; @@ -243,16 +254,18 @@ int8_t STORAGE_Read (uint8_t lun, * @retval Status */ -int8_t STORAGE_Write (uint8_t lun, - uint8_t *buf, +int8_t STORAGE_Write (uint8_t lun, + uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) { WATCHDOG_SUSPEND(100/*1s*/); - + +#if defined(FWDRIVE) if (lun == STORAGE_EEPROM_LUN) { return (fat12Write(buf, blk_addr, blk_len) == 0) ? 0 : -1; } +#endif // write without cache return (__disk_write(0, buf, blk_addr, blk_len) == RES_OK) ? 0 : -1; @@ -269,39 +282,39 @@ int8_t STORAGE_GetMaxLun (void) return STORAGE_LUN_NBR - 1; } - +#if defined(FWDRIVE) /* Firmware.txt */ const char firmware_txt[] = -#if defined(BOOT) + #if defined(BOOT) "EdgeTX Bootloader" -#else + #else "EdgeTX Firmware" -#endif + #endif " for " FLAVOUR "\r\n\r\n" -#if defined(BOOT) + #if defined(BOOT) "BOOTVER " -#else + #else "FWVERSION " -#endif + #endif "edgetx-" FLAVOUR "-" VERSION " (" GIT_STR ")\r\n" "DATE " DATE "\r\n" "TIME " TIME "\r\n" -#if !defined(BOOT) + #if !defined(BOOT) "BOOTVER " -#else + #else "FWVERSION " -#endif + #endif ; //------------------------------------------------------------------------------ /** * FAT12 boot sector partition. */ -#if defined(EEPROM) -#define TOTALSECTORS (RESERVED_SECTORS + (EEPROM_SIZE/BLOCK_SIZE) + (FLASHSIZE/BLOCK_SIZE)) -#else -#define TOTALSECTORS (RESERVED_SECTORS + (FLASHSIZE/BLOCK_SIZE)) -#endif + #if defined(EEPROM) + #define TOTALSECTORS (RESERVED_SECTORS + (EEPROM_SIZE/BLOCK_SIZE) + (FLASHSIZE/BLOCK_SIZE)) + #else + #define TOTALSECTORS (RESERVED_SECTORS + (FLASHSIZE/BLOCK_SIZE)) + #endif const char g_FATboot[BLOCK_SIZE] = { 0xeb, 0x3c, 0x90, // Jump instruction. @@ -424,11 +437,11 @@ const FATDirEntry_t g_DIRroot[] = { { 'F', 'I', 'R', 'M', 'W', 'A', 'R', 'E'}, { 'B', 'I', 'N'}, -#if defined(BOOT) + #if defined(BOOT) 0x20, // Archive -#else + #else 0x21, // Readonly+Archive -#endif + #endif 0x00, 0x3E, 0xA301, @@ -440,7 +453,7 @@ const FATDirEntry_t g_DIRroot[] = 0x0003, FLASHSIZE }, -#if defined(EEPROM) + #if defined(EEPROM) { { 'E', 'E', 'P', 'R', 'O', 'M', ' ', ' '}, { 'B', 'I', 'N'}, @@ -456,7 +469,7 @@ const FATDirEntry_t g_DIRroot[] = 0x0003 + (FLASHSIZE/BLOCK_SIZE)/8, EEPROM_SIZE }, -#endif + #endif // Emty entries are 0x00, omitted here. Up to 16 entries can be defined here }; @@ -508,12 +521,12 @@ int32_t fat12Read(uint8_t * buffer, uint16_t sector, uint16_t count) pushCluster (buffer, sector, cluster, rest, cluster+1); pushCluster (buffer, sector, cluster, rest, (uint16_t) 0xFFF); -#if defined(EEPROM) + #if defined(EEPROM) // Entry for eeprom.bin for (int i=0;i