summaryrefslogtreecommitdiff
path: root/build/scons_tools
diff options
context:
space:
mode:
Diffstat (limited to 'build/scons_tools')
-rw-r--r--build/scons_tools/tool_firmware.py13
-rw-r--r--build/scons_tools/tool_selectmcu.py132
2 files changed, 145 insertions, 0 deletions
diff --git a/build/scons_tools/tool_firmware.py b/build/scons_tools/tool_firmware.py
new file mode 100644
index 0000000..b1ead1f
--- /dev/null
+++ b/build/scons_tools/tool_firmware.py
@@ -0,0 +1,13 @@
+from SCons.Script import *
+
+def Firmware(env, target, sources, **kwargs):
+ objects = [env.Object(f) for f in Flatten([sources, env['LIB_SOURCES']])]
+ firmware = env.Program(target, objects, **kwargs)
+ #env.Depends(firmware, env['LINK_SCRIPT']) # TODO
+ return firmware
+
+def exists():
+ return True
+
+def generate(env):
+ env.AddMethod(Firmware) \ No newline at end of file
diff --git a/build/scons_tools/tool_selectmcu.py b/build/scons_tools/tool_selectmcu.py
new file mode 100644
index 0000000..1e2b0ee
--- /dev/null
+++ b/build/scons_tools/tool_selectmcu.py
@@ -0,0 +1,132 @@
+from SCons.Script import *
+
+laks_dir = Dir('..')
+ld_dir = Dir('../ld_scripts')
+main_sconscript = File('../SConscript')
+
+def select_arm(env, family):
+ env.SetDefault(
+ TOOLCHAIN = 'arm-none-eabi-',
+ )
+
+ if family == 'cortex-m4f':
+ family = 'cortex-m4'
+ has_mcu = True
+ else:
+ has_mcu = False
+
+ env.Replace(
+ CC = '${TOOLCHAIN}gcc',
+ CXX = '${TOOLCHAIN}g++',
+ AS = '${TOOLCHAIN}gcc',
+ LINK = '${TOOLCHAIN}gcc',
+ AR = '${TOOLCHAIN}ar',
+ RANLIB = '${TOOLCHAIN}ranlib',
+
+ CCFLAGS = Split('-O2 -Wall -ggdb -mcpu=${CPU_FAMILY} -mthumb -ffunction-sections'),
+ CXXFLAGS = Split('-std=c++20 -fno-exceptions -fno-rtti -Wno-pmf-conversions'),
+ ASFLAGS = Split('-c -x assembler-with-cpp -mcpu=${CPU_FAMILY} -mthumb'),
+ LINKFLAGS = Split('-Wall -mcpu=${CPU_FAMILY} -mthumb -nostartfiles -Wl,-T${LINK_SCRIPT} -Wl,--gc-sections'),
+
+ CPPPATH = [laks_dir],
+ LIBPATH = [ld_dir],
+
+ LIB_SOURCES = [],
+
+ CPU_FAMILY = family,
+ )
+
+ if has_mcu:
+ env.Append(CCFLAGS = Split('-mfloat-abi=hard -mfpu=fpv4-sp-d16'))
+ env.Append(LINKFLAGS = Split('-mfloat-abi=hard -mfpu=fpv4-sp-d16'))
+ env.Append(CPPDEFINES = ['HAS_FPU'])
+
+def select_stm32(env, variant):
+ family = variant[5:9]
+ pin_count = variant[9]
+ flash = variant[10]
+
+ if family.startswith('f0'):
+ select_arm(env, 'cortex-m0')
+ env.Append(CPPDEFINES = ['STM32F0'])
+
+ sram = family[2]
+
+ env['LINK_SCRIPT'] = {
+ ('4', '6'): 'stm32_f04_6.ld',
+ ('5', '8'): 'stm32_f05_8.ld',
+ }[sram, flash]
+
+ elif family == 'f103':
+ select_arm(env, 'cortex-m3')
+ env.Append(CPPDEFINES = ['STM32F1'])
+
+ env['LINK_SCRIPT'] = {
+ '8': 'stm32_f1_8.ld',
+ 'b': 'stm32_f1_b.ld',
+ }[flash]
+
+ elif family == 'f303':
+ select_arm(env, 'cortex-m4f')
+ env.Append(CPPDEFINES = ['STM32F3'])
+
+ env['LINK_SCRIPT'] = {
+ 'b': 'stm32_f303_b.ld',
+ 'c': 'stm32_f303_c.ld',
+ }[flash]
+
+ elif family == 'f373':
+ select_arm(env, 'cortex-m4f')
+ env.Append(CPPDEFINES = ['STM32F3'])
+
+ env['LINK_SCRIPT'] = {
+ '8': 'stm32_f373_8.ld',
+ 'b': 'stm32_f373_b.ld',
+ 'c': 'stm32_f373_c.ld',
+ }[flash]
+
+ elif family in ('f401'):
+ select_arm(env, 'cortex-m4f')
+ env.Append(CPPDEFINES = ['STM32F4'])
+
+ env['LINK_SCRIPT'] = {
+ 'e': 'stm32_f401_e.ld',
+ }[flash]
+
+ elif family in ('f405', 'f407'):
+ select_arm(env, 'cortex-m4f')
+ env.Append(CPPDEFINES = ['STM32F4'])
+
+ env['LINK_SCRIPT'] = {
+ 'e': 'stm32_f4_e.ld',
+ 'g': 'stm32_f4_g.ld',
+ }[flash]
+
+ elif family in ('l051', 'l052', 'l053'):
+ select_arm(env, 'cortex-m0plus')
+ env.Append(CPPDEFINES = ['STM32L0'])
+
+ env['LINK_SCRIPT'] = {
+ '8': 'stm32_l0_8.ld',
+ }[flash]
+
+ else:
+ print('Unknown stm32 family: %s' % family)
+ Exit(1)
+
+def SelectMCU(env, mcu, variant_dir = None):
+ mcu = mcu.lower()
+
+ if mcu.startswith('stm32'):
+ select_stm32(env, mcu)
+
+ else:
+ print('Unknown MCU: %s' % mcu)
+ Exit(1)
+
+ SConscript(main_sconscript, variant_dir = variant_dir, exports = 'env')
+def exists():
+ return True
+
+def generate(env):
+ env.AddMethod(SelectMCU) \ No newline at end of file