Fixes. Flash an external module should work

This commit is contained in:
Bertrand Songis
2019-02-21 16:57:23 +01:00
parent 5979b319b7
commit a4434bc5f3
17 changed files with 200 additions and 108 deletions
@@ -19,6 +19,7 @@
*/
#include "opentx.h"
#include "io/frsky_device_firmware_update.h"
#define REFRESH_FILES() do { reusableBuffer.sdmanager.offset = 65535; menuVerticalPosition = 0; } while(0)
#define NODE_TYPE(fname) fname[SD_SCREEN_FILE_LENGTH+1]
+62 -25
View File
@@ -19,6 +19,7 @@
*/
#include "opentx.h"
#include "frsky_device_firmware_update.h"
#define PRIM_REQ_POWERUP 0
#define PRIM_REQ_VERSION 1
@@ -32,10 +33,10 @@
#define PRIM_END_DOWNLOAD 0x83
#define PRIM_DATA_CRC_ERR 0x84
void DeviceFirmwareUpdate::processFrame()
void DeviceFirmwareUpdate::processFrame(const uint8_t * frame)
{
if (frame[1] == 0x5E && frame[2] == 0x50) {
switch (frame[3]) {
if (frame[0] == 0x5E && frame[1] == 0x50) {
switch (frame[2]) {
case PRIM_ACK_POWERUP :
if (state == SPORT_POWERUP_REQ) {
state = SPORT_POWERUP_ACK;
@@ -51,7 +52,7 @@ void DeviceFirmwareUpdate::processFrame()
case PRIM_REQ_DATA_ADDR:
if (state == SPORT_DATA_TRANSFER) {
address = *((uint32_t *)(&frame[4]));
address = *((uint32_t *)(&frame[3]));
state = SPORT_DATA_REQ;
}
break;
@@ -76,6 +77,12 @@ void DeviceFirmwareUpdate::startup()
break;
#endif
case EXTERNAL_MODULE:
#if defined(EXTMODULE_USART)
extmoduleInvertedSerialStart(57600);
break;
#endif
default:
telemetryInit(PROTOCOL_TELEMETRY_FRSKY_SPORT);
break;
@@ -87,21 +94,56 @@ void DeviceFirmwareUpdate::startup()
EXTERNAL_MODULE_ON();
else
SPORT_UPDATE_POWER_ON();
watchdogSuspend(50);
RTOS_WAIT_MS(50);
}
bool DeviceFirmwareUpdate::readByte(uint8_t & byte)
const uint8_t * DeviceFirmwareUpdate::readFullDuplexFrame(ModuleFifo & fifo, uint32_t timeout)
{
uint8_t len = 0;
while (len < 10) {
uint32_t elapsed = 0;
while (!fifo.pop(frame[len])) {
RTOS_WAIT_MS(1);
if (elapsed++ >= timeout) {
return nullptr;
}
}
if (len > 0 || frame[len] == 0x7E) {
++len;
}
}
return &frame[1];
}
const uint8_t * DeviceFirmwareUpdate::readHalfDuplexFrame(uint32_t timeout)
{
for (int i=timeout; i>=0; i--) {
uint8_t byte ;
while (telemetryGetByte(&byte)) {
if (pushFrskyTelemetryData(byte)) {
return telemetryRxBuffer;
}
}
RTOS_WAIT_MS(1);
}
return nullptr;
}
const uint8_t * DeviceFirmwareUpdate::readFrame(uint32_t timeout)
{
switch(module) {
case INTERNAL_MODULE:
#if defined(INTMODULE_USART)
return intmoduleFifo.pop(byte);
return readFullDuplexFrame(intmoduleFifo, timeout);
#endif
case EXTERNAL_MODULE:
#if defined(EXTMODULE_USART)
return readFullDuplexFrame(extmoduleFifo, timeout);
#endif
default:
return telemetryGetByte(&byte);
return readHalfDuplexFrame(timeout);
}
}
@@ -114,22 +156,12 @@ bool DeviceFirmwareUpdate::waitState(State state, uint32_t timeout)
#else
watchdogSuspend(timeout / 10);
uint8_t len = 0;
while (len < 10) {
uint32_t elapsed = 0;
while (!readByte(frame[len])) {
RTOS_WAIT_MS(1);
if (elapsed++ >= timeout) {
return false;
}
}
if (len > 0 || frame[len] == 0x7E) {
++len;
}
const uint8_t * frame = readFrame(timeout);
if (!frame) {
return false;
}
processFrame();
processFrame(&frame[1]);
return state == state;
#endif
}
@@ -164,6 +196,11 @@ void DeviceFirmwareUpdate::sendFrame()
return intmoduleSendBuffer(outputTelemetryBuffer, ptr-outputTelemetryBuffer);
#endif
case EXTERNAL_MODULE:
#if defined(EXTMODULE_USART)
return extmoduleSendBuffer(outputTelemetryBuffer, ptr-outputTelemetryBuffer);
#endif
default:
return sportSendBuffer(outputTelemetryBuffer, ptr-outputTelemetryBuffer);
}
@@ -171,8 +208,8 @@ void DeviceFirmwareUpdate::sendFrame()
const char * DeviceFirmwareUpdate::sendPowerOn()
{
waitState(SPORT_IDLE, 20); // Clear the fifo
state = SPORT_POWERUP_REQ;
waitState(SPORT_IDLE, 50); // Wait 50ms and clear the fifo
for (int i=0; i<10; i++) {
// max 10 attempts
startFrame(PRIM_REQ_POWERUP);
@@ -18,32 +18,11 @@
* GNU General Public License for more details.
*/
#ifndef _IO_ARM_H_
#define _IO_ARM_H_
#ifndef _FRSKY_DEVICE_FIRMWARE_UPDATE_H_
#define _FRSKY_DEVICE_FIRMWARE_UPDATE_H_
#include "dataconstants.h"
#if defined(TELEMETRY_FRSKY_SPORT)
PACK(union SportTelemetryPacket
{
struct {
uint8_t physicalId;
uint8_t primId;
uint16_t dataId;
uint32_t value;
};
uint8_t raw[8];
});
bool isSportOutputBufferAvailable();
void sportOutputPushPacket(SportTelemetryPacket * packet);
void sportFlashDevice(ModuleIndex module, const char * filename);
#endif
#if defined(STM32)
bool isBootloader(const char * filename);
void bootloaderFlash(const char * filename);
#endif
#include "frsky_pxx2.h"
class DeviceFirmwareUpdate {
enum State {
@@ -76,9 +55,11 @@ class DeviceFirmwareUpdate {
void startFrame(uint8_t command);
void sendFrame();
bool readByte(uint8_t & byte);
const uint8_t * readFullDuplexFrame(ModuleFifo & fifo, uint32_t timeout);
const uint8_t * readHalfDuplexFrame(uint32_t timeout);
const uint8_t * readFrame(uint32_t timeout);
bool waitState(State state, uint32_t timeout);
void processFrame();
void processFrame(const uint8_t * frame);
const char * sendPowerOn();
const char * sendReqVersion();
@@ -86,4 +67,4 @@ class DeviceFirmwareUpdate {
const char * endTransfer();
};
#endif // _IO_ARM_H_
#endif // _FRSKY_DEVICE_FIRMWARE_UPDATE_H_
+65
View File
@@ -0,0 +1,65 @@
/*
* Copyright (C) OpenTX
*
* Based on code named
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef _IO_PXX2_H_
#define _IO_PXX2_H_
#include "fifo.h"
#define PXX2_BAUDRATE 230400
#define PXX2_PERIOD 4 // 4ms
class ModuleFifo : public Fifo<uint8_t, 32> {
public:
bool getFrame(uint8_t * frame)
{
while (1) {
if (isEmpty()) {
return false;
}
else if (fifo[ridx] != 0x7E) {
skip();
}
else {
break;
}
}
uint32_t next = nextIndex(ridx);
uint8_t len = fifo[next];
if (unsigned(len + 4 /* 2 bytes header + 2 bytes CRC */) > size()) {
return false;
}
for (uint32_t i=0; i<=len; i++) {
frame[i] = fifo[next];
next = nextIndex(next);
}
// TODO CRC CHECK
next = nextIndex(next);
ridx = nextIndex(next);
return true;
}
uint32_t errors;
};
#endif
@@ -18,10 +18,31 @@
* GNU General Public License for more details.
*/
#ifndef _IO_PXX2_H_
#define _IO_PXX2_H_
#ifndef _IO_FRSKY_SPORT_H_
#define _IO_FRSKY_SPORT_H_
#define PXX2_BAUDRATE 230400
#define PXX2_PERIOD 4 // 4ms
#include "dataconstants.h"
#if defined(TELEMETRY_FRSKY_SPORT)
PACK(union SportTelemetryPacket
{
struct {
uint8_t physicalId;
uint8_t primId;
uint16_t dataId;
uint32_t value;
};
uint8_t raw[8];
});
bool isSportOutputBufferAvailable();
void sportOutputPushPacket(SportTelemetryPacket * packet);
void sportFlashDevice(ModuleIndex module, const char * filename);
#endif
#if defined(STM32)
bool isBootloader(const char * filename);
void bootloaderFlash(const char * filename);
#endif
#endif // _IO_FRSKY_SPORT_H_
+1 -1
View File
@@ -294,7 +294,7 @@ void memswap(void * a, void * b, uint8_t size);
#endif
#include "fifo.h"
#include "io/io_arm.h"
#include "io/frsky_sport.h"
extern volatile tmr10ms_t g_tmr10ms;
static inline tmr10ms_t get_tmr10ms()
+1 -1
View File
@@ -19,7 +19,7 @@
*/
#include "opentx.h"
#include "io/pxx2.h"
#include "io/frsky_pxx2.h"
#include "pulses/pxx2.h"
uint8_t s_pulses_paused = 0;
+1 -36
View File
@@ -22,6 +22,7 @@
#define _PULSES_PXX2_H_
#include "fifo.h"
#include "io/frsky_pxx2.h"
#include "./pxx.h"
#define PXX2_TYPE_C_MODULE 0x01
@@ -56,42 +57,6 @@ enum PXX2BindSteps {
BIND_OK
};
class ModuleFifo : public Fifo<uint8_t, 32> {
public:
bool getFrame(uint8_t * frame)
{
while (1) {
if (isEmpty()) {
return false;
}
else if (fifo[ridx] != 0x7E) {
skip();
}
else {
break;
}
}
uint32_t next = nextIndex(ridx);
uint8_t len = fifo[next];
if (size() < unsigned(len + 4 /* 2 bytes header + 2 bytes CRC */)) {
return false;
}
for (uint32_t i=0; i<=len; i++) {
frame[i] = fifo[next];
next = nextIndex(next);
}
// TODO CRC CHECK
next = nextIndex(next);
ridx = nextIndex(next);
return true;
}
uint32_t errors;
};
extern ModuleFifo intmoduleFifo;
extern ModuleFifo extmoduleFifo;
@@ -59,13 +59,13 @@ void bluetoothInit(uint32_t baudrate)
GPIO_Init(BT_BCTS_GPIO, &GPIO_InitStructure);
#endif
GPIO_PinAFConfig(BT_GPIO_TXRX, BT_TX_GPIO_PinSource, BT_GPIO_AF);
GPIO_PinAFConfig(BT_GPIO_TXRX, BT_RX_GPIO_PinSource, BT_GPIO_AF);
GPIO_PinAFConfig(BT_USART_GPIO, BT_TX_GPIO_PinSource, BT_GPIO_AF);
GPIO_PinAFConfig(BT_USART_GPIO, BT_RX_GPIO_PinSource, BT_GPIO_AF);
GPIO_InitStructure.GPIO_Pin = BT_TX_GPIO_PIN | BT_RX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(BT_GPIO_TXRX, &GPIO_InitStructure);
GPIO_Init(BT_USART_GPIO, &GPIO_InitStructure);
USART_DeInit(BT_USART);
USART_InitTypeDef USART_InitStructure;
@@ -66,6 +66,8 @@ void intmoduleSerialStart(uint32_t baudrate)
USART_Init(INTMODULE_USART, &USART_InitStructure);
USART_Cmd(INTMODULE_USART, ENABLE);
intmoduleFifo.clear();
USART_ITConfig(INTMODULE_USART, USART_IT_RXNE, ENABLE);
NVIC_SetPriority(INTMODULE_USART_IRQn, 6);
NVIC_EnableIRQ(INTMODULE_USART_IRQn);
+1 -1
View File
@@ -185,7 +185,7 @@ void extmoduleSerialStart(uint32_t /*baudrate*/, uint32_t period_half_us)
#endif
#if defined(EXTMODULE_USART)
void extmoduleSendSerialBuffer(const uint8_t * data, uint8_t size)
void extmoduleSendBuffer(const uint8_t * data, uint8_t size)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(EXTMODULE_DMA_STREAM);
+1 -1
View File
@@ -631,7 +631,7 @@
#define BT_USART USART6
#define BT_GPIO_AF GPIO_AF_USART6
#define BT_USART_IRQn USART6_IRQn
#define BT_GPIO_TXRX GPIOG
#define BT_USART_GPIO GPIOG
#define BT_TX_GPIO_PIN GPIO_Pin_14 // PG.14
#define BT_RX_GPIO_PIN GPIO_Pin_9 // PG.09
#define BT_TX_GPIO_PinSource GPIO_PinSource14
+2
View File
@@ -192,6 +192,8 @@ void extmodulePpmStart();
void extmodulePxxStart();
void extmodulePxx2Start();
void extmoduleSerialStart(uint32_t baudrate, uint32_t period_half_us);
void extmoduleInvertedSerialStart(uint32_t baudrate);
void extmoduleSendBuffer(const uint8_t * data, uint8_t size);
void extmoduleSendNextFrame();
// Trainer driver
@@ -147,12 +147,14 @@ void extmoduleInvertedSerialStart(uint32_t baudrate)
USART_Init(EXTMODULE_USART, &USART_InitStructure);
USART_Cmd(EXTMODULE_USART, ENABLE);
extmoduleFifo.clear();
USART_ITConfig(INTMODULE_USART, USART_IT_RXNE, ENABLE);
NVIC_SetPriority(EXTMODULE_USART_IRQn, 6);
NVIC_EnableIRQ(EXTMODULE_USART_IRQn);
}
void extmoduleSendSerialBuffer(const uint8_t * data, uint8_t size)
void extmoduleSendBuffer(const uint8_t * data, uint8_t size)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(EXTMODULE_USART_DMA_STREAM);
@@ -295,7 +297,7 @@ void extmoduleSendNextFrame()
#if defined(PXX2)
else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2) {
#if defined(EXTMODULE_USART)
extmoduleSendSerialBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize());
extmoduleSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize());
#else
sportSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize());
#endif
+2 -2
View File
@@ -1284,7 +1284,7 @@
#define BT_RCC_AHB1Periph (RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOG)
#define BT_RCC_APB1Periph 0
#define BT_RCC_APB2Periph RCC_APB2Periph_USART6
#define BT_GPIO_TXRX GPIOG
#define BT_USART_GPIO GPIOG
#define BT_TX_GPIO_PIN GPIO_Pin_14 // PG.14
#define BT_RX_GPIO_PIN GPIO_Pin_9 // PG.09
#define BT_EN_GPIO GPIOD
@@ -1306,7 +1306,7 @@
#else
#define BT_EN_GPIO_PIN GPIO_Pin_12 // PE.12
#endif
#define BT_GPIO_TXRX GPIOB
#define BT_USART_GPIO GPIOB
#define BT_TX_GPIO_PIN GPIO_Pin_10 // PB.10
#define BT_RX_GPIO_PIN GPIO_Pin_11 // PB.11
#define BT_TX_GPIO_PinSource GPIO_PinSource10
+19 -4
View File
@@ -92,8 +92,6 @@ void processFrskyPXX2Data(uint8_t data)
void processFrskyTelemetryData(uint8_t data)
{
static uint8_t dataState = STATE_DATA_IDLE;
#if defined(PCBSKY9X) && defined(BLUETOOTH)
// TODO if (g_model.bt_telemetry)
btPushByte(data);
@@ -111,6 +109,19 @@ void processFrskyTelemetryData(uint8_t data)
}
#endif
if (pushFrskyTelemetryData(data)) {
if (IS_FRSKY_SPORT_PROTOCOL()) {
sportProcessTelemetryPacket(telemetryRxBuffer);
} else {
frskyDProcessPacket(telemetryRxBuffer);
}
}
}
bool pushFrskyTelemetryData(uint8_t data)
{
static uint8_t dataState = STATE_DATA_IDLE;
switch (dataState) {
case STATE_DATA_START:
if (data == START_STOP) {
@@ -138,8 +149,8 @@ void processFrskyTelemetryData(uint8_t data)
}
else {
// end of frame detected
frskyDProcessPacket(telemetryRxBuffer);
dataState = STATE_DATA_IDLE;
return true;
}
break;
}
@@ -166,9 +177,13 @@ void processFrskyTelemetryData(uint8_t data)
#if defined(TELEMETRY_FRSKY_SPORT)
if (IS_FRSKY_SPORT_PROTOCOL() && telemetryRxBufferCount >= FRSKY_SPORT_PACKET_SIZE) {
sportProcessTelemetryPacket(telemetryRxBuffer);
// end of frame detected
dataState = STATE_DATA_IDLE;
return true;
}
#endif
return false;
}
+2 -1
View File
@@ -23,7 +23,7 @@
#include "../definitions.h"
#include "telemetry_holders.h"
#include "../io/pxx2.h"
#include "io/frsky_pxx2.h"
// Receive buffer state machine state enum
enum FrSkyDataState {
@@ -313,6 +313,7 @@ struct TelemetryData {
extern TelemetryData telemetryData;
bool pushFrskyTelemetryData(uint8_t data); // returns true when end of frame detected
void processFrskyTelemetryData(uint8_t data);
void processFrskyPXX2Data(uint8_t data);