mirror of
https://github.com/EdgeTX/edgetx.git
synced 2025-07-25 01:05:08 +03:00
Bootloader can now be flashed from the SD Manager
This commit is contained in:
parent
fd92c3877b
commit
ff7a4599e9
20 changed files with 66 additions and 10 deletions
1
radio/src/.gitignore
vendored
1
radio/src/.gitignore
vendored
|
@ -19,3 +19,4 @@
|
||||||
/BMP
|
/BMP
|
||||||
/traces
|
/traces
|
||||||
/MODELS
|
/MODELS
|
||||||
|
/FIRMWARES
|
||||||
|
|
|
@ -635,7 +635,7 @@ ifeq ($(PCB), TARANIS)
|
||||||
EXTRAINCDIRS += targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_OTG_Driver/inc targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Core/inc
|
EXTRAINCDIRS += targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_OTG_Driver/inc targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Core/inc
|
||||||
EXTRAINCDIRS += targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Class/msc/inc targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Class/hid/inc
|
EXTRAINCDIRS += targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Class/msc/inc targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Class/hid/inc
|
||||||
BOARDSRC = targets/taranis/board_taranis.cpp
|
BOARDSRC = targets/taranis/board_taranis.cpp
|
||||||
EXTRABOARDSRC += targets/taranis/lcd_driver.cpp targets/taranis/aspi.c targets/taranis/i2c.c targets/taranis/delays.c
|
EXTRABOARDSRC += targets/taranis/lcd_driver.cpp targets/taranis/flash_driver.cpp targets/taranis/aspi.c targets/taranis/i2c.c targets/taranis/delays.c
|
||||||
SRC += CoOS/kernel/core.c CoOS/kernel/hook.c CoOS/kernel/task.c CoOS/kernel/event.c CoOS/kernel/time.c CoOS/kernel/timer.c CoOS/kernel/flag.c CoOS/kernel/mutex.c CoOS/kernel/serviceReq.c CoOS/portable/GCC/port.c CoOS/portable/arch.c
|
SRC += CoOS/kernel/core.c CoOS/kernel/hook.c CoOS/kernel/task.c CoOS/kernel/event.c CoOS/kernel/time.c CoOS/kernel/timer.c CoOS/kernel/flag.c CoOS/kernel/mutex.c CoOS/kernel/serviceReq.c CoOS/portable/GCC/port.c CoOS/portable/arch.c
|
||||||
SRC += targets/taranis/pwr_driver.c targets/taranis/usb_driver.c
|
SRC += targets/taranis/pwr_driver.c targets/taranis/usb_driver.c
|
||||||
EEPROMSRC = eeprom_common.cpp eeprom_rlc.cpp eeprom_conversions.cpp
|
EEPROMSRC = eeprom_common.cpp eeprom_rlc.cpp eeprom_conversions.cpp
|
||||||
|
|
|
@ -63,7 +63,7 @@
|
||||||
#include "../translations/en.h"
|
#include "../translations/en.h"
|
||||||
|
|
||||||
#if defined(PCBTARANIS)
|
#if defined(PCBTARANIS)
|
||||||
#define BOOTLOADER_TITLE "Taranis Boot Loader - v1.0"
|
#define BOOTLOADER_TITLE " Taranis Boot Loader - v1.0"
|
||||||
#define BOOT_KEY_UP KEY_PLUS
|
#define BOOT_KEY_UP KEY_PLUS
|
||||||
#define BOOT_KEY_DOWN KEY_MINUS
|
#define BOOT_KEY_DOWN KEY_MINUS
|
||||||
#define BOOT_KEY_LEFT KEY_MENU
|
#define BOOT_KEY_LEFT KEY_MENU
|
||||||
|
|
|
@ -685,6 +685,31 @@ 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);
|
return (!isfile && line[SD_SCREEN_FILE_LENGTH+1]) || (isfile==(bool)line[SD_SCREEN_FILE_LENGTH+1] && strcasecmp(fn, line) < 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(PCBTARANIS)
|
||||||
|
void flashBootloader(const char * filename)
|
||||||
|
{
|
||||||
|
FIL file;
|
||||||
|
f_open(&file, filename, FA_READ);
|
||||||
|
uint8_t buffer[FLASH_PAGESIZE];
|
||||||
|
UINT count;
|
||||||
|
lcd_rect( 3, 6*FH+4, 204, 7);
|
||||||
|
watchdogSetTimeout(1000/*10s*/);
|
||||||
|
unlockFlash();
|
||||||
|
for (int i=0; i<BOOTLOADER_SIZE; i+=FLASH_PAGESIZE) {
|
||||||
|
if (f_read(&file, buffer, FLASH_PAGESIZE, &count) != FR_OK || count != FLASH_PAGESIZE) {
|
||||||
|
// TODO popup error
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
writeFlash((uint32_t*)(uint64_t)(FIRMWARE_ADDRESS+i), (uint32_t *)buffer);
|
||||||
|
lcd_hline(5, 6*FH+6, (200*i)/BOOTLOADER_SIZE, FORCE);
|
||||||
|
lcd_hline(5, 6*FH+7, (200*i)/BOOTLOADER_SIZE, FORCE);
|
||||||
|
lcd_hline(5, 6*FH+8, (200*i)/BOOTLOADER_SIZE, FORCE);
|
||||||
|
lcdRefresh();
|
||||||
|
}
|
||||||
|
f_close(&file);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void onSdManagerMenu(const char *result)
|
void onSdManagerMenu(const char *result)
|
||||||
{
|
{
|
||||||
TCHAR lfn[_MAX_LFN + 1];
|
TCHAR lfn[_MAX_LFN + 1];
|
||||||
|
@ -733,6 +758,19 @@ void onSdManagerMenu(const char *result)
|
||||||
memcpy(modelHeaders[g_eeGeneral.currModel].bitmap, g_model.header.bitmap, sizeof(g_model.header.bitmap));
|
memcpy(modelHeaders[g_eeGeneral.currModel].bitmap, g_model.header.bitmap, sizeof(g_model.header.bitmap));
|
||||||
eeDirty(EE_MODEL);
|
eeDirty(EE_MODEL);
|
||||||
}
|
}
|
||||||
|
else if (result == STR_VIEW_TEXT) {
|
||||||
|
f_getcwd(lfn, _MAX_LFN);
|
||||||
|
strcat(lfn, "/");
|
||||||
|
strcat(lfn, reusableBuffer.sdmanager.lines[index]);
|
||||||
|
pushMenuTextView(lfn);
|
||||||
|
}
|
||||||
|
else if (result == STR_FLASH_BOOTLOADER) {
|
||||||
|
f_getcwd(lfn, _MAX_LFN);
|
||||||
|
strcat(lfn, "/");
|
||||||
|
strcat(lfn, reusableBuffer.sdmanager.lines[index]);
|
||||||
|
flashBootloader(lfn);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#if defined(LUA)
|
#if defined(LUA)
|
||||||
else if (result == STR_EXECUTE_FILE) {
|
else if (result == STR_EXECUTE_FILE) {
|
||||||
f_getcwd(lfn, _MAX_LFN);
|
f_getcwd(lfn, _MAX_LFN);
|
||||||
|
@ -740,13 +778,6 @@ void onSdManagerMenu(const char *result)
|
||||||
strcat(lfn, reusableBuffer.sdmanager.lines[index]);
|
strcat(lfn, reusableBuffer.sdmanager.lines[index]);
|
||||||
luaExec(lfn);
|
luaExec(lfn);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
else if (result == STR_VIEW_TEXT) {
|
|
||||||
f_getcwd(lfn, _MAX_LFN);
|
|
||||||
strcat(lfn, "/");
|
|
||||||
strcat(lfn, reusableBuffer.sdmanager.lines[index]);
|
|
||||||
pushMenuTextView(lfn);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -847,6 +878,7 @@ void menuGeneralSdManager(uint8_t _event)
|
||||||
else */ if (!strcasecmp(ext, SOUNDS_EXT)) {
|
else */ if (!strcasecmp(ext, SOUNDS_EXT)) {
|
||||||
MENU_ADD_ITEM(STR_PLAY_FILE);
|
MENU_ADD_ITEM(STR_PLAY_FILE);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#if defined(PCBTARANIS)
|
#if defined(PCBTARANIS)
|
||||||
else if (!strcasecmp(ext, BITMAPS_EXT) && !READ_ONLY()) {
|
else if (!strcasecmp(ext, BITMAPS_EXT) && !READ_ONLY()) {
|
||||||
MENU_ADD_ITEM(STR_ASSIGN_BITMAP);
|
MENU_ADD_ITEM(STR_ASSIGN_BITMAP);
|
||||||
|
@ -854,12 +886,14 @@ void menuGeneralSdManager(uint8_t _event)
|
||||||
else if (!strcasecmp(ext, TEXT_EXT)) {
|
else if (!strcasecmp(ext, TEXT_EXT)) {
|
||||||
MENU_ADD_ITEM(STR_VIEW_TEXT);
|
MENU_ADD_ITEM(STR_VIEW_TEXT);
|
||||||
}
|
}
|
||||||
|
else if (!strcasecmp(ext, FIRMWARE_EXT) && !READ_ONLY()) {
|
||||||
|
MENU_ADD_ITEM(STR_FLASH_BOOTLOADER);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined(LUA)
|
#if defined(LUA)
|
||||||
else if (!strcasecmp(ext, SCRIPTS_EXT)) {
|
else if (!strcasecmp(ext, SCRIPTS_EXT)) {
|
||||||
MENU_ADD_ITEM(STR_EXECUTE_FILE);
|
MENU_ADD_ITEM(STR_EXECUTE_FILE);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
if (!READ_ONLY()) {
|
if (!READ_ONLY()) {
|
||||||
MENU_ADD_ITEM(STR_DELETE_FILE);
|
MENU_ADD_ITEM(STR_DELETE_FILE);
|
||||||
|
|
|
@ -55,6 +55,7 @@
|
||||||
#define BITMAPS_EXT ".bmp"
|
#define BITMAPS_EXT ".bmp"
|
||||||
#define SCRIPTS_EXT ".lua"
|
#define SCRIPTS_EXT ".lua"
|
||||||
#define TEXT_EXT ".txt"
|
#define TEXT_EXT ".txt"
|
||||||
|
#define FIRMWARE_EXT ".bin"
|
||||||
|
|
||||||
extern FATFS g_FATFS_Obj;
|
extern FATFS g_FATFS_Obj;
|
||||||
|
|
||||||
|
|
|
@ -672,5 +672,6 @@ void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState New
|
||||||
void RCC_LSEConfig(uint8_t RCC_LSE) { }
|
void RCC_LSEConfig(uint8_t RCC_LSE) { }
|
||||||
FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG) { return RESET; }
|
FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG) { return RESET; }
|
||||||
ErrorStatus RTC_WaitForSynchro(void) { return SUCCESS; }
|
ErrorStatus RTC_WaitForSynchro(void) { return SUCCESS; }
|
||||||
|
void writeFlash(uint32_t *address, uint32_t *buffer) { SIMU_SLEEP(100); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -146,6 +146,7 @@ void delay_01us(uint16_t nb);
|
||||||
void unlockFlash();
|
void unlockFlash();
|
||||||
void writeFlash(uint32_t * address, uint32_t * buffer);
|
void writeFlash(uint32_t * address, uint32_t * buffer);
|
||||||
uint32_t isFirmwareStart(uint32_t *block);
|
uint32_t isFirmwareStart(uint32_t *block);
|
||||||
|
uint32_t isBootloaderStart(uint32_t *block);
|
||||||
|
|
||||||
// Pulses driver
|
// Pulses driver
|
||||||
void init_no_pulses(uint32_t port);
|
void init_no_pulses(uint32_t port);
|
||||||
|
|
|
@ -111,3 +111,9 @@ uint32_t isFirmwareStart(uint32_t *block)
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t isBootloaderStart(uint32_t *block)
|
||||||
|
{
|
||||||
|
// TODO search for "BOOT" inside the block
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
|
@ -465,6 +465,7 @@ const pm_char STR_DATE[] PROGMEM = TR_DATE;
|
||||||
const pm_char STR_CHANNELS_MONITOR[] PROGMEM = TR_CHANNELS_MONITOR;
|
const pm_char STR_CHANNELS_MONITOR[] PROGMEM = TR_CHANNELS_MONITOR;
|
||||||
const pm_char STR_PATH_TOO_LONG[] PROGMEM = TR_PATH_TOO_LONG;
|
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_VIEW_TEXT[] PROGMEM = TR_VIEW_TEXT;
|
||||||
|
const pm_char STR_FLASH_BOOTLOADER[] PROGMEM = TR_FLASH_BOOTLOADER;
|
||||||
|
|
||||||
#if LCD_W >= 212
|
#if LCD_W >= 212
|
||||||
const pm_char STR_MODELNAME[] PROGMEM = TR_MODELNAME;
|
const pm_char STR_MODELNAME[] PROGMEM = TR_MODELNAME;
|
||||||
|
|
|
@ -616,6 +616,7 @@ extern const pm_char STR_DATE[];
|
||||||
extern const pm_char STR_CHANNELS_MONITOR[];
|
extern const pm_char STR_CHANNELS_MONITOR[];
|
||||||
extern const pm_char STR_PATH_TOO_LONG[];
|
extern const pm_char STR_PATH_TOO_LONG[];
|
||||||
extern const pm_char STR_VIEW_TEXT[];
|
extern const pm_char STR_VIEW_TEXT[];
|
||||||
|
extern const pm_char STR_FLASH_BOOTLOADER[];
|
||||||
|
|
||||||
#if defined(VOICE) && defined(CPUARM)
|
#if defined(VOICE) && defined(CPUARM)
|
||||||
struct LanguagePack {
|
struct LanguagePack {
|
||||||
|
|
|
@ -712,6 +712,7 @@
|
||||||
#define TR_CHANNELS_MONITOR "MONITOR KANÁLU"
|
#define TR_CHANNELS_MONITOR "MONITOR KANÁLU"
|
||||||
#define TR_PATH_TOO_LONG "Cesta je moc dlouhá"
|
#define TR_PATH_TOO_LONG "Cesta je moc dlouhá"
|
||||||
#define TR_VIEW_TEXT "Zobrazit text"
|
#define TR_VIEW_TEXT "Zobrazit text"
|
||||||
|
#define TR_FLASH_BOOTLOADER "Flash BootLoader"
|
||||||
#define TR_INTERNALRF "Vnitřní RF modul"
|
#define TR_INTERNALRF "Vnitřní RF modul"
|
||||||
#define TR_EXTERNALRF "Externí RF modul"
|
#define TR_EXTERNALRF "Externí RF modul"
|
||||||
#define TR_FAILSAFE "Mód Failsafe"
|
#define TR_FAILSAFE "Mód Failsafe"
|
||||||
|
|
|
@ -712,6 +712,7 @@
|
||||||
#define TR_CHANNELS_MONITOR "Kanal Monitor"
|
#define TR_CHANNELS_MONITOR "Kanal Monitor"
|
||||||
#define TR_PATH_TOO_LONG "Path too long"
|
#define TR_PATH_TOO_LONG "Path too long"
|
||||||
#define TR_VIEW_TEXT "View text"
|
#define TR_VIEW_TEXT "View text"
|
||||||
|
#define TR_FLASH_BOOTLOADER "Flash BootLoader"
|
||||||
#define TR_INTERNALRF "----Internes HF Modul----------"
|
#define TR_INTERNALRF "----Internes HF Modul----------"
|
||||||
#define TR_EXTERNALRF "----Externes HF Modul----------"
|
#define TR_EXTERNALRF "----Externes HF Modul----------"
|
||||||
#define TR_FAILSAFE "Failsafe Mode"
|
#define TR_FAILSAFE "Failsafe Mode"
|
||||||
|
|
|
@ -716,6 +716,7 @@
|
||||||
#define TR_CHANNELS_MONITOR "CHANNEL MONITOR"
|
#define TR_CHANNELS_MONITOR "CHANNEL MONITOR"
|
||||||
#define TR_PATH_TOO_LONG "Path too long"
|
#define TR_PATH_TOO_LONG "Path too long"
|
||||||
#define TR_VIEW_TEXT "View text"
|
#define TR_VIEW_TEXT "View text"
|
||||||
|
#define TR_FLASH_BOOTLOADER "Flash BootLoader"
|
||||||
#define TR_INTERNALRF "Internal RF"
|
#define TR_INTERNALRF "Internal RF"
|
||||||
#define TR_EXTERNALRF "External RF"
|
#define TR_EXTERNALRF "External RF"
|
||||||
#define TR_FAILSAFE INDENT "Failsafe mode"
|
#define TR_FAILSAFE INDENT "Failsafe mode"
|
||||||
|
|
|
@ -712,6 +712,7 @@
|
||||||
#define TR_CHANNELS_MONITOR "MONITOR CANALES"
|
#define TR_CHANNELS_MONITOR "MONITOR CANALES"
|
||||||
#define TR_PATH_TOO_LONG "Path too long"
|
#define TR_PATH_TOO_LONG "Path too long"
|
||||||
#define TR_VIEW_TEXT "View text"
|
#define TR_VIEW_TEXT "View text"
|
||||||
|
#define TR_FLASH_BOOTLOADER "Flash BootLoader"
|
||||||
#define TR_INTERNALRF "Interna RF"
|
#define TR_INTERNALRF "Interna RF"
|
||||||
#define TR_EXTERNALRF "Externa RF"
|
#define TR_EXTERNALRF "Externa RF"
|
||||||
#define TR_FAILSAFE INDENT"Modo sgdad."
|
#define TR_FAILSAFE INDENT"Modo sgdad."
|
||||||
|
|
|
@ -712,6 +712,7 @@
|
||||||
#define TR_CHANNELS_MONITOR "CHANNEL MONITOR"
|
#define TR_CHANNELS_MONITOR "CHANNEL MONITOR"
|
||||||
#define TR_PATH_TOO_LONG "Path too long"
|
#define TR_PATH_TOO_LONG "Path too long"
|
||||||
#define TR_VIEW_TEXT "View text"
|
#define TR_VIEW_TEXT "View text"
|
||||||
|
#define TR_FLASH_BOOTLOADER "Flash BootLoader"
|
||||||
#define TR_INTERNALRF "Internal RF"
|
#define TR_INTERNALRF "Internal RF"
|
||||||
#define TR_EXTERNALRF "External RF"
|
#define TR_EXTERNALRF "External RF"
|
||||||
#define TR_FAILSAFE INDENT "Failsafe mode"
|
#define TR_FAILSAFE INDENT "Failsafe mode"
|
||||||
|
|
|
@ -712,6 +712,7 @@
|
||||||
#define TR_CHANNELS_MONITOR "MONITEUR CANAUX"
|
#define TR_CHANNELS_MONITOR "MONITEUR CANAUX"
|
||||||
#define TR_PATH_TOO_LONG "Chemin trop long"
|
#define TR_PATH_TOO_LONG "Chemin trop long"
|
||||||
#define TR_VIEW_TEXT "Voir texte"
|
#define TR_VIEW_TEXT "Voir texte"
|
||||||
|
#define TR_FLASH_BOOTLOADER "Flash BootLoader"
|
||||||
#define TR_INTERNALRF "HF interne"
|
#define TR_INTERNALRF "HF interne"
|
||||||
#define TR_EXTERNALRF "HF externe"
|
#define TR_EXTERNALRF "HF externe"
|
||||||
#define TR_FAILSAFE INDENT "Type failsafe"
|
#define TR_FAILSAFE INDENT "Type failsafe"
|
||||||
|
|
|
@ -712,6 +712,7 @@
|
||||||
#define TR_CHANNELS_MONITOR "CHANNELS MONITOR"
|
#define TR_CHANNELS_MONITOR "CHANNELS MONITOR"
|
||||||
#define TR_PATH_TOO_LONG "Path too long"
|
#define TR_PATH_TOO_LONG "Path too long"
|
||||||
#define TR_VIEW_TEXT "View text"
|
#define TR_VIEW_TEXT "View text"
|
||||||
|
#define TR_FLASH_BOOTLOADER "Flash BootLoader"
|
||||||
#define TR_INTERNALRF "Modulo Interno"
|
#define TR_INTERNALRF "Modulo Interno"
|
||||||
#define TR_EXTERNALRF "Modulo esterno"
|
#define TR_EXTERNALRF "Modulo esterno"
|
||||||
#define TR_FAILSAFE "Modo failsafe"
|
#define TR_FAILSAFE "Modo failsafe"
|
||||||
|
|
|
@ -712,6 +712,7 @@
|
||||||
#define TR_CHANNELS_MONITOR "MONITOR KANAŁÓW"
|
#define TR_CHANNELS_MONITOR "MONITOR KANAŁÓW"
|
||||||
#define TR_PATH_TOO_LONG "Ścieżka za długa"
|
#define TR_PATH_TOO_LONG "Ścieżka za długa"
|
||||||
#define TR_VIEW_TEXT "Pokaż tekst"
|
#define TR_VIEW_TEXT "Pokaż tekst"
|
||||||
|
#define TR_FLASH_BOOTLOADER "Flash BootLoader"
|
||||||
#define TR_INTERNALRF "Wewnętrzny moduł RF"
|
#define TR_INTERNALRF "Wewnętrzny moduł RF"
|
||||||
#define TR_EXTERNALRF "Zewnętrzny moduł RF"
|
#define TR_EXTERNALRF "Zewnętrzny moduł RF"
|
||||||
#define TR_FAILSAFE "Tryb Failsafe"
|
#define TR_FAILSAFE "Tryb Failsafe"
|
||||||
|
|
|
@ -712,6 +712,7 @@
|
||||||
#define TR_CHANNELS_MONITOR "CHANNELS MONITOR"
|
#define TR_CHANNELS_MONITOR "CHANNELS MONITOR"
|
||||||
#define TR_PATH_TOO_LONG "Path too long"
|
#define TR_PATH_TOO_LONG "Path too long"
|
||||||
#define TR_VIEW_TEXT "View text"
|
#define TR_VIEW_TEXT "View text"
|
||||||
|
#define TR_FLASH_BOOTLOADER "Flash BootLoader"
|
||||||
#define TR_INTERNALRF "Internal RF"
|
#define TR_INTERNALRF "Internal RF"
|
||||||
#define TR_EXTERNALRF "External RF"
|
#define TR_EXTERNALRF "External RF"
|
||||||
#define TR_FAILSAFE "Failsafe mode"
|
#define TR_FAILSAFE "Failsafe mode"
|
||||||
|
|
|
@ -712,6 +712,7 @@
|
||||||
#define TR_CHANNELS_MONITOR "Kanalöversikt"
|
#define TR_CHANNELS_MONITOR "Kanalöversikt"
|
||||||
#define TR_PATH_TOO_LONG "För lång sökväg"
|
#define TR_PATH_TOO_LONG "För lång sökväg"
|
||||||
#define TR_VIEW_TEXT "Visa Text"
|
#define TR_VIEW_TEXT "Visa Text"
|
||||||
|
#define TR_FLASH_BOOTLOADER "Flash BootLoader"
|
||||||
#define TR_INTERNALRF "Intern Radio"
|
#define TR_INTERNALRF "Intern Radio"
|
||||||
#define TR_EXTERNALRF "Extern Radiomodul"
|
#define TR_EXTERNALRF "Extern Radiomodul"
|
||||||
#define TR_FAILSAFE "Failsafeläge"
|
#define TR_FAILSAFE "Failsafeläge"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue