diff --git a/radio/util/build.py b/radio/util/build.py new file mode 100644 index 000000000..a3c286874 --- /dev/null +++ b/radio/util/build.py @@ -0,0 +1,179 @@ +#!/usr/bin/env python + +import os +import sys +from fwoptions import * + +# Board types +BOARD_9X = 0 +BOARD_GRUVIN9X = 1 +BOARD_SKY9X = 2 +BOARD_TARANIS = 3 +BOARD_HORUS = 4 + +# Board families +BOARD_FAMILY_AVR = 0 +BOARD_FAMILY_ARM = 1 + +srcdir = os.path.dirname(os.path.realpath(__file__)) + "/../.." +filename = sys.argv[1] +root, ext = os.path.splitext(filename) +options = root.split("-") + +if options[0] != "opentx": + sys.exit("Invalid firmware"); + +filename = "opentx-" +optcount = 1 + +command_options = {} + +if options[optcount] == "9x": + command_options["PCB"] = "9X" + firmware_options = options_9x + maxsize = 65536 + board = BOARD_9X + board_family = BOARD_FAMILY_AVR +elif options[optcount] == "9xr": + command_options["PCB"] = "9XR" + firmware_options = options_9x + maxsize = 65536 + board = BOARD_9X + board_family = BOARD_FAMILY_AVR +elif options[optcount] == "9x128": + command_options["PCB"] = "9X128" + command_options["FRSKY_STICKS"] = "YES" + firmware_options = options_9x128 + maxsize = 65536*2 + board = BOARD_9X + board_family = BOARD_FAMILY_AVR +elif options[optcount] == "9xr128": + command_options["PCB"] = "9XR128" + command_options["FRSKY_STICKS"] = "YES" + firmware_options = options_9x128 + maxsize = 65536*2 + board = BOARD_9X + board_family = BOARD_FAMILY_AVR +elif options[optcount] == "gruvin9x": + command_options["PCB"] = "GRUVIN9X" + command_options["EXT"] = "FRSKY" + firmware_options = options_gruvin9x + maxsize = 65536*4 + board = BOARD_GRUVIN9X + board_family = BOARD_FAMILY_AVR +elif options[optcount] == "mega2560": + command_options["PCB"] = "MEGA2560" + command_options["EXT"] = "FRSKY" + firmware_options = options_mega2560 + maxsize = 65536*4 + board = BOARD_GRUVIN9X + board_family = BOARD_FAMILY_AVR +elif options[optcount] == "sky9x": + command_options["PCB"] = "SKY9X" + firmware_options = options_sky9x + maxsize = 65536*4 + board = BOARD_SKY9X + board_family = BOARD_FAMILY_ARM +elif options[optcount] == "9xrpro": + command_options["PCB"] = "9XRPRO" + command_options["SDCARD"] = "YES" + firmware_options = options_sky9x + maxsize = 65536*4 + board = BOARD_SKY9X + board_family = BOARD_FAMILY_ARM +elif options[optcount] == "ar9x": + command_options["PCB"] = "AR9X" + command_options["SDCARD"] = "YES" + command_options["HARDWARE_VOLUME"] = "NO" + firmware_options = options_ar9x + maxsize = 65536*4 + board = BOARD_SKY9X + board_family = BOARD_FAMILY_ARM +elif options[optcount] == "taranis": + command_options["PCB"] = "TARANIS" + firmware_options = options_taranis + maxsize = 65536*8 + board = BOARD_TARANIS + board_family = BOARD_FAMILY_ARM +elif options[optcount] == "taranisplus": + command_options["PCB"] = "TARANIS" + command_options["PCBREV"] = "REVPLUS" + firmware_options = options_taranisplus + maxsize = 65536*8 + board = BOARD_TARANIS + board_family = BOARD_FAMILY_ARM +elif options[optcount] == "taranisx9e": + command_options["PCB"] = "TARANIS" + command_options["PCBREV"] = "REV9E" + firmware_options = options_taranisx9e + maxsize = 65536*8 + board = BOARD_TARANIS + board_family = BOARD_FAMILY_ARM +elif options[optcount] == "horus": + command_options["PCB"] = "HORUS" + firmware_options = options_horus + maxsize = 2*1024*1024 + board = BOARD_HORUS + board_family = BOARD_FAMILY_ARM +else: + sys.exit("Unknown board") + +filename += options[optcount] +optcount += 1 + +# The firmware options +for opt, value in firmware_options.items(): + found = False + for i in range(optcount, len(options)): + if options[i] == opt: + found = True + break + + if found: + optvalue = value[1]; + filename += "-" + opt; + else: + optvalue = value[2] + + if optvalue != None: + command_options[value[0]] = optvalue + +# The firmware display language +language = "" +for key in languages: + if key == options[-1]: + language = key +if not language: + sys.exit("Invalid language") +command_options["TRANSLATIONS"] = language.upper() +filename += "-" + language + +if board_family == BOARD_FAMILY_ARM: + ext = ".bin" +else: + ext = ".hex" +filename += ext +firmware = "firmware" + ext + +# Launch CMake +cmd = "cmake" +for opt, value in command_options.items(): + cmd += " -D%s=%s" % (opt, value) +cmd += " " + srcdir +if "OPENTX_VERSION_SUFFIX" in os.environ: + cmd += ' -DVERSION_SUFFIX="%s"' % os.environ["OPENTX_VERSION_SUFFIX"] +print cmd +os.system(cmd) + +# Launch make firmware +cmd = "make firmware" +os.system(cmd) + +# Check binary size +if board_family == BOARD_FAMILY_ARM: + size = os.stat(firmware).st_size +else: + os.system("avr-size -A %s | grep Total | cut -f2- -d \" \" > ./size" % firmware) + size = file("./size").read().strip() +if int(size) > maxsize: + exit("Invalid size") diff --git a/radio/util/fwoptions.py b/radio/util/fwoptions.py new file mode 100644 index 000000000..24f910a52 --- /dev/null +++ b/radio/util/fwoptions.py @@ -0,0 +1,308 @@ +#!/usr/bin/env python + +languages = ( + "en", + "fr", + "se", + "it", + "cz", + "de", + "pt", + "es", + "pl", + "nl" +) + +tts_avr = { + "ttsen": ("TTS", "EN", None), + "ttsfr": ("TTS", "FR", None), + "ttsit": ("TTS", "IT", None), + "ttscz": ("TTS", "CZ", None), + "ttsde": ("TTS", "DE", None), + "ttspt": ("TTS", "PT", None), +} + +options_9x_ext = { + "nmea": ("EXT", "NMEA", None), + "frsky": ("EXT", "FRSKY", None), + "telemetrez": ("EXT", "TELEMETREZ", None), + "jeti": ("EXT", "JETI", None), + "ardupilot": ("EXT", "ARDUPILOT", None), + "mavlink": ("EXT", "MAVLINK", None), +} + +options_9x = { + "heli": ("HELI", "YES", "NO"), + "templates": ("TEMPLATES", "YES", "NO"), + "nosplash": ("SPLASH", "NO", "YES"), + "nofp": ("FLIGHT_MODES", "NO", "YES"), + "nocurves": ("CURVES", "NO", "YES"), + "audio": ("AUDIO", "YES", "NO"), + "voice": ("VOICE", "YES", "NO"), + "haptic": ("HAPTIC", "YES", "NO"), + "pwmbl": ("PWM_BACKLIGHT", "YES", "NO"), + "turnigyfix": ("TURNIGY_TRANSMITTER_FIX", "YES", "NO"), + "acurStats": ("ACCURAT_THROTTLE_STATS", "YES", "NO"), + "arithOvfl": ("ARITHMETIC_OVERFLOW_CHECK", "YES", "NO"), + # "PXX": ("PXX", "YES", "NO"), + "DSM2": ("DSM2", "PPM ", "NO"), + "potscroll": ("NAVIGATION", "POTS ", "NO"), + "rotenc": ("NAVIGATION", "ROTENC ", "NO"), + "sp22": ("SP22", "YES", "NO"), + "autosource": ("AUTOSOURCE", "YES", "NO"), + "autoswitch": ("AUTOSWITCH", "YES", "NO"), + "dblkeys": ("DBLKEYS", "YES", "NO"), + "ppmca": ("PPM_CENTER_ADJUSTABLE", "YES", "NO"), + "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), + "gvars": ("GVARS", "YES", "NO"), + "symlimits": ("PPM_LIMITS_SYMETRICAL", "YES", "NO"), + "nographics": ("GRAPHICS", "NO", "YES"), + "battgraph": ("BATTGRAPH", "YES", "NO"), + "nobold": ("BOLD", "NO", "YES"), + "sqt5font": ("FONT", "SQT5 ", None), + "thrtrace": ("THR_TRACE", "YES", "NO"), + "pgbar": ("EEPROM_PROGRESS_BAR", "YES", "NO"), + "imperial": ("UNITS", "IMPERIAL", "METRIC"), + "nogps": ("GPS", "NO", "YES"), + "nogauges": ("GAUGES", "NO", "YES"), + "novario": ("VARIO", "NO", "YES"), + "nowshh": ("WS_HOW_HIGH", "NO", "YES"), + "faimode": ("FAI", "YES", None), + "faichoice": ("FAI", "CHOICE ", None), + "fasoffset": ("FAS_OFFSET", "YES", "NO"), + "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), + "stickrev": ("FRSKY_STICKS", "YES", "NO") +} + +options_9x.update(options_9x_ext) +options_9x.update(tts_avr) + +options_9x128 = { + "heli": ("HELI", "YES", "NO"), + "templates": ("TEMPLATES", "YES", "NO"), + "nosplash": ("SPLASH", "NO", "YES"), + "nofp": ("FLIGHT_MODES", "NO", "YES"), + "nocurves": ("CURVES", "NO", "YES"), + "audio": ("AUDIO", "YES", "NO"), + "voice": ("VOICE", "YES", "NO"), + "haptic": ("HAPTIC", "YES", "NO"), + "pwmbl": ("PWM_BACKLIGHT", "YES", "NO"), + "turnigyfix": ("TURNIGY_TRANSMITTER_FIX", "YES", "NO"), + # "PXX": ("PXX", "YES", "NO"), + "DSM2": ("DSM2", "PPM", "NO"), + "potscroll": ("NAVIGATION", "POTS", "NO"), + "rotenc": ("NAVIGATION", "ROTENC", "NO"), + "sp22": ("SP22", "YES", "NO"), + "autosource": ("AUTOSOURCE", "YES", "NO"), + "autoswitch": ("AUTOSWITCH", "YES", "NO"), + "dblkeys": ("DBLKEYS", "YES", "NO"), + "ppmca": ("PPM_CENTER_ADJUSTABLE", "YES", "NO"), + "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), + "gvars": ("GVARS", "YES", "NO"), + "symlimits": ("PPM_LIMITS_SYMETRICAL", "YES", "NO"), + "nographics": ("GRAPHICS", "NO", "YES"), + "battgraph": ("BATTGRAPH", "YES", "NO"), + "nobold": ("BOLD", "NO", "YES"), + "sqt5font": ("FONT", "SQT5", None), + "thrtrace": ("THR_TRACE", "YES", "NO"), + "pgbar": ("EEPROM_PROGRESS_BAR", "YES", "NO"), + "imperial": ("UNITS", "IMPERIAL", "METRIC"), + "nogps": ("GPS", "NO", "YES"), + "nogauges": ("GAUGES", "NO", "YES"), + "novario": ("VARIO", "NO", "YES"), + "nowshh": ("WS_HOW_HIGH", "NO", "YES"), + "faimode": ("FAI", "YES", None), + "faichoice": ("FAI", "CHOICE", None), + "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES") +} + +options_9x128.update(options_9x_ext) +options_9x128.update(tts_avr) + +options_gruvin9x = { + "heli": ("HELI", "YES", "NO"), + "templates": ("TEMPLATES", "YES", "NO"), + "nofp": ("FLIGHT_MODES", "NO", "YES"), + "nocurves": ("CURVES", "NO", "YES"), + "sdcard": ("SDCARD", "YES", "NO"), + "voice": ("VOICE", "YES", "NO"), + "PXX": ("PXX", "YES", "NO"), + "DSM2": ("DSM2", "SERIAL", "NO"), + "DSM2PPM": ("DSM2", "PPM", "NO"), + "potscroll": ("NAVIGATION", "POTS", "NO"), + "ppmca": ("PPM_CENTER_ADJUSTABLE", "YES", "NO"), + "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), + "gvars": ("GVARS", "YES", "NO"), + "symlimits": ("PPM_LIMITS_SYMETRICAL", "YES", "NO"), + "autosource": ("AUTOSOURCE", "YES", "NO"), + "autoswitch": ("AUTOSWITCH", "YES", "NO"), + "dblkeys": ("DBLKEYS", "YES", "NO"), + "nographics": ("GRAPHICS", "NO", "YES"), + "battgraph": ("BATTGRAPH", "YES", "NO"), + "nobold": ("BOLD", "NO", "YES"), + "sqt5font": ("FONT", "SQT5", None), + "pgbar": ("EEPROM_PROGRESS_BAR", "YES", "NO"), + "imperial": ("UNITS", "IMPERIAL", "METRIC"), + "faimode": ("FAI", "YES", None), + "faichoice": ("FAI", "CHOICE", None), + "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES") +} + +options_gruvin9x.update(tts_avr) + +options_mega2560 = { + "heli": ("HELI", "YES", "NO"), + "templates": ("TEMPLATES", "YES", "NO"), + "nofp": ("FLIGHT_MODES", "NO", "YES"), + "nocurves": ("CURVES", "NO", "YES"), + "PWR": ("PWRMANAGE", "YES", "NO"), + "sdcard": ("SDCARD", "YES", "NO"), + "voice": ("VOICE", "YES", "NO"), + "PXX": ("PXX", "YES", "NO"), + "DSM2": ("DSM2", "SERIAL", "NO"), + "DSM2PPM": ("DSM2", "PPM", "NO"), + "ST7565R": ("LCD", "ST7565R", None), + "ERC12864FSF": ("LCD", "ERC12864FSF", None), + "ST7920": ("LCD", "ST7920", None), + "potscroll": ("NAVIGATION", "POTS", "NO"), + "ppmca": ("PPM_CENTER_ADJUSTABLE", "YES", "NO"), + "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), + "gvars": ("GVARS", "YES", "NO"), + "symlimits": ("PPM_LIMITS_SYMETRICAL", "YES", "NO"), + "autosource": ("AUTOSOURCE", "YES", "NO"), + "autoswitch": ("AUTOSWITCH", "YES", "NO"), + "dblkeys": ("DBLKEYS", "YES", "NO"), + "nographics": ("GRAPHICS", "NO", "YES"), + "battgraph": ("BATTGRAPH", "YES", "NO"), + "nobold": ("BOLD", "NO", "YES"), + "sqt5font": ("FONT", "SQT5", None), + "pgbar": ("EEPROM_PROGRESS_BAR", "YES", "NO"), + "imperial": ("UNITS", "IMPERIAL", "METRIC"), + "faimode": ("FAI", "YES", None), + "faichoice": ("FAI", "CHOICE", None), + "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES") +} + +options_mega2560.update(tts_avr) + +options_sky9x = { + "heli": ("HELI", "YES", "NO"), + "templates": ("TEMPLATES", "YES", "NO"), + "nofp": ("FLIGHT_MODES", "NO", "YES"), + "nocurves": ("CURVES", "NO", "YES"), + "ppmca": ("PPM_CENTER_ADJUSTABLE", "YES", "NO"), + "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), + "gvars": ("GVARS", "YES", "NO"), + "symlimits": ("PPM_LIMITS_SYMETRICAL", "YES", "NO"), + "potscroll": ("NAVIGATION", "POTS", "NO"), + "autosource": ("AUTOSOURCE", "YES", "NO"), + "autoswitch": ("AUTOSWITCH", "YES", "NO"), + "dblkeys": ("DBLKEYS", "YES", "NO"), + "nographics": ("GRAPHICS", "NO", "YES"), + "battgraph": ("BATTGRAPH", "YES", "NO"), + "nobold": ("BOLD", "NO", "YES"), + "sqt5font": ("FONT", "SQT5", None), + "imperial": ("UNITS", "IMPERIAL", "METRIC"), + "bluetooth": ("BLUETOOTH", "YES", "NO"), + "faimode": ("FAI", "YES", None), + "faichoice": ("FAI", "CHOICE", None), + "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES") +} + +options_ar9x = { + "heli": ("HELI", "YES", "NO"), + "templates": ("TEMPLATES", "YES", "NO"), + "nofp": ("FLIGHT_MODES", "NO", "YES"), + "nocurves": ("CURVES", "NO", "YES"), + "ppmca": ("PPM_CENTER_ADJUSTABLE", "YES", "NO"), + "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), + "gvars": ("GVARS", "YES", "NO"), + "symlimits": ("PPM_LIMITS_SYMETRICAL", "YES", "NO"), + "potscroll": ("NAVIGATION", "POTS", "NO"), + "autosource": ("AUTOSOURCE", "YES", "NO"), + "autoswitch": ("AUTOSWITCH", "YES", "NO"), + "dblkeys": ("DBLKEYS", "YES", "NO"), + "nographics": ("GRAPHICS", "NO", "YES"), + "battgraph": ("BATTGRAPH", "YES", "NO"), + "nobold": ("BOLD", "NO", "YES"), + "sqt5font": ("FONT", "SQT5", None), + "imperial": ("UNITS", "IMPERIAL", "METRIC"), + "bluetooth": ("BLUETOOTH", "YES", "NO"), + "faimode": ("FAI", "YES", None), + "faichoice": ("FAI", "CHOICE", None), + "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), + # "rtc": ("RTCLOCK", "YES", "NO"), + # "volume": ("HARDWARE_VOLUME", "YES", "NO") # Renove HARDWARE_VOLUME=NO in the commandline below when activating! +} + +options_taranis = { + "noheli": ("HELI", "NO", "YES"), + "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), + "lua": ("LUA", "YES", "NO_MODEL_SCRIPTS"), + "haptic": ("HAPTIC", "YES", "NO"), + "nogvars": ("GVARS", "NO", "YES"), + "sqt5font": ("FONT", "SQT5", None), + "faimode": ("FAI", "YES", None), + "faichoice": ("FAI", "CHOICE", None), + "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), + "massstorage": ("USB", "MASSSTORAGE", None), + "cli": ("USB", "SERIAL", None), + "mixersmon": ("MIXERS_MONITOR", "YES", "NO"), + "internalppm": ("TARANIS_INTERNAL_PPM", "YES", "NO"), + "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), + "timer3": ("TIMERS", "3", "2"), + "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO") +} + +options_taranisplus = { + "noheli": ("HELI", "NO", "YES"), + "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), + "lua": ("LUA", "YES", "NO_MODEL_SCRIPTS"), + "SWR": ("SWR", "YES", "NO"), + "nogvars": ("GVARS", "NO", "YES"), + "sqt5font": ("FONT", "SQT5", None), + "faimode": ("FAI", "YES", None), + "faichoice": ("FAI", "CHOICE", None), + "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), + "massstorage": ("USB", "MASSSTORAGE", None), + "cli": ("USB", "SERIAL", None), + "mixersmon": ("MIXERS_MONITOR", "YES", "NO"), + "internalppm": ("TARANIS_INTERNAL_PPM", "YES", "NO"), + "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), + "timer3": ("TIMERS", "3", None), + "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO") +} + +options_taranisx9e = { + "noheli": ("HELI", "NO", "YES"), + "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), + "lua": ("LUA", "YES", "NO_MODEL_SCRIPTS"), + "SWR": ("SWR", "YES", "NO"), + "nogvars": ("GVARS", "NO", "YES"), + "sqt5font": ("FONT", "SQT5", None), + "faimode": ("FAI", "YES", None), + "faichoice": ("FAI", "CHOICE", None), + "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), + "massstorage": ("USB", "MASSSTORAGE", None), + "cli": ("USB", "SERIAL", None), + "mixersmon": ("MIXERS_MONITOR", "YES", "NO"), + "internalppm": ("TARANIS_INTERNAL_PPM", "YES", "NO"), + "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), + "timer3": ("TIMERS", "3", None), + "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), + "horussticks": ("STICKS", "HORUS", "STANDARD") +} + +options_horus = { + "noheli": ("HELI", "NO", "YES"), + "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), + "lua": ("LUA", "YES", "NO_MODEL_SCRIPTS"), + "nogvars": ("GVARS", "NO", "YES"), + "faimode": ("FAI", "YES", None), + "faichoice": ("FAI", "CHOICE", None), + "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), + "massstorage": ("USB", "MASSSTORAGE", None), + "cli": ("USB", "SERIAL", None), + "timer3": ("TIMERS", "3", "2"), + "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO") +}