diff --git a/builder/frameworks/arduino.py b/builder/frameworks/arduino.py index b08b673..035f272 100644 --- a/builder/frameworks/arduino.py +++ b/builder/frameworks/arduino.py @@ -24,114 +24,302 @@ http://www.stm32duino.com from os.path import isdir, join -from SCons.Script import COMMAND_LINE_TARGETS, DefaultEnvironment +from SCons.Script import DefaultEnvironment + +import pdb env = DefaultEnvironment() -platform = env.PioPlatform() -board = env.BoardConfig() -if board.id == "bluepill_f103c8": - board = env.BoardConfig("genericSTM32F103C8") - env['LDSCRIPT_PATH'] = board.get("build.ldscript") - env.ProcessFlags(board.get("build.extra_flags")) +print env.get("CPPDEFINES") + +#try to get variant folder from board name +def getVariantFromBoard(boardi): + var_folder=""; + + boardMappings = { + "bluepill_f103c8":"BLUEPILL", + "genericSTM32F103CB":"BLUEPILL", + "genericSTM32F103C8":"BLUEPILL", + "maple_mini_b20":"MAPLE_MINI" + } + + #check board from mappings + if boardi in boardMappings: + var_folder=boardMappings[boardi].upper() + + #convert discovery boards + if boardi[:5].upper()=="DISCO": + a=boardi.split("_") + var_folder="DISCOVERY_"+a[1].upper() + + #convert nucleo boards + if boardi[:6].upper()=="NUCLEO": + a=boardi.split("_") + var_folder="NUCLEO"+a[1].upper() -FRAMEWORK_DIR = join(platform.get_package_dir( - "framework-arduinoststm32"), "STM32F1") -FRAMEWORK_VERSION = platform.get_package_version("framework-arduinoststm32") -assert isdir(FRAMEWORK_DIR) + if var_folder=="": + print "ERROR: could not get variant folder from board: "+boardi -env.Append( - CCFLAGS=[ - "--param", "max-inline-insns-single=500", - "-march=armv7-m" - ], + return var_folder; - CPPDEFINES=[ - ("ARDUINO", 10610), - "BOARD_%s" % board.get("build.variant"), - ("ERROR_LED_PORT", "GPIOB"), - ("ERROR_LED_PIN", 1), - ("DEBUG_LEVEL", "DEBUG_NONE"), - "__STM32F1__", - "ARDUINO_ARCH_STM32F1" - ], +#HAL MX based Arduino +def stm32generic(): + print "stm32generic()" + env = DefaultEnvironment() + platform = env.PioPlatform() + board = env.BoardConfig() + FRAMEWORK_DIR = join(platform.get_package_dir( + "framework-arduinoSTM32GENERIC"), "STM32") + FRAMEWORK_VERSION = platform.get_package_version("framework-arduinoSTM32GENERIC") + assert isdir(FRAMEWORK_DIR) - CPPPATH=[ - join(FRAMEWORK_DIR, "cores", board.get("build.core")), - join(FRAMEWORK_DIR, "system", "libmaple"), - join(FRAMEWORK_DIR, "system", "libmaple", "include"), - join(FRAMEWORK_DIR, "system", "libmaple", "usb", "stm32f1"), - join(FRAMEWORK_DIR, "system", "libmaple", "usb", "usb_lib") - ], + #print FRAMEWORK_DIR; - LIBPATH=[ - join(FRAMEWORK_DIR, "variants", - board.get("build.variant"), "ld") - ], + mcuseries=board.get('build.mcu')[:7].upper(); + mcudefine=board.get('build.mcu')[:11].upper(); + boardi=env.get("BOARD"); - LIBS=["c"] -) + #map ststm32 board name to stm32generic variant folder for compiling etc. -for item in ("-nostartfiles", "-nostdlib"): - if item in env['LINKFLAGS']: - env['LINKFLAGS'].remove(item) + var_folder=getVariantFromBoard(boardi) + print boardi+" --> " + var_folder; + + print "var_folder="+var_folder; + #enable FPU for F4 in building and linking + if mcuseries=="STM32F4": + print "is F4" + env.Append( + CCFLAGS=[ + "-mfpu=fpv4-sp-d16", + "-mfloat-abi=hard" + ], + LINKFLAGS=[ + "-Wl,--start-group", + "-mfloat-abi=hard", + "-mfpu=fpv4-sp-d16", + "-Wl,--entry=Reset_Handler", + "--specs=nano.specs" + ], + ) + + #empty LIBPATH, use our own ldscript + env["LIBPATH"]= []; -if env.subst("$UPLOAD_PROTOCOL") == "dfu": - if board.id in ("maple", "maple_mini_origin"): - env.Append(CPPDEFINES=[("VECT_TAB_ADDR", 0x8005000), "SERIAL_USB"]) - else: - env.Append(CPPDEFINES=[ - ("VECT_TAB_ADDR", 0x8002000), "SERIAL_USB", "GENERIC_BOOTLOADER"]) - - if "stm32f103r" in board.get("build.mcu", ""): - env.Replace(LDSCRIPT_PATH="bootloader.ld") - elif board.get("upload.boot_version", 0) == 2: - env.Replace(LDSCRIPT_PATH="bootloader_20.ld") -else: - env.Append(CPPDEFINES=[("VECT_TAB_ADDR", 0x8000000)]) - - -if "__debug" in COMMAND_LINE_TARGETS: - env.Append(CPPDEFINES=[ - "SERIAL_USB", "GENERIC_BOOTLOADER", - ("CONFIG_MAPLE_MINI_NO_DISABLE_DEBUG", "1") - ]) - -# -# Lookup for specific core's libraries -# - -BOARD_CORELIBDIRNAME = board.get("build.core", "") -env.Append( - LIBSOURCE_DIRS=[ - join(FRAMEWORK_DIR, "libraries", "__cores__", BOARD_CORELIBDIRNAME), - join(FRAMEWORK_DIR, "libraries") - ] -) - -# -# Target: Build Core Library -# - -libs = [] - -if "build.variant" in board: env.Append( + CCFLAGS=[ + "--param", "max-inline-insns-single=500", + "-fno-exceptions", + "-fno-rtti", + "-std=gnu++11", + "-fno-threadsafe-statics", + "-ffunction-sections", + "-fdata-sections", + "-mthumb", + "--specs=nano.specs" + ], + CPPDEFINES=[ + ("ARDUINO", 10810), + mcuseries, + mcudefine, + "ARDUINO_ARCH_STM32", + ("HSE_VALUE", 8000000) + ], + CPPPATH=[ + join(FRAMEWORK_DIR, "cores", "arduino","stm32"), + join(FRAMEWORK_DIR, "cores", "arduino"), + join(FRAMEWORK_DIR, "cores", "arduino","usb"), + join(FRAMEWORK_DIR, "system", "CMSIS"), + join(FRAMEWORK_DIR, "system", mcuseries, "CMSIS_Inc"), + join(FRAMEWORK_DIR, "system", mcuseries, "HAL_Inc"), + + join(FRAMEWORK_DIR, "variants", var_folder), + + join(FRAMEWORK_DIR, "system", mcuseries, "HAL_Src"), + ], + + LIBPATH=[ join(FRAMEWORK_DIR, "variants", - board.get("build.variant")) + var_folder) ] ) + + env['LDSCRIPT_PATH'] = join(FRAMEWORK_DIR, "variants", var_folder)+"\ldscript.ld"; + env.ProcessFlags(board.get("build.extra_flags")) + + for item in ("-nostartfiles","-nostdlib"): + if item in env['LINKFLAGS']: + env['LINKFLAGS'].remove(item) + + if env.subst("$UPLOAD_PROTOCOL") == "dfu": + if board.id in ("maple", "maple_mini_origin"): + env.Append(CPPDEFINES=[("VECT_TAB_ADDR", 0x8005000), "SERIAL_USB"]) + else: + env.Append(CPPDEFINES=[ + ("VECT_TAB_ADDR", 0x8002000), "SERIAL_USB", "GENERIC_BOOTLOADER"]) + + if "stm32f103r" in board.get("build.mcu", ""): + env.Replace(LDSCRIPT_PATH="bootloader.ld") + elif board.get("upload.boot_version", 0) == 2: + env.Replace(LDSCRIPT_PATH="bootloader_20.ld") + else: + env.Append(CPPDEFINES=[("VECT_TAB_ADDR", 0x8000000)]) + + # + # Lookup for specific core's libraries + # + env.Append( + LIBSOURCE_DIRS=[ + join(FRAMEWORK_DIR, "libraries") + ] + ) + + # + # Target: Build Core Library + # + + libs = [] + + if "build.variant" in board: + env.Append( + CPPPATH=[ + join(FRAMEWORK_DIR, "variants", + board.get("build.variant")) + ] + ) + + + libs.append(env.BuildLibrary( + join("$BUILD_DIR", "FrameworkArduinoVariant"), + join(FRAMEWORK_DIR, "variants", board.get("build.variant")) + )) + libs.append(env.BuildLibrary( - join("$BUILD_DIR", "FrameworkArduinoVariant"), - join(FRAMEWORK_DIR, "variants", board.get("build.variant")) + join("$BUILD_DIR", "FrameworkArduino"), + join(FRAMEWORK_DIR, "cores", board.get("build.core")) )) -libs.append(env.BuildLibrary( - join("$BUILD_DIR", "FrameworkArduino"), - join(FRAMEWORK_DIR, "cores", board.get("build.core")) -)) + env.Prepend(LIBS=libs) + + +def stm32duino(): + env = DefaultEnvironment() + platform = env.PioPlatform() + board = env.BoardConfig() + print "stm32duino()"; + if board.id == "bluepill_f103c8": + board = env.BoardConfig("genericSTM32F103C8") + env['LDSCRIPT_PATH'] = board.get("build.ldscript") + env.ProcessFlags(board.get("build.extra_flags")) + + + FRAMEWORK_DIR = join(platform.get_package_dir( + "framework-arduinoststm32"), "STM32F1") + FRAMEWORK_VERSION = platform.get_package_version("framework-arduinoststm32") + assert isdir(FRAMEWORK_DIR) + + env.Append( + CCFLAGS=[ + "--param", "max-inline-insns-single=500", + "-march=armv7-m" + ], + + CPPDEFINES=[ + ("ARDUINO", 10610), + "BOARD_%s" % board.get("build.variant"), + ("ERROR_LED_PORT", "GPIOB"), + ("ERROR_LED_PIN", 1), + ("DEBUG_LEVEL", "DEBUG_NONE"), + "__STM32F1__", + "ARDUINO_ARCH_STM32F1" + ], + + CPPPATH=[ + join(FRAMEWORK_DIR, "cores", board.get("build.core")), + join(FRAMEWORK_DIR, "system", "libmaple"), + join(FRAMEWORK_DIR, "system", "libmaple", "include"), + join(FRAMEWORK_DIR, "system", "libmaple", "usb", "stm32f1"), + join(FRAMEWORK_DIR, "system", "libmaple", "usb", "usb_lib") + ], + + LIBPATH=[ + join(FRAMEWORK_DIR, "variants", + board.get("build.variant"), "ld") + ], + + LIBS=["c"] + ) + + for item in ("-nostartfiles", "-nostdlib"): + if item in env['LINKFLAGS']: + env['LINKFLAGS'].remove(item) + + + if env.subst("$UPLOAD_PROTOCOL") == "dfu": + if board.id in ("maple", "maple_mini_origin"): + env.Append(CPPDEFINES=[("VECT_TAB_ADDR", 0x8005000), "SERIAL_USB"]) + else: + env.Append(CPPDEFINES=[ + ("VECT_TAB_ADDR", 0x8002000), "SERIAL_USB", "GENERIC_BOOTLOADER"]) + + if "stm32f103r" in board.get("build.mcu", ""): + env.Replace(LDSCRIPT_PATH="bootloader.ld") + elif board.get("upload.boot_version", 0) == 2: + env.Replace(LDSCRIPT_PATH="bootloader_20.ld") + else: + env.Append(CPPDEFINES=[("VECT_TAB_ADDR", 0x8000000)]) + + + if "__debug" in COMMAND_LINE_TARGETS: + env.Append(CPPDEFINES=[ + "SERIAL_USB", "GENERIC_BOOTLOADER", + ("CONFIG_MAPLE_MINI_NO_DISABLE_DEBUG", "1") + ]) + + # + # Lookup for specific core's libraries + # + + BOARD_CORELIBDIRNAME = board.get("build.core", "") + env.Append( + LIBSOURCE_DIRS=[ + join(FRAMEWORK_DIR, "libraries", "__cores__", BOARD_CORELIBDIRNAME), + join(FRAMEWORK_DIR, "libraries") + ] + ) + + # + # Target: Build Core Library + # + + libs = [] + + if "build.variant" in board: + env.Append( + CPPPATH=[ + join(FRAMEWORK_DIR, "variants", + board.get("build.variant")) + ] + ) + libs.append(env.BuildLibrary( + join("$BUILD_DIR", "FrameworkArduinoVariant"), + join(FRAMEWORK_DIR, "variants", board.get("build.variant")) + )) + + libs.append(env.BuildLibrary( + join("$BUILD_DIR", "FrameworkArduino"), + join(FRAMEWORK_DIR, "cores", board.get("build.core")) + )) + + env.Prepend(LIBS=libs) + +if "USE_STM32GENERIC" in env.get("CPPDEFINES"): + print "USE STM32GENERIC" + stm32generic() +else: + stm32duino() + + -env.Prepend(LIBS=libs)