1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-25 17:25:13 +03:00

Bsongis/autoupdate (#6521)

Auto update internal chips at boot if /FIRMWARE/autoupdate.frsk is present on SD
This commit is contained in:
Bertrand Songis 2019-06-21 08:52:48 +02:00 committed by GitHub
parent 8cdcf565c2
commit dbec79e10f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 99 additions and 21 deletions

View file

@ -355,7 +355,7 @@ const char * FrskyDeviceFirmwareUpdate::endTransfer()
return nullptr; return nullptr;
} }
void FrskyDeviceFirmwareUpdate::flashFirmware(const char * filename) const char * FrskyDeviceFirmwareUpdate::flashFirmware(const char * filename)
{ {
pausePulses(); pausePulses();
@ -416,6 +416,8 @@ void FrskyDeviceFirmwareUpdate::flashFirmware(const char * filename)
state = SPORT_IDLE; state = SPORT_IDLE;
resumePulses(); resumePulses();
return result;
} }
#define CHIP_FIRMWARE_UPDATE_TIMEOUT 20000 /* 20s */ #define CHIP_FIRMWARE_UPDATE_TIMEOUT 20000 /* 20s */
@ -452,8 +454,6 @@ const char * FrskyChipFirmwareUpdate::waitAnswer(uint8_t & status)
const char * FrskyChipFirmwareUpdate::startBootloader() const char * FrskyChipFirmwareUpdate::startBootloader()
{ {
telemetryPortSetDirectionOutput();
sportSendByte(0x01); sportSendByte(0x01);
for (uint8_t i = 0; i < 30; i++) for (uint8_t i = 0; i < 30; i++)
@ -489,8 +489,6 @@ void FrskyChipFirmwareUpdate::sendByte(uint8_t byte, bool crcFlag)
const char * FrskyChipFirmwareUpdate::sendUpgradeCommand(char command, uint32_t packetsCount) const char * FrskyChipFirmwareUpdate::sendUpgradeCommand(char command, uint32_t packetsCount)
{ {
telemetryPortSetDirectionOutput();
crc = 0; crc = 0;
// Head // Head
@ -532,8 +530,6 @@ const char * FrskyChipFirmwareUpdate::sendUpgradeCommand(char command, uint32_t
const char * FrskyChipFirmwareUpdate::sendUpgradeData(uint32_t index, uint8_t * data) const char * FrskyChipFirmwareUpdate::sendUpgradeData(uint32_t index, uint8_t * data)
{ {
telemetryPortSetDirectionOutput();
crc = 0; crc = 0;
// Head // Head
@ -620,7 +616,7 @@ const char * FrskyChipFirmwareUpdate::doFlashFirmware(const char * filename)
return sendUpgradeCommand('E', packetsCount); return sendUpgradeCommand('E', packetsCount);
} }
void FrskyChipFirmwareUpdate::flashFirmware(const char * filename) const char * FrskyChipFirmwareUpdate::flashFirmware(const char * filename, bool wait)
{ {
drawProgressScreen(getBasename(filename), STR_DEVICE_RESET, 0, 0); drawProgressScreen(getBasename(filename), STR_DEVICE_RESET, 0, 0);
@ -636,9 +632,11 @@ void FrskyChipFirmwareUpdate::flashFirmware(const char * filename)
SPORT_UPDATE_POWER_OFF(); SPORT_UPDATE_POWER_OFF();
/* wait 2s off */ if (wait) {
watchdogSuspend(2000); /* wait 2s off */
RTOS_WAIT_MS(2000); watchdogSuspend(2000);
RTOS_WAIT_MS(2000);
}
telemetryInit(PROTOCOL_TELEMETRY_FRSKY_SPORT); telemetryInit(PROTOCOL_TELEMETRY_FRSKY_SPORT);
@ -655,13 +653,6 @@ void FrskyChipFirmwareUpdate::flashFirmware(const char * filename)
POPUP_INFORMATION(STR_FIRMWARE_UPDATE_SUCCESS); POPUP_INFORMATION(STR_FIRMWARE_UPDATE_SUCCESS);
} }
#if defined(HARDWARE_INTERNAL_MODULE)
INTERNAL_MODULE_OFF();
#endif
EXTERNAL_MODULE_OFF();
SPORT_UPDATE_POWER_OFF();
/* wait 2s off */ /* wait 2s off */
watchdogSuspend(2000); watchdogSuspend(2000);
RTOS_WAIT_MS(2000); RTOS_WAIT_MS(2000);
@ -679,4 +670,6 @@ void FrskyChipFirmwareUpdate::flashFirmware(const char * filename)
} }
resumePulses(); resumePulses();
return result;
} }

View file

@ -22,6 +22,7 @@
#define _FRSKY_FIRMWARE_UPDATE_H_ #define _FRSKY_FIRMWARE_UPDATE_H_
#include "dataconstants.h" #include "dataconstants.h"
#include "definitions.h"
#include "frsky_pxx2.h" #include "frsky_pxx2.h"
enum FrskyFirmwareProductFamily { enum FrskyFirmwareProductFamily {
@ -65,7 +66,7 @@ class FrskyDeviceFirmwareUpdate {
module(module) { module(module) {
} }
void flashFirmware(const char * filename); const char * flashFirmware(const char * filename);
protected: protected:
uint8_t state = SPORT_IDLE; uint8_t state = SPORT_IDLE;
@ -96,7 +97,7 @@ class FrskyChipFirmwareUpdate {
{ {
} }
void flashFirmware(const char * filename); const char * flashFirmware(const char * filename, bool wait = true);
protected: protected:
uint8_t crc; uint8_t crc;

View file

@ -18,6 +18,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#include <io/frsky_firmware_update.h>
#include "opentx.h" #include "opentx.h"
RadioData g_eeGeneral; RadioData g_eeGeneral;
@ -1753,10 +1754,19 @@ void opentxInit()
unexpectedShutdown = 1; unexpectedShutdown = 1;
} }
#if defined(SDCARD) && !defined(PCBMEGA2560) #if defined(SDCARD)
// SDCARD related stuff, only done if not unexpectedShutdown // SDCARD related stuff, only done if not unexpectedShutdown
if (!unexpectedShutdown) { if (!unexpectedShutdown) {
sdInit(); sdInit();
#if defined(AUTOUPDATE)
if (f_stat(AUTOUPDATE_FILENAME, nullptr) == FR_OK) {
FrskyChipFirmwareUpdate device;
if (device.flashFirmware(AUTOUPDATE_FILENAME, false) == nullptr)
f_unlink(AUTOUPDATE_FILENAME);
}
#endif
logsInit(); logsInit();
} }
#endif #endif

View file

@ -37,6 +37,7 @@
#define SYSTEM_SUBDIR "SYSTEM" #define SYSTEM_SUBDIR "SYSTEM"
#define BITMAPS_PATH ROOT_PATH "IMAGES" #define BITMAPS_PATH ROOT_PATH "IMAGES"
#define FIRMWARES_PATH ROOT_PATH "FIRMWARE" #define FIRMWARES_PATH ROOT_PATH "FIRMWARE"
#define AUTOUPDATE_FILENAME FIRMWARES_PATH "/autoupdate.frsk"
#define EEPROMS_PATH ROOT_PATH "EEPROM" #define EEPROMS_PATH ROOT_PATH "EEPROM"
#define SCRIPTS_PATH ROOT_PATH "SCRIPTS" #define SCRIPTS_PATH ROOT_PATH "SCRIPTS"
#define WIZARD_PATH SCRIPTS_PATH "/WIZARD" #define WIZARD_PATH SCRIPTS_PATH "/WIZARD"

View file

@ -140,10 +140,40 @@ void telemetryPortSetDirectionInput()
void sportSendByte(uint8_t byte) void sportSendByte(uint8_t byte)
{ {
telemetryPortSetDirectionOutput();
while (!(TELEMETRY_USART->SR & USART_SR_TXE)); while (!(TELEMETRY_USART->SR & USART_SR_TXE));
USART_SendData(TELEMETRY_USART, byte); USART_SendData(TELEMETRY_USART, byte);
} }
void sportSendByteLoop(uint8_t byte)
{
telemetryPortSetDirectionOutput();
outputTelemetryBuffer.data[0] = byte;
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(TELEMETRY_DMA_Stream_TX);
DMA_InitStructure.DMA_Channel = TELEMETRY_DMA_Channel_TX;
DMA_InitStructure.DMA_PeripheralBaseAddr = CONVERT_PTR_UINT(&TELEMETRY_USART->DR);
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(outputTelemetryBuffer.data);
DMA_InitStructure.DMA_BufferSize = 1;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(TELEMETRY_DMA_Stream_TX, &DMA_InitStructure);
DMA_Cmd(TELEMETRY_DMA_Stream_TX, ENABLE);
USART_DMACmd(TELEMETRY_USART, USART_DMAReq_Tx, ENABLE);
}
void sportSendBuffer(const uint8_t * buffer, uint32_t count) void sportSendBuffer(const uint8_t * buffer, uint32_t count)
{ {
telemetryPortSetDirectionOutput(); telemetryPortSetDirectionOutput();

View file

@ -4,6 +4,7 @@ option(INTERNAL_MODULE_PPM "Support for PPM internal module hack" OFF)
option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module replacement" OFF) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module replacement" OFF)
option(PXX1 "PXX1 protocol support" ON) option(PXX1 "PXX1 protocol support" ON)
option(PXX2 "PXX2 protocol support" OFF) option(PXX2 "PXX2 protocol support" OFF)
option(AUTOUPDATE "Auto update internal chips from SD" OFF)
if(PCB STREQUAL X9E) if(PCB STREQUAL X9E)
set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)")
@ -204,6 +205,10 @@ if(PCB STREQUAL X9E OR PCB STREQUAL X7 OR PCB STREQUAL XLITE OR PCB STREQUAL XLI
) )
endif() endif()
if(AUTOUPDATE)
add_definitions(-DAUTOUPDATE)
endif()
set(HSE_VALUE 12000000) set(HSE_VALUE 12000000)
set(SDCARD YES) set(SDCARD YES)
set(EEPROM EEPROM_RLC) set(EEPROM EEPROM_RLC)

View file

@ -137,6 +137,11 @@ void boardInit()
pwrInit(); pwrInit();
#if defined(AUTOUPDATE)
telemetryPortInit(FRSKY_SPORT_BAUDRATE, TELEMETRY_SERIAL_WITHOUT_DMA);
sportSendByteLoop(0x7E);
#endif
#if defined(STATUS_LEDS) #if defined(STATUS_LEDS)
ledInit(); ledInit();
ledGreen(); ledGreen();

View file

@ -704,6 +704,7 @@ void telemetryPortInit(uint32_t baudrate, uint8_t mode);
void telemetryPortSetDirectionInput(void); void telemetryPortSetDirectionInput(void);
void telemetryPortSetDirectionOutput(void); void telemetryPortSetDirectionOutput(void);
void sportSendByte(uint8_t byte); void sportSendByte(uint8_t byte);
void sportSendByteLoop(uint8_t byte);
void sportSendBuffer(const uint8_t * buffer, uint32_t count); void sportSendBuffer(const uint8_t * buffer, uint32_t count);
uint8_t telemetryGetByte(uint8_t * byte); uint8_t telemetryGetByte(uint8_t * byte);
void telemetryClearFifo(); void telemetryClearFifo();

View file

@ -97,10 +97,40 @@ void telemetryPortSetDirectionInput()
void sportSendByte(uint8_t byte) void sportSendByte(uint8_t byte)
{ {
telemetryPortSetDirectionOutput();
while (!(TELEMETRY_USART->SR & USART_SR_TXE)); while (!(TELEMETRY_USART->SR & USART_SR_TXE));
USART_SendData(TELEMETRY_USART, byte); USART_SendData(TELEMETRY_USART, byte);
} }
void sportSendByteLoop(uint8_t byte)
{
telemetryPortSetDirectionOutput();
outputTelemetryBuffer.data[0] = byte;
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(TELEMETRY_DMA_Stream_TX);
DMA_InitStructure.DMA_Channel = TELEMETRY_DMA_Channel_TX;
DMA_InitStructure.DMA_PeripheralBaseAddr = CONVERT_PTR_UINT(&TELEMETRY_USART->DR);
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(outputTelemetryBuffer.data);
DMA_InitStructure.DMA_BufferSize = 1;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(TELEMETRY_DMA_Stream_TX, &DMA_InitStructure);
DMA_Cmd(TELEMETRY_DMA_Stream_TX, ENABLE);
USART_DMACmd(TELEMETRY_USART, USART_DMAReq_Tx, ENABLE);
}
void sportSendBuffer(const uint8_t * buffer, uint32_t count) void sportSendBuffer(const uint8_t * buffer, uint32_t count)
{ {
telemetryPortSetDirectionOutput(); telemetryPortSetDirectionOutput();

View file

@ -12,6 +12,7 @@ options = {
"XLITES": { "XLITES": {
"LUA": "NO_MODEL_SCRIPTS", "LUA": "NO_MODEL_SCRIPTS",
"GVARS": "YES", "GVARS": "YES",
"AUTOUPDATE": "YES",
"PXX1": "YES", "PXX1": "YES",
"XJT": "NO", "XJT": "NO",
"R9M_SIZE_STD": "NO", "R9M_SIZE_STD": "NO",
@ -23,6 +24,7 @@ options = {
"X9LITE": { "X9LITE": {
"LUA": "NO_MODEL_SCRIPTS", "LUA": "NO_MODEL_SCRIPTS",
"GVARS": "YES", "GVARS": "YES",
"AUTOUPDATE": "YES",
"PXX1": "YES", "PXX1": "YES",
"XJT": "NO", "XJT": "NO",
"R9M_SIZE_STD": "NO", "R9M_SIZE_STD": "NO",