[X10 Express] Internal module flash OK
This commit is contained in:
@@ -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 );
|
||||
|
||||
Reference in New Issue
Block a user