From 0d6907c76cd5a388d14fd1f1e137808a764635bc Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Tue, 25 Aug 2015 16:20:08 +0200 Subject: [PATCH] Preliminary ar9x board support --- companion/src/constants.h | 1 + companion/src/eeprominterface.h | 2 +- .../src/firmwares/opentx/opentxinterface.cpp | 28 +++++++++++++++++++ radio/src/Makefile | 25 +++++++++++++---- radio/src/gui/9X/menu_general_diaganas.cpp | 18 ++++++++---- radio/src/gui/9X/menu_general_setup.cpp | 6 ++-- radio/src/opentx.h | 6 ++++ radio/src/targets/sky9x/audio_driver.cpp | 2 ++ radio/src/targets/sky9x/rtc_driver.cpp | 4 +-- 9 files changed, 75 insertions(+), 17 deletions(-) diff --git a/companion/src/constants.h b/companion/src/constants.h index 3f319b666..ece5bf1e2 100644 --- a/companion/src/constants.h +++ b/companion/src/constants.h @@ -7,6 +7,7 @@ enum BoardEnum { BOARD_MEGA2560, BOARD_GRUVIN9X, BOARD_SKY9X, + BOARD_AR9X, BOARD_9XRPRO, BOARD_TARANIS, BOARD_TARANIS_PLUS, diff --git a/companion/src/eeprominterface.h b/companion/src/eeprominterface.h index 2b4f11b23..11ad3a49d 100644 --- a/companion/src/eeprominterface.h +++ b/companion/src/eeprominterface.h @@ -40,7 +40,7 @@ QString getBoardName(BoardEnum board); #define IS_9X(board) (board==BOARD_STOCK || board==BOARD_M128) #define IS_STOCK(board) (board==BOARD_STOCK) #define IS_2560(board) (board==BOARD_GRUVIN9X || board==BOARD_MEGA2560) -#define IS_SKY9X(board) (board==BOARD_SKY9X || board==BOARD_9XRPRO) +#define IS_SKY9X(board) (board==BOARD_SKY9X || board==BOARD_9XRPRO || board==BOARD_AR9X) #define IS_9XRPRO(board) (board==BOARD_9XRPRO) #define IS_TARANIS(board) (board==BOARD_TARANIS || board==BOARD_TARANIS_PLUS || board==BOARD_TARANIS_X9E) #define IS_TARANIS_PLUS(board) (board==BOARD_TARANIS_PLUS || board==BOARD_TARANIS_X9E) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index b6b61d720..ce1368f2b 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -73,6 +73,8 @@ const char * OpenTxEepromInterface::getName() return "OpenTX for Sky9x board / 9X"; case BOARD_9XRPRO: return "OpenTX for 9XR-PRO"; + case BOARD_AR9X: + return "OpenTX for ar9x board / 9X"; default: return "OpenTX for an unknown board"; } @@ -91,6 +93,7 @@ const int OpenTxEepromInterface::getEEpromSize() case BOARD_SKY9X: return EESIZE_SKY9X; case BOARD_9XRPRO: + case BOARD_AR9X: return EESIZE_9XRPRO; case BOARD_TARANIS: case BOARD_TARANIS_PLUS: @@ -381,6 +384,7 @@ int OpenTxEepromInterface::save(uint8_t *eeprom, RadioData &radioData, uint32_t case BOARD_TARANIS_PLUS: case BOARD_TARANIS_X9E: case BOARD_SKY9X: + case BOARD_AR9X: case BOARD_9XRPRO: version = 217; break; @@ -1069,6 +1073,7 @@ QString OpenTxFirmware::getFirmwareUrl() url.append(QString("/getfw.php?fw=%1.hex").arg(id)); break; case BOARD_SKY9X: + case BOARD_AR9X: case BOARD_9XRPRO: case BOARD_TARANIS: case BOARD_TARANIS_PLUS: @@ -1340,6 +1345,29 @@ void registerOpenTxFirmwares() firmware->addOption("bluetooth", QObject::tr("Bluetooth interface")); addOpenTxCommonOptions(firmware); firmwares.push_back(firmware); + + /* ar9x board */ + firmware = new OpenTxFirmware("opentx-ar9x", QObject::tr("ar9x board / 9X"), BOARD_AR9X); + firmware->addOption("heli", QObject::tr("Enable HELI menu and cyclic mix support")); + firmware->addOption("templates", QObject::tr("Enable TEMPLATES menu")); + firmware->addOption("nofp", QObject::tr("No flight modes")); + firmware->addOption("nocurves", QObject::tr("Disable curves menus")); + firmware->addOption("ppmca", QObject::tr("PPM center adjustment in limits")); + firmware->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT); + firmware->addOption("symlimits", QObject::tr("Symetrical Limits")); + firmware->addOption("timer3", QObject::tr("Support for a third timer")); + firmware->addOption("potscroll", QObject::tr("Pots use in menus navigation")); + firmware->addOption("autosource", QObject::tr("In model setup menus automatically set source by moving the control")); + firmware->addOption("autoswitch", QObject::tr("In model setup menus automatically set switch by moving the control")); + firmware->addOption("dblkeys", QObject::tr("Enable resetting values by pressing up and down at the same time")); + firmware->addOption("nographics", QObject::tr("No graphical check boxes and sliders")); + firmware->addOption("battgraph", QObject::tr("Battery graph")); + firmware->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items")); + firmware->addOption("bluetooth", QObject::tr("Bluetooth interface")); + firmware->addOption("rtc", QObject::tr("Optional RTC added")); + firmware->addOption("volume", QObject::tr("i2c volume control added")); + addOpenTxCommonOptions(firmware); + firmwares.push_back(firmware); /* 9XR-Pro */ firmware = new OpenTxFirmware("opentx-9xrpro", QObject::tr("9XR-PRO"), BOARD_9XRPRO); diff --git a/radio/src/Makefile b/radio/src/Makefile index 3212d851c..895caffe3 100644 --- a/radio/src/Makefile +++ b/radio/src/Makefile @@ -50,7 +50,7 @@ DELAY = 5 #----------- BUILD OPTIONS --------------------------- # PCB version -# Values: 9X, 9X128, 9X2561, 9XR, 9XR128, 9XR2561, GRUVIN9X, MEGA2560, SKY9X, 9XRPRO, TARANIS +# Values: 9X, 9X128, 9X2561, 9XR, 9XR128, 9XR2561, GRUVIN9X, MEGA2560, SKY9X, 9XRPRO, AR9X, TARANIS # Old values STD and STD128 are mapped to 9X and 9X128 for compatibility PCB = 9X @@ -214,6 +214,11 @@ VARIO = YES # default = YES (means enabled when available) RTCLOCK = YES +# Hardware volume +# Values = YES, NO +# default = YES (AR9X board doesn't have a hardware volume control as delivered but it can be fitted optionally) +HARDWARE_VOLUME = YES + # BLUETOOTH # Values = YES, NO BLUETOOTH = NO @@ -391,7 +396,7 @@ LUADEP = DEBUG_TRACE_BUFFER = NO # MCU name -ifneq ($(PCB), $(filter $(PCB), STD 9X 9XR STD128 9X128 9XR128 9X2561 9XR2561 GRUVIN9X MEGA2560 SKY9X 9XRPRO TARANIS)) +ifneq ($(PCB), $(filter $(PCB), STD 9X 9XR STD128 9X128 9XR128 9X2561 9XR2561 GRUVIN9X MEGA2560 SKY9X 9XRPRO AR9X TARANIS)) $(error Sorry, the PCB $(PCB) is not supported yet in OpenTX) endif @@ -746,7 +751,7 @@ ifeq ($(PCB), MEGA2560) CPPDEFS += -DROTARY_ENCODERS=${ROTARY_ENCODERS} endif -ifeq ($(PCB), $(filter $(PCB), SKY9X 9XRPRO)) +ifeq ($(PCB), $(filter $(PCB), SKY9X 9XRPRO AR9X)) # 9x/9XR radio with a sky9x replacement board GUIDIRECTORY = 9X ARCH = ARM @@ -757,6 +762,11 @@ ifeq ($(PCB), $(filter $(PCB), SKY9X 9XRPRO)) FLAVOUR = 9xrpro CPPDEFS += -DREVX LDSCRIPT = targets/sky9x/sam3s8c_flash.ld + else ifeq ($(PCB), AR9X) + CPPDEFS = -Dat91sam3s8 + FLAVOUR = ar9x + CPPDEFS += -DAR9X + LDSCRIPT = targets/sky9x/sam3s8c_flash.ld else ifeq ($(PCBREV), REVA) FLAVOUR = sky9x CPPDEFS += -DREVA @@ -826,6 +836,9 @@ ifeq ($(PCB), $(filter $(PCB), SKY9X 9XRPRO)) ifeq ($(DEBUG), YES) SRC += syscalls.c endif + ifeq ($(HARDWARE_VOLUME), NO) + CPPDEFS += -DNO_HARDWARE_VOLUME + endif endif ifeq ($(PCB), TARANIS) @@ -1048,7 +1061,7 @@ FORMAT = ihex TARGET = opentx # List C++ source files here. (C dependencies are automatically generated.) -ifeq ($(PCB), $(filter $(PCB), SKY9X 9XRPRO TARANIS)) +ifeq ($(PCB), $(filter $(PCB), SKY9X 9XRPRO AR9X TARANIS)) TTS_SRC = translations/tts_cz.cpp translations/tts_de.cpp translations/tts_en.cpp translations/tts_es.cpp translations/tts_fr.cpp translations/tts_it.cpp translations/tts_nl.cpp translations/tts_pt.cpp translations/tts_sk.cpp translations/tts_se.cpp translations/tts_pl.cpp translations/tts_hu.cpp else STD_TTS_SRC = translations/tts_$(shell sh -c "echo $(TTS) | tr '[:upper:]' '[:lower:]'").cpp @@ -1437,7 +1450,7 @@ all: begin gccversion sizebefore build sizeafter end # Change the build target to build a HEX file or a library. ifeq ($(ARCH), AVR) build: stamp_header tra lbm allsrc.cpp elf remallsrc hex -else ifeq ($(PCB), $(filter $(PCB), SKY9X 9XRPRO TARANIS)) +else ifeq ($(PCB), $(filter $(PCB), SKY9X 9XRPRO AR9X TARANIS)) build: stamp_header tra lbm bootloader.lbm $(LUADEP) allsrc.cpp elf remallsrc bin else build: stamp_header tra lbm allsrc.cpp elf remallsrc bin @@ -1450,7 +1463,7 @@ bootloader.lbm: targets/taranis/bootloader/bootloader_ramBoot.bin .PHONY targets/taranis/bootloader/bootloader_ramBoot.bin: @echo "Building bootloader..." $(MAKE) -C targets/taranis/bootloader PCB=$(PCB) PCBREV=$(PCBREV) NANO=$(NANO) -else ifeq ($(PCB), 9XRPRO) +else ifeq ($(PCB), $(filter $(PCB), 9XRPRO AR9X)) bootloader.lbm: @echo "Fetching Mike's bootloader..." wget http://ersky9x.googlecode.com/svn/trunk/src/bootloader/bootflash8.lbm diff --git a/radio/src/gui/9X/menu_general_diaganas.cpp b/radio/src/gui/9X/menu_general_diaganas.cpp index 8af5642c6..ee684f0ad 100755 --- a/radio/src/gui/9X/menu_general_diaganas.cpp +++ b/radio/src/gui/9X/menu_general_diaganas.cpp @@ -38,7 +38,7 @@ void menuGeneralDiagAna(uint8_t event) { -#if defined(PCBSKY9X) && !defined(REVA) +#if defined(PCBSKY9X) && !defined(REVA) && !defined(AR9X) #define ANAS_ITEMS_COUNT 4 #elif defined(PCBSKY9X) #define ANAS_ITEMS_COUNT 3 @@ -93,15 +93,23 @@ void menuGeneralDiagAna(uint8_t event) #endif if (m_posVert==1) CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatCalib, -127, 127); -#if defined(PCBSKY9X) && !defined(REVA) +#if defined(PCBSKY9X) && !defined(REVA) && !defined(AR9X) lcd_putsLeft(6*FH+1, STR_CURRENT_CALIB); putsValueWithUnit(LEN_CALIB_FIELDS*FW+4*FW, 6*FH+1, getCurrent(), UNIT_MILLIAMPS, (m_posVert==2 ? INVERS : 0)) ; if (m_posVert==2) CHECK_INCDEC_GENVAR(event, g_eeGeneral.currentCalib, -49, 49); #endif #if defined(PCBSKY9X) - lcd_putsLeft(7*FH+1, STR_TEMP_CALIB); - putsValueWithUnit(LEN_CALIB_FIELDS*FW+4*FW, 7*FH+1, getTemperature(), UNIT_TEMPERATURE, (m_posVert==3 ? INVERS : 0)) ; - if (m_posVert==3) CHECK_INCDEC_GENVAR(event, g_eeGeneral.temperatureCalib, -100, 100); + #if defined(AR9X) + #define TEMP_CALIB_POS 6*FH+1 + #define TEMP_CALIB_MENU_POS 2 + #else + #define TEMP_CALIB_POS 7*FH+1 + #define TEMP_CALIB_MENU_POS 3 + #endif + + lcd_putsLeft(TEMP_CALIB_POS, STR_TEMP_CALIB); + putsValueWithUnit(LEN_CALIB_FIELDS*FW+4*FW, TEMP_CALIB_POS, getTemperature(), UNIT_TEMPERATURE, (m_posVert==TEMP_CALIB_MENU_POS ? INVERS : 0)) ; + if (m_posVert==TEMP_CALIB_MENU_POS) CHECK_INCDEC_GENVAR(event, g_eeGeneral.temperatureCalib, -100, 100); #endif } diff --git a/radio/src/gui/9X/menu_general_setup.cpp b/radio/src/gui/9X/menu_general_setup.cpp index 097d90e49..a7ae0c689 100755 --- a/radio/src/gui/9X/menu_general_setup.cpp +++ b/radio/src/gui/9X/menu_general_setup.cpp @@ -97,7 +97,7 @@ enum menuGeneralSetupItems { ITEM_SETUP_CONTRAST, ITEM_SETUP_ALARMS_LABEL, ITEM_SETUP_BATTERY_WARNING, - CASE_PCBSKY9X(ITEM_SETUP_CAPACITY_WARNING) + CASE_CAPACITY(ITEM_SETUP_CAPACITY_WARNING) CASE_PCBSKY9X(ITEM_SETUP_TEMPERATURE_WARNING) ITEM_SETUP_INACTIVITY_ALARM, ITEM_SETUP_MEMORY_WARNING, @@ -153,7 +153,7 @@ void menuGeneralSetup(uint8_t event) } #endif - MENU(STR_MENURADIOSETUP, menuTabGeneral, e_Setup, ITEM_SETUP_MAX+1, {0, CASE_RTCLOCK(2) CASE_RTCLOCK(2) CASE_BATTGRAPH(1) LABEL(SOUND), CASE_AUDIO(0) CASE_BUZZER(0) CASE_VOICE(0) CASE_CPUARM(0) CASE_CPUARM(0) CASE_CPUARM(0) 0, CASE_AUDIO(0) CASE_VARIO_CPUARM(LABEL(VARIO)) CASE_VARIO_CPUARM(0) CASE_VARIO_CPUARM(0) CASE_VARIO_CPUARM(0) CASE_VARIO_CPUARM(0) CASE_HAPTIC(LABEL(HAPTIC)) CASE_HAPTIC(0) CASE_HAPTIC(0) CASE_HAPTIC(0) 0, LABEL(ALARMS), 0, CASE_PCBSKY9X(0) CASE_PCBSKY9X(0) 0, 0, 0, IF_ROTARY_ENCODERS(0) LABEL(BACKLIGHT), 0, 0, CASE_CPUARM(0) CASE_PWM_BACKLIGHT(0) CASE_PWM_BACKLIGHT(0) 0, CASE_SPLASH_PARAM(0) CASE_GPS(0) CASE_GPS(0) CASE_PXX(0) CASE_CPUARM(0) CASE_CPUARM(0) IF_FAI_CHOICE(0) CASE_MAVLINK(0) CASE_CPUARM(0) 0, COL_TX_MODE, 1/*to force edit mode*/}); + MENU(STR_MENURADIOSETUP, menuTabGeneral, e_Setup, ITEM_SETUP_MAX+1, {0, CASE_RTCLOCK(2) CASE_RTCLOCK(2) CASE_BATTGRAPH(1) LABEL(SOUND), CASE_AUDIO(0) CASE_BUZZER(0) CASE_VOICE(0) CASE_CPUARM(0) CASE_CPUARM(0) CASE_CPUARM(0) 0, CASE_AUDIO(0) CASE_VARIO_CPUARM(LABEL(VARIO)) CASE_VARIO_CPUARM(0) CASE_VARIO_CPUARM(0) CASE_VARIO_CPUARM(0) CASE_VARIO_CPUARM(0) CASE_HAPTIC(LABEL(HAPTIC)) CASE_HAPTIC(0) CASE_HAPTIC(0) CASE_HAPTIC(0) 0, LABEL(ALARMS), 0, CASE_CAPACITY(0) CASE_PCBSKY9X(0) 0, 0, 0, IF_ROTARY_ENCODERS(0) LABEL(BACKLIGHT), 0, 0, CASE_CPUARM(0) CASE_PWM_BACKLIGHT(0) CASE_PWM_BACKLIGHT(0) 0, CASE_SPLASH_PARAM(0) CASE_GPS(0) CASE_GPS(0) CASE_PXX(0) CASE_CPUARM(0) CASE_CPUARM(0) IF_FAI_CHOICE(0) CASE_MAVLINK(0) CASE_CPUARM(0) 0, COL_TX_MODE, 1/*to force edit mode*/}); uint8_t sub = m_posVert - 1; @@ -394,7 +394,7 @@ void menuGeneralSetup(uint8_t event) break; } -#if defined(PCBSKY9X) +#if defined(PCBSKY9X) && !defined(AR9X) case ITEM_SETUP_CAPACITY_WARNING: lcd_putsLeft(y, STR_CAPAWARNING); putsValueWithUnit(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.mAhWarn*50, UNIT_MAH, attr|LEFT) ; diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 7ef82bdfb..5f67c5da9 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -208,6 +208,12 @@ #define CASE_REV9E(x) #endif +#if defined(PCBSKX9X) && !defined(AR9X) + #define CASE_CAPACITY(x) x, +#else + #define CASE_CAPACITY(x) +#endif + #if ROTARY_ENCODERS > 0 #define ROTARY_ENCODER_NAVIGATION #endif diff --git a/radio/src/targets/sky9x/audio_driver.cpp b/radio/src/targets/sky9x/audio_driver.cpp index e92142af7..03d270b6f 100644 --- a/radio/src/targets/sky9x/audio_driver.cpp +++ b/radio/src/targets/sky9x/audio_driver.cpp @@ -179,10 +179,12 @@ void audioEnd() void setVolume(uint8_t volume) { +#if !defined(NO_HARDWARE_VOLUME) volumeRequired = volumeScale[min(volume, VOLUME_LEVEL_MAX)]; __disable_irq() ; i2cCheck() ; __enable_irq() ; +#endif } diff --git a/radio/src/targets/sky9x/rtc_driver.cpp b/radio/src/targets/sky9x/rtc_driver.cpp index ddd0ea50d..7e4044f23 100644 --- a/radio/src/targets/sky9x/rtc_driver.cpp +++ b/radio/src/targets/sky9x/rtc_driver.cpp @@ -267,7 +267,7 @@ void rtcSetTime(struct gtm * t) I2CTime.Time[6] = (t->tm_year+1900) >> 8; #if defined(REVX) writeRTC((uint8_t *)&I2CTime.Time[0]) ; -#else +#elif defined(COPROCESSOR) coprocWriteData((uint8_t *) &I2CTime, 8); #endif } @@ -276,7 +276,7 @@ void rtcInit() { #if defined(REVX) readRTC(); -#else +#elif defined(COPROCESSOR) coprocReadData(); #endif }