From 0cf78746ed43fdbd7fdd962406775156f73bf9d8 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 23 Aug 2019 16:48:19 +0200 Subject: [PATCH] [X10 Express] Internal module flash OK --- radio/src/io/frsky_firmware_update.cpp | 138 +++++++++++++------------ radio/src/io/frsky_firmware_update.h | 12 ++- radio/src/targets/horus/hal.h | 1 - radio/src/targets/taranis/hal.h | 1 - 4 files changed, 83 insertions(+), 69 deletions(-) diff --git a/radio/src/io/frsky_firmware_update.cpp b/radio/src/io/frsky_firmware_update.cpp index 1e793c4b3..8baeacb72 100644 --- a/radio/src/io/frsky_firmware_update.cpp +++ b/radio/src/io/frsky_firmware_update.cpp @@ -96,28 +96,6 @@ void FrskyDeviceFirmwareUpdate::processFrame(const uint8_t * frame) } } -void FrskyDeviceFirmwareUpdate::startup() -{ - switch(module) { -#if defined(INTMODULE_USART) - case INTERNAL_MODULE: - intmoduleSerialStart(INTMODULE_FLASH_BAUDRATE, true); - break; -#endif - - default: - telemetryInit(PROTOCOL_TELEMETRY_FRSKY_SPORT); - break; - } - - if (module == INTERNAL_MODULE) - INTERNAL_MODULE_ON(); - else if (module == EXTERNAL_MODULE) - EXTERNAL_MODULE_ON(); - else - SPORT_UPDATE_POWER_ON(); -} - bool FrskyDeviceFirmwareUpdate::readBuffer(uint8_t * buffer, uint8_t count, uint32_t timeout) { watchdogSuspend(timeout); @@ -310,10 +288,11 @@ const char * FrskyDeviceFirmwareUpdate::sendReqVersion() return "Version request failed"; } -const char * FrskyDeviceFirmwareUpdate::uploadFile(const char * filename) +const char * FrskyDeviceFirmwareUpdate::doFlashFirmware(const char * filename) { FIL file; - uint32_t buffer[1024 / sizeof(uint32_t)]; + const char * result; + FrSkyFirmwareInformation information; UINT count; if (f_open(&file, filename, FA_READ) != FR_OK) { @@ -322,14 +301,57 @@ const char * FrskyDeviceFirmwareUpdate::uploadFile(const char * filename) const char * ext = getFileExtension(filename); if (ext && !strcasecmp(ext, UPDATE_FIRMWARE_EXT)) { - // FrSkyFirmwareInformation * information = (FrSkyFirmwareInformation *) buffer; - if (f_read(&file, buffer, sizeof(FrSkyFirmwareInformation), &count) != FR_OK || count != sizeof(FrSkyFirmwareInformation)) { + if (f_read(&file, &information, sizeof(FrSkyFirmwareInformation), &count) != FR_OK || count != sizeof(FrSkyFirmwareInformation)) { f_close(&file); return "Format error"; } + } else { +#if defined(PCBHORUS) + information.productId = FIRMWARE_ID_XJT; +#endif } #if defined(PCBHORUS) + if (module == INTERNAL_MODULE && information.productId == FIRMWARE_ID_XJT) { + INTERNAL_MODULE_ON(); + intmoduleSerialStart(38400, true); + GPIO_SetBits(INTMODULE_BOOTCMD_GPIO, INTMODULE_BOOTCMD_GPIO_PIN); + result = uploadFileToHorusXJT(filename, &file); + GPIO_ResetBits(INTMODULE_BOOTCMD_GPIO, INTMODULE_BOOTCMD_GPIO_PIN); + f_close(&file); + return result; + } +#endif + + switch (module) { +#if defined(INTMODULE_USART) + case INTERNAL_MODULE: + intmoduleSerialStart(57600, true); + break; +#endif + + default: + telemetryInit(PROTOCOL_TELEMETRY_FRSKY_SPORT); + break; + } + + if (module == INTERNAL_MODULE) + INTERNAL_MODULE_ON(); + else if (module == EXTERNAL_MODULE) + EXTERNAL_MODULE_ON(); + else + SPORT_UPDATE_POWER_ON(); + + result = uploadFileNormal(filename, &file); + f_close(&file); + return result; +} + +#if defined(PCBHORUS) +const char * FrskyDeviceFirmwareUpdate::uploadFileToHorusXJT(const char * filename, FIL * file) +{ + uint32_t buffer[1024 / sizeof(uint32_t)]; + UINT count; uint8_t frame[8]; if (!readBuffer(frame, 8, 100) || frame[0] != 0x01) { @@ -347,11 +369,10 @@ const char * FrskyDeviceFirmwareUpdate::uploadFile(const char * filename) readBuffer(frame, 1, 100); uint8_t index = 0; - while (1) { - drawProgressScreen(getBasename(filename), STR_WRITING, file.fptr, file.obj.objsize); + while (true) { + drawProgressScreen(getBasename(filename), STR_WRITING, file->fptr, file->obj.objsize); - if (f_read(&file, buffer, 1024, &count) != FR_OK) { - f_close(&file); + if (f_read(file, buffer, 1024, &count) != FR_OK) { return "Error reading file"; } @@ -362,7 +383,6 @@ const char * FrskyDeviceFirmwareUpdate::uploadFile(const char * filename) return "Wrong request"; if (count == 0) { - f_close(&file); intmoduleSendByte(0xA1); RTOS_WAIT_MS(50); return nullptr; @@ -375,7 +395,7 @@ const char * FrskyDeviceFirmwareUpdate::uploadFile(const char * filename) intmoduleSendByte(frame[1]); uint16_t crc_16 = crc16(CRC_1189, (uint8_t *)buffer, 1024, crc16(CRC_1189, &frame[1], 1)); - for (unsigned i = 0; i < sizeof(buffer); i++) { + for (size_t i = 0; i < sizeof(buffer); i++) { intmoduleSendByte(((uint8_t *)buffer)[i]); } intmoduleSendByte(crc_16 >> 8); @@ -383,7 +403,22 @@ const char * FrskyDeviceFirmwareUpdate::uploadFile(const char * filename) index++; } -#else +} +#endif + +const char * FrskyDeviceFirmwareUpdate::uploadFileNormal(const char * filename, FIL * file) +{ + uint32_t buffer[1024 / sizeof(uint32_t)]; + UINT count; + + const char * result = sendPowerOn(); + if (result) + return result; + + result = sendReqVersion(); + if (result) + return result; + RTOS_WAIT_MS(200); telemetryClearFifo(); @@ -391,9 +426,8 @@ const char * FrskyDeviceFirmwareUpdate::uploadFile(const char * filename) startFrame(PRIM_CMD_DOWNLOAD); sendFrame(); - while (1) { - if (f_read(&file, buffer, 1024, &count) != FR_OK) { - f_close(&file); + while (true) { + if (f_read(file, buffer, 1024, &count) != FR_OK) { return "Error reading file"; } @@ -410,16 +444,16 @@ const char * FrskyDeviceFirmwareUpdate::uploadFile(const char * filename) state = SPORT_DATA_TRANSFER, sendFrame(); if (i == 0) { - drawProgressScreen(getBasename(filename), STR_WRITING, file.fptr, file.obj.objsize); + drawProgressScreen(getBasename(filename), STR_WRITING, file->fptr, file->obj.objsize); } } if (count < 256) { - f_close(&file); - return nullptr; + break; } } -#endif + + return endTransfer(); } const char * FrskyDeviceFirmwareUpdate::endTransfer() @@ -434,28 +468,6 @@ const char * FrskyDeviceFirmwareUpdate::endTransfer() return nullptr; } -const char * FrskyDeviceFirmwareUpdate::doFlashFirmware(const char * filename) -{ - const char * result; - -#if defined(PCBHORUS) - if (module == INTERNAL_MODULE) { - intmoduleSerialStart(38400, true); - GPIO_SetBits(INTMODULE_BOOTCMD_GPIO, INTMODULE_BOOTCMD_GPIO_PIN); - result = uploadFile(filename); - GPIO_ResetBits(INTMODULE_BOOTCMD_GPIO, INTMODULE_BOOTCMD_GPIO_PIN); - return result; - } -#endif - - result = sendPowerOn(); - if (!result) result = sendReqVersion(); - if (!result) result = uploadFile(filename); - if (!result) result = endTransfer(); - - return result; -} - const char * FrskyDeviceFirmwareUpdate::flashFirmware(const char * filename) { pausePulses(); @@ -476,8 +488,6 @@ const char * FrskyDeviceFirmwareUpdate::flashFirmware(const char * filename) watchdogSuspend(2000); RTOS_WAIT_MS(2000); - startup(); - const char * result = doFlashFirmware(filename); AUDIO_PLAY(AU_SPECIAL_SOUND_BEEP1 ); diff --git a/radio/src/io/frsky_firmware_update.h b/radio/src/io/frsky_firmware_update.h index e23b5cb98..9d3dcc820 100644 --- a/radio/src/io/frsky_firmware_update.h +++ b/radio/src/io/frsky_firmware_update.h @@ -24,6 +24,7 @@ #include "dataconstants.h" #include "definitions.h" #include "frsky_pxx2.h" +#include "ff.h" enum FrskyFirmwareProductFamily { FIRMWARE_FAMILY_INTERNAL_MODULE, @@ -34,6 +35,12 @@ enum FrskyFirmwareProductFamily { FIRMWARE_FAMILY_POWER_MANAGEMENT_UNIT, }; +enum FrskyFirmwareProductId { + FIRMWARE_ID_NONE, + FIRMWARE_ID_XJT = 0x01, + FIRMWARE_ID_ISRM = 0x02, +}; + PACK(struct FrSkyFirmwareInformation { uint32_t fourcc; uint8_t headerVersion; @@ -74,8 +81,6 @@ class FrskyDeviceFirmwareUpdate { ModuleIndex module; uint8_t frame[12]; - void startup(); - void startFrame(uint8_t command); void sendFrame(); @@ -89,7 +94,8 @@ class FrskyDeviceFirmwareUpdate { const char * doFlashFirmware(const char * filename); const char * sendPowerOn(); const char * sendReqVersion(); - const char * uploadFile(const char * filename); + const char * uploadFileNormal(const char * filename, FIL * file); + const char * uploadFileToHorusXJT(const char * filename, FIL * file); const char * endTransfer(); }; diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 186bd3329..a811610dc 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -590,7 +590,6 @@ #define INTMODULE_BOOTCMD_GPIO GPIOI #define INTMODULE_BOOTCMD_GPIO_PIN GPIO_Pin_9 // PI.09 #endif -#define INTMODULE_FLASH_BAUDRATE 38400 #if defined(PCBX10) || PCBREV >= 13 #define INTMODULE_RCC_APB1Periph RCC_APB1Periph_TIM2 #define INTMODULE_RCC_APB2Periph RCC_APB2Periph_USART1 diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index a4cba3fda..ea0d08f95 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -912,7 +912,6 @@ #else #define INTERNAL_MODULE_PXX1 #endif -#define INTMODULE_FLASH_BAUDRATE 57600 #if defined(PCBXLITE) || defined(PCBX9LITE) #define INTMODULE_RCC_APB1Periph 0 #define INTMODULE_RCC_APB2Periph RCC_APB2Periph_USART1