public static void AddFPModeProperty(CoreSpecificFlags flagsToDefine, MCUFamily family) { if (family.ConfigurableProperties == null) { family.ConfigurableProperties = new PropertyList { PropertyGroups = new List <PropertyGroup> { new PropertyGroup() } } } ; family.ConfigurableProperties.PropertyGroups[0].Properties.Add( new PropertyEntry.Enumerated { Name = "Floating point support", UniqueID = "com.sysprogs.bspoptions.arm.floatmode", SuggestionList = new PropertyEntry.Enumerated.Suggestion[] { new PropertyEntry.Enumerated.Suggestion { InternalValue = "-mfloat-abi=soft", UserFriendlyName = "Software" }, new PropertyEntry.Enumerated.Suggestion { InternalValue = "-mfloat-abi=hard", UserFriendlyName = "Hardware" }, new PropertyEntry.Enumerated.Suggestion { InternalValue = "", UserFriendlyName = "Unspecified" }, }, DefaultEntryIndex = ((flagsToDefine & CoreSpecificFlags.DefaultHardFloat) == CoreSpecificFlags.DefaultHardFloat) ? 1 : 0, }); family.CompilationFlags.COMMONFLAGS += " $$com.sysprogs.bspoptions.arm.floatmode$$"; }
public MCUFamily GenerateFamilyObject(CoreSpecificFlags flagsToGenerate) { var family = new MCUFamily { ID = Definition.Name }; if (!Definition.HasMixedCores) { if (MCUs.Count == 0) { throw new Exception("No MCUs found for " + Definition.Name); } var core = MCUs[0].Core; foreach (var mcu in MCUs) { if (mcu.Core != core) { throw new Exception("Different MCUs within " + Definition.Name + " have different core types"); } } AddCoreSpecificFlags(flagsToGenerate, family, core); } family.CompilationFlags = family.CompilationFlags.Merge(Definition.CompilationFlags); List <string> projectFiles = new List <string>(); CopyFamilyFiles(ref family.CompilationFlags, projectFiles); family.AdditionalSourceFiles = projectFiles.Where(f => !IsHeaderFile(f)).ToArray(); family.AdditionalHeaderFiles = projectFiles.Where(f => IsHeaderFile(f)).ToArray(); family.AdditionalSystemVars = LoadedBSP.Combine(family.AdditionalSystemVars, Definition.AdditionalSystemVars); if (Definition.ConfigurableProperties != null) { if (family.ConfigurableProperties == null) { family.ConfigurableProperties = new PropertyList(); } family.ConfigurableProperties.Import(Definition.ConfigurableProperties); } return(family); }
public static void AddCoreSpecificFlags(CoreSpecificFlags flagsToDefine, MCUFamily family, string core) { CortexCore translatedCore = core switch { "cm0plus" => CortexCore.M0Plus, "cm0" => CortexCore.M0, "cm3" => CortexCore.M3, "cm33" => CortexCore.M33_FPU, "cm33_nodsp" => CortexCore.M33, "cm4" => CortexCore.M4, "cm7" => CortexCore.M7, _ => CortexCore.Invalid }; AddCoreSpecificFlags(flagsToDefine, family, translatedCore); } }
internal static void AddCoreSpecificFlags(CoreSpecificFlags flagsToDefine, MCUFamily family, CortexCore core) { string coreName = null; switch (core) { case CortexCore.M0: family.CompilationFlags.COMMONFLAGS = "-mcpu=cortex-m0 -mthumb"; family.CompilationFlags.PreprocessorMacros = new string[] { "ARM_MATH_CM0" }; coreName = "M0"; break; case CortexCore.M0Plus: family.CompilationFlags.COMMONFLAGS = "-mcpu=cortex-m0plus -mthumb"; family.CompilationFlags.PreprocessorMacros = new string[] { "ARM_MATH_CM0PLUS" }; coreName = "M0"; break; case CortexCore.M3: family.CompilationFlags.COMMONFLAGS = "-mcpu=cortex-m3 -mthumb"; family.CompilationFlags.PreprocessorMacros = new string[] { "ARM_MATH_CM3" }; coreName = "M3"; break; case CortexCore.M4: family.CompilationFlags.COMMONFLAGS = "-mcpu=cortex-m4 -mthumb"; family.CompilationFlags.PreprocessorMacros = new string[] { "ARM_MATH_CM4" }; family.CompilationFlags.ASFLAGS = "-mfpu=fpv4-sp-d16"; coreName = "M4"; break; case CortexCore.M7: family.CompilationFlags.COMMONFLAGS = "-mcpu=cortex-m7 -mthumb"; family.CompilationFlags.PreprocessorMacros = new string[] { "ARM_MATH_CM7" }; coreName = "M7"; break; default: throw new Exception("Unsupported core type"); } if ((flagsToDefine & CoreSpecificFlags.PrimaryMemory) == CoreSpecificFlags.PrimaryMemory) { if (core == CortexCore.M0) { family.AdditionalSystemVars = new SysVarEntry[] { new SysVarEntry { Key = PrimaryMemoryOptionName, Value = "flash" } } } ; else { family.ConfigurableProperties = new PropertyList { PropertyGroups = new List <PropertyGroup> { new PropertyGroup { Properties = new List <PropertyEntry> { new PropertyEntry.Enumerated { Name = "Execute from", UniqueID = PrimaryMemoryOptionName, SuggestionList = new PropertyEntry.Enumerated.Suggestion[] { new PropertyEntry.Enumerated.Suggestion { InternalValue = "flash", UserFriendlyName = "FLASH" }, new PropertyEntry.Enumerated.Suggestion { InternalValue = "sram", UserFriendlyName = "SRAM" }, } } } } } }; } } if ((flagsToDefine & CoreSpecificFlags.FPU) == CoreSpecificFlags.FPU) { if (core == CortexCore.M4 || core == CortexCore.M7) { if (family.ConfigurableProperties == null) { family.ConfigurableProperties = new PropertyList { PropertyGroups = new List <PropertyGroup> { new PropertyGroup() } } } ; family.ConfigurableProperties.PropertyGroups[0].Properties.Add( new PropertyEntry.Enumerated { Name = "Floating point support", UniqueID = "com.sysprogs.bspoptions.arm.floatmode", SuggestionList = new PropertyEntry.Enumerated.Suggestion[] { new PropertyEntry.Enumerated.Suggestion { InternalValue = "-mfloat-abi=soft", UserFriendlyName = "Software" }, new PropertyEntry.Enumerated.Suggestion { InternalValue = "-mfloat-abi=hard", UserFriendlyName = "Hardware" }, new PropertyEntry.Enumerated.Suggestion { InternalValue = "", UserFriendlyName = "Unspecified" }, } }); family.CompilationFlags.COMMONFLAGS += " $$com.sysprogs.bspoptions.arm.floatmode$$"; } } if (coreName != null) { family.AdditionalSystemVars = LoadedBSP.Combine(family.AdditionalSystemVars, new SysVarEntry[] { new SysVarEntry { Key = "com.sysprogs.bspoptions.arm.core", Value = coreName } }); } }
public override MCUFamily GenerateFamilyObject(CoreSpecificFlags flagsToGenerate, bool allowExcludingStartupFiles = false) { //STM32MP1 devices use a predefined linker script, so we cannot override the primary memory. return(base.GenerateFamilyObject(flagsToGenerate & ~CoreSpecificFlags.PrimaryMemory, allowExcludingStartupFiles)); }
public MCUFamily GenerateFamilyObject(CoreSpecificFlags flagsToGenerate, bool allowExcludingStartupFiles = false) { var family = new MCUFamily { ID = Definition.Name }; if (!Definition.HasMixedCores) { if (MCUs.Count == 0) { throw new Exception("No MCUs found for " + Definition.Name); } var core = MCUs[0].Core; foreach (var mcu in MCUs) { if (mcu.Core != core) { throw new Exception("Different MCUs within " + Definition.Name + " have different core types"); } } AddCoreSpecificFlags(flagsToGenerate, family, core); } family.CompilationFlags = family.CompilationFlags.Merge(Definition.CompilationFlags); List <string> projectFiles = new List <string>(); CopyFamilyFiles(ref family.CompilationFlags, projectFiles); family.AdditionalSourceFiles = projectFiles.Where(f => !IsHeaderFile(f)).ToArray(); family.AdditionalHeaderFiles = projectFiles.Where(f => IsHeaderFile(f)).ToArray(); family.AdditionalSystemVars = LoadedBSP.Combine(family.AdditionalSystemVars, Definition.AdditionalSystemVars); if (Definition.ConfigurableProperties != null || allowExcludingStartupFiles) { if (family.ConfigurableProperties == null) { family.ConfigurableProperties = new PropertyList(); } if (Definition.ConfigurableProperties != null) { family.ConfigurableProperties.Import(Definition.ConfigurableProperties); } if (allowExcludingStartupFiles && MCUs != null) { family.ConfigurableProperties.Import(new PropertyList { PropertyGroups = new List <PropertyGroup>() { new PropertyGroup { Properties = new List <PropertyEntry> { new PropertyEntry.Boolean { DefaultValue = false, ValueForTrue = "1", Name = "Exclude the startup file from project", UniqueID = IgnoreStartupFileProperty, } } } } }); foreach (var mcu in MCUs) { if (mcu.StartupFile != null) { BSP.MatchedFileConditions.Add(new FileCondition { FilePath = mcu.StartupFile, ConditionToInclude = new Condition.Not { Argument = new Condition.Equals { Expression = $"$${IgnoreStartupFileProperty}$$", ExpectedValue = "1" } } }); } } } } return(family); }
internal static void AddCoreSpecificFlags(CoreSpecificFlags flagsToDefine, MCUFamily family, CortexCore core) { //WARNING: If the proper string coreName = null, freertosPort = null; switch (core) { case CortexCore.M0: family.CompilationFlags.COMMONFLAGS = "-mcpu=cortex-m0 -mthumb"; family.CompilationFlags.PreprocessorMacros = new string[] { "ARM_MATH_CM0" }; freertosPort = "ARM_CM0"; coreName = "M0"; break; case CortexCore.M0Plus: family.CompilationFlags.COMMONFLAGS = "-mcpu=cortex-m0plus -mthumb"; family.CompilationFlags.PreprocessorMacros = new string[] { "ARM_MATH_CM0PLUS" }; freertosPort = "ARM_CM0"; coreName = "M0"; break; case CortexCore.M3: family.CompilationFlags.COMMONFLAGS = "-mcpu=cortex-m3 -mthumb"; family.CompilationFlags.PreprocessorMacros = new string[] { "ARM_MATH_CM3" }; coreName = "M3"; freertosPort = "ARM_CM3"; break; case CortexCore.M33: family.CompilationFlags.COMMONFLAGS = "-mcpu=cortex-m33 -mthumb"; family.CompilationFlags.PreprocessorMacros = new string[] { "ARM_MATH_CM33" }; coreName = "M33"; freertosPort = "ARM_CM33_NTZ/non_secure"; break; case CortexCore.M33_FPU: family.CompilationFlags.COMMONFLAGS = "-mcpu=cortex-m33 -mthumb -mfpu=fpv5-sp-d16"; family.CompilationFlags.PreprocessorMacros = new string[] { "ARM_MATH_CM33" }; coreName = "M33"; freertosPort = "ARM_CM33_NTZ/non_secure"; break; case CortexCore.M4: family.CompilationFlags.COMMONFLAGS = "-mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16"; family.CompilationFlags.PreprocessorMacros = new string[] { "ARM_MATH_CM4" }; freertosPort = "ARM_CM4F"; coreName = "M4"; break; case CortexCore.M4_NOFPU: family.CompilationFlags.COMMONFLAGS = "-mcpu=cortex-m4 -mthumb"; family.CompilationFlags.PreprocessorMacros = new string[] { "ARM_MATH_CM4" }; coreName = "M4"; freertosPort = "ARM_CM3"; break; case CortexCore.M7: family.CompilationFlags.COMMONFLAGS = "-mcpu=cortex-m7 -mthumb -mfpu=fpv4-sp-d16"; family.CompilationFlags.PreprocessorMacros = new string[] { "ARM_MATH_CM7" }; coreName = "M7"; freertosPort = "ARM_CM7/r0p1"; break; case CortexCore.R5F: family.CompilationFlags.COMMONFLAGS = "-mcpu=cortex-r5 -mfpu=vfpv3-d16 -mthumb"; family.CompilationFlags.PreprocessorMacros = new string[] { "ARM_MATH_CR5" }; break; default: return; } if ((flagsToDefine & CoreSpecificFlags.FPU) == CoreSpecificFlags.FPU) { if (core == CortexCore.M4 || core == CortexCore.M7 || core == CortexCore.R5F || core == CortexCore.M33_FPU) { AddFPModeProperty(flagsToDefine, family); } } List <SysVarEntry> vars = new List <SysVarEntry>(); if (coreName != null) { vars.Add(new SysVarEntry { Key = "com.sysprogs.bspoptions.arm.core", Value = coreName }); } if (freertosPort != null) { vars.Add(new SysVarEntry { Key = "com.sysprogs.freertos.default_port", Value = freertosPort }); } if (vars.Count > 0) { family.AdditionalSystemVars = LoadedBSP.Combine(family.AdditionalSystemVars, vars.ToArray()); } }