From fdb48528f91e66690f39f5a65052871d0478c2a2 Mon Sep 17 00:00:00 2001 From: bsongis Date: Sat, 14 Mar 2015 11:34:35 +0100 Subject: [PATCH 1/7] Fixes #1599 - SPORT devices firmware update --- .../gui/Taranis/menu_general_sdmanager.cpp | 50 ++- radio/src/sdcard.h | 1 + radio/src/targets/taranis/board_taranis.h | 1 + radio/src/targets/taranis/hal.h | 4 +- .../src/targets/taranis/telemetry_driver.cpp | 52 ++- radio/src/telemetry/frsky.h | 4 +- radio/src/telemetry/frsky_sport.cpp | 307 +++++++++++++++++- radio/src/translations.cpp | 2 + radio/src/translations.h | 2 + radio/src/translations/en.h.txt | 2 + radio/src/translations/fr.h.txt | 2 + 11 files changed, 405 insertions(+), 22 deletions(-) diff --git a/radio/src/gui/Taranis/menu_general_sdmanager.cpp b/radio/src/gui/Taranis/menu_general_sdmanager.cpp index 7fa37bc71..a88693040 100755 --- a/radio/src/gui/Taranis/menu_general_sdmanager.cpp +++ b/radio/src/gui/Taranis/menu_general_sdmanager.cpp @@ -74,6 +74,20 @@ inline bool isFilenameLower(bool isfile, const char * fn, const char * line) return (!isfile && line[SD_SCREEN_FILE_LENGTH+1]) || (isfile==(bool)line[SD_SCREEN_FILE_LENGTH+1] && strcasecmp(fn, line) < 0); } +bool isBootloader(const char *filename) +{ + FIL file; + f_open(&file, filename, FA_READ); + uint8_t buffer[1024]; + UINT count; + + if (f_read(&file, buffer, 1024, &count) != FR_OK || count != 1024) { + return false; + } + + return isBootloaderStart((uint32_t *)buffer); +} + void flashBootloader(const char * filename) { FIL file; @@ -115,6 +129,20 @@ void flashBootloader(const char * filename) f_close(&file); } +void flashSportDevice(ModuleIndex module, const char *filename) +{ + pausePulses(); + watchdogSetTimeout(60*60*100/*1h*/); + + lcd_clear(); + displayProgressBar(STR_WRITING); + + sportFirmwareUpdate(module, filename); + + watchdogSetTimeout(100/*1s*/); + resumePulses(); +} + void getSelectionFullPath(char *lfn) { f_getcwd(lfn, _MAX_LFN); @@ -187,6 +215,14 @@ void onSdManagerMenu(const char *result) getSelectionFullPath(lfn); flashBootloader(lfn); } + else if (result == STR_FLASH_INTERNAL_MODULE) { + getSelectionFullPath(lfn); + flashSportDevice(INTERNAL_MODULE, lfn); + } + else if (result == STR_FLASH_EXTERNAL_DEVICE) { + getSelectionFullPath(lfn); + flashSportDevice(EXTERNAL_MODULE, lfn); + } #if defined(LUA) else if (result == STR_EXECUTE_FILE) { getSelectionFullPath(lfn); @@ -272,14 +308,22 @@ void menuGeneralSdManager(uint8_t _event) else if (!strcasecmp(ext, TEXT_EXT)) { MENU_ADD_ITEM(STR_VIEW_TEXT); } - else if (!strcasecmp(ext, FIRMWARE_EXT) && !READ_ONLY()) { - MENU_ADD_ITEM(STR_FLASH_BOOTLOADER); - } #if defined(LUA) else if (!strcasecmp(ext, SCRIPTS_EXT)) { MENU_ADD_ITEM(STR_EXECUTE_FILE); } #endif + else if (!READ_ONLY() && !strcasecmp(ext, FIRMWARE_EXT)) { + TCHAR lfn[_MAX_LFN + 1]; + getSelectionFullPath(lfn); + if (isBootloader(lfn)) { + MENU_ADD_ITEM(STR_FLASH_BOOTLOADER); + } + } + else if (!READ_ONLY() && !strcasecmp(ext, SPORT_FIRMWARE_EXT)) { + MENU_ADD_ITEM(STR_FLASH_INTERNAL_MODULE); + MENU_ADD_ITEM(STR_FLASH_EXTERNAL_DEVICE); + } } if (!READ_ONLY()) { if (line[SD_SCREEN_FILE_LENGTH+1]) // it's a file diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index 5f43512b9..44e2724c5 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -65,6 +65,7 @@ #define TEXT_EXT ".txt" #define FIRMWARE_EXT ".bin" #define EEPROM_EXT ".bin" +#define SPORT_FIRMWARE_EXT ".frk" extern FATFS g_FATFS_Obj; diff --git a/radio/src/targets/taranis/board_taranis.h b/radio/src/targets/taranis/board_taranis.h index 01761bfd4..417d4190d 100644 --- a/radio/src/targets/taranis/board_taranis.h +++ b/radio/src/targets/taranis/board_taranis.h @@ -285,6 +285,7 @@ void debugPutc(const char c); // Telemetry driver void telemetryPortInit(uint32_t baudrate); +void sportSendBuffer(uint8_t *buffer, uint32_t count); // Haptic driver void hapticInit(void); diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index fe938df0b..e5f1b2129 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -262,7 +262,9 @@ #define GPIO_PinSource_SPORT_TX GPIO_PinSource5 #define GPIO_PinSource_SPORT_RX GPIO_PinSource6 #define GPIO_AF_SPORT GPIO_AF_USART2 -#define SPORT USART2 +#define SPORT_USART USART2 +#define SPORT_IRQHandler USART2_IRQHandler +#define SPORT_IRQn USART2_IRQn // USB_OTG #define PIN_FS_VBUS GPIO_Pin_9 // PA.09 diff --git a/radio/src/targets/taranis/telemetry_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp index 004ab15ee..820d04a1b 100644 --- a/radio/src/targets/taranis/telemetry_driver.cpp +++ b/radio/src/targets/taranis/telemetry_driver.cpp @@ -41,7 +41,7 @@ extern Fifo<512> telemetryFifo; void telemetryPortInit(uint32_t baudrate) { if (baudrate == 0) { - USART_DeInit(USART2); + USART_DeInit(SPORT_USART); return; } @@ -78,40 +78,60 @@ void telemetryPortInit(uint32_t baudrate) USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; - USART_Init(SPORT, &USART_InitStructure); - USART_Cmd(SPORT, ENABLE); - USART_ITConfig(SPORT, USART_IT_RXNE, ENABLE); + USART_Init(SPORT_USART, &USART_InitStructure); + USART_Cmd(SPORT_USART, ENABLE); + USART_ITConfig(SPORT_USART, USART_IT_RXNE, ENABLE); - NVIC_SetPriority(USART2_IRQn, 6); - NVIC_EnableIRQ(USART2_IRQn); + NVIC_SetPriority(SPORT_IRQn, 6); + NVIC_EnableIRQ(SPORT_IRQn); } -void telemetryPutc(const char c) +struct SportTxBuffer { - GPIO_SetBits(GPIO_PIN_SPORT_ON, PIN_SPORT_ON); - USART_SendData(SPORT, c); - GPIO_ResetBits(GPIO_PIN_SPORT_ON, PIN_SPORT_ON); + uint8_t *ptr; + uint32_t count; +} sportTxBuffer; + +void sportSendBuffer(uint8_t *buffer, uint32_t count) +{ + sportTxBuffer.ptr = buffer ; + sportTxBuffer.count = count ; + GPIO_PIN_SPORT_ON->BSRRL = PIN_SPORT_ON ; // output enable + SPORT_USART->CR1 |= USART_CR1_TXEIE ; } #if !defined(SIMU) - #define USART_FLAG_ERRORS (USART_FLAG_ORE | USART_FLAG_NE | USART_FLAG_FE | USART_FLAG_PE) -extern "C" void USART2_IRQHandler() +extern "C" void SPORT_IRQHandler() { uint32_t status; uint8_t data; - status = SPORT->SR; + status = SPORT_USART->SR; + if (status & USART_SR_TXE) { + if (sportTxBuffer.count) { + SPORT_USART->DR = *sportTxBuffer.ptr++; + if (--sportTxBuffer.count == 0) { + SPORT_USART->CR1 &= ~USART_CR1_TXEIE; // Stop Tx interrupt + SPORT_USART->CR1 |= USART_CR1_TCIE; // Enable complete interrupt + } + } + } + + if (SPORT_USART->SR & USART_SR_TC) { + SPORT_USART->CR1 &= ~USART_CR1_TCIE ; // Stop Complete interrupt + GPIO_PIN_SPORT_ON->BSRRH = PIN_SPORT_ON ; // output disable + } + while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { - data = SPORT->DR; + data = SPORT_USART->DR; if (!(status & USART_FLAG_ERRORS)) telemetryFifo.push(data); - status = SPORT->SR; + status = SPORT_USART->SR; } } - #endif diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index f0ef38835..a98632f0a 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -478,7 +478,9 @@ void frskyDProcessPacket(uint8_t *packet); // FrSky S.PORT Protocol void processSportPacket(uint8_t *packet); - +#if defined(PCBTARANIS) +void sportFirmwareUpdate(ModuleIndex module, const char *filename); +#endif void telemetryWakeup(void); void telemetryReset(); void telemetryInit(void); diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index dd770d4f1..125310a2d 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -36,6 +36,18 @@ #include "../opentx.h" +#define PRIM_REQ_POWERUP (0) +#define PRIM_REQ_VERSION (1) +#define PRIM_CMD_DOWNLOAD (3) +#define PRIM_DATA_WORD (4) +#define PRIM_DATA_EOF (5) + +#define PRIM_ACK_POWERUP (0x80) +#define PRIM_ACK_VERSION (0x81) +#define PRIM_REQ_DATA_ADDR (0x82) +#define PRIM_END_DOWNLOAD (0x83) +#define PRIM_DATA_CRC_ERR (0x84) + struct FrSkySportSensor { const uint16_t firstId; const uint16_t lastId; @@ -97,14 +109,74 @@ bool checkSportPacket(uint8_t *packet) #define SPORT_DATA_U32(packet) (*((uint32_t *)(packet+4))) #define HUB_DATA_U16(packet) (*((uint16_t *)(packet+4))) +enum SportUpdateState { + SPORT_IDLE, + SPORT_POWERUP_REQ, + SPORT_POWERUP_ACK, + SPORT_VERSION_REQ, + SPORT_VERSION_ACK, + SPORT_DATA_TRANSFER, + SPORT_DATA_REQ, + SPORT_COMPLETE, + SPORT_FAIL +}; + +uint8_t sportUpdateState = SPORT_IDLE; +uint32_t sportUpdateAddr = 0; + +void processSportUpdatePacket(uint8_t *packet) +{ + if (packet[0]==0x5E && packet[1]==0x50) { + switch (packet[2]) { + case PRIM_ACK_POWERUP : + if (sportUpdateState == SPORT_POWERUP_REQ) { + sportUpdateState = SPORT_POWERUP_ACK; + } + break; + + case PRIM_ACK_VERSION: + if (sportUpdateState == SPORT_VERSION_REQ) { + sportUpdateState = SPORT_VERSION_ACK; + // SportVersion[0] = packet[3] ; + // SportVersion[1] = packet[4] ; + // SportVersion[2] = packet[5] ; + // SportVersion[3] = packet[6] ; + // SportVerValid = 1 ; + } + break; + + case PRIM_REQ_DATA_ADDR : + if (sportUpdateState == SPORT_DATA_TRANSFER) { + sportUpdateAddr = *((uint32_t *)(&packet[3])); + } + break; + + case PRIM_END_DOWNLOAD : + sportUpdateState = SPORT_COMPLETE ; + break; + + case PRIM_DATA_CRC_ERR : + sportUpdateState = SPORT_FAIL ; + break; + } + } +} + void processSportPacket(uint8_t *packet) { uint8_t dataId = packet[0]; uint8_t prim = packet[1]; uint16_t appId = *((uint16_t *)(packet+2)); +#if defined(PCBTARANIS) && !defined(SIMU) + if (sportUpdateState != SPORT_IDLE) { + processSportUpdatePacket(packet); // Uses different chksum + return; + } +#endif + if (!checkSportPacket(packet)) { - TRACE("processSportPacket(): checksumm error "); + TRACE("processSportPacket(): checksum error "); DUMP(packet, FRSKY_SPORT_PACKET_SIZE); return; } @@ -187,3 +259,236 @@ void frskySportSetDefault(int index, uint16_t id, uint8_t instance) eeDirty(EE_MODEL); } + +#if defined(PCBTARANIS) +bool sportWaitState(SportUpdateState state, int timeout) +{ + for (int i=timeout/2; i>=0; i--) { + uint8_t data ; + while (telemetryFifo.pop(data)) { + processSerialData(data); + } + if (sportUpdateState == state) { + return true; + } + else if (sportUpdateState == SPORT_FAIL) { + return false; + } +#if defined(SIMU) + SIMU_SLEEP_NORET(1); + return true; +#endif + CoTickDelay(1); + } + return false; +} + +void blankPacket(uint8_t *packet) +{ + memset(packet+2, 0, 6); +} + +/* CRC16 implementation acording to CCITT standards */ + +static const unsigned short crc16tab[256]= { + 0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7, + 0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef, + 0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6, + 0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de, + 0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485, + 0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d, + 0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4, + 0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc, + 0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823, + 0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b, + 0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12, + 0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a, + 0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41, + 0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49, + 0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70, + 0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78, + 0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f, + 0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067, + 0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e, + 0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256, + 0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d, + 0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405, + 0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c, + 0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634, + 0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab, + 0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3, + 0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a, + 0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92, + 0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9, + 0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1, + 0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8, + 0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0 +}; + +uint16_t crc16_ccitt(uint8_t *buf, uint32_t len) +{ + uint16_t crc = 0; + for (uint32_t counter=0; counter>8) ^ *buf++ ) &0x00FF]; + } + return crc; +} + +uint8_t sportUpdatePacket[16]; + +void writePacket(uint8_t *packet) +{ + uint8_t *ptr = sportUpdatePacket; + *ptr++ = 0x7E; + *ptr++ = 0xFF; + packet[7] = crc16_ccitt(packet, 7); + for (int i=0; i<8; i++) { + if (packet[i] == 0x7E || packet[i] == 0x7D) { + *ptr++ = 0x7D; + *ptr++ = 0x20 ^ packet[i]; + } + else { + *ptr++ = packet[i]; + } + } + sportSendBuffer(sportUpdatePacket, ptr-sportUpdatePacket); +} + +bool sportUpdatePowerOn(ModuleIndex module) +{ + uint8_t packet[8]; + + sportUpdateState = SPORT_POWERUP_REQ; + +#if defined(PCBTARANIS) + INTERNAL_MODULE_OFF(); + EXTERNAL_MODULE_OFF(); +#endif + + sportWaitState(SPORT_IDLE, 500); + + telemetryPortInit(FRSKY_SPORT_BAUDRATE); + +#if defined(PCBTARANIS) + if (module == INTERNAL_MODULE) + INTERNAL_MODULE_ON(); + else + EXTERNAL_MODULE_ON(); +#endif + + sportWaitState(SPORT_IDLE, 50); + + for (int i=0; i<10; i++) { + // max 10 attempts + blankPacket(packet); + packet[0] = 0x50 ; + packet[1] = PRIM_REQ_POWERUP; + writePacket(packet); + if (sportWaitState(SPORT_POWERUP_ACK, 100)) + return true; + } + return false; +} + +bool sportUpdateReqVersion() +{ + uint8_t packet[8]; + sportWaitState(SPORT_IDLE, 20); + sportUpdateState = SPORT_VERSION_REQ; + for (int i=0; i<10; i++) { + // max 10 attempts + blankPacket(packet) ; + packet[0] = 0x50 ; + packet[1] = PRIM_REQ_VERSION ; + writePacket(packet); + if (sportWaitState(SPORT_VERSION_ACK, 200)) + return true; + } + return false; +} + +bool sportUpdateUploadFile(const char *filename) +{ + FIL file; + uint32_t buffer[1024/4]; + UINT count; + uint8_t packet[8]; + + if (f_open(&file, filename, FA_READ) != FR_OK) { + return false; + } + + sportWaitState(SPORT_IDLE, 200); + sportUpdateState = SPORT_DATA_TRANSFER; + blankPacket(packet) ; + packet[0] = 0x50 ; + packet[1] = PRIM_CMD_DOWNLOAD ; + // Stop here for testing + writePacket(packet); + + while(1) { + if (f_read(&file, buffer, 1024, &count) != FR_OK) { + f_close(&file); + return false; + } + + count >>= 2; + + for (UINT i=0; i> 2; // 32 bit word offset into buffer + uint32_t *data = (uint32_t *)(&packet[2]); + *data = buffer[offset]; + sportUpdateState = SPORT_DATA_TRANSFER, + writePacket(packet); + if (i==0) { + updateProgressBar(file.fptr, file.fsize); + } + } + + if (count < 256) { + f_close(&file); + return true; + } + } +} + +bool sportUpdateEnd() +{ + uint8_t packet[8]; + if (!sportWaitState(SPORT_DATA_REQ, 2000)) + return false; + blankPacket(packet); + packet[0] = 0x50 ; + packet[1] = PRIM_DATA_EOF; + writePacket(packet); + return sportWaitState(SPORT_COMPLETE, 2000); +} + +void sportFirmwareUpdate(ModuleIndex module, const char *filename) +{ + bool result = sportUpdatePowerOn(module); + if (result) + result = sportUpdateReqVersion(); + if (result) + result = sportUpdateUploadFile(filename); + if (result) + result = sportUpdateEnd(); + + if (result == false) { + POPUP_WARNING("Firmware Update Error"); + } + sportUpdateState = SPORT_IDLE; + +#if defined(PCBTARANIS) + INTERNAL_MODULE_OFF(); + EXTERNAL_MODULE_OFF(); +#endif +} + +#endif diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 2f97fe905..48ce9ee21 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -494,6 +494,8 @@ const pm_char STR_MIXERS_MONITOR[] PROGMEM = TR_MIXERS_MONITOR; const pm_char STR_PATH_TOO_LONG[] PROGMEM = TR_PATH_TOO_LONG; const pm_char STR_VIEW_TEXT[] PROGMEM = TR_VIEW_TEXT; const pm_char STR_FLASH_BOOTLOADER[] PROGMEM = TR_FLASH_BOOTLOADER; +const pm_char STR_FLASH_INTERNAL_MODULE[] PROGMEM = TR_FLASH_INTERNAL_MODULE; +const pm_char STR_FLASH_EXTERNAL_DEVICE[] PROGMEM = TR_FLASH_EXTERNAL_DEVICE; const pm_char STR_WRITING[] PROGMEM = TR_WRITING; const pm_char STR_CONFIRM_FORMAT[] PROGMEM = TR_CONFIRM_FORMAT; const pm_char STR_EEBACKUP[] PROGMEM = TR_EEBACKUP; diff --git a/radio/src/translations.h b/radio/src/translations.h index 7649228ec..8f9cdbcda 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -664,6 +664,8 @@ extern const pm_char STR_MIXERS_MONITOR[]; extern const pm_char STR_PATH_TOO_LONG[]; extern const pm_char STR_VIEW_TEXT[]; extern const pm_char STR_FLASH_BOOTLOADER[]; +extern const pm_char STR_FLASH_EXTERNAL_DEVICE[]; +extern const pm_char STR_FLASH_INTERNAL_MODULE[]; extern const pm_char STR_WRITING[]; extern const pm_char STR_CONFIRM_FORMAT[]; extern const pm_char STR_EEBACKUP[]; diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 1e1162da1..4d403c78d 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -855,6 +855,8 @@ #define TR_PATH_TOO_LONG "Path too long" #define TR_VIEW_TEXT "View text" #define TR_FLASH_BOOTLOADER "Flash BootLoader" +#define TR_FLASH_EXTERNAL_DEVICE "Flash External Device" +#define TR_FLASH_INTERNAL_MODULE "Flash Internal Module" #define TR_WRITING "\032Writing..." #define TR_CONFIRM_FORMAT "Confirm Format?" #define TR_INTERNALRF "Internal RF" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 7a72cb196..4ad9984f3 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -851,6 +851,8 @@ #define TR_PATH_TOO_LONG "Chemin trop long" #define TR_VIEW_TEXT "Voir texte" #define TR_FLASH_BOOTLOADER "Flasher BootLoader" +#define TR_FLASH_EXTERNAL_DEVICE "Flash External Device" +#define TR_FLASH_INTERNAL_MODULE "Flash Module Interne" #define TR_WRITING "\032Ecriture..." #define TR_CONFIRM_FORMAT "Confirmer Formatage?" #define TR_INTERNALRF "HF interne" From d885807c1121ab86eaeeb83523ac4f6a6b9a1757 Mon Sep 17 00:00:00 2001 From: bsongis Date: Sat, 14 Mar 2015 11:48:54 +0100 Subject: [PATCH 2/7] [Taranis] SPORT Rx must be OFF when Tx is ON (otherwise it receives what it sends...) --- .../src/targets/taranis/telemetry_driver.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/radio/src/targets/taranis/telemetry_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp index 820d04a1b..0d498e4a7 100644 --- a/radio/src/targets/taranis/telemetry_driver.cpp +++ b/radio/src/targets/taranis/telemetry_driver.cpp @@ -97,6 +97,7 @@ void sportSendBuffer(uint8_t *buffer, uint32_t count) sportTxBuffer.ptr = buffer ; sportTxBuffer.count = count ; GPIO_PIN_SPORT_ON->BSRRL = PIN_SPORT_ON ; // output enable + SPORT_USART->CR1 &= ~USART_CR1_RE ; // turn off receiver SPORT_USART->CR1 |= USART_CR1_TXEIE ; } @@ -114,23 +115,27 @@ extern "C" void SPORT_IRQHandler() if (sportTxBuffer.count) { SPORT_USART->DR = *sportTxBuffer.ptr++; if (--sportTxBuffer.count == 0) { - SPORT_USART->CR1 &= ~USART_CR1_TXEIE; // Stop Tx interrupt - SPORT_USART->CR1 |= USART_CR1_TCIE; // Enable complete interrupt + SPORT_USART->CR1 &= ~USART_CR1_TXEIE; // stop Tx interrupt + SPORT_USART->CR1 |= USART_CR1_TCIE; // enable complete interrupt } } } - if (SPORT_USART->SR & USART_SR_TC) { - SPORT_USART->CR1 &= ~USART_CR1_TCIE ; // Stop Complete interrupt + if ((status & USART_SR_TC) && (SPORT_USART->CR1 & USART_CR1_TCIE)) + SPORT_USART->CR1 &= ~USART_CR1_TCIE ; // stop Complete interrupt GPIO_PIN_SPORT_ON->BSRRH = PIN_SPORT_ON ; // output disable + SPORT_USART->CR1 |= USART_CR1_RE ; + while (status & (USART_FLAG_RXNE)) { + status = SPORT_USART->DR; + status = SPORT_USART->SR ; + } } while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { data = SPORT_USART->DR; - - if (!(status & USART_FLAG_ERRORS)) + if (!(status & USART_FLAG_ERRORS)) { telemetryFifo.push(data); - + } status = SPORT_USART->SR; } } From 996433db81202b06e08d78acd877ceb77163b8f2 Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Sat, 14 Mar 2015 14:55:25 +0400 Subject: [PATCH 3/7] Missing { --- radio/src/targets/taranis/telemetry_driver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/taranis/telemetry_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp index 0d498e4a7..f29fd7eae 100644 --- a/radio/src/targets/taranis/telemetry_driver.cpp +++ b/radio/src/targets/taranis/telemetry_driver.cpp @@ -121,7 +121,7 @@ extern "C" void SPORT_IRQHandler() } } - if ((status & USART_SR_TC) && (SPORT_USART->CR1 & USART_CR1_TCIE)) + if ((status & USART_SR_TC) && (SPORT_USART->CR1 & USART_CR1_TCIE)) { SPORT_USART->CR1 &= ~USART_CR1_TCIE ; // stop Complete interrupt GPIO_PIN_SPORT_ON->BSRRH = PIN_SPORT_ON ; // output disable SPORT_USART->CR1 |= USART_CR1_RE ; From 940543cd384fb861dbe7672c0541b869bd564914 Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Sat, 14 Mar 2015 17:33:23 +0400 Subject: [PATCH 4/7] Fix SPORT update state machine --- radio/src/telemetry/frsky_sport.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index 125310a2d..ff508d053 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -148,6 +148,7 @@ void processSportUpdatePacket(uint8_t *packet) case PRIM_REQ_DATA_ADDR : if (sportUpdateState == SPORT_DATA_TRANSFER) { sportUpdateAddr = *((uint32_t *)(&packet[3])); + sportUpdateState = SPORT_DATA_REQ; } break; From 99169b6a453c08c06e0aed55ceaeb0fe2798545c Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Sat, 14 Mar 2015 18:07:30 +0400 Subject: [PATCH 5/7] Save/restore previous module power state after SPORT upgrade --- radio/src/targets/taranis/board_taranis.h | 2 ++ radio/src/telemetry/frsky_sport.cpp | 12 +++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/radio/src/targets/taranis/board_taranis.h b/radio/src/targets/taranis/board_taranis.h index 417d4190d..e89827d90 100644 --- a/radio/src/targets/taranis/board_taranis.h +++ b/radio/src/targets/taranis/board_taranis.h @@ -177,6 +177,8 @@ uint32_t isBootloaderStart(const void * buffer); #define INTERNAL_MODULE_OFF() GPIO_ResetBits(GPIO_INT_RF_PWR, PIN_INT_RF_PWR) #define EXTERNAL_MODULE_ON() GPIO_SetBits(GPIO_EXT_RF_PWR, PIN_EXT_RF_PWR) #define EXTERNAL_MODULE_OFF() GPIO_ResetBits(GPIO_EXT_RF_PWR, PIN_EXT_RF_PWR) +#define INERNAL_MODULE_PWR() (GPIO_ReadInputDataBit(GPIO_INT_RF_PWR, PIN_INT_RF_PWR) == Bit_SET) +#define EXTERNAL_MODULE_PWR() (GPIO_ReadInputDataBit(GPIO_EXT_RF_PWR, PIN_EXT_RF_PWR) == Bit_SET) void init_no_pulses(uint32_t port); void disable_no_pulses(uint32_t port); void init_ppm( uint32_t module_index ); diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index ff508d053..e853f8cea 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -123,6 +123,7 @@ enum SportUpdateState { uint8_t sportUpdateState = SPORT_IDLE; uint32_t sportUpdateAddr = 0; +bool intPwr, extPwr; void processSportUpdatePacket(uint8_t *packet) { @@ -362,6 +363,8 @@ bool sportUpdatePowerOn(ModuleIndex module) sportUpdateState = SPORT_POWERUP_REQ; #if defined(PCBTARANIS) + intPwr = INERNAL_MODULE_PWR(); + extPwr = EXTERNAL_MODULE_PWR(); INTERNAL_MODULE_OFF(); EXTERNAL_MODULE_OFF(); #endif @@ -484,12 +487,19 @@ void sportFirmwareUpdate(ModuleIndex module, const char *filename) if (result == false) { POPUP_WARNING("Firmware Update Error"); } - sportUpdateState = SPORT_IDLE; #if defined(PCBTARANIS) INTERNAL_MODULE_OFF(); EXTERNAL_MODULE_OFF(); + + sportWaitState(SPORT_IDLE, 1000); + + if (intPwr) + INTERNAL_MODULE_ON(); + if (extPwr) + EXTERNAL_MODULE_ON(); #endif + sportUpdateState = SPORT_IDLE; } #endif From 170acef7c904718bb00e399654b80bc053056ddc Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Sat, 14 Mar 2015 18:31:17 +0400 Subject: [PATCH 6/7] Cosmetics --- radio/src/targets/taranis/board_taranis.h | 4 ++-- radio/src/telemetry/frsky_sport.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/radio/src/targets/taranis/board_taranis.h b/radio/src/targets/taranis/board_taranis.h index e89827d90..6e7639437 100644 --- a/radio/src/targets/taranis/board_taranis.h +++ b/radio/src/targets/taranis/board_taranis.h @@ -177,8 +177,8 @@ uint32_t isBootloaderStart(const void * buffer); #define INTERNAL_MODULE_OFF() GPIO_ResetBits(GPIO_INT_RF_PWR, PIN_INT_RF_PWR) #define EXTERNAL_MODULE_ON() GPIO_SetBits(GPIO_EXT_RF_PWR, PIN_EXT_RF_PWR) #define EXTERNAL_MODULE_OFF() GPIO_ResetBits(GPIO_EXT_RF_PWR, PIN_EXT_RF_PWR) -#define INERNAL_MODULE_PWR() (GPIO_ReadInputDataBit(GPIO_INT_RF_PWR, PIN_INT_RF_PWR) == Bit_SET) -#define EXTERNAL_MODULE_PWR() (GPIO_ReadInputDataBit(GPIO_EXT_RF_PWR, PIN_EXT_RF_PWR) == Bit_SET) +#define IS_INTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(GPIO_INT_RF_PWR, PIN_INT_RF_PWR) == Bit_SET) +#define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(GPIO_EXT_RF_PWR, PIN_EXT_RF_PWR) == Bit_SET) void init_no_pulses(uint32_t port); void disable_no_pulses(uint32_t port); void init_ppm( uint32_t module_index ); diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index e853f8cea..499ab8890 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -363,8 +363,8 @@ bool sportUpdatePowerOn(ModuleIndex module) sportUpdateState = SPORT_POWERUP_REQ; #if defined(PCBTARANIS) - intPwr = INERNAL_MODULE_PWR(); - extPwr = EXTERNAL_MODULE_PWR(); + intPwr = IS_INTERNAL_MODULE_ON(); + extPwr = IS_EXTERNAL_MODULE_ON(); INTERNAL_MODULE_OFF(); EXTERNAL_MODULE_OFF(); #endif From f2b29505ec2ffaecf924a37b4caf50ec0e5fa767 Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Sat, 14 Mar 2015 18:37:31 +0400 Subject: [PATCH 7/7] Cosmetics --- radio/src/targets/taranis/board_taranis.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/targets/taranis/board_taranis.h b/radio/src/targets/taranis/board_taranis.h index 6e7639437..fff66ed5c 100644 --- a/radio/src/targets/taranis/board_taranis.h +++ b/radio/src/targets/taranis/board_taranis.h @@ -177,8 +177,8 @@ uint32_t isBootloaderStart(const void * buffer); #define INTERNAL_MODULE_OFF() GPIO_ResetBits(GPIO_INT_RF_PWR, PIN_INT_RF_PWR) #define EXTERNAL_MODULE_ON() GPIO_SetBits(GPIO_EXT_RF_PWR, PIN_EXT_RF_PWR) #define EXTERNAL_MODULE_OFF() GPIO_ResetBits(GPIO_EXT_RF_PWR, PIN_EXT_RF_PWR) -#define IS_INTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(GPIO_INT_RF_PWR, PIN_INT_RF_PWR) == Bit_SET) -#define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(GPIO_EXT_RF_PWR, PIN_EXT_RF_PWR) == Bit_SET) +#define IS_INTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(GPIO_INT_RF_PWR, PIN_INT_RF_PWR) == Bit_SET) +#define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(GPIO_EXT_RF_PWR, PIN_EXT_RF_PWR) == Bit_SET) void init_no_pulses(uint32_t port); void disable_no_pulses(uint32_t port); void init_ppm( uint32_t module_index );