[X10 Express] Internal module flash OK

This commit is contained in:
Bertrand Songis
2019-08-23 16:48:19 +02:00
parent ce447d4404
commit 0cf78746ed
4 changed files with 83 additions and 69 deletions
+74 -64
View File
@@ -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 );
+9 -3
View File
@@ -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();
};
-1
View File
@@ -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
-1
View File
@@ -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