public GeneratedProject(string projectDir, LoadedBSP.ConfiguredMCU mcu, string[] selectedFrameworks) { _ProjectDir = projectDir; MCU = mcu; if (MCU.BSP.BSP.Frameworks != null) foreach (var fw in MCU.BSP.BSP.Frameworks) { if (!selectedFrameworks.Contains(fw.ID)) { if (fw.ClassID != null && selectedFrameworks.Contains(fw.ClassID)) { try { if (!fw.IsCompatibleWithMCU(MCU.ExpandedMCU.ID)) continue; } catch { continue; } } else continue; } _Frameworks.Add(fw); } }
static void Main(string[] args) { if (args.Length < 2) { throw new Exception("Usage: StandaloneBSPValidator <job file> <output dir>"); } var job = XmlTools.LoadObject <TestJob>(args[0]); job.BSPPath = job.BSPPath.Replace("$$JOBDIR$$", Path.GetDirectoryName(args[0])); if (job.ToolchainPath.StartsWith("[")) { job.ToolchainPath = (string)Registry.CurrentUser.OpenSubKey(@"Software\Sysprogs\GNUToolchains").GetValue(job.ToolchainPath.Trim('[', ']')); if (job.ToolchainPath == null) { throw new Exception("Cannot locate toolchain path from registry"); } } var toolchain = LoadedToolchain.Load(new ToolchainSource.Other(Environment.ExpandEnvironmentVariables(job.ToolchainPath))); var bsp = LoadedBSP.Load(new BSPEngine.BSPSummary(Path.GetFullPath(Environment.ExpandEnvironmentVariables(job.BSPPath))), toolchain); TestBSP(job, bsp, args[1]); return; }
public GeneratedProject(LoadedBSP.ConfiguredMCU mcu, VendorSample vs, string projectDir, Dictionary<string, string> bspDict, string[] frameworks) : this(projectDir, mcu, frameworks) { _ProjectDir = projectDir; _SourceFiles.AddRange(vs.SourceFiles.Select(s=>VariableHelper.ExpandVariables(s, bspDict))); }
private static TestResult TestVendorSample(LoadedBSP.LoadedMCU mcu, BSPEngine.VendorSample vs, string mcuDir, VendorSampleDirectory sampleDir) { var configuredMCU = new LoadedBSP.ConfiguredMCU(mcu, GetDefaultPropertyValues(mcu.ExpandedMCU.ConfigurableProperties)); configuredMCU.Configuration["com.sysprogs.toolchainoptions.arm.libnosys"] = "--specs=nosys.specs"; if (configuredMCU.ExpandedMCU.FLASHSize == 0) { configuredMCU.Configuration["com.sysprogs.bspoptions.primary_memory"] = "sram"; } var entries = vs.Configuration.MCUConfiguration?.Entries; if (entries != null) { foreach (var e in entries) { configuredMCU.Configuration[e.Key] = e.Value; } } var bspDict = configuredMCU.BuildSystemDictionary(SystemDirs); bspDict["PROJECTNAME"] = "test"; bspDict["SYS:VSAMPLE_DIR"] = sampleDir.Path; var prj = new GeneratedProject(configuredMCU, vs, mcuDir, bspDict, vs.Configuration.Frameworks ?? new string[0]); var projectCfg = PropertyDictionary2.ReadPropertyDictionary(vs.Configuration.MCUConfiguration); var frameworkCfg = PropertyDictionary2.ReadPropertyDictionary(vs.Configuration.Configuration); foreach (var k in projectCfg.Keys) { bspDict[k] = projectCfg[k]; } var frameworkIDs = vs.Configuration.Frameworks?.ToDictionary(fw => fw, fw => true); prj.AddBSPFilesToProject(bspDict, frameworkCfg, frameworkIDs); var flags = prj.GetToolFlags(bspDict, frameworkCfg, frameworkIDs); //ToolFlags flags = new ToolFlags { CXXFLAGS = " ", COMMONFLAGS = "-mcpu=cortex-m3 -mthumb", LDFLAGS = "-Wl,-gc-sections -Wl,-Map," + "test.map", CFLAGS = "-ffunction-sections -Os -MD" }; flags.CFLAGS += " -MD"; flags.CXXFLAGS += " -MD"; flags.IncludeDirectories = LoadedBSP.Combine(flags.IncludeDirectories, vs.IncludeDirectories).Distinct().ToArray(); flags.PreprocessorMacros = LoadedBSP.Combine(flags.PreprocessorMacros, vs.PreprocessorMacros); flags = LoadedBSP.ConfiguredMCU.ExpandToolFlags(flags, bspDict, null); Dictionary <string, bool> sourceExtensions = new Dictionary <string, bool>(StringComparer.InvariantCultureIgnoreCase); sourceExtensions.Add("c", true); sourceExtensions.Add("cpp", true); sourceExtensions.Add("s", true); return(BuildAndRunValidationJob(mcu, mcuDir, false, null, prj, flags, sourceExtensions, null, null, vs)); }
static void Main(string[] args) { if (args[0] == "vs") { if (args.Length < 3) { throw new Exception("Usage: StandaloneBSPValidator vs <VendorSamples dir> <output dir>"); } if (Directory.GetFiles(args[1], "VendorSamples.xml").Count() == 0) { foreach (var dir in Directory.GetDirectories(args[1])) { foreach (var es in Directory.GetFiles(dir, "VendorSamples.xml")) { var expandedSamples = XmlTools.LoadObject <VendorSampleDirectory>(es); expandedSamples.Path = Path.GetFullPath(Path.Combine(dir, "VendorSamples")); var testdir = Path.GetDirectoryName(Path.Combine(dir, "VendorSamples")).Split('\\').Reverse().ToArray()[0]; var ts = TestVendorSamples(expandedSamples, dir, Path.Combine(args[2], testdir)); } } } else { var bspDir = args[1]; var expandedSamples = XmlTools.LoadObject <VendorSampleDirectory>(Path.Combine(bspDir, "VendorSamples.xml")); expandedSamples.Path = Path.GetFullPath(Path.Combine(bspDir, "VendorSamples")); var ts = TestVendorSamples(expandedSamples, bspDir, args[2]); } } else { if (args.Length < 2) { throw new Exception("Usage: StandaloneBSPValidator <job file> <output dir>"); } var job = XmlTools.LoadObject <TestJob>(args[0]); job.BSPPath = job.BSPPath.Replace("$$JOBDIR$$", Path.GetDirectoryName(args[0])); if (job.ToolchainPath.StartsWith("[")) { job.ToolchainPath = (string)Registry.CurrentUser.OpenSubKey(@"Software\Sysprogs\GNUToolchains").GetValue(job.ToolchainPath.Trim('[', ']')); if (job.ToolchainPath == null) { throw new Exception("Cannot locate toolchain path from registry"); } } var toolchain = LoadedToolchain.Load(new ToolchainSource.Other(Environment.ExpandEnvironmentVariables(job.ToolchainPath))); var bsp = LoadedBSP.Load(new BSPEngine.BSPSummary(Path.GetFullPath(Environment.ExpandEnvironmentVariables(job.BSPPath))), toolchain); TestBSP(job, bsp, args[1]); } return; }
public MCUFamily GenerateFamilyObject(bool defineConfigurationVariables) { 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(defineConfigurationVariables, 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); }
internal ToolFlags GetToolFlags(Dictionary <string, string> systemDict, Dictionary <string, string> frameworkDict, IDictionary frameworkIDs) { var flags = new ToolFlags { CXXFLAGS = "-fno-exceptions -ffunction-sections -Os", LDFLAGS = "-Wl,-gc-sections -Wl,-Map," + MapFileName, CFLAGS = "-ffunction-sections -Os" }; if (DataSections) { flags.CXXFLAGS += " -fdata-sections"; flags.CFLAGS += " -fdata-sections"; } var mcuFlags = MCU.ExpandToolFlags(systemDict, null); flags = flags.Merge(mcuFlags); Dictionary <string, string> primaryDict = new Dictionary <string, string>(systemDict); foreach (var fwObj in _Frameworks) { if (fwObj.AdditionalSystemVars != null) { foreach (var sv in fwObj.AdditionalSystemVars) { primaryDict[sv.Key] = sv.Value; } } flags.IncludeDirectories = LoadedBSP.Combine(flags.IncludeDirectories, VariableHelper.ExpandVariables(fwObj.AdditionalIncludeDirs, primaryDict, frameworkDict)); flags.PreprocessorMacros = LoadedBSP.Combine(flags.PreprocessorMacros, VariableHelper.ExpandVariables(fwObj.AdditionalPreprocessorMacros, primaryDict, frameworkDict)?.Where(m => !string.IsNullOrEmpty(m))?.ToArray()); } if (MCU.BSP.BSP.ConditionalFlags != null) { foreach (var cf in MCU.BSP.BSP.ConditionalFlags) { if (cf.FlagCondition.IsTrue(primaryDict, frameworkDict, frameworkIDs)) { flags = flags.Merge(LoadedBSP.ConfiguredMCU.ExpandToolFlags(cf.Flags, primaryDict, frameworkDict)); } } } if (!string.IsNullOrEmpty(_LinkerScript)) { flags.LinkerScript = VariableHelper.ExpandVariables(_LinkerScript, primaryDict, frameworkDict); } return(flags); }
protected VendorSampleParser(string testedBSPDirectory, string sampleCatalogName, string subdir = null) { VendorSampleCatalogName = sampleCatalogName; var baseDirectory = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), @"..\..")); string problemClassifierFile = Path.Combine(baseDirectory, "KnownProblems.xml"); _KnownProblems = XmlTools.LoadObject <KnownSampleProblemDatabase>(problemClassifierFile); BSPDirectory = Path.GetFullPath(Path.Combine(baseDirectory, testedBSPDirectory)); CacheDirectory = Path.Combine(baseDirectory, "Cache"); RulesDirectory = Path.Combine(baseDirectory, "Rules"); var reportDirectory = Path.Combine(baseDirectory, "Reports"); if (!string.IsNullOrEmpty(subdir)) { CacheDirectory = Path.Combine(CacheDirectory, subdir); RulesDirectory = Path.Combine(RulesDirectory, subdir); reportDirectory = Path.Combine(reportDirectory, subdir); } Directory.CreateDirectory(CacheDirectory); Directory.CreateDirectory(reportDirectory); var toolchainType = XmlTools.LoadObject <BoardSupportPackage>(Path.Combine(BSPDirectory, LoadedBSP.PackageFileName)).GNUTargetID ?? throw new Exception("The BSP does not define GNU target ID."); TestDirectory = _SettingsKey.GetValue("TestDirectory") as string ?? throw new Exception("Registry settings not present. Please apply 'settings.reg'"); ToolchainDirectory = _SettingsKey.CreateSubKey("ToolchainDirectories").GetValue(toolchainType) as string ?? throw new Exception($"Location for {toolchainType} toolchain is not configured. Please apply 'settings.reg'"); var toolchain = LoadedToolchain.Load(new ToolchainSource.Other(Environment.ExpandEnvironmentVariables(ToolchainDirectory))); BSP = LoadedBSP.Load(new BSPEngine.BSPSummary(Environment.ExpandEnvironmentVariables(Path.GetFullPath(BSPDirectory))), toolchain); ReportFile = Path.Combine(reportDirectory, BSP.BSP.PackageVersion.Replace(".", "_") + ".xml"); if (File.Exists(ReportFile)) { _Report = XmlTools.LoadObject <VendorSampleTestReport>(ReportFile); } else { _Report = new VendorSampleTestReport { BSPVersion = BSP.BSP.PackageVersion, BSPID = BSP.BSP.PackageID } }; }
public EmbeddedProjectSample ToProjectSample(IEnumerable <string> extraReferences) { return(new EmbeddedProjectSample { AdditionalSourcesToCopy = Framework.AdditionalSourceFiles .Select(f => new AdditionalSourceFile { SourcePath = f, TargetFileName = Path.GetFileName(f) }) .Concat(new[] { new AdditionalSourceFile { SourcePath = "$$SYS:BSP_ROOT$$/" + ParsedSDK.MainFileName, TargetFileName = ParsedSDK.MainFileName } }) .ToArray(), AdditionalIncludeDirectories = Framework.AdditionalIncludeDirs, PreprocessorMacros = Framework.AdditionalPreprocessorMacros, RequiredFrameworks = LoadedBSP.Combine(Framework.RequiredFrameworks, extraReferences?.ToArray()), Name = "Empty project for " + OriginalName, }); }
public void AdjustDebugMethod(LoadedBSP.ConfiguredMCU mcu, ConfiguredDebugMethod method) { string iface; if (method.Method.ID == "xt-ocd") { if (method.Parameters.TryGetValue("com.sysprogs.esp8266.xt-ocd.debug_iface", out iface)) { ESP8266DebugConfigurator.DebugInterface ifaceObj = null; foreach (var obj in _Interfaces.Interfaces) if (obj.ID == iface) { ifaceObj = obj; break; } if (ifaceObj != null) { string templateFile = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "topology-template.xml"); XmlDocument doc = new XmlDocument(); doc.Load(templateFile); XmlElement el = doc.CreateElement("controller"); el.SetAttribute("id", "Controller0"); el.SetAttribute("module", ifaceObj.Module); foreach (var p in ifaceObj.Parameters) { string val; if (method.Parameters.TryGetValue(ESP8266DebugConfigurator.InterfaceSettingPrefix + p.UniqueID, out val) && !string.IsNullOrEmpty(val)) el.SetAttribute(p.UniqueID, val); } doc.DocumentElement.InsertBefore(el, doc.DocumentElement.FirstChild); string newFn = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), @"VisualGDB\xt-ocd-topology.xml"); doc.Save(newFn); method.Method.GDBServerArguments.Template = method.Method.GDBServerArguments.Template.Replace("$$com.sysprogs.esp8266.xt-ocd.configfile$$", "\"" + newFn + "\""); } } } else if (_ESP32Mode && method.Method.ID == "openocd") { if (!method.Parameters.ContainsKey("com.sysprogs.esp32.openocd.alg_timeout")) method.Parameters["com.sysprogs.esp32.openocd.alg_timeout"] = "5000"; } }
public static LoadedBSP LoadBSP(string toolchainID, string bspDir) { if (string.IsNullOrEmpty(toolchainID)) { toolchainID = (string)Registry.CurrentUser.OpenSubKey(@"Software\Sysprogs\BSPTools\VendorSampleParsers\ToolchainDirectories").GetValue("arm-eabi"); } if (toolchainID.StartsWith("[")) { toolchainID = (string)Registry.CurrentUser.OpenSubKey(@"Software\Sysprogs\GNUToolchains").GetValue(toolchainID.Trim('[', ']')); if (toolchainID == null) { throw new Exception("Cannot locate toolchain path from registry"); } } var toolchain = LoadedToolchain.Load(new ToolchainSource.Other(Environment.ExpandEnvironmentVariables(toolchainID))); return(LoadedBSP.Load(new BSPEngine.BSPSummary(Path.GetFullPath(Environment.ExpandEnvironmentVariables(bspDir))), toolchain)); }
public override MCU GenerateDefinition(MCUFamilyBuilder fam, BSPBuilder bspBuilder, bool requirePeripheralRegisters, bool allowIncompleteDefinition = false, MCUFamilyBuilder.CoreSpecificFlags flagsToAdd = MCUFamilyBuilder.CoreSpecificFlags.All) { var mcu = base.GenerateDefinition(fam, bspBuilder, requirePeripheralRegisters, allowIncompleteDefinition, flagsToAdd); var layout = ToMemoryLayout(fam.BSP.Report); var sram = layout.Layout.Memories.FirstOrDefault(m => m.Type == MemoryType.RAM && m.IsPrimary); if (sram != null) { mcu.RAMBase = sram.Start; mcu.RAMSize = (int)sram.Size; } mcu.MemoryMap = layout.Layout.ToMemoryMap(); mcu.AdditionalSystemVars = LoadedBSP.Combine(new[] { new SysVarEntry { Key = "com.sysprogs.stm32.hal_device_family", Value = MCU.Define } }, mcu.AdditionalSystemVars); return(mcu); }
public static void MergeFamilies(MCUFamily updatedFamily, MCUFamily familyToCopy) { updatedFamily.GDBStartupCommands = LoadedBSP.Combine(familyToCopy.GDBStartupCommands, updatedFamily.GDBStartupCommands); updatedFamily.AdditionalSystemVars = LoadedBSP.Combine(familyToCopy.AdditionalSystemVars, updatedFamily.AdditionalSystemVars); if (updatedFamily.ConfigurableProperties == null) { updatedFamily.ConfigurableProperties = familyToCopy.ConfigurableProperties; } else if (familyToCopy.ConfigurableProperties != null) { var lst = new List <PropertyGroup>(); lst.AddRange(familyToCopy.ConfigurableProperties.PropertyGroups); lst.AddRange(updatedFamily.ConfigurableProperties.PropertyGroups); updatedFamily.ConfigurableProperties.PropertyGroups = lst; } updatedFamily.CompilationFlags = familyToCopy.CompilationFlags.Merge(updatedFamily.CompilationFlags); updatedFamily.AdditionalSourceFiles = LoadedBSP.Combine(familyToCopy.AdditionalSourceFiles, updatedFamily.AdditionalSourceFiles); updatedFamily.AdditionalHeaderFiles = LoadedBSP.Combine(familyToCopy.AdditionalHeaderFiles, updatedFamily.AdditionalHeaderFiles); updatedFamily.AdditionalMakefileLines = LoadedBSP.Combine(familyToCopy.AdditionalMakefileLines, updatedFamily.AdditionalMakefileLines); }
public void Save(BoardSupportPackage bsp, bool produceBSPArchive, bool addFixedStackHeapFramework = true) { if (addFixedStackHeapFramework) { string dir = Path.Combine(Directories.OutputDir, "StackAndHeap"); Directory.CreateDirectory(dir); File.Copy(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "StackAndHeap.c"), Path.Combine(dir, "StackAndHeap.c")); var framework = XmlTools.LoadObject <EmbeddedFramework>(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "StackAndHeap.xml")); bsp.Frameworks = LoadedBSP.Combine(bsp.Frameworks, new[] { framework }); } XmlTools.SaveObject(bsp, Path.Combine(BSPRoot, "BSP.XML")); string archiveName = string.Format("{0}-{1}.vgdbxbsp", bsp.PackageID.Split('.').Last(), bsp.PackageVersion); if (produceBSPArchive) { TarPacker.PackDirectoryToTGZ(BSPRoot, Path.Combine(BSPRoot, archiveName), fn => Path.GetExtension(fn).ToLower() != ".vgdbxbsp"); } BSPSummary lst = new BSPSummary { BSPName = bsp.PackageDescription, BSPID = bsp.PackageID, BSPVersion = bsp.PackageVersion, MinimumEngineVersion = bsp.MinimumEngineVersion, FileName = archiveName, }; foreach (var mcu in bsp.SupportedMCUs) { lst.MCUs.Add(new BSPSummary.MCU { Name = mcu.ID, FLASHSize = mcu.FLASHSize, RAMSize = mcu.RAMSize, UserFriendlyName = mcu.UserFriendlyName }); } XmlTools.SaveObject(lst, Path.Combine(BSPRoot, Path.ChangeExtension(archiveName, ".xml"))); }
private static void RunTests(MbedBSPGenerator generator) { var testFiles = new TestInfo[] { new TestInfo("test_ledblink.xml", 0, 0), new TestInfo("test_usbcd.xml", 0, 0), new TestInfo("test_ledblink_rtos.xml", 0, 0), }; foreach (var test in testFiles) { Console.WriteLine($"Testing {test.Filename}..."); var job = XmlTools.LoadObject <TestJob>(Path.Combine(generator.dataDir, test.Filename)); if (job.ToolchainPath.StartsWith("[")) { job.ToolchainPath = (string)Registry.CurrentUser.OpenSubKey(@"Software\Sysprogs\GNUToolchains").GetValue(job.ToolchainPath.Trim('[', ']')); if (job.ToolchainPath == null) { throw new Exception("Cannot locate toolchain path from registry"); } } var toolchain = LoadedToolchain.Load(new ToolchainSource.Other(Environment.ExpandEnvironmentVariables(job.ToolchainPath))); var lbsp = LoadedBSP.Load(new BSPEngine.BSPSummary(Environment.ExpandEnvironmentVariables(Path.Combine(generator.outputDir, "mbed"))), toolchain); var r = StandaloneBSPValidator.Program.TestBSP(job, lbsp, Path.Combine(generator.outputDir, "TestResults")); test.Passed = r.Passed; test.Failed = r.Failed; } foreach (var test in testFiles) { Console.WriteLine("Results for the test: " + test.Filename); Console.WriteLine("Passed: " + test.Passed.ToString()); Console.WriteLine("Failed: " + test.Failed.ToString()); Console.WriteLine(); } }
static void Main(string[] args) { if (args.Length < 1) { throw new Exception("Usage: msp432_bsp_generator.exe <MSP432 SW package directory>"); } var bspBuilder = new Msp432Builder(new BSPDirectories(args[0], @"..\..\Output", @"..\..\rules")); var devices = BSPGeneratorTools.ReadMCUDevicesFromCommaDelimitedCSVFile( bspBuilder.Directories.RulesDir + @"\msp432devices.csv", "Part Number", "Non-volatile Memory (KB)", "RAM(KB)", "CPU", true); var allMCUFamilyBuilders = new List <MCUFamilyBuilder>(); foreach (var fn in Directory.GetFiles(bspBuilder.Directories.RulesDir + @"\Families", "*.xml")) { allMCUFamilyBuilders.Add(new MCUFamilyBuilder(bspBuilder, XmlTools.LoadObject <FamilyDefinition>(fn))); } var rejects = BSPGeneratorTools.AssignMCUsToFamilies(devices, allMCUFamilyBuilders); var commonPseudofamily = new MCUFamilyBuilder(bspBuilder, XmlTools.LoadObject <FamilyDefinition>(bspBuilder.Directories.RulesDir + @"\CommonFiles.xml")); var flags = new ToolFlags(); var projectFiles = new List <string>(); commonPseudofamily.CopyFamilyFiles(ref flags, projectFiles); var exampleDirs = new List <string>(); foreach (var sample in commonPseudofamily.CopySamples()) { exampleDirs.Add(sample); } bool noPeripheralRegisters = args.Contains("/noperiph"); var familyDefinitions = new List <MCUFamily>(); var mcuDefinitions = new List <MCU>(); var frameworks = new List <EmbeddedFramework>(); foreach (var mcuFamilyBuilder in allMCUFamilyBuilders) { var rejectedMCUs = mcuFamilyBuilder.RemoveUnsupportedMCUs(true); if (rejectedMCUs.Length != 0) { Console.WriteLine("Unsupported {0} MCUs:", mcuFamilyBuilder.Definition.Name); foreach (var mcu in rejectedMCUs) { Console.WriteLine("\t{0}", mcu.Name); } } mcuFamilyBuilder.AttachStartupFiles(new[] { StartupFilesParser.Parse( mcuFamilyBuilder.Definition.Name, mcuFamilyBuilder.Definition.PrimaryHeaderDir, mcuFamilyBuilder.Definition.Name + "_startup_gcc.c") }); if (!noPeripheralRegisters) { var headerFiles = Directory.GetFiles(mcuFamilyBuilder.Definition.PrimaryHeaderDir + "\\inc", "*.h"); var headerFileRegex = new Regex(mcuFamilyBuilder.Definition.DeviceRegex, RegexOptions.IgnoreCase); var familyHeaderFiles = headerFiles.Where(headerFile => headerFileRegex.Match(headerFile.Substring(headerFile.LastIndexOf("\\") + 1)).Success).ToArray(); if (familyHeaderFiles.Length == 0) { throw new Exception("No header file found for MCU family"); } else if (familyHeaderFiles.Length > 1) { throw new Exception("Only one header file expected for MCU family"); } var registersParser = new RegistersParser(familyHeaderFiles[0]); mcuFamilyBuilder.AttachPeripheralRegisters(new[] { new MCUDefinitionWithPredicate { MCUName = mcuFamilyBuilder.Definition.Name, RegisterSets = registersParser.Parse(), MatchPredicate = m => true } }); } var familyObject = mcuFamilyBuilder.GenerateFamilyObject(true); familyObject.AdditionalSourceFiles = LoadedBSP.Combine(familyObject.AdditionalSourceFiles, projectFiles.Where(f => !MCUFamilyBuilder.IsHeaderFile(f)).ToArray()); familyObject.AdditionalHeaderFiles = LoadedBSP.Combine(familyObject.AdditionalHeaderFiles, projectFiles.Where(f => MCUFamilyBuilder.IsHeaderFile(f)).ToArray()); familyObject.AdditionalSystemVars = LoadedBSP.Combine(familyObject.AdditionalSystemVars, commonPseudofamily.Definition.AdditionalSystemVars); familyObject.CompilationFlags = familyObject.CompilationFlags.Merge(flags); familyDefinitions.Add(familyObject); mcuFamilyBuilder.GenerateLinkerScripts(false); foreach (var mcu in mcuFamilyBuilder.MCUs) { mcuDefinitions.Add(mcu.GenerateDefinition(mcuFamilyBuilder, bspBuilder, !noPeripheralRegisters)); } foreach (var fw in mcuFamilyBuilder.GenerateFrameworkDefinitions()) { frameworks.Add(fw); } foreach (var sample in mcuFamilyBuilder.CopySamples()) { exampleDirs.Add(sample); } } BoardSupportPackage bsp = new BoardSupportPackage { PackageID = "com.sysprogs.arm.ti.msp432", PackageDescription = "TI MSP432 Devices", GNUTargetID = "arm-eabi", GeneratedMakFileName = "msp432.mak", MCUFamilies = familyDefinitions.ToArray(), SupportedMCUs = mcuDefinitions.ToArray(), Frameworks = frameworks.ToArray(), Examples = exampleDirs.ToArray(), PackageVersion = "1.0" }; bspBuilder.Save(bsp, true); }
public ICustomBSPConfigurator CreateConfigurator(LoadedBSP.ConfiguredMCU mcu, DebugMethod method) { if (method.ID == "xt-ocd") return new ESP8266DebugConfigurator(method, _Interfaces); else if (method.ID == "openocd") return new OpenOCDDebugConfigurator(method, _QuickSetupData); return null; }
public ConfigurationFixDatabaseBuilder(LoadedBSP bsp, string testDirectory, ReverseConditionTable reverseConditionTable) { _BSP = bsp; _TestDirectory = testDirectory; _ReverseConditionTable = reverseConditionTable; }
public static ParsedSDK ParseKSDKManifest(string sdkDirectory, IWarningSink sink) { string[] manifestFiles = Directory.GetFiles(sdkDirectory, "*manifest.xml"); if (manifestFiles.Length < 1) { throw new Exception($"No manifest files in {sdkDirectory}"); } string manifestFile = Directory.GetFiles(sdkDirectory, "*manifest.xml")[0]; List <VendorSample> vsl = new List <VendorSample>(); XmlDocument doc = new XmlDocument(); doc.Load(manifestFile); List <MCU> mcus = new List <MCU>(); List <MCUFamily> families = new List <MCUFamily>(); List <ParsedComponent> allFrameworks = new List <ParsedComponent>(); bool linkerScriptHandled = false; List <string> allFiles = new List <string>(); Dictionary <string, ParsedDevice> deviceDict = new Dictionary <string, ParsedDevice>(); Dictionary <string, EmbeddedFramework> frameworkDict = new Dictionary <string, EmbeddedFramework>(); List <FileCondition> allConditions = new List <FileCondition>(); string fwPrefix = "com.sysprogs.ksdk2x_imported."; HashSet <string> alwaysIncludedFrameworks = new HashSet <string>(); foreach (XmlElement devNode in doc.SelectNodes("//devices/device")) { ParsedDevice dev = new ParsedDevice(devNode, sdkDirectory); var mcuFamily = dev.ToMCUFamily(); int FLASHSize, RAMSize; int.TryParse((devNode.SelectSingleNode("memory/@flash_size_kb")?.Value ?? ""), out FLASHSize); int.TryParse((devNode.SelectSingleNode("memory/@ram_size_kb")?.Value ?? ""), out RAMSize); FLASHSize *= 1024; RAMSize *= 1024; families.Add(mcuFamily); string svdFile = null; //Map each component to an instance of EmbeddedFramework foreach (XmlNode componentNode in doc.SelectNodes($"//components/component")) { string componentName = componentNode.SelectSingleNode("@name")?.Value ?? ""; string componentType = componentNode.SelectSingleNode("@type")?.Value ?? ""; string device = componentNode.SelectSingleNode("@device")?.Value ?? ""; switch (componentType) { case "documentation": case "SCR": case "EULA": continue; case "debugger": case "linker": { List <string> relPaths = new List <string>(); bool isDebug = componentType == "debugger"; string sourceType = isDebug ? "debug" : "linker"; foreach (var src in componentNode.SelectNodes($"source[@type='{sourceType}']").OfType <XmlElement>().Select(e => new ParsedSource(e, dev))) { foreach (var fn in src.AllFiles) { relPaths.Add(fn.RelativePath); } } if (relPaths.Count > 0) { if (isDebug) { svdFile = relPaths[0]; } else if (!linkerScriptHandled) { linkerScriptHandled = true; if (relPaths.Count == 1) { mcuFamily.CompilationFlags.LinkerScript = "$$SYS:BSP_ROOT$$/" + relPaths[0]; } else { const string optionID = "com.sysprogs.imported.ksdk2x.linker_script"; mcuFamily.CompilationFlags.LinkerScript = $"$$SYS:BSP_ROOT$$/$${optionID}$$"; mcuFamily.ConfigurableProperties.PropertyGroups[0].Properties.Add(new PropertyEntry.Enumerated { UniqueID = optionID, Name = "Linker script", AllowFreeEntry = false, SuggestionList = relPaths.Select(p => new PropertyEntry.Enumerated.Suggestion { InternalValue = p, UserFriendlyName = Path.GetFileName(p) }).ToArray() }); } } } } continue; case "CMSIS": //KSDK 2.x defines a Include_xxx framework for each possible CMSIS core. Those frameworks are redundant (normal 'Include' framework references the same include path) and should be removed to avoid confusion. if (componentName.StartsWith("Include_")) { continue; } if (componentName == "Include") { alwaysIncludedFrameworks.Add(fwPrefix + componentName); } break; default: break; } List <string> headerFiles = new List <string>(); List <string> includeDirectories = new List <string>(); List <string> sourceFiles = new List <string>(); foreach (ParsedSource src in componentNode.SelectNodes("source").OfType <XmlElement>().Select(e => new ParsedSource(e, dev))) { if (src.Type == "c_include") { includeDirectories.Add(src.BSPPath); } foreach (var file in src.AllFiles) { if (src.Type == "src" || src.Type == "asm_include") { sourceFiles.Add(file.BSPPath); } else if (src.Type == "c_include") { headerFiles.Add(file.BSPPath); } } } if (componentName == "clock" && componentType == "driver") { alwaysIncludedFrameworks.Add(fwPrefix + componentName); } string[] dependencyList = componentNode.Attributes?.GetNamedItem("dependency")?.Value?.Split(' ') ?.Select(id => fwPrefix + id) ?.ToArray() ?? new string[0]; EmbeddedFramework fw = new EmbeddedFramework { ID = $"{fwPrefix}{componentName}", UserFriendlyName = $"{componentName} ({componentType})", ProjectFolderName = componentName, AdditionalSourceFiles = sourceFiles.Distinct().ToArray(), AdditionalHeaderFiles = headerFiles.Distinct().ToArray(), RequiredFrameworks = dependencyList, AdditionalIncludeDirs = includeDirectories.Distinct().ToArray(), AdditionalPreprocessorMacros = componentNode.SelectNodes("defines/define").OfType <XmlElement>().Select(el => new ParsedDefine(el).Definition).ToArray(), }; if (componentName == "freertos" && componentType == "OS") { fw.AdditionalPreprocessorMacros = LoadedBSP.Combine(fw.AdditionalPreprocessorMacros, "USE_RTOS=1;USE_FREERTOS".Split(';')); fw.ConfigurableProperties = new PropertyList { PropertyGroups = new List <PropertyGroup>() { new PropertyGroup { Properties = new List <PropertyEntry>() { new PropertyEntry.Enumerated { Name = "FreeRTOS Heap Implementation", UniqueID = "com.sysprogs.bspoptions.stm32.freertos.heap", DefaultEntryIndex = 3, SuggestionList = new PropertyEntry.Enumerated.Suggestion[] { new PropertyEntry.Enumerated.Suggestion { InternalValue = "heap_1", UserFriendlyName = "Heap1 - no support for freeing" }, new PropertyEntry.Enumerated.Suggestion { InternalValue = "heap_2", UserFriendlyName = "Heap2 - no block consolidation" }, new PropertyEntry.Enumerated.Suggestion { InternalValue = "heap_3", UserFriendlyName = "Heap3 - use newlib malloc()/free()" }, new PropertyEntry.Enumerated.Suggestion { InternalValue = "heap_4", UserFriendlyName = "Heap4 - contiguous heap area" }, new PropertyEntry.Enumerated.Suggestion { InternalValue = "heap_5", UserFriendlyName = "Heap5 - scattered heap area" }, } } } } } }; foreach (var fn in fw.AdditionalSourceFiles) { string name = Path.GetFileName(fn); if (name.StartsWith("heap_")) { allConditions.Add(new FileCondition { FilePath = fn, ConditionToInclude = new Condition.Equals { Expression = "$$com.sysprogs.bspoptions.stm32.freertos.heap$$", ExpectedValue = Path.GetFileNameWithoutExtension(fn) } }); } } } if (frameworkDict.ContainsKey(fw.ID)) { sink.LogWarning("Duplicate framework for " + fw.ID); continue; } frameworkDict[fw.ID] = fw; if (string.IsNullOrEmpty(fw.ID)) { sink.LogWarning($"Found a framework with empty ID. Skipping..."); continue; } if (string.IsNullOrEmpty(fw.UserFriendlyName)) { fw.UserFriendlyName = fw.ID; } allFrameworks.Add(new ParsedComponent { Framework = fw, OriginalType = componentType, OriginalName = componentName }); allFiles.AddRange(sourceFiles); allFiles.AddRange(headerFiles); } string deviceDefinitionFile = null; if (svdFile != null) { try { var mcuDef = SVDParser.ParseSVDFile(Path.Combine(sdkDirectory, svdFile), dev.DeviceName); deviceDefinitionFile = Path.ChangeExtension(svdFile, ".vgdbdevice"); XmlSerializer ser = new XmlSerializer(typeof(MCUDefinition)); using (var fs = File.Create(Path.Combine(sdkDirectory, Path.ChangeExtension(svdFile, ".vgdbdevice.gz")))) using (var gs = new GZipStream(fs, CompressionMode.Compress, true)) ser.Serialize(gs, new MCUDefinition(mcuDef)); } catch (Exception ex) { sink.LogWarning($"Failed to parse {svdFile}: {ex.Message}"); } } foreach (XmlNode packageNode in devNode.SelectNodes($"package/@name")) { string pkgName = packageNode?.Value; if (string.IsNullOrEmpty(pkgName)) { continue; } deviceDict[pkgName] = dev; mcus.Add(new MCU { ID = pkgName, UserFriendlyName = $"{pkgName} (KSDK 2.x)", FamilyID = mcuFamily.ID, FLASHSize = FLASHSize, RAMSize = RAMSize, CompilationFlags = new ToolFlags { PreprocessorMacros = new string[] { "CPU_" + pkgName } }, MCUDefinitionFile = deviceDefinitionFile }); } } if (families.Count == 0) { throw new Exception("The selected KSDK contains no families"); } List <VendorSample> samples = new List <VendorSample>(); foreach (XmlElement boardNode in doc.SelectNodes("//boards/board")) { string boardName = boardNode.GetAttribute("name"); string deviceID = boardNode.GetAttribute("package"); ParsedDevice dev; if (!deviceDict.TryGetValue(deviceID, out dev)) { continue; } foreach (XmlElement exampleNode in boardNode.SelectNodes("examples/example")) { List <string> dependencyList = new List <string>(exampleNode.Attributes?.GetNamedItem("dependency")?.Value?.Split(' ') ?.Select(id => fwPrefix + id) ?? new string[0]); dependencyList.AddRange(alwaysIncludedFrameworks); for (int i = 0; i < dependencyList.Count; i++) { EmbeddedFramework fw; if (frameworkDict.TryGetValue(dependencyList[i], out fw) && fw?.RequiredFrameworks != null) { dependencyList.AddRange(fw.RequiredFrameworks.Except(dependencyList)); } } VendorSample sample = new VendorSample { DeviceID = deviceID, UserFriendlyName = exampleNode.GetAttribute("name") ?? "???", BoardName = boardName, Configuration = new VendorSampleConfiguration { Frameworks = dependencyList.ToArray() }, VirtualPath = exampleNode.GetAttribute("category"), NoImplicitCopy = true }; List <string> headerFiles = new List <string>(); List <string> includeDirectories = new List <string>(); List <string> sourceFiles = new List <string>(); foreach (var src in exampleNode.SelectNodes("source").OfType <XmlElement>().Select(e => new ParsedSource(e, dev))) { foreach (var file in src.AllFiles) { if (src.Type == "src" || src.Type == "asm_include") { sourceFiles.Add(file.BSPPath); } else if (src.Type == "c_include") { headerFiles.Add(file.BSPPath); } } } sample.SourceFiles = sourceFiles.ToArray(); sample.HeaderFiles = headerFiles.ToArray(); if (sourceFiles.Count == 0 && headerFiles.Count == 0) { continue; } string[] matchingComponents = null; foreach (var fn in sourceFiles.Concat(headerFiles)) { string[] components = fn.Split('/', '\\'); if (matchingComponents == null) { matchingComponents = components; } else { int matches = CountMatches(matchingComponents, components); if (matches < matchingComponents.Length) { Array.Resize(ref matchingComponents, matches); } } } if (matchingComponents != null) { sample.Path = string.Join("/", matchingComponents); } samples.Add(sample); } } return(new ParsedSDK { BSP = new BoardSupportPackage { PackageID = "com.sysprogs.imported.ksdk2x." + families[0].ID, PackageDescription = "Imported KSDK 2.x for " + families[0].ID, PackageVersion = doc.SelectSingleNode("//ksdk/@version")?.Value ?? "unknown", GNUTargetID = "arm-eabi", Frameworks = allFrameworks.Where(f => f.OriginalType != "project_template").Select(f => f.Framework).ToArray(), MCUFamilies = families.ToArray(), SupportedMCUs = mcus.ToArray(), FileConditions = allFiles .Where(f => f.IndexOf("freertos", StringComparison.InvariantCultureIgnoreCase) != -1) .Select(f => new FileCondition { FilePath = f, ConditionToInclude = new Condition.ReferencesFramework { FrameworkID = fwPrefix + "freertos" } }) .Concat(allConditions) .ToArray(), VendorSampleCatalogName = "KSDK Samples", EmbeddedSamples = allFrameworks.Where(f => f.OriginalType == "project_template").Select(f => f.ToProjectSample(alwaysIncludedFrameworks)).ToArray(), }, VendorSampleDirectory = new VendorSampleDirectory { Samples = samples.ToArray() } }); }
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(bool defineConfigurationVariables, 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 (defineConfigurationVariables) { 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 (core == CortexCore.M4 || core == CortexCore.M7) { 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 static TestStatistics TestVendorSamples(VendorSampleDirectory samples, string bspDir, string temporaryDirectory, double testProbability = 1, bool esp32 = false) { string defaultToolchainID = "SysGCC-arm-eabi-6.2.0"; flEsp32 = false; if (esp32) { defaultToolchainID = "SysGCC-xtensa-esp32-elf-5.2.0"; flEsp32 = true; } var toolchainPath = (string)Registry.CurrentUser.OpenSubKey(@"Software\Sysprogs\GNUToolchains").GetValue(defaultToolchainID); if (toolchainPath == null) { throw new Exception("Cannot locate toolchain path from registry"); } var toolchain = LoadedToolchain.Load(new ToolchainSource.Other(Environment.ExpandEnvironmentVariables(toolchainPath))); var bsp = LoadedBSP.Load(new BSPEngine.BSPSummary(Environment.ExpandEnvironmentVariables(Path.GetFullPath(bspDir))), toolchain); if (flEsp32) { toolchainPath = toolchainPath.Replace('\\', '/'); //esp32 } TestStatistics stats = new TestStatistics(); int cnt = 0, failed = 0, succeeded = 0; LoadedBSP.LoadedMCU[] MCUs = bsp.MCUs.ToArray(); string outputDir = Path.Combine(temporaryDirectory, "VendorSamples"); if (!Directory.Exists(outputDir)) { Directory.CreateDirectory(outputDir); } int sampleCount = samples.Samples.Length; Random rng = new Random(); using (var r = new TestResults(Path.Combine(temporaryDirectory, "bsptest.log"))) { r.BeginSample("Vendor Samples"); foreach (var vs in samples.Samples) { LoadedBSP.LoadedMCU mcu; try { var rgFilterID = new Regex(vs.DeviceID.Replace('x', '.'), RegexOptions.IgnoreCase); mcu = bsp.MCUs.Where(f => rgFilterID.IsMatch(f.ExpandedMCU.ID)).ToArray()?.First(); vs.DeviceID = mcu.ExpandedMCU.ID; } catch (Exception ex) { r.ExceptionSample(ex.Message, "mcu " + vs.DeviceID + " not found in bsp"); Console.WriteLine("bsp have not mcu:" + vs.DeviceID); continue; } if (testProbability < 1 && rng.NextDouble() > testProbability) { cnt++; continue; } string mcuDir = Path.Combine(temporaryDirectory, "VendorSamples", vs.UserFriendlyName); mcuDir += $"-{mcu.ExpandedMCU.ID}"; if (!Directory.Exists(mcuDir)) { Directory.CreateDirectory(mcuDir); } DateTime start = DateTime.Now; string[] hwSubstrings = new[] { @"\ARM_CM4F\port.c", @"ARM_CM7\r0p1\port.c", @"CM4_GCC.a", }; if (vs.SourceFiles.FirstOrDefault(f => ContainsAnySubstrings(f, hwSubstrings)) != null) { if (vs.Configuration.MCUConfiguration != null) { var dict = PropertyDictionary2.ReadPropertyDictionary(vs.Configuration.MCUConfiguration); dict["com.sysprogs.bspoptions.arm.floatmode"] = "-mfloat-abi=hard"; vs.Configuration.MCUConfiguration = new PropertyDictionary2 { Entries = dict.Select(kv => new PropertyDictionary2.KeyValue { Key = kv.Key, Value = kv.Value }).ToArray() }; } else { vs.Configuration.MCUConfiguration = new PropertyDictionary2 { Entries = new PropertyDictionary2.KeyValue[] { new PropertyDictionary2.KeyValue { Key = "com.sysprogs.bspoptions.arm.floatmode", Value = "-mfloat-abi=hard" } } }; } } vs.SourceFiles = vs.SourceFiles.Where(s => !IsNonGCCFile(vs, s)).ToArray(); var result = TestVendorSample(mcu, vs, mcuDir, samples); Console.WriteLine($"[{(DateTime.Now - start).TotalMilliseconds:f0} msec]"); if (result == TestResult.Failed) { failed++; } else if (result == TestResult.Succeeded) { succeeded++; } r.LogTestResult(vs.UserFriendlyName, result); cnt++; Console.WriteLine("{0}: {1}% done ({2}/{3} projects, {4} failed)", vs.UserFriendlyName, (cnt * 100) / sampleCount, cnt, sampleCount, failed); } r.EndSample(); } stats.Passed += succeeded; stats.Failed += failed; if (samples is ConstructedVendorSampleDirectory) { (samples as ConstructedVendorSampleDirectory).ToolchainDirectory = toolchainPath; (samples as ConstructedVendorSampleDirectory).BSPDirectory = Path.GetFullPath(bspDir); } return(stats); }
//---------------------------------------------- static void Main(string[] args) { if (args.Length < 1) { throw new Exception("Usage: EFM32.exe <Atmel SW package directory>"); } var bspBuilder = new AtmelBSPBuilder(new BSPDirectories(args[0], @"..\..\Output", @"..\..\rules")); var devices = BSPGeneratorTools.ReadMCUDevicesFromCommaDelimitedCSVFile(bspBuilder.Directories.RulesDir + @"\McuAtmel.csv", "Device Name", "Flash (kBytes)", "SRAM (kBytes)", "CPU", true); RemoveDuplicateMCU(ref devices); List <MCUFamilyBuilder> allFamilies = new List <MCUFamilyBuilder>(); foreach (var fn in Directory.GetFiles(bspBuilder.Directories.RulesDir + @"\Families", "*.xml")) { allFamilies.Add(new MCUFamilyBuilder(bspBuilder, XmlTools.LoadObject <FamilyDefinition>(fn))); } var rejects = BSPGeneratorTools.AssignMCUsToFamilies(devices, allFamilies); List <MCUFamily> familyDefinitions = new List <MCUFamily>(); List <MCU> mcuDefinitions = new List <MCU>(); List <EmbeddedFramework> frameworks = new List <EmbeddedFramework>(); List <MCUFamilyBuilder.CopiedSample> exampleDirs = new List <MCUFamilyBuilder.CopiedSample>(); CopyAddSourceFiles(bspBuilder.Directories.InputDir); bool noPeripheralRegisters = args.Contains("/noperiph"); List <KeyValuePair <string, string> > macroToHeaderMap = new List <KeyValuePair <string, string> >(); var commonPseudofamily = new MCUFamilyBuilder(bspBuilder, XmlTools.LoadObject <FamilyDefinition>(bspBuilder.Directories.RulesDir + @"\CommonFiles.xml")); //Embedded Frameworks var AddFrW = GenereteAddFrameWorks(bspBuilder.Directories, "ServicesFrimwork.txt"); commonPseudofamily.Definition.AdditionalFrameworks = commonPseudofamily.Definition.AdditionalFrameworks.Concat(AddFrW).ToArray(); AddFrW = GenereteAddFrameWorksDir(bspBuilder.Directories, "sam"); commonPseudofamily.Definition.AdditionalFrameworks = commonPseudofamily.Definition.AdditionalFrameworks.Concat(AddFrW).ToArray(); AddFrW = GenereteAddFrameWorksDir(bspBuilder.Directories, "sam0"); commonPseudofamily.Definition.AdditionalFrameworks = commonPseudofamily.Definition.AdditionalFrameworks.Concat(AddFrW).ToArray(); foreach (var fw in commonPseudofamily.GenerateFrameworkDefinitions()) { frameworks.Add(fw); } var flags = new ToolFlags(); List <string> projectFiles = new List <string>(); commonPseudofamily.CopyFamilyFiles(ref flags, projectFiles); foreach (var sample in commonPseudofamily.CopySamples()) { exampleDirs.Add(sample); } foreach (var fam in allFamilies) { var rejectedMCUs = fam.RemoveUnsupportedMCUs(true); if (rejectedMCUs.Length != 0) { Console.WriteLine("Unsupported {0} MCUs:", fam.Definition.Name); foreach (var mcu in rejectedMCUs) { Console.WriteLine("\t{0}", mcu.Name); } } fam.AttachStartupFiles(ParseStartupFiles(fam.Definition.StartupFileDir, fam)); var famObj = fam.GenerateFamilyObject(true); famObj.AdditionalSourceFiles = LoadedBSP.Combine(famObj.AdditionalSourceFiles, projectFiles.Where(f => !MCUFamilyBuilder.IsHeaderFile(f)).ToArray()); famObj.AdditionalHeaderFiles = LoadedBSP.Combine(famObj.AdditionalHeaderFiles, projectFiles.Where(f => MCUFamilyBuilder.IsHeaderFile(f)).ToArray()); famObj.AdditionalSystemVars = LoadedBSP.Combine(famObj.AdditionalSystemVars, commonPseudofamily.Definition.AdditionalSystemVars); famObj.CompilationFlags = famObj.CompilationFlags.Merge(flags); famObj.CompilationFlags.PreprocessorMacros = LoadedBSP.Combine(famObj.CompilationFlags.PreprocessorMacros, new string[] { "$$com.sysprogs.bspoptions.primary_memory$$_layout" }); familyDefinitions.Add(famObj); var memoryLayouts = fam.GenerateLinkerScripts(false); if (!noPeripheralRegisters) { fam.AttachPeripheralRegisters(ParsePeripheralRegisters(bspBuilder.Directories.OutputDir, fam)); } foreach (var mcu in fam.MCUs) { var mcuDef = mcu.GenerateDefinition(fam, bspBuilder, !noPeripheralRegisters); var layout = memoryLayouts[mcu.Name]; var ram = layout.Memories.First(m => m.Type == MemoryType.RAM); var flash = layout.Memories.First(m => m.Type == MemoryType.FLASH); mcuDef.RAMBase = ram.Start; mcuDef.RAMSize = (int)ram.Size; mcuDef.FLASHBase = flash.Start; mcuDef.FLASHSize = (int)flash.Size; mcuDefinitions.Add(mcuDef); } foreach (var fw in fam.GenerateFrameworkDefinitions()) { frameworks.Add(fw); } foreach (var sample in fam.CopySamples()) { exampleDirs.Add(sample); } } BoardSupportPackage bsp = new BoardSupportPackage { PackageID = "com.sysprogs.arm.atmel.sam-cortex", PackageDescription = "Atmel ARM Cortex Devices", GNUTargetID = "arm-eabi", GeneratedMakFileName = "atmel.mak", MCUFamilies = familyDefinitions.ToArray(), SupportedMCUs = mcuDefinitions.ToArray(), Frameworks = frameworks.ToArray(), Examples = exampleDirs.Where(s => !s.IsTestProjectSample).Select(s => s.RelativePath).ToArray(), TestExamples = exampleDirs.Where(s => s.IsTestProjectSample).Select(s => s.RelativePath).ToArray(), FileConditions = bspBuilder.MatchedFileConditions.ToArray(), PackageVersion = "3.35.2" }; bspBuilder.Save(bsp, true); }
//=========================================================== static void Main(string[] args) { if (args.Length < 1) { throw new Exception("Usage: InfineonXMC.exe <InfineonXMC SW package directory>"); } using (var bspBuilder = new InfineonXMCBSPBuilder(BSPDirectories.MakeDefault(args))) { var devices = BSPGeneratorTools.ReadMCUDevicesFromCommaDelimitedCSVFile(bspBuilder.Directories.RulesDir + @"\McuInfineonDevices.csv", "Product", "Program Memory(KB) ", "SRAM (KB) ", "CORE", true); devices = UpdateListMCU(devices); List <MCUFamilyBuilder> allFamilies = new List <MCUFamilyBuilder>(); foreach (var fn in Directory.GetFiles(bspBuilder.Directories.RulesDir + @"\Families", "*.xml")) { allFamilies.Add(new MCUFamilyBuilder(bspBuilder, XmlTools.LoadObject <FamilyDefinition>(fn))); } var rejects = BSPGeneratorTools.AssignMCUsToFamilies(devices, allFamilies); if (rejects.Count > 0) { throw new Exception($"Found {rejects.Count} MCUs not assigned to any family"); } List <MCUFamily> familyDefinitions = new List <MCUFamily>(); List <MCU> mcuDefinitions = new List <MCU>(); List <EmbeddedFramework> frameworks = new List <EmbeddedFramework>(); List <string> exampleDirs = new List <string>(); bool noPeripheralRegisters = args.Contains("/noperiph"); List <KeyValuePair <string, string> > macroToHeaderMap = new List <KeyValuePair <string, string> >(); var commonPseudofamily = new MCUFamilyBuilder(bspBuilder, XmlTools.LoadObject <FamilyDefinition>(bspBuilder.Directories.RulesDir + @"\CommonFiles.xml")); var flags = new ToolFlags(); List <string> projectFiles = new List <string>(); commonPseudofamily.CopyFamilyFiles(ref flags, projectFiles); foreach (var sample in commonPseudofamily.CopySamples()) { exampleDirs.Add(sample.RelativePath); } foreach (var fam in allFamilies) { var rejectedMCUs = fam.RemoveUnsupportedMCUs(); if (rejectedMCUs.Length != 0) { Console.WriteLine("Unsupported {0} MCUs:", fam.Definition.Name); foreach (var mcu in rejectedMCUs) { Console.WriteLine("\t{0}", mcu.Name); } } fam.AttachStartupFiles(ParseStartupFiles(fam.Definition.StartupFileDir)); if (!noPeripheralRegisters) { fam.AttachPeripheralRegisters(new MCUDefinitionWithPredicate[] { SVDParser.ParseSVDFile(Path.Combine(fam.Definition.PrimaryHeaderDir, @"CMSIS\Infineon\SVD\" + fam.Definition.Name + ".svd"), fam.Definition.Name) }); } var famObj = fam.GenerateFamilyObject(true); famObj.AdditionalSourceFiles = LoadedBSP.Combine(famObj.AdditionalSourceFiles, projectFiles.Where(f => !MCUFamilyBuilder.IsHeaderFile(f)).ToArray()); famObj.AdditionalHeaderFiles = LoadedBSP.Combine(famObj.AdditionalHeaderFiles, projectFiles.Where(f => MCUFamilyBuilder.IsHeaderFile(f)).ToArray()); famObj.AdditionalSystemVars = LoadedBSP.Combine(famObj.AdditionalSystemVars, commonPseudofamily.Definition.AdditionalSystemVars); famObj.CompilationFlags = famObj.CompilationFlags.Merge(flags); famObj.CompilationFlags.PreprocessorMacros = LoadedBSP.Combine(famObj.CompilationFlags.PreprocessorMacros, new string[] { "$$com.sysprogs.bspoptions.primary_memory$$_layout" }); familyDefinitions.Add(famObj); fam.GenerateLinkerScripts(false); foreach (var mcu in fam.MCUs) { mcuDefinitions.Add(mcu.GenerateDefinition(fam, bspBuilder, !noPeripheralRegisters)); } foreach (var fw in fam.GenerateFrameworkDefinitions()) { frameworks.Add(fw); } foreach (var sample in fam.CopySamples()) { exampleDirs.Add(sample.RelativePath); } } BoardSupportPackage bsp = new BoardSupportPackage { PackageID = "com.sysprogs.arm.infineon.xmc", PackageDescription = "Infineon XMC Devices", GNUTargetID = "arm-eabi", GeneratedMakFileName = "infineon_xmc.mak", MCUFamilies = familyDefinitions.ToArray(), SupportedMCUs = mcuDefinitions.ToArray(), Frameworks = frameworks.ToArray(), Examples = exampleDirs.ToArray(), FileConditions = bspBuilder.MatchedFileConditions.Values.ToArray(), PackageVersion = "2.1.24R2" }; bspBuilder.Save(bsp, true); } }
public void GeneratePackage() { Console.Write("Creating a list of MCUs... "); CreateMCUBuilders(); Console.WriteLine("done"); Console.WriteLine("Number of MCUs: {0}", _mcuBuilders.Count); Console.Write("Creating a list of MCU families... "); CreateMCUFamilyBuilders(); Console.WriteLine("done"); Console.WriteLine("Number of MCU families: {0}", _mcuFamilyBuilders.Count); Console.Write("Assigning MCUs to MCU families... "); AssignMCUsToFamilies(); Console.WriteLine("done"); Console.WriteLine("{0} MCU families have no MCUs and will be discarded: {1}", _rejectedMCUFamilies.Length, string.Join(",", _rejectedMCUFamilies.Select(mf => mf.Definition.Name))); Console.WriteLine("{0} MCUs were not assigned to any family and will be discarded: {1}", _rejectedMCUs.Length, string.Join(",", _rejectedMCUs.Select(m => m.Name))); Console.Write("Processing common files... "); ProcessCommonFiles(); Console.WriteLine("done"); Console.Write("Generating MCUs and their families... "); GenerateMCUsAndMCUFamilies(); Console.WriteLine("done"); //We don't want to include the same include paths twice (once from the family and another time from the framework), so we filter out the family-provided ones here. HashSet <string> includeDirsFromFamilies = new HashSet <string>(); foreach (var fam in _mcuFamilies) { foreach (var dir in fam.CompilationFlags.IncludeDirectories) { includeDirsFromFamilies.Add(dir.Replace(fam.ID, "$$SYS:FAMILY_ID$$")); } } foreach (var fw in _frameworks) { fw.AdditionalIncludeDirs = fw.AdditionalIncludeDirs.Where(d => !includeDirsFromFamilies.Contains(d)).ToArray(); } ; Console.Write("Detecting GPIO prefixes... "); Regex rgBrackets = new Regex(@"\(([^\(\)]+)\)"); foreach (var fam in _mcuFamilies) { var mainIncludeFile = string.Format(@"{0}\platform\devices\M{1}\include\M{1}.h", Directories.InputDir, fam.ID); string gpioaLine = File.ReadAllLines(mainIncludeFile).First(s => s.Contains("#define GPIOA_PDOR")); var m = rgBrackets.Match(gpioaLine); if (!m.Success) { throw new Exception("Cannot detect GPIO prefix for " + fam.ID); } fam.AdditionalSystemVars = LoadedBSP.Combine(fam.AdditionalSystemVars, new SysVarEntry[] { new SysVarEntry { Key = "com.sysprogs.arm.kinetis.gpio_prefix", Value = m.Groups[1].Value.Substring(0, m.Groups[1].Value.Length - 1) } }); } Console.WriteLine("done"); Console.Write("Reading MCUs listed in Segger lists... "); var mcusFromSeggerFile = new HashSet <string>(ReadSeggerMCUs(Directories.RulesDir + "\\" + SEGGER_FILE, MANUFACTURER)); Console.WriteLine("done"); Console.Write("Generating BSP... "); BoardSupportPackage bsp = new BoardSupportPackage { PackageID = "com.sysprogs.arm.freescale.kinetis_ksdk", PackageDescription = "Freescale Kinetis (KSDK)", GNUTargetID = "arm-eabi", GeneratedMakFileName = "kinetis.mak", MCUFamilies = _mcuFamilies.ToArray(), SupportedMCUs = _mcus.ToArray(), Frameworks = _frameworks.ToArray(), Examples = _exampleDirs.Where(s => !s.IsTestProjectSample).Select(s => s.RelativePath).ToArray(), TestExamples = _exampleDirs.Where(s => s.IsTestProjectSample).Select(s => s.RelativePath).ToArray(), FileConditions = MatchedFileConditions.ToArray(), PackageVersion = "1.3.2", MinimumEngineVersion = "5.0", }; Save(bsp, true); Console.WriteLine("done"); var mcusUnlistedInSeggerFile = new List <string>(); foreach (var mcu in _mcus) { var generalizedMCUName = MCUNameToGeneralizedMCUName(mcu.ID); if (!mcusFromSeggerFile.Contains(generalizedMCUName)) { mcusUnlistedInSeggerFile.Add(generalizedMCUName); } } Console.WriteLine("Generated MCU definitions: {0}\r\nGenerated families: {1}\r\nMCUs unlisted in Segger lists: {2}", _mcus.Count, _mcuFamilies.Count, mcusUnlistedInSeggerFile.Count); Console.WriteLine("Press any key to exit..."); Console.ReadKey(); }
static void Main(string[] args) { if (args.Length < 1) { throw new Exception("Usage: EFM32.exe <SLab SW package directory>"); } var bspBuilder = new SLabBSPBuilder(new BSPDirectories(args[0], @"..\..\Output", @"..\..\rules")); var devices = BSPGeneratorTools.ReadMCUDevicesFromCommaDelimitedCSVFile(bspBuilder.Directories.RulesDir + @"\McuSiliconLabs.csv", "Part No.", "Flash (kB)", "Ram (kB)", "MCU Core", true); RemoveDuplicateMCU(ref devices); var devicesOld = BSPGeneratorTools.ReadMCUDevicesFromCommaDelimitedCSVFile(bspBuilder.Directories.RulesDir + @"\McuSiliconLabsOld.csv", "Part No.", "Flash (kB)", "Ram (kB)", "MCU Core", true); RemoveDuplicateMCU(ref devicesOld); foreach (var d in devicesOld) { if (!devices.Contains(d)) { devices.Add(d); } } if (devices.Where(d => d.RAMSize == 0 || d.FlashSize == 0).Count() > 0) { throw new Exception($"Some devices are RAM Size ({devices.Where(d => d.RAMSize == 0).Count()}) = 0 or FLASH Size({devices.Where(d => d.FlashSize == 0).Count()}) = 0 "); } List <MCUFamilyBuilder> allFamilies = new List <MCUFamilyBuilder>(); foreach (var fn in Directory.GetFiles(bspBuilder.Directories.RulesDir + @"\Families", "*.xml")) { allFamilies.Add(new MCUFamilyBuilder(bspBuilder, XmlTools.LoadObject <FamilyDefinition>(fn))); } var rejects = BSPGeneratorTools.AssignMCUsToFamilies(devices, allFamilies); List <MCUFamily> familyDefinitions = new List <MCUFamily>(); List <MCU> mcuDefinitions = new List <MCU>(); List <EmbeddedFramework> frameworks = new List <EmbeddedFramework>(); List <MCUFamilyBuilder.CopiedSample> exampleDirs = new List <MCUFamilyBuilder.CopiedSample>(); bool noPeripheralRegisters = args.Contains("/noperiph"); List <KeyValuePair <string, string> > macroToHeaderMap = new List <KeyValuePair <string, string> >(); var commonPseudofamily = new MCUFamilyBuilder(bspBuilder, XmlTools.LoadObject <FamilyDefinition>(bspBuilder.Directories.RulesDir + @"\CommonFiles.xml")); foreach (var fw in commonPseudofamily.GenerateFrameworkDefinitions()) { frameworks.Add(fw); } var flags = new ToolFlags(); List <string> projectFiles = new List <string>(); commonPseudofamily.CopyFamilyFiles(ref flags, projectFiles); foreach (var sample in commonPseudofamily.CopySamples()) { exampleDirs.Add(sample); } foreach (var fam in allFamilies) { var rejectedMCUs = fam.RemoveUnsupportedMCUs(true); if (rejectedMCUs.Length != 0) { Console.WriteLine("Unsupported {0} MCUs:", fam.Definition.Name); foreach (var mcu in rejectedMCUs) { Console.WriteLine("\t{0}", mcu.Name); } } fam.AttachStartupFiles(ParseStartupFiles(fam.Definition.StartupFileDir, fam)); var famObj = fam.GenerateFamilyObject(true); famObj.AdditionalSourceFiles = LoadedBSP.Combine(famObj.AdditionalSourceFiles, projectFiles.Where(f => !MCUFamilyBuilder.IsHeaderFile(f)).ToArray()); famObj.AdditionalHeaderFiles = LoadedBSP.Combine(famObj.AdditionalHeaderFiles, projectFiles.Where(f => MCUFamilyBuilder.IsHeaderFile(f)).ToArray()); famObj.AdditionalSystemVars = LoadedBSP.Combine(famObj.AdditionalSystemVars, commonPseudofamily.Definition.AdditionalSystemVars); famObj.CompilationFlags = famObj.CompilationFlags.Merge(flags); famObj.CompilationFlags.PreprocessorMacros = LoadedBSP.Combine(famObj.CompilationFlags.PreprocessorMacros, new string[] { "$$com.sysprogs.bspoptions.primary_memory$$_layout" }); familyDefinitions.Add(famObj); fam.GenerateLinkerScripts(false); if (!noPeripheralRegisters) { fam.AttachPeripheralRegisters(ParsePeripheralRegisters(bspBuilder.Directories.OutputDir + "\\" + fam.Definition.FamilySubdirectory + "\\Devices", fam)); } foreach (var mcu in fam.MCUs) { mcuDefinitions.Add(mcu.GenerateDefinition(fam, bspBuilder, !noPeripheralRegisters)); } foreach (var fw in fam.GenerateFrameworkDefinitions()) { frameworks.Add(fw); } foreach (var sample in fam.CopySamples()) { exampleDirs.Add(sample); } } BoardSupportPackage bsp = new BoardSupportPackage { PackageID = "com.sysprogs.arm.silabs.efm32", PackageDescription = "Silabs EFM32 Devices", GNUTargetID = "arm-eabi", GeneratedMakFileName = "efm32.mak", MCUFamilies = familyDefinitions.ToArray(), SupportedMCUs = mcuDefinitions.ToArray(), Frameworks = frameworks.ToArray(), Examples = exampleDirs.Where(s => !s.IsTestProjectSample).Select(s => s.RelativePath).ToArray(), TestExamples = exampleDirs.Where(s => s.IsTestProjectSample).Select(s => s.RelativePath).ToArray(), FileConditions = bspBuilder.MatchedFileConditions.ToArray(), PackageVersion = "5.1.2" }; bspBuilder.Save(bsp, true); }
static void Main(string[] args) { if (args.Length < 1) { throw new Exception("Usage: EFM32.exe <SLab SW package directory>"); } var bspBuilder = new SLabBSPBuilder(new BSPDirectories(args[0], @"..\..\Output", @"..\..\rules")); List <MCUFamilyBuilder> allFamilies = new List <MCUFamilyBuilder>(); var ignoredFamilyNames = File.ReadAllLines(Path.Combine(bspBuilder.Directories.RulesDir, "rulesfamaly.txt")); string DirDevices = Path.Combine(bspBuilder.Directories.InputDir, @"platform\Device\SiliconLabs"); string[] allFamilySubdirectories = Directory.GetDirectories(DirDevices); Console.WriteLine("Enumerating devices..."); foreach (var dir in allFamilySubdirectories) { string familyName = Path.GetFileNameWithoutExtension(dir); if (ignoredFamilyNames.FirstOrDefault(n => dir.Contains(n)) != null) { continue; } var devices = GetMCUsForFamily(dir); Console.WriteLine($" {familyName}: {devices.Count} devices"); ValidateMCUNames(devices); if (devices.Where(d => d.RAMSize == 0 || d.FlashSize == 0).Count() > 0) { throw new Exception($"Some devices are RAM Size ({devices.Where(d => d.RAMSize == 0).Count()}) = 0 or FLASH Size({devices.Where(d => d.FlashSize == 0).Count()}) = 0 "); } if (devices.Count == 0) { throw new Exception("No devices for " + familyName); } string StartupFile = Directory.GetFiles(Path.Combine(DirDevices, familyName, @"Source\GCC"), "startup_*.c")[0].Replace(bspBuilder.Directories.InputDir, @"$$BSPGEN:INPUT_DIR$$"); var copyJob = new CopyJob() { FilesToCopy = "-*startup_*;*.h;*.c", TargetFolder = "Devices", ProjectInclusionMask = "*.c", AutoIncludeMask = "*.h", SourceFolder = DirDevices + "\\" + familyName }; var fam = new MCUFamilyBuilder(bspBuilder, new FamilyDefinition() { Name = familyName, FamilySubdirectory = familyName, PrimaryHeaderDir = "$$BSPGEN:INPUT_DIR$$", StartupFileDir = StartupFile, CoreFramework = new Framework() { CopyJobs = new[] { copyJob } }, Subfamilies = new MCUClassifier[] { }.ToArray() }); fam.MCUs.AddRange(devices); allFamilies.Add(fam); } List <MCUFamily> familyDefinitions = new List <MCUFamily>(); List <MCU> mcuDefinitions = new List <MCU>(); List <EmbeddedFramework> frameworks = new List <EmbeddedFramework>(); List <MCUFamilyBuilder.CopiedSample> exampleDirs = new List <MCUFamilyBuilder.CopiedSample>(); bool noPeripheralRegisters = args.Contains("/noperiph"); List <KeyValuePair <string, string> > macroToHeaderMap = new List <KeyValuePair <string, string> >(); var commonPseudofamily = new MCUFamilyBuilder(bspBuilder, XmlTools.LoadObject <FamilyDefinition>(bspBuilder.Directories.RulesDir + @"\CommonFiles.xml")); foreach (var fw in commonPseudofamily.GenerateFrameworkDefinitions()) { frameworks.Add(fw); } var flags = new ToolFlags(); List <string> projectFiles = new List <string>(); commonPseudofamily.CopyFamilyFiles(ref flags, projectFiles); foreach (var sample in commonPseudofamily.CopySamples()) { exampleDirs.Add(sample); } Console.WriteLine("Processing families..."); int cnt = 0; foreach (var fam in allFamilies) { Console.WriteLine($" {fam.Definition.Name} ({++cnt}/{allFamilies.Count})..."); var rejectedMCUs = fam.RemoveUnsupportedMCUs(true); if (rejectedMCUs.Length != 0) { Console.WriteLine("Unsupported {0} MCUs:", fam.Definition.Name); foreach (var mcu in rejectedMCUs) { Console.WriteLine("\t{0}", mcu.Name); } } fam.AttachStartupFiles(ParseStartupFiles(fam.Definition.StartupFileDir, fam)); var famObj = fam.GenerateFamilyObject(true); famObj.AdditionalSourceFiles = LoadedBSP.Combine(famObj.AdditionalSourceFiles, projectFiles.Where(f => !MCUFamilyBuilder.IsHeaderFile(f)).ToArray()); famObj.AdditionalHeaderFiles = LoadedBSP.Combine(famObj.AdditionalHeaderFiles, projectFiles.Where(f => MCUFamilyBuilder.IsHeaderFile(f)).ToArray()); famObj.AdditionalSystemVars = LoadedBSP.Combine(famObj.AdditionalSystemVars, commonPseudofamily.Definition.AdditionalSystemVars); famObj.CompilationFlags = famObj.CompilationFlags.Merge(flags); famObj.CompilationFlags.PreprocessorMacros = LoadedBSP.Combine(famObj.CompilationFlags.PreprocessorMacros, new string[] { "$$com.sysprogs.bspoptions.primary_memory$$_layout" }); familyDefinitions.Add(famObj); fam.GenerateLinkerScripts(false); if (!noPeripheralRegisters) { fam.AttachPeripheralRegisters(ParsePeripheralRegisters(bspBuilder.Directories.OutputDir + "\\" + fam.Definition.FamilySubdirectory + "\\Devices", fam)); } foreach (var mcu in fam.MCUs) { mcuDefinitions.Add(mcu.GenerateDefinition(fam, bspBuilder, !noPeripheralRegisters)); } foreach (var fw in fam.GenerateFrameworkDefinitions()) { frameworks.Add(fw); } foreach (var sample in fam.CopySamples()) { exampleDirs.Add(sample); } } BoardSupportPackage bsp = new BoardSupportPackage { PackageID = "com.sysprogs.arm.silabs.efm32", PackageDescription = "Silabs EFM32 Devices", GNUTargetID = "arm-eabi", GeneratedMakFileName = "efm32.mak", MCUFamilies = familyDefinitions.ToArray(), SupportedMCUs = mcuDefinitions.ToArray(), Frameworks = frameworks.ToArray(), Examples = exampleDirs.Where(s => !s.IsTestProjectSample).Select(s => s.RelativePath).ToArray(), TestExamples = exampleDirs.Where(s => s.IsTestProjectSample).Select(s => s.RelativePath).ToArray(), FileConditions = bspBuilder.MatchedFileConditions.ToArray(), PackageVersion = "5.8.3" }; Console.WriteLine("Saving BSP..."); bspBuilder.Save(bsp, true); }
static void Main(string[] args) { if (args.Length < 1) { throw new Exception("Usage: nrf5x.exe <Nordic SW package directory>"); } bool usingIoTSDK = false; if (Directory.Exists(Path.Combine(args[0], @"components\iot\ble_6lowpan"))) { usingIoTSDK = true; Console.WriteLine("Detected IoT SDK"); } NordicBSPBuilder bspBuilder; if (usingIoTSDK) { bspBuilder = new NordicBSPBuilder(new BSPDirectories(args[0], @"..\..\Output", @"..\..\rules_iot")); bspBuilder.SoftDevices.Add(new NordicBSPBuilder.SoftDevice("s1xx_iot", 0x1f000, 0x2800, "nrf52", "IoT")); } else { bspBuilder = new NordicBSPBuilder(new BSPDirectories(args[0], @"..\..\Output", @"..\..\rules")); bspBuilder.SoftDevices.Add(new NordicBSPBuilder.SoftDevice("S130", 0x1b000, 0x13c8, "nrf51", "Bluetooth LE Universal")); bspBuilder.SoftDevices.Add(new NordicBSPBuilder.SoftDevice("S132", 0x20000, 0x2168, "nrf52832", "Bluetooth LE")); bspBuilder.SoftDevices.Add(new NordicBSPBuilder.SoftDevice("S140", 0x21000, 0x2780, "nrf52840", "Bluetooth LE")); } List <MCUBuilder> devices = new List <MCUBuilder>(); if (!usingIoTSDK) { foreach (string part in new string[] { "nRF51822", "nRF51422" }) { devices.Add(new MCUBuilder { Name = part + "_XXAA", FlashSize = 256 * 1024, RAMSize = 16 * 1024, Core = CortexCore.M0 }); devices.Add(new MCUBuilder { Name = part + "_XXAB", FlashSize = 128 * 1024, RAMSize = 16 * 1024, Core = CortexCore.M0 }); devices.Add(new MCUBuilder { Name = part + "_XXAC", FlashSize = 256 * 1024, RAMSize = 32 * 1024, Core = CortexCore.M0 }); } } devices.Add(new MCUBuilder { Name = "nRF52832_XXAA", FlashSize = 512 * 1024, RAMSize = 64 * 1024, Core = CortexCore.M4 }); devices.Add(new MCUBuilder { Name = "nRF52840_XXAA", FlashSize = 1024 * 1024, RAMSize = 256 * 1024, Core = CortexCore.M4 }); List <MCUFamilyBuilder> allFamilies = new List <MCUFamilyBuilder>(); foreach (var fn in Directory.GetFiles(bspBuilder.Directories.RulesDir + @"\Families", "*.xml")) { allFamilies.Add(new MCUFamilyBuilder(bspBuilder, XmlTools.LoadObject <FamilyDefinition>(fn))); } var rejects = BSPGeneratorTools.AssignMCUsToFamilies(devices, allFamilies); List <EmbeddedFramework> frameworks = new List <EmbeddedFramework>(); List <MCUFamilyBuilder.CopiedSample> exampleDirs = new List <MCUFamilyBuilder.CopiedSample>(); bool noPeripheralRegisters = true; List <MCUFamily> familyDefinitions = new List <MCUFamily>(); List <MCU> mcuDefinitions = new List <MCU>(); var commonPseudofamily = new MCUFamilyBuilder(bspBuilder, XmlTools.LoadObject <FamilyDefinition>(bspBuilder.Directories.RulesDir + @"\CommonFiles.xml")); var flags = new ToolFlags(); List <string> projectFiles = new List <string>(); commonPseudofamily.CopyFamilyFiles(ref flags, projectFiles); flags = flags.Merge(commonPseudofamily.Definition.CompilationFlags); List <ConditionalToolFlags> condFlags = new List <ConditionalToolFlags>(); foreach (var fam in allFamilies) { Console.WriteLine("Processing " + fam.Definition.Name + " family..."); string famBase = fam.Definition.Name.Substring(0, 5).ToLower(); var rejectedMCUs = fam.RemoveUnsupportedMCUs(true); if (rejectedMCUs.Length != 0) { Console.WriteLine("Unsupported {0} MCUs:", fam.Definition.Name); foreach (var mcu in rejectedMCUs) { Console.WriteLine("\t{0}", mcu.Name); } } List <Framework> bleFrameworks = new List <Framework>(); foreach (var line in File.ReadAllLines(bspBuilder.Directories.RulesDir + @"\BLEFrameworks.txt")) { int idx = line.IndexOf('|'); string dir = line.Substring(0, idx); string desc = line.Substring(idx + 1); string id = Path.GetFileName(dir); if (!id.StartsWith("ble_")) { id = "ble_" + id; } if (dir.StartsWith("services\\", StringComparison.CurrentCultureIgnoreCase)) { id = "ble_svc_" + id.Substring(4); } bleFrameworks.Add(new Framework { Name = string.Format("Bluetooth LE - {0} ({1})", desc, Path.GetFileName(dir)), ID = "com.sysprogs.arm.nordic." + famBase + "." + id, ClassID = "com.sysprogs.arm.nordic.nrfx." + id, ProjectFolderName = "BLE " + desc, DefaultEnabled = false, CopyJobs = new CopyJob[] { new CopyJob { SourceFolder = allFamilies[0].Definition.PrimaryHeaderDir + @"\..\components\ble\" + dir, TargetFolder = dir, FilesToCopy = "*.c;*.h", } } }); } fam.Definition.AdditionalFrameworks = fam.Definition.AdditionalFrameworks.Concat(bleFrameworks).ToArray(); // Startup Files StartupFileGenerator.InterruptVectorTable[] aStartupVectors; if (usingIoTSDK) { aStartupVectors = new StartupFileGenerator.InterruptVectorTable[] { GenerateStartupFile(fam.Definition.StartupFileDir, "nRF52") } } ; else { aStartupVectors = new StartupFileGenerator.InterruptVectorTable[] { GenerateStartupFile(fam.Definition.StartupFileDir, "nRF51"), GenerateStartupFile(fam.Definition.StartupFileDir, "nRF52") } }; fam.AttachStartupFiles(aStartupVectors); // SVD Files var aMcuDef1 = (new MCUDefinitionWithPredicate[] { SVDParser.ParseSVDFile(Path.Combine(fam.Definition.PrimaryHeaderDir, "nRF51.svd"), "nRF51") }); aMcuDef1[0].MatchPredicate = m => m.Name.StartsWith("nRF51"); var aMcuDef2 = (new MCUDefinitionWithPredicate[] { SVDParser.ParseSVDFile(Path.Combine(fam.Definition.PrimaryHeaderDir, "nRF52.svd"), "nRF52") }); aMcuDef2[0].MatchPredicate = m => m.Name.StartsWith("nRF52"); fam.AttachPeripheralRegisters(aMcuDef1.Concat(aMcuDef2)); var famObj = fam.GenerateFamilyObject(true); famObj.AdditionalSourceFiles = LoadedBSP.Combine(famObj.AdditionalSourceFiles, projectFiles.Where(f => !MCUFamilyBuilder.IsHeaderFile(f)).ToArray()); famObj.AdditionalHeaderFiles = LoadedBSP.Combine(famObj.AdditionalHeaderFiles, projectFiles.Where(f => MCUFamilyBuilder.IsHeaderFile(f)).ToArray()); famObj.AdditionalSystemVars = LoadedBSP.Combine(famObj.AdditionalSystemVars, commonPseudofamily.Definition.AdditionalSystemVars); famObj.CompilationFlags = famObj.CompilationFlags.Merge(flags); familyDefinitions.Add(famObj); fam.GenerateLinkerScripts(false); SysVarEntry defaultConfigFolder51 = new SysVarEntry { Key = "com.sysprogs.nordic.default_config_suffix", Value = "pca10040/s132" }; // s132_pca10036" }; SysVarEntry defaultConfigFolder52 = new SysVarEntry { Key = "com.sysprogs.nordic.default_config_suffix", Value = "pca10028/s130" }; // s130_pca10028" }; foreach (var mcu in fam.MCUs) { var mcuDef = mcu.GenerateDefinition(fam, bspBuilder, !noPeripheralRegisters); var compatibleSoftdevs = new PropertyEntry.Enumerated.Suggestion[] { new PropertyEntry.Enumerated.Suggestion { InternalValue = "nosoftdev", UserFriendlyName = "None" } }.Concat(bspBuilder.SoftDevices.Where(sd => sd.IsCompatible(mcu.Name)).Select(s => new PropertyEntry.Enumerated.Suggestion { InternalValue = s.Name, UserFriendlyName = s.UserFriendlyName })).ToArray(); if (mcuDef.ConfigurableProperties == null) { mcuDef.ConfigurableProperties = new PropertyList { PropertyGroups = new List <PropertyGroup>() } } ; mcuDef.ConfigurableProperties.PropertyGroups.Add(new PropertyGroup { Properties = new List <PropertyEntry> { new PropertyEntry.Enumerated { UniqueID = NordicBSPBuilder.SoftdevicePropertyID, Name = "Softdevice", DefaultEntryIndex = 1, SuggestionList = compatibleSoftdevs, } } }); if (mcu.Name.StartsWith("nRF52")) { var prop = mcuDef.ConfigurableProperties.PropertyGroups[0].Properties.Find(p => p.UniqueID == "com.sysprogs.bspoptions.arm.floatmode") as PropertyEntry.Enumerated; var idx = Array.FindIndex(prop.SuggestionList, p => p.UserFriendlyName == "Hardware"); prop.DefaultEntryIndex = idx; prop.SuggestionList[idx].UserFriendlyName = "Hardware (required when using a softdevice)"; //Otherwise the system_nrf52.c file won't initialize the FPU and the internal initialization of the softdevice will later fail. mcuDef.AdditionalSystemVars = LoadedBSP.Combine(mcuDef.AdditionalSystemVars, new SysVarEntry[] { defaultConfigFolder51 }); } else { mcuDef.AdditionalSystemVars = LoadedBSP.Combine(mcuDef.AdditionalSystemVars, new SysVarEntry[] { defaultConfigFolder52 }); } mcuDefinitions.Add(mcuDef); } if (fam.Definition.ConditionalFlags != null) { condFlags.AddRange(fam.Definition.ConditionalFlags); } foreach (var fw in fam.GenerateFrameworkDefinitions()) { frameworks.Add(fw); } foreach (var sample in fam.CopySamples(null, new SysVarEntry[] { defaultConfigFolder51 })) { exampleDirs.Add(sample); } // var prioritizer = new SamplePrioritizer(Path.Combine(bspBuilder.Directories.RulesDir, "SamplePriorities.txt")); // exampleDirs.Sort((a, b) => prioritizer.Prioritize(a.RelativePath, b.RelativePath)); } bspBuilder.GenerateSoftdeviceLibraries(); Console.WriteLine("Building BSP archive..."); string strPackageID, strPackageDesc, strPAckVersion; if (usingIoTSDK) { strPackageID = "com.sysprogs.arm.nordic.nrf5x-iot"; strPackageDesc = "Nordic NRF52 IoT"; strPAckVersion = "0.9"; foreach (var mcu in mcuDefinitions) { mcu.UserFriendlyName = mcu.ID + " (IoT)"; } } else { strPackageID = "com.sysprogs.arm.nordic.nrf5x"; strPackageDesc = "Nordic NRF5x Devices"; strPAckVersion = "13.0-alpha"; } BoardSupportPackage bsp = new BoardSupportPackage { PackageID = strPackageID, PackageDescription = strPackageDesc, GNUTargetID = "arm-eabi", GeneratedMakFileName = "nrf5x.mak", MCUFamilies = familyDefinitions.ToArray(), SupportedMCUs = mcuDefinitions.ToArray(), Frameworks = frameworks.ToArray(), Examples = exampleDirs.Where(s => !s.IsTestProjectSample).Select(s => s.RelativePath).ToArray(), TestExamples = exampleDirs.Where(s => s.IsTestProjectSample).Select(s => s.RelativePath).ToArray(), PackageVersion = strPAckVersion, FileConditions = bspBuilder.MatchedFileConditions.ToArray(), MinimumEngineVersion = "5.0", ConditionalFlags = condFlags.ToArray(), }; bspBuilder.Save(bsp, true); } } }
public static TestStatistics TestBSP(TestJob job, LoadedBSP bsp, string temporaryDirectory) { TestStatistics stats = new TestStatistics(); Directory.CreateDirectory(temporaryDirectory); using (var r = new TestResults(Path.Combine(temporaryDirectory, "bsptest.log"))) { LoadedBSP.LoadedMCU[] MCUs; if (job.DeviceRegex == null) { MCUs = bsp.MCUs.ToArray(); } else { var rgFilter = new Regex(job.DeviceRegex); MCUs = bsp.MCUs.Where(mcu => rgFilter.IsMatch(mcu.ExpandedMCU.ID)).ToArray(); } if (job.SkippedDeviceRegex != null) { var rg = new Regex(job.SkippedDeviceRegex); MCUs = MCUs.Where(mcu => !rg.IsMatch(mcu.ExpandedMCU.ID)).ToArray(); } var loadedRules = job.RegisterRenamingRules?.Select(rule => new LoadedRenamingRule(rule))?.ToArray(); var noValidateReg = job.NonValidatedRegisters; foreach (var sample in job.Samples) { r.BeginSample(sample.Name); int cnt = 0, failed = 0, succeeded = 0; var effectiveMCUs = MCUs; if (!string.IsNullOrEmpty(sample.DeviceRegex)) { Regex rgDevice = new Regex(sample.DeviceRegex); effectiveMCUs = MCUs.Where(mcu => rgDevice.IsMatch(mcu.ExpandedMCU.ID)).ToArray(); } foreach (var mcu in effectiveMCUs) { if (string.IsNullOrEmpty(mcu.ExpandedMCU.ID)) { throw new Exception("Invalid MCU ID!"); } var extraParams = job.DeviceParameterSets?.FirstOrDefault(s => s.DeviceRegexObject?.IsMatch(mcu.ExpandedMCU.ID) == true); string mcuDir = Path.Combine(temporaryDirectory, mcu.ExpandedMCU.ID); DateTime start = DateTime.Now; var result = TestMCU(mcu, mcuDir + sample.TestDirSuffix, sample, extraParams, loadedRules, noValidateReg, job.UndefinedMacros); Console.WriteLine($"[{(DateTime.Now - start).TotalMilliseconds:f0} msec]"); if (result == TestResult.Failed) { failed++; } else if (result == TestResult.Succeeded) { succeeded++; } r.LogTestResult(mcu.ExpandedMCU.ID, result); cnt++; Console.WriteLine("{0}: {1}% done ({2}/{3} devices, {4} failed)", sample.Name, (cnt * 100) / effectiveMCUs.Length, cnt, effectiveMCUs.Length, failed); } if ((succeeded + failed) == 0) { throw new Exception("Not a single MCU supports " + sample.Name); } r.EndSample(); stats.Passed += succeeded; stats.Failed += failed; } } return(stats); }
public void AdjustDebugMethod(LoadedBSP.ConfiguredMCU mcu, ConfiguredDebugMethod method) { }
private static TestResult BuildAndRunValidationJob(LoadedBSP.LoadedMCU mcu, string mcuDir, bool validateRegisters, LoadedRenamingRule[] renameRules, GeneratedProject prj, ToolFlags flags, Dictionary<string, bool> sourceExtensions, string[] nonValidateReg, BSPEngine.VendorSample vendorSample = null) { BuildJob job = new BuildJob(); string prefix = string.Format("{0}\\{1}\\{2}-", mcu.BSP.Toolchain.Directory, mcu.BSP.Toolchain.Toolchain.BinaryDirectory, mcu.BSP.Toolchain.Toolchain.GNUTargetID); job.OtherTasks.Add(new BuildTask { Executable = prefix + "g++", Arguments = $"{flags.EffectiveLDFLAGS} $^ -o $@", AllInputs = prj.SourceFiles.Where(f => sourceExtensions.ContainsKey(Path.GetExtension(f).TrimStart('.'))) .Select(f => Path.ChangeExtension(Path.GetFileName(f), ".o")) .Concat(prj.SourceFiles.Where(f => f.EndsWith(".a", StringComparison.InvariantCultureIgnoreCase))) .ToArray(), PrimaryOutput = "test.elf", }); job.OtherTasks.Add(new BuildTask { Executable = prefix + "objcopy", Arguments = "-O binary $< $@", AllInputs = new[] { "test.elf" }, PrimaryOutput = "test.bin", }); foreach (var sf in prj.SourceFiles) { string ext = Path.GetExtension(sf); if (!sourceExtensions.ContainsKey(ext.TrimStart('.'))) { if (ext != ".txt") Console.WriteLine($"#{sf} is not a recognized source file"); } else { bool isCpp = ext.ToLower() != ".c"; string obj = Path.ChangeExtension(Path.GetFileName(sf), ".o"); job.CompileTasks.Add(new BuildTask { PrimaryOutput = Path.ChangeExtension(Path.GetFileName(sf), ".o"), AllInputs = new[] { sf }, Executable = prefix + (isCpp ? "g++" : "gcc"), Arguments = $"-c $< {flags.GetEffectiveCFLAGS(isCpp)} -o {obj}", }); } } job.GenerateMakeFile(Path.Combine(mcuDir, "Makefile"), "test.bin"); if (!string.IsNullOrEmpty(mcu.MCUDefinitionFile) && validateRegisters) { string firstSrcFileInPrjDir = prj.SourceFiles.First(fn => Path.GetDirectoryName(fn) == mcuDir); InsertRegisterValidationCode(firstSrcFileInPrjDir, XmlTools.LoadObject<MCUDefinition>(mcu.MCUDefinitionFile), renameRules, nonValidateReg); } Console.Write("Building {0}...", Path.GetFileName(mcuDir)); bool buildSucceeded; if (false) { var proc = Process.Start(new ProcessStartInfo("cmd.exe", "/c " + Path.Combine(mcu.BSP.Toolchain.Directory, mcu.BSP.Toolchain.Toolchain.BinaryDirectory, "make.exe") + " -j" + Environment.ProcessorCount + " > build.log 2>&1") { UseShellExecute = false, CreateNoWindow = true, WorkingDirectory = mcuDir }); proc.WaitForExit(); buildSucceeded = proc.ExitCode == 0; } else { buildSucceeded = job.BuildFast(mcuDir, Environment.ProcessorCount); } bool success = false; string mapFile = Path.Combine(mcuDir, GeneratedProject.MapFileName); if (buildSucceeded && File.Exists(mapFile)) { success = File.ReadAllLines(Path.Combine(mcuDir, mapFile)).Where(l => RgMainMap.IsMatch(l)).Count() > 0; if (success) { string binFile = Path.Combine(mcuDir, "test.bin"); using (var fs = File.Open(binFile, FileMode.Open)) if (fs.Length < 512) success = false; } } if (!success) return TestResult.Failed; if (vendorSample != null) { FillSampleDependenciesFromDepFiles(vendorSample, mcuDir); } Directory.Delete(mcuDir, true); return TestResult.Succeeded; }
public ICustomBSPConfigurator CreateConfigurator(LoadedBSP.ConfiguredMCU mcu, DebugMethod method) { return null; }
private static TestResult TestVendorSample(LoadedBSP.LoadedMCU mcu, BSPEngine.VendorSample vs, string mcuDir, bool pSoftFPU, VendorSampleDirectory sampleDir) { var configuredMCU = new LoadedBSP.ConfiguredMCU(mcu, GetDefaultPropertyValues(mcu.ExpandedMCU.ConfigurableProperties)); if (configuredMCU.ExpandedMCU.FLASHSize == 0) { configuredMCU.Configuration["com.sysprogs.bspoptions.primary_memory"] = "sram"; } var bspDict = configuredMCU.BuildSystemDictionary(new BSPManager(), null); bspDict["PROJECTNAME"] = "test"; bspDict["SYS:VSAMPLE_DIR"] = sampleDir.Path; var prj = new GeneratedProject(configuredMCU, vs, mcuDir, bspDict, vs.Configuration.Frameworks ?? new string[0]); var frameworkCfg = PropertyDictionary2.ReadPropertyDictionary(vs.Configuration.Configuration); var frameworkIDs = vs.Configuration.Frameworks?.ToDictionary(fw => fw, fw => true); prj.AddBSPFilesToProject(bspDict, frameworkCfg, frameworkIDs); var flags = prj.GetToolFlags(bspDict, frameworkCfg, frameworkIDs); //ToolFlags flags = new ToolFlags { CXXFLAGS = " ", COMMONFLAGS = "-mcpu=cortex-m3 -mthumb", LDFLAGS = "-Wl,-gc-sections -Wl,-Map," + "test.map", CFLAGS = "-ffunction-sections -Os -MD" }; if (!pSoftFPU) flags.COMMONFLAGS = flags.COMMONFLAGS.Replace("soft", "hard"); flags.CFLAGS += " -MD"; flags.CXXFLAGS += " -MD"; flags.IncludeDirectories = LoadedBSP.Combine(flags.IncludeDirectories, vs.IncludeDirectories); flags.PreprocessorMacros = LoadedBSP.Combine(flags.PreprocessorMacros, vs.PreprocessorMacros); flags = LoadedBSP.ConfiguredMCU.ExpandToolFlags(flags, bspDict, null); Dictionary<string, bool> sourceExtensions = new Dictionary<string, bool>(StringComparer.InvariantCultureIgnoreCase); sourceExtensions.Add("c", true); sourceExtensions.Add("cpp", true); return BuildAndRunValidationJob(mcu, mcuDir, false, null, prj, flags, sourceExtensions, null, vs); }
static void Main(string[] args) { if (args.Length < 1) { throw new Exception("Usage: tiva.exe <Tiva SW package directory>"); } var bspBuilder = new TivaBSPBuilder(new BSPDirectories(args[0], @"..\..\Output", @"..\..\rules")); var devices = BSPGeneratorTools.ReadMCUDevicesFromCommaDelimitedCSVFile(bspBuilder.Directories.RulesDir + @"\Tivadevices.csv", "Part Number", "Flash (KB)", "SRAM(kB)", "CPU", true); List <MCUFamilyBuilder> allFamilies = new List <MCUFamilyBuilder>(); foreach (var fn in Directory.GetFiles(bspBuilder.Directories.RulesDir + @"\Families", "*.xml")) { allFamilies.Add(new MCUFamilyBuilder(bspBuilder, XmlTools.LoadObject <FamilyDefinition>(fn))); } var rejects = BSPGeneratorTools.AssignMCUsToFamilies(devices, allFamilies); List <MCUFamily> familyDefinitions = new List <MCUFamily>(); List <MCU> mcuDefinitions = new List <MCU>(); List <EmbeddedFramework> frameworks = new List <EmbeddedFramework>(); List <MCUFamilyBuilder.CopiedSample> exampleDirs = new List <MCUFamilyBuilder.CopiedSample>(); bool noPeripheralRegisters = args.Contains("/noperiph"); List <KeyValuePair <string, string> > macroToHeaderMap = new List <KeyValuePair <string, string> >(); var commonPseudofamily = new MCUFamilyBuilder(bspBuilder, XmlTools.LoadObject <FamilyDefinition>(bspBuilder.Directories.RulesDir + @"\CommonFiles.xml")); var flags = new ToolFlags(); List <string> projectFiles = new List <string>(); commonPseudofamily.CopyFamilyFiles(ref flags, projectFiles); foreach (var sample in commonPseudofamily.CopySamples()) { exampleDirs.Add(sample); } foreach (var fam in allFamilies) { var rejectedMCUs = fam.RemoveUnsupportedMCUs(true); if (rejectedMCUs.Length != 0) { Console.WriteLine("Unsupported {0} MCUs:", fam.Definition.Name); foreach (var mcu in rejectedMCUs) { Console.WriteLine("\t{0}", mcu.Name); } } foreach (var mcu in fam.MCUs) { string fn = string.Format("{0}\\inc\\{1}.h", fam.Definition.PrimaryHeaderDir, mcu.Name); if (!File.Exists(fn)) { throw new Exception("Missing device header file"); } macroToHeaderMap.Add(new KeyValuePair <string, string>(mcu.Name, mcu.Name.ToLower() + ".h")); } fam.AttachStartupFiles(ParseStartupFiles(fam.Definition.PrimaryHeaderDir, "startup_gcc.c", fam)); if (!noPeripheralRegisters) { fam.AttachPeripheralRegisters(ParsePeripheralRegisters(fam.Definition.PrimaryHeaderDir)); } var famObj = fam.GenerateFamilyObject(true); famObj.AdditionalSourceFiles = LoadedBSP.Combine(famObj.AdditionalSourceFiles, projectFiles.Where(f => !MCUFamilyBuilder.IsHeaderFile(f)).ToArray()); famObj.AdditionalHeaderFiles = LoadedBSP.Combine(famObj.AdditionalHeaderFiles, projectFiles.Where(f => MCUFamilyBuilder.IsHeaderFile(f)).ToArray()); famObj.AdditionalSystemVars = LoadedBSP.Combine(famObj.AdditionalSystemVars, commonPseudofamily.Definition.AdditionalSystemVars); famObj.CompilationFlags = famObj.CompilationFlags.Merge(flags); familyDefinitions.Add(famObj); fam.GenerateLinkerScripts(false); foreach (var mcu in fam.MCUs) { mcuDefinitions.Add(mcu.GenerateDefinition(fam, bspBuilder, !noPeripheralRegisters)); } foreach (var fw in fam.GenerateFrameworkDefinitions()) { frameworks.Add(fw); } foreach (var sample in fam.CopySamples()) { exampleDirs.Add(sample); } } using (var sw = File.CreateText(Path.Combine(bspBuilder.BSPRoot, "SDK", "inc", "tiva_device.h"))) { sw.WriteLine("#pragma once"); sw.WriteLine(); bool first = true; foreach (var kv in macroToHeaderMap) { sw.WriteLine("#{0}if defined({1})", first ? "" : "el", kv.Key); sw.WriteLine("\t#include \"{0}\"", kv.Value); first = false; } sw.WriteLine("#else"); sw.WriteLine("#error Device type not specified"); sw.WriteLine("#endif"); } BoardSupportPackage bsp = new BoardSupportPackage { PackageID = "com.sysprogs.arm.ti.tiva", PackageDescription = "TI Tiva Devices", GNUTargetID = "arm-eabi", GeneratedMakFileName = "tiva.mak", MCUFamilies = familyDefinitions.ToArray(), SupportedMCUs = mcuDefinitions.ToArray(), Frameworks = frameworks.ToArray(), Examples = exampleDirs.Where(s => !s.IsTestProjectSample).Select(s => s.RelativePath).ToArray(), TestExamples = exampleDirs.Where(s => s.IsTestProjectSample).Select(s => s.RelativePath).ToArray(), PackageVersion = "2.1.4.178" }; bspBuilder.Save(bsp, true); }
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()); } }
public static TestStatistics TestBSP(TestJob job, LoadedBSP bsp, string temporaryDirectory) { TestStatistics stats = new TestStatistics(); Directory.CreateDirectory(temporaryDirectory); using (var r = new TestResults(Path.Combine(temporaryDirectory, "bsptest.log"))) { LoadedBSP.LoadedMCU[] MCUs; if (job.DeviceRegex == null) MCUs = bsp.MCUs.ToArray(); else { var rgFilter = new Regex(job.DeviceRegex); MCUs = bsp.MCUs.Where(mcu => rgFilter.IsMatch(mcu.ExpandedMCU.ID)).ToArray(); } if (job.SkippedDeviceRegex != null) { var rg = new Regex(job.SkippedDeviceRegex); MCUs = MCUs.Where(mcu => !rg.IsMatch(mcu.ExpandedMCU.ID)).ToArray(); } var loadedRules = job.RegisterRenamingRules?.Select(rule => new LoadedRenamingRule(rule))?.ToArray(); var noValidateReg = job.NonValidatedRegisters; foreach (var sample in job.Samples) { r.BeginSample(sample.Name); int cnt = 0, failed = 0, succeeded = 0; foreach (var mcu in MCUs) { if (string.IsNullOrEmpty(mcu.ExpandedMCU.ID)) throw new Exception("Invalid MCU ID!"); var extraParams = job.DeviceParameterSets?.FirstOrDefault(s => s.DeviceRegexObject?.IsMatch(mcu.ExpandedMCU.ID) == true); string mcuDir = Path.Combine(temporaryDirectory, mcu.ExpandedMCU.ID); DateTime start = DateTime.Now; var result = TestMCU(mcu, mcuDir + sample.TestDirSuffix, sample, extraParams, loadedRules, noValidateReg); Console.WriteLine($"[{(DateTime.Now - start).TotalMilliseconds:f0} msec]"); if (result == TestResult.Failed) failed++; else if (result == TestResult.Succeeded) succeeded++; r.LogTestResult(mcu.ExpandedMCU.ID, result); cnt++; Console.WriteLine("{0}: {1}% done ({2}/{3} devices, {4} failed)", sample.Name, (cnt * 100) / MCUs.Length, cnt, MCUs.Length, failed); } if (succeeded == 0) throw new Exception("Not a single MCU supports " + sample.Name); r.EndSample(); stats.Passed += succeeded; stats.Failed += failed; } } return stats; }
static void Main(string[] args) { if (args.Length < 1) { throw new Exception("Usage: nrf5x.exe <Nordic SW package directory>"); } bool usingIoTSDK = false; /* if (Directory.Exists(Path.Combine(args[0], @"components\iot\ble_6lowpan"))) * { * usingIoTSDK = true; * Console.WriteLine("Detected IoT SDK"); * }*/ if (usingIoTSDK) { bspBuilder = new NordicBSPBuilder(new BSPDirectories(args[0], @"..\..\Output", @"..\..\rules_iot")); bspBuilder.SoftDevices.Add(new NordicBSPBuilder.SoftDevice("s1xx_iot", 0x1f000, 0x2800, "nrf52", "IoT", bspBuilder.Directories.InputDir)); } else { bspBuilder = new NordicBSPBuilder(new BSPDirectories(args[0], @"..\..\Output", @"..\..\rules")); bspBuilder.SoftDevices.Add(new NordicBSPBuilder.SoftDevice("S132", "nrf52832.*", null, bspBuilder.Directories.InputDir)); bspBuilder.SoftDevices.Add(new NordicBSPBuilder.SoftDevice("S140", "nrf52840.*", null, bspBuilder.Directories.InputDir)); bspBuilder.SoftDevices.Add(new NordicBSPBuilder.SoftDevice("S112", "nrf52810.*", null, bspBuilder.Directories.InputDir)); } List <MCUBuilder> devices = new List <MCUBuilder>(); #if NRF51_SUPPORT if (!usingIoTSDK) { foreach (string part in new string[] { "nRF51822", "nRF51422" }) { devices.Add(new MCUBuilder { Name = part + "_XXAA", FlashSize = 256 * 1024, RAMSize = 16 * 1024, Core = CortexCore.M0 }); devices.Add(new MCUBuilder { Name = part + "_XXAB", FlashSize = 128 * 1024, RAMSize = 16 * 1024, Core = CortexCore.M0 }); devices.Add(new MCUBuilder { Name = part + "_XXAC", FlashSize = 256 * 1024, RAMSize = 32 * 1024, Core = CortexCore.M0 }); } } #endif devices.Add(new MCUBuilder { Name = "nRF52832_XXAA", FlashSize = 512 * 1024, RAMSize = 64 * 1024, Core = CortexCore.M4, StartupFile = "$$SYS:BSP_ROOT$$/nRF5x/components/toolchain/gcc/gcc_startup_nrf52.S" }); devices.Add(new MCUBuilder { Name = "nRF52840_XXAA", FlashSize = 1024 * 1024, RAMSize = 256 * 1024, Core = CortexCore.M4, StartupFile = "$$SYS:BSP_ROOT$$/nRF5x/components/toolchain/gcc/gcc_startup_nrf52840.S" }); devices.Add(new MCUBuilder { Name = "nRF52810_XXAA", FlashSize = 192 * 1024, RAMSize = 24 * 1024, Core = CortexCore.M4_NOFPU, StartupFile = "$$SYS:BSP_ROOT$$/nRF5x/components/toolchain/gcc/gcc_startup_nrf52810.S" }); List <MCUFamilyBuilder> allFamilies = new List <MCUFamilyBuilder>(); foreach (var fn in Directory.GetFiles(bspBuilder.Directories.RulesDir + @"\Families", "*.xml")) { allFamilies.Add(new NordicFamilyBuilder(bspBuilder, XmlTools.LoadObject <FamilyDefinition>(fn))); } var rejects = BSPGeneratorTools.AssignMCUsToFamilies(devices, allFamilies); List <EmbeddedFramework> frameworks = new List <EmbeddedFramework>(); List <MCUFamilyBuilder.CopiedSample> exampleDirs = new List <MCUFamilyBuilder.CopiedSample>(); bool noPeripheralRegisters = true; List <MCUFamily> familyDefinitions = new List <MCUFamily>(); List <MCU> mcuDefinitions = new List <MCU>(); var commonPseudofamily = new MCUFamilyBuilder(bspBuilder, XmlTools.LoadObject <FamilyDefinition>(bspBuilder.Directories.RulesDir + @"\CommonFiles.xml")); var flags = new ToolFlags(); List <string> projectFiles = new List <string>(); commonPseudofamily.CopyFamilyFiles(ref flags, projectFiles); flags = flags.Merge(commonPseudofamily.Definition.CompilationFlags); List <ConditionalToolFlags> condFlags = new List <ConditionalToolFlags>(); foreach (var fam in allFamilies) { fam.GenerateLinkerScripts(false); Console.WriteLine("Processing " + fam.Definition.Name + " family..."); string famBase = fam.Definition.Name.Substring(0, 5).ToLower(); var rejectedMCUs = fam.RemoveUnsupportedMCUs(true); if (rejectedMCUs.Length != 0) { Console.WriteLine("Unsupported {0} MCUs:", fam.Definition.Name); foreach (var mcu in rejectedMCUs) { Console.WriteLine("\t{0}", mcu.Name); } } List <Framework> bleFrameworks = new List <Framework>(); foreach (var line in File.ReadAllLines(bspBuilder.Directories.RulesDir + @"\BLEFrameworks.txt")) { int idx = line.IndexOf('|'); string dir = line.Substring(0, idx); string desc = line.Substring(idx + 1); string id = Path.GetFileName(dir); if (!id.StartsWith("ble_")) { id = "ble_" + id; } if (dir.StartsWith("services\\", StringComparison.CurrentCultureIgnoreCase)) { id = "ble_svc_" + id.Substring(4); } bleFrameworks.Add(new Framework { Name = string.Format("Bluetooth LE - {0} ({1})", desc, Path.GetFileName(dir)), ID = "com.sysprogs.arm.nordic." + famBase + "." + id, ClassID = "com.sysprogs.arm.nordic.nrfx." + id, ProjectFolderName = "BLE " + desc, DefaultEnabled = false, CopyJobs = new CopyJob[] { new CopyJob { SourceFolder = allFamilies[0].Definition.PrimaryHeaderDir + @"\..\components\ble\" + dir, TargetFolder = dir, FilesToCopy = "*.c;*.h", } } }); } fam.Definition.AdditionalFrameworks = fam.Definition.AdditionalFrameworks.Concat(bleFrameworks).ToArray(); // Starting from SDK 14.0 we use the original Nordic startup files & linker scripts as they contain various non-trivial logic #if GENERATE_STARTUP_FILES StartupFileGenerator.InterruptVectorTable[] aStartupVectors; if (usingIoTSDK) { aStartupVectors = new StartupFileGenerator.InterruptVectorTable[] { GenerateStartupFile(fam.Definition.StartupFileDir, "nRF52") } } ; else { aStartupVectors = new StartupFileGenerator.InterruptVectorTable[] { GenerateStartupFile(fam.Definition.StartupFileDir, "nRF51"), GenerateStartupFile(fam.Definition.StartupFileDir, "nRF52") } }; fam.AttachStartupFiles(aStartupVectors); #endif // SVD Files var aMcuDef1 = (new MCUDefinitionWithPredicate[] { SVDParser.ParseSVDFile(Path.Combine(fam.Definition.PrimaryHeaderDir, "nRF51.svd"), "nRF51") }); aMcuDef1[0].MatchPredicate = m => m.Name.StartsWith("nRF51"); var aMcuDef2 = (new MCUDefinitionWithPredicate[] { SVDParser.ParseSVDFile(Path.Combine(fam.Definition.PrimaryHeaderDir, "nRF52.svd"), "nRF52") }); aMcuDef2[0].MatchPredicate = m => m.Name.StartsWith("nRF52"); fam.AttachPeripheralRegisters(aMcuDef1.Concat(aMcuDef2)); var famObj = fam.GenerateFamilyObject(true); famObj.AdditionalSourceFiles = LoadedBSP.Combine(famObj.AdditionalSourceFiles, projectFiles.Where(f => !MCUFamilyBuilder.IsHeaderFile(f)).ToArray()); famObj.AdditionalHeaderFiles = LoadedBSP.Combine(famObj.AdditionalHeaderFiles, projectFiles.Where(f => MCUFamilyBuilder.IsHeaderFile(f)).ToArray()); famObj.AdditionalSystemVars = LoadedBSP.Combine(famObj.AdditionalSystemVars, commonPseudofamily.Definition.AdditionalSystemVars); famObj.CompilationFlags = famObj.CompilationFlags.Merge(flags); familyDefinitions.Add(famObj); fam.GenerateLinkerScripts(false); SysVarEntry suffixEntry = null; foreach (var mcu in fam.MCUs) { var mcuDef = mcu.GenerateDefinition(fam, bspBuilder, !noPeripheralRegisters, false, MCUFamilyBuilder.CoreSpecificFlags.All & ~MCUFamilyBuilder.CoreSpecificFlags.PrimaryMemory); if (mcu.Name.StartsWith("nRF52832")) { //Although documented as a legacy definition, skipping this breaks fds_internal_defs.h mcuDef.CompilationFlags.PreprocessorMacros = mcuDef.CompilationFlags.PreprocessorMacros.Concat(new[] { "NRF52" }).ToArray(); } var compatibleSoftdevs = new[] { new PropertyEntry.Enumerated.Suggestion { InternalValue = "nosoftdev", UserFriendlyName = "None" } } .Concat(bspBuilder.SoftDevices.Where(sd => sd.IsCompatible(mcu.Name)) .SelectMany(s => new[] { new PropertyEntry.Enumerated.Suggestion { InternalValue = s.Name, UserFriendlyName = s.UserFriendlyName }, new PropertyEntry.Enumerated.Suggestion { InternalValue = s.Name + "_reserve", UserFriendlyName = $"{s.UserFriendlyName} (programmed separately)" } })) .ToArray(); if (mcuDef.ConfigurableProperties == null) { mcuDef.ConfigurableProperties = new PropertyList { PropertyGroups = new List <PropertyGroup>() } } ; mcuDef.ConfigurableProperties.PropertyGroups.Add(new PropertyGroup { Properties = new List <PropertyEntry> { new PropertyEntry.Enumerated { UniqueID = NordicBSPBuilder.SoftdevicePropertyID, Name = "Softdevice", DefaultEntryIndex = 1, SuggestionList = compatibleSoftdevs, } } }); if (mcu.Name.StartsWith("nRF52") && !mcu.Name.StartsWith("nRF52810")) { var prop = mcuDef.ConfigurableProperties.PropertyGroups[0].Properties.Find(p => p.UniqueID == "com.sysprogs.bspoptions.arm.floatmode") as PropertyEntry.Enumerated; var idx = Array.FindIndex(prop.SuggestionList, p => p.UserFriendlyName == "Hardware"); prop.DefaultEntryIndex = idx; prop.SuggestionList[idx].UserFriendlyName = "Hardware (required when using a softdevice)"; //Otherwise the system_nrf52.c file won't initialize the FPU and the internal initialization of the softdevice will later fail. } string defaultConfig; if (mcu.Name.StartsWith("nRF52840")) { defaultConfig = "pca10056/s140"; } else if (mcu.Name.StartsWith("nRF52810")) { defaultConfig = "pca10040e/s112"; } else { defaultConfig = "pca10040/s132"; } suffixEntry = new SysVarEntry { Key = "com.sysprogs.nordic.default_config_suffix", Value = defaultConfig }; mcuDef.AdditionalSystemVars = LoadedBSP.Combine(mcuDef.AdditionalSystemVars, new SysVarEntry[] { suffixEntry }); mcuDefinitions.Add(mcuDef); } if (fam.Definition.ConditionalFlags != null) { condFlags.AddRange(fam.Definition.ConditionalFlags); } foreach (var fw in fam.GenerateFrameworkDefinitions()) { frameworks.Add(fw); } foreach (var sample in fam.CopySamples(null, new SysVarEntry[] { new SysVarEntry { Key = "com.sysprogs.nordic.default_config_suffix", Value = "pca10040e/s112" } })) { exampleDirs.Add(sample); } } const string softdevExpression = "$$com.sysprogs.bspoptions.nrf5x.softdevice$$"; foreach (var softdev in bspBuilder.SoftDevices) { condFlags.Add(new ConditionalToolFlags { FlagCondition = new Condition.Equals { Expression = softdevExpression, ExpectedValue = softdev.Name + "_reserve" }, Flags = new ToolFlags { PreprocessorMacros = familyDefinitions.First().CompilationFlags.PreprocessorMacros.Where(f => f.Contains(softdevExpression)).Select(f => f.Replace(softdevExpression, softdev.Name)).ToArray(), IncludeDirectories = familyDefinitions.First().CompilationFlags.IncludeDirectories.Where(f => f.Contains(softdevExpression)).Select(f => f.Replace(softdevExpression, softdev.Name)).ToArray() } }); } bspBuilder.GenerateSoftdeviceLibraries(); Console.WriteLine("Building BSP archive..."); string strPackageID, strPackageDesc, strPAckVersion; if (usingIoTSDK) { strPackageID = "com.sysprogs.arm.nordic.nrf5x-iot"; strPackageDesc = "Nordic NRF52 IoT"; strPAckVersion = "0.9"; foreach (var mcu in mcuDefinitions) { mcu.UserFriendlyName = mcu.ID + " (IoT)"; } } else { strPackageID = "com.sysprogs.arm.nordic.nrf5x"; strPackageDesc = "Nordic NRF52x Devices"; strPAckVersion = "14.2R2"; } BoardSupportPackage bsp = new BoardSupportPackage { PackageID = strPackageID, PackageDescription = strPackageDesc, GNUTargetID = "arm-eabi", GeneratedMakFileName = "nrf5x.mak", MCUFamilies = familyDefinitions.ToArray(), SupportedMCUs = mcuDefinitions.ToArray(), Frameworks = frameworks.ToArray(), Examples = exampleDirs.Where(s => !s.IsTestProjectSample).Select(s => s.RelativePath).ToArray(), TestExamples = exampleDirs.Where(s => s.IsTestProjectSample).Select(s => s.RelativePath).ToArray(), PackageVersion = strPAckVersion, FileConditions = bspBuilder.MatchedFileConditions.ToArray(), MinimumEngineVersion = "5.0", ConditionalFlags = condFlags.ToArray(), InitializationCodeInsertionPoints = commonPseudofamily.Definition.InitializationCodeInsertionPoints, }; bspBuilder.Save(bsp, true, false); } }
private static TestResult TestMCU(LoadedBSP.LoadedMCU mcu, string mcuDir, TestedSample sample, DeviceParameterSet extraParameters, LoadedRenamingRule[] renameRules, string[] nonValidateReg) { const int RepeatCount = 20; for (var i = 0; i < RepeatCount; ++i) { if (!Directory.Exists(mcuDir)) { break; } Console.WriteLine("Deleting " + mcuDir + "..."); Directory.Delete(mcuDir, true); if (i == RepeatCount - 1) { throw new Exception("Cannot remove folder!"); } Thread.Sleep(50); } for (var i = 0; i < RepeatCount; ++i) { if (Directory.Exists(mcuDir)) { break; } Directory.CreateDirectory(mcuDir); if (i == RepeatCount - 1) { throw new Exception("Cannot create folder!"); } Thread.Sleep(50); } var configuredMCU = new LoadedBSP.ConfiguredMCU(mcu, GetDefaultPropertyValues(mcu.ExpandedMCU.ConfigurableProperties)); if (configuredMCU.ExpandedMCU.FLASHSize == 0) { configuredMCU.Configuration["com.sysprogs.bspoptions.primary_memory"] = "sram"; } var samples = mcu.BSP.GetSamplesForMCU(mcu.ExpandedMCU.ID, false); LoadedBSP.LoadedSample sampleObj; if (string.IsNullOrEmpty(sample.Name)) sampleObj = samples[0]; else sampleObj = samples.FirstOrDefault(s => s.Sample.Name == sample.Name); if (sampleObj == null) { if (sample.SkipIfNotFound) { Directory.Delete(mcuDir, true); return TestResult.Skipped; } else throw new Exception("Cannot find sample: " + sample.Name); } string[] frameworks = sampleObj.Sample.RequiredFrameworks ?? new string[0]; //frameworkCfg["com.sysprogs.bspoptions.stm32.freertos.heap"] = "heap_4"; //frameworkCfg["com.sysprogs.bspoptions.stm32.freertos.portcore"] = "CM0"; //frameworkCfg["com.sysprogs.bspoptions.stm32.usb.devclass"] = "CDC"; //frameworkCfg["com.sysprogs.bspoptions.stm32.usb.speed"] = "FS"; var configuredSample = new ConfiguredSample { Sample = sampleObj, Parameters = GetDefaultPropertyValues(sampleObj.Sample.ConfigurableProperties), Frameworks = (sampleObj.Sample.RequiredFrameworks == null) ? null : sampleObj.Sample.RequiredFrameworks.Select(fwId => { return configuredMCU.BSP.BSP.Frameworks.First(fwO => fwO.ID == fwId || fwO.ClassID == fwId && fwO.IsCompatibleWithMCU(configuredMCU.ExpandedMCU.ID)); }).ToList(), FrameworkParameters = new Dictionary<string, string>(), }; ApplyConfiguration(configuredMCU.Configuration, extraParameters?.MCUConfiguration, sample.MCUConfiguration); //configuredSample.Parameters["com.sysprogs.examples.ledblink.LEDPORT"] = "GPIOA"; //configuredSample.Parameters["com.sysprogs.examples.stm32.LEDPORT"] = "GPIOA"; //configuredSample.Parameters["com.sysprogs.examples.stm32.freertos.heap_size"] = "0"; var bspDict = configuredMCU.BuildSystemDictionary(new BSPManager(), null); bspDict["PROJECTNAME"] = "test"; if (configuredSample.Frameworks != null) foreach (var fw in configuredSample.Frameworks) { if (fw.AdditionalSystemVars != null) foreach (var kv in fw.AdditionalSystemVars) bspDict[kv.Key] = kv.Value; if (fw.ConfigurableProperties != null) { var defaultFwConfig = GetDefaultPropertyValues(fw.ConfigurableProperties); if (defaultFwConfig != null) foreach (var kv in defaultFwConfig) configuredSample.FrameworkParameters[kv.Key] = kv.Value; } } if (sampleObj.Sample?.DefaultConfiguration?.Entries != null) foreach (var kv in sampleObj.Sample.DefaultConfiguration.Entries) configuredSample.FrameworkParameters[kv.Key] = kv.Value; ApplyConfiguration(configuredSample.FrameworkParameters, extraParameters?.FrameworkConfiguration, sample.FrameworkConfiguration); ApplyConfiguration(configuredSample.Parameters, extraParameters?.SampleConfiguration, sample.SampleConfiguration); var prj = new GeneratedProject(mcuDir, configuredMCU, frameworks); prj.DoGenerateProjectFromEmbeddedSample(configuredSample, false, bspDict); Dictionary<string, bool> frameworkIDs = new Dictionary<string, bool>(); if (frameworks != null) foreach (var fw in frameworks) frameworkIDs[fw] = true; if (sample.AdditionalFrameworks != null) foreach (var fw in sample.AdditionalFrameworks) frameworkIDs[fw] = true; prj.AddBSPFilesToProject(bspDict, configuredSample.FrameworkParameters, frameworkIDs); var flags = prj.GetToolFlags(bspDict, configuredSample.FrameworkParameters, frameworkIDs); Dictionary<string, bool> sourceExtensions = new Dictionary<string, bool>(StringComparer.InvariantCultureIgnoreCase); foreach (var ext in sample.SourceFileExtensions.Split(';')) sourceExtensions[ext] = true; return BuildAndRunValidationJob(mcu, mcuDir, sample.ValidateRegisters, renameRules, prj, flags, sourceExtensions, nonValidateReg); }
private void GenerateMCUsAndMCUFamilies() { foreach (var mcuFamilyBuilder in _mcuFamilyBuilders) { var vectorTables = new List <StartupFileGenerator.InterruptVector[]>(); var vectorTableFiles = Directory.GetFiles( mcuFamilyBuilder.Definition.PrimaryHeaderDir + VECTOR_TABLE_RELATIVE_PATH, VECTOR_TABLE_FILE_PATTERN); foreach (var vectorTableFile in vectorTableFiles) { StartupFileGenerator.InterruptVector[] vectorTable = null; vectorTable = StartupFileGenerator.ParseInterruptVectors( vectorTableFile, @"^[ \t]*__isr_vector[ \t]*:", @"^[ \t]*.size[ \t]+__isr_vector", @"^[ \t]*.long[ \t]+(\w+)[ \t]*(\/\*[\s]*[\w \t\(,';\-\/\)]*[\s]*\*\/)", null, @"^[ \t\r\n]+(\/\*[ \w]+\*\/)?$", null, 1, 2); if (vectorTable.Length > 0) { var defaultISRNumber = 0; foreach (var vector in vectorTable) { if (vector == null) { continue; } if (vector.Name == DEFAULT_ISR_NAME) { vector.Name = DEFAULT_ISR_NAME + defaultISRNumber++; } else if (vector.Name == TRIM_VALUE) { vector.SpecialVectorValue = TRIM_VALUE; vector.Name = TRIM_VALUE_NAME; } } vectorTables.Add(vectorTable); } } if (vectorTables.Count == 0) { throw new Exception("Didn't find any vector table"); } CheckVectorTables(vectorTables); Directory.CreateDirectory(Path.Combine(Directories.OutputDir, mcuFamilyBuilder.FamilyFilePrefix)); GenerateStartupFiles(mcuFamilyBuilder, vectorTables[0]); if (_parsePeripheralRegisters) { var headerFiles = Directory.GetFiles(mcuFamilyBuilder.Definition.PrimaryHeaderDir + "/include", "*.h"); var familyHeaderFiles = headerFiles .Where(file => file.Substring(file.LastIndexOf(Path.DirectorySeparatorChar) + 1) == "M" + mcuFamilyBuilder.Definition.Name + ".h").ToArray(); if (familyHeaderFiles.Length == 0) { throw new Exception("No header file found for MCU family"); } else if (familyHeaderFiles.Length > 1) { throw new Exception("Only one header file expected for MCU family"); } mcuFamilyBuilder.AttachPeripheralRegisters(new[] { new MCUDefinitionWithPredicate { MCUName = mcuFamilyBuilder.Definition.Name, RegisterSets = PeripheralRegisterGenerator.GenerateFamilyPeripheralRegisters(familyHeaderFiles[0]), MatchPredicate = m => true } }); } var famObj = mcuFamilyBuilder.GenerateFamilyObject(true); famObj.ConfigurableProperties.PropertyGroups[0].Properties.Add( new PropertyEntry.Boolean { Name = "Disable Watchdog", UniqueID = "com.sysprogs.bspoptions.wdog", ValueForTrue = "DISABLE_WDOG", DefaultValue = true } ); famObj.AdditionalSourceFiles = new string[] { "$$SYS:BSP_ROOT$$/" + mcuFamilyBuilder.FamilyFilePrefix + STARTUP_FILES_FOLDER + "/startup.c", "$$SYS:BSP_ROOT$$/" + mcuFamilyBuilder.FamilyFilePrefix + STARTUP_FILES_FOLDER + "/vectors_" + mcuFamilyBuilder.Definition.Name + ".c" }; var deviceSpecificFiles = _projectFiles.Where(file => file.Contains("devices") || file.Contains("CMSIS")); famObj.AdditionalSourceFiles = LoadedBSP.Combine(famObj.AdditionalSourceFiles, deviceSpecificFiles.Where(f => f.Contains(famObj.ID) && !MCUFamilyBuilder.IsHeaderFile(f)).ToArray()); famObj.AdditionalHeaderFiles = LoadedBSP.Combine(famObj.AdditionalHeaderFiles, deviceSpecificFiles. Where(f => (f.Contains(famObj.ID) || f.Contains("CMSIS") || f.Contains("fsl_device_registers.h")) && MCUFamilyBuilder.IsHeaderFile(f)).ToArray()); famObj.AdditionalSystemVars = LoadedBSP.Combine(famObj.AdditionalSystemVars, _commonPseudofamily.Definition.AdditionalSystemVars); famObj.CompilationFlags = famObj.CompilationFlags.Merge(_flags); famObj.CompilationFlags.IncludeDirectories = new HashSet <string>(famObj.AdditionalSourceFiles.Concat(famObj.AdditionalHeaderFiles).Select(f => f.Substring(0, f.LastIndexOf("/")))).ToArray(); _mcuFamilies.Add(famObj); GenerateLinkerScripts(mcuFamilyBuilder); foreach (var mcuBuilder in mcuFamilyBuilder.MCUs) { mcuBuilder.StartupFile = "$$SYS:BSP_ROOT$$/" + mcuFamilyBuilder.FamilyFilePrefix + STARTUP_FILES_FOLDER + "/startup.c"; var mcu = mcuBuilder.GenerateDefinition(mcuFamilyBuilder, mcuFamilyBuilder.BSP, _parsePeripheralRegisters); mcu.FLASHBase = _mcuMemoryLayouts[mcu.ID].Memories.First(m => m.Name == FLASH_MEMORY).Start; mcu.RAMBase = _mcuMemoryLayouts[mcu.ID].Memories.First(m => m.Name == SRAM_MEMORY).Start; var preprocessorMacroses = mcu.CompilationFlags.PreprocessorMacros.ToList(); preprocessorMacroses.Add("CPU_" + mcu.ID); mcu.CompilationFlags.PreprocessorMacros = preprocessorMacroses.ToArray(); _mcus.Add(mcu); } foreach (var fw in mcuFamilyBuilder.GenerateFrameworkDefinitions()) { _frameworks.Add(fw); } foreach (var sample in mcuFamilyBuilder.CopySamples(_frameworks)) { _exampleDirs.Add(sample); } } }
public static ParsedSDK ParseKSDKManifest(string sdkDirectory, IWarningSink sink) { string[] manifestFiles = Directory.GetFiles(sdkDirectory, "*manifest.xml"); if (manifestFiles.Length < 1) { throw new Exception($"No manifest files in {sdkDirectory}"); } string manifestFile = Directory.GetFiles(sdkDirectory, "*manifest.xml")[0]; List <VendorSample> vsl = new List <VendorSample>(); XmlDocument doc = new XmlDocument(); doc.Load(manifestFile); List <MCU> mcus = new List <MCU>(); List <MCUFamily> families = new List <MCUFamily>(); List <ParsedComponent> allFrameworks = new List <ParsedComponent>(); bool linkerScriptHandled = false; List <string> allFiles = new List <string>(); Dictionary <string, ParsedDevice> deviceDict = new Dictionary <string, ParsedDevice>(); Dictionary <string, EmbeddedFramework> frameworkDict = new Dictionary <string, EmbeddedFramework>(); List <FileCondition> allConditions = new List <FileCondition>(); string fwPrefix = "com.sysprogs.ksdk2x_imported."; HashSet <string> alwaysIncludedFrameworks = new HashSet <string>(); // HashSet<string> alwaysExcludedFrameworks = new HashSet<string>(); List <string> lstdevAll = new List <string>(); List <CopiedFile> cfs = new List <CopiedFile>(); var dictCopiedFile = new ListDictionary <string, CopiedFile>(); var dictAddIncludeDir = new ListDictionary <string, string>(); foreach (XmlElement devNode in doc.SelectNodes("//devices/device")) { lstdevAll.Add(new ParsedDevice(devNode, sdkDirectory).DeviceName); } foreach (XmlElement devNode in doc.SelectNodes("//devices/device")) { ParsedDevice dev = new ParsedDevice(devNode, sdkDirectory); var mcuFamily = dev.ToMCUFamily(); int FLASHSize, RAMSize; int.TryParse((devNode.SelectSingleNode("memory/@flash_size_kb")?.Value ?? ""), out FLASHSize); int.TryParse((devNode.SelectSingleNode("memory/@ram_size_kb")?.Value ?? ""), out RAMSize); FLASHSize *= 1024; RAMSize *= 1024; families.Add(mcuFamily); string svdFile = null; //Map each component to an instance of EmbeddedFramework foreach (XmlNode componentNode in doc.SelectNodes($"//components/component")) { string componentName = componentNode.SelectSingleNode("@name")?.Value ?? ""; string componentType = componentNode.SelectSingleNode("@type")?.Value ?? ""; string device = componentNode.SelectSingleNode("@device")?.Value ?? ""; string idComponent = componentNode.SelectSingleNode("@id")?.Value ?? ""; device = idComponent.Split('.').Last(); if (device != dev.DeviceName && (lstdevAll.Contains(device))) { continue; } switch (componentType) { case "documentation": case "SCR": case "EULA": continue; case "debugger": case "linker": { List <string> relPaths = new List <string>(); bool isDebug = componentType == "debugger"; string sourceType = isDebug ? "debug" : "linker"; foreach (var src in componentNode.SelectNodes($"source[@type='{sourceType}' and @toolchain='armgcc']").OfType <XmlElement>().Select(e => new ParsedSource(e, dev))) { foreach (var fn in src.AllFiles) { relPaths.Add(fn.RelativePath); } } if (relPaths.Count > 0) { if (isDebug) { svdFile = relPaths[0]; } else if (!linkerScriptHandled) { linkerScriptHandled = true; if (relPaths.Count == 1) { mcuFamily.CompilationFlags.LinkerScript = "$$SYS:BSP_ROOT$$/" + relPaths[0]; } else { const string optionID = "com.sysprogs.imported.ksdk2x.linker_script"; mcuFamily.CompilationFlags.LinkerScript = $"$$SYS:BSP_ROOT$$/$${optionID}$$"; if ((mcuFamily.ConfigurableProperties?.PropertyGroups?.Count ?? 0) == 0) { mcuFamily.ConfigurableProperties = new PropertyList { PropertyGroups = new List <PropertyGroup> { new PropertyGroup() } } } ; mcuFamily.ConfigurableProperties.PropertyGroups[0].Properties.Add(new PropertyEntry.Enumerated { UniqueID = optionID, Name = "Linker script", AllowFreeEntry = false, SuggestionList = relPaths.Select(p => new PropertyEntry.Enumerated.Suggestion { InternalValue = p, UserFriendlyName = Path.GetFileName(p) }).ToArray() }); } } } } continue; case "CMSIS": //KSDK 2.x defines a Include_xxx framework for each possible CMSIS core. Those frameworks are redundant (normal 'Include' framework references the same include path) and should be removed to avoid confusion. if (componentName.StartsWith("Include_")) { continue; } if (idComponent == "platform.CMSIS_Driver") { continue; } if (componentName == "Include") { alwaysIncludedFrameworks.Add(fwPrefix + componentName); //!!! +"."+dev.DeviceName); } if (idComponent == "platform.CMSIS") { alwaysIncludedFrameworks.Add(fwPrefix + idComponent); //!!! + "." + dev.DeviceName); } break; case "project_template": continue; default: break; } List <string> headerFiles = new List <string>(); List <string> includeDirectories = new List <string>(); List <string> sourceFiles = new List <string>(); List <string> libFiles = new List <string>(); var IDFr = fwPrefix + idComponent; foreach (ParsedSource src in componentNode.SelectNodes("source").OfType <XmlElement>().Select(e => new ParsedSource(e, dev))) { if (src.Exclude) { continue; } if (src.Type == "c_include") { includeDirectories.Add(src.BSPPath); } foreach (var file in src.AllFiles) { if (file.BSPPath.EndsWith("ucosii.c") && !componentName.Contains("ucosii")) { continue; } if (file.BSPPath.EndsWith("ucosiii.c") && !componentName.Contains("ucosiii")) { continue; } if (file.BSPPath.Contains("freertos")) { allConditions.Add(new FileCondition { FilePath = file.BSPPath, ConditionToInclude = new Condition.ReferencesFramework { FrameworkID = fwPrefix + "middleware.freertos." + dev.DeviceName } }); } if (src.TargetPath != "") { dictCopiedFile.Add(IDFr, new CopiedFile { SourcePath = file.BSPPath, TargetPath = src.TargetPath + "/" + Path.GetFileName(file.BSPPath) }); foreach (XmlElement patch in componentNode.SelectNodes("include_paths/include_path")) { dictAddIncludeDir.Add(IDFr, patch.GetAttribute("path")); } } if (src.Type == "lib") { libFiles.Add(file.BSPPath); } if (src.Type == "src" || src.Type == "asm_include") { sourceFiles.Add(file.BSPPath); } else if (src.Type == "c_include") { headerFiles.Add(file.BSPPath); } } } foreach (XmlElement patch in componentNode.SelectNodes("include_paths/include_path")) { includeDirectories.Add(patch.GetAttribute("path")); } string[] dependencyList = componentNode.Attributes?.GetNamedItem("dependency")?.Value?.Split(' ') ?.Select(id => fwPrefix + id) ?.ToArray() ?? new string[0]; var FilterRegex = device.Length > 5 ? $"^{device.Substring(0, 5)}.*" : $"^{device}.*"; //MK02F MK22F if (device.Length == 0) { FilterRegex = ""; } EmbeddedFramework fw = new EmbeddedFramework { ID = $"{IDFr}", MCUFilterRegex = FilterRegex, UserFriendlyName = $"{componentName} ({componentType})", ProjectFolderName = componentName, AdditionalSourceFiles = sourceFiles.Distinct().ToArray(), AdditionalHeaderFiles = headerFiles.Distinct().ToArray(), RequiredFrameworks = dependencyList, AdditionalIncludeDirs = includeDirectories.Distinct().ToArray(), AdditionalLibraries = libFiles.ToArray(), AdditionalPreprocessorMacros = componentNode.SelectNodes("defines/define").OfType <XmlElement>().Select(el => new ParsedDefine(el).Definition).ToArray(), }; if (componentName == "freertos" && componentType == "OS") { fw.AdditionalPreprocessorMacros = LoadedBSP.Combine(fw.AdditionalPreprocessorMacros, "USE_RTOS=1;USE_FREERTOS".Split(';')); fw.ConfigurableProperties = new PropertyList { PropertyGroups = new List <PropertyGroup>() { new PropertyGroup { Properties = new List <PropertyEntry>() { new PropertyEntry.Enumerated { Name = "FreeRTOS Heap Implementation", UniqueID = "com.sysprogs.bspoptions.stm32.freertos.heap", DefaultEntryIndex = 3, SuggestionList = new PropertyEntry.Enumerated.Suggestion[] { new PropertyEntry.Enumerated.Suggestion { InternalValue = "heap_1", UserFriendlyName = "Heap1 - no support for freeing" }, new PropertyEntry.Enumerated.Suggestion { InternalValue = "heap_2", UserFriendlyName = "Heap2 - no block consolidation" }, new PropertyEntry.Enumerated.Suggestion { InternalValue = "heap_3", UserFriendlyName = "Heap3 - use newlib malloc()/free()" }, new PropertyEntry.Enumerated.Suggestion { InternalValue = "heap_4", UserFriendlyName = "Heap4 - contiguous heap area" }, new PropertyEntry.Enumerated.Suggestion { InternalValue = "heap_5", UserFriendlyName = "Heap5 - scattered heap area" }, } } } } } }; foreach (var fn in fw.AdditionalSourceFiles) { string name = Path.GetFileName(fn); if (name.StartsWith("heap_")) { allConditions.Add(new FileCondition { FilePath = fn, ConditionToInclude = new Condition.Equals { Expression = "$$com.sysprogs.bspoptions.stm32.freertos.heap$$", ExpectedValue = Path.GetFileNameWithoutExtension(fn) } }); } } } if (frameworkDict.ContainsKey(fw.ID)) { sink.LogWarning("Duplicate framework for " + fw.ID); continue; } frameworkDict[fw.ID] = fw; if (string.IsNullOrEmpty(fw.ID)) { sink.LogWarning($"Found a framework with empty ID. Skipping..."); continue; } if (string.IsNullOrEmpty(fw.UserFriendlyName)) { fw.UserFriendlyName = fw.ID; } allFrameworks.Add(new ParsedComponent { Framework = fw, OriginalType = componentType, OriginalName = componentName }); allFiles.AddRange(sourceFiles); allFiles.AddRange(headerFiles); } string deviceDefinitionFile = null; if (svdFile != null) { try { var mcuDef = SVDParser.ParseSVDFile(Path.Combine(sdkDirectory, svdFile), dev.DeviceName); deviceDefinitionFile = Path.ChangeExtension(svdFile, ".vgdbdevice"); XmlSerializer ser = new XmlSerializer(typeof(MCUDefinition)); using (var fs = File.Create(Path.Combine(sdkDirectory, Path.ChangeExtension(svdFile, ".vgdbdevice.gz")))) using (var gs = new GZipStream(fs, CompressionMode.Compress, true)) ser.Serialize(gs, new MCUDefinition(mcuDef)); } catch (Exception ex) { sink.LogWarning($"Failed to parse {svdFile}: {ex.Message}"); } } foreach (XmlNode packageNode in devNode.SelectNodes($"package/@name")) { string pkgName = packageNode?.Value; if (string.IsNullOrEmpty(pkgName)) { continue; } deviceDict[pkgName] = dev; mcus.Add(new MCU { ID = pkgName, UserFriendlyName = $"{pkgName} (KSDK 2.x)", FamilyID = mcuFamily.ID, FLASHSize = FLASHSize, RAMSize = RAMSize, CompilationFlags = new ToolFlags { PreprocessorMacros = new string[] { "CPU_" + pkgName }, }, MCUDefinitionFile = deviceDefinitionFile }); } } if (families.Count == 0) { throw new Exception("The selected KSDK contains no families"); } List <VendorSample> samples = new List <VendorSample>(); foreach (XmlElement boardNode in doc.SelectNodes("//boards/board")) { string boardName = boardNode.GetAttribute("name"); string deviceID = boardNode.GetAttribute("package"); ParsedDevice dev; if (!deviceDict.TryGetValue(deviceID, out dev)) { continue; } foreach (XmlElement directExampleNode in boardNode.SelectNodes("examples/example")) { var exampleNode = directExampleNode; var externalNode = exampleNode.SelectSingleNode("external/files"); if (externalNode != null) { var path = (externalNode.ParentNode as XmlElement)?.GetAttribute("path"); var mask = (externalNode as XmlElement)?.GetAttribute("mask"); if (path != null && mask != null) { { var sampleFiles = Directory.GetFiles(Path.Combine(sdkDirectory, path), mask); var fn = sampleFiles?.FirstOrDefault(); if (fn != null) { XmlDocument doc2 = new XmlDocument(); doc2.Load(fn); exampleNode = doc2.DocumentElement.SelectSingleNode("example") as XmlElement; if (exampleNode == null) { continue; } } } } } List <string> dependencyList = new List <string>(exampleNode.Attributes?.GetNamedItem("dependency")?.Value?.Split(' ') ?.Select(id => fwPrefix + id) ?? new string[0]); var name = exampleNode.GetAttribute("id") ?? "???"; dependencyList.AddRange(alwaysIncludedFrameworks); for (int i = 0; i < dependencyList.Count; i++) { EmbeddedFramework fw; if (frameworkDict.TryGetValue(dependencyList[i], out fw) && fw?.RequiredFrameworks != null) { dependencyList.AddRange(fw.RequiredFrameworks.Except(dependencyList)); } } List <string> dependencyList1 = new List <string>(dependencyList.Distinct()); List <CopiedFile> CopiedFileForSample = new List <CopiedFile>(); List <string> includeDirectories = new List <string>(); foreach (var fr1 in dependencyList1) { if (!dictCopiedFile.ContainsKey(fr1)) { continue; } var l = dictCopiedFile[fr1]; CopiedFileForSample.AddRange(l); if (dictAddIncludeDir.ContainsKey(fr1)) { includeDirectories.AddRange(dictAddIncludeDir[fr1]); } } List <PropertyDictionary2.KeyValue> CfgEntr = new List <PropertyDictionary2.KeyValue>(); string typFpu = "soft"; var tth = exampleNode.SelectSingleNode("toolchainSettings/toolchainSetting/option[@id='com.crt.advproject.gcc.fpu']")?.InnerText ?? "soft"; if (tth.Contains("hard")) { typFpu = "hard"; } CfgEntr.Add(new PropertyDictionary2.KeyValue { Key = "com.sysprogs.bspoptions.arm.floatmode", Value = "-mfloat-abi=" + typFpu }); VendorSample sample = new VendorSample { DeviceID = deviceID, UserFriendlyName = name, BoardName = boardName, Configuration = new VendorSampleConfiguration { Frameworks = dependencyList.Distinct().ToArray(), MCUConfiguration = new PropertyDictionary2 { Entries = CfgEntr.ToArray() } }, VirtualPath = exampleNode.GetAttribute("category"), ExtraFiles = CopiedFileForSample.Distinct().ToArray(), NoImplicitCopy = true }; List <string> headerFiles = new List <string>(); List <string> sourceFiles = new List <string>(); foreach (var cf in CopiedFileForSample.Distinct()) { includeDirectories.Add(Path.GetDirectoryName(cf.TargetPath)); } foreach (var src in exampleNode.SelectNodes("source").OfType <XmlElement>().Select(e => new ParsedSource(e, dev))) { foreach (var file in src.AllFiles) { if (src.Type == "src" || src.Type == "asm_include") { sourceFiles.Add(file.BSPPath); } else if (src.Type == "c_include") { headerFiles.Add(file.BSPPath); } if (src.Type == "lib") { sourceFiles.Add(file.BSPPath); } } } sample.PreprocessorMacros = exampleNode.SelectNodes("toolchainSettings/toolchainSetting/option[@id='gnu.c.compiler.option.preprocessor.def.symbols']/value").OfType <XmlElement>(). Select(node => node.InnerText.Replace("'\"", "'<").Replace("\"'", ">'")).ToArray(); sample.SourceFiles = sourceFiles.ToArray(); sample.HeaderFiles = headerFiles.ToArray(); if (sourceFiles.Count == 0 && headerFiles.Count == 0) { continue; } string[] matchingComponents = null; foreach (var fn in sourceFiles.Concat(headerFiles)) { string[] components = fn.Split('/', '\\'); if (matchingComponents == null) { matchingComponents = components; } else { int matches = CountMatches(matchingComponents, components); if (matches < matchingComponents.Length) { Array.Resize(ref matchingComponents, matches); } } } if (matchingComponents != null) { sample.Path = string.Join("/", matchingComponents); } foreach (var hf in headerFiles) { int c = hf.LastIndexOf('/'); includeDirectories.Add(hf.Substring(0, c)); } sample.IncludeDirectories = includeDirectories.Distinct().ToArray(); samples.Add(sample); } } return(new ParsedSDK { BSP = new BoardSupportPackage { PackageID = "com.sysprogs.imported.ksdk2x." + families[0].ID, PackageDescription = "Imported KSDK 2.x for " + families[0].ID, PackageVersion = doc.SelectSingleNode("//ksdk/@version")?.Value ?? "unknown", GNUTargetID = "arm-eabi", Frameworks = allFrameworks.Where(f => f.OriginalType != "project_template").Select(f => f.Framework).ToArray(), MCUFamilies = families.ToArray(), SupportedMCUs = mcus.ToArray(), FileConditions = allConditions.ToArray(), VendorSampleCatalogName = "KSDK Samples", EmbeddedSamples = allFrameworks.Where(f => f.OriginalType == "project_template").Select(f => f.ToProjectSample(alwaysIncludedFrameworks)).ToArray(), }, VendorSampleDirectory = new VendorSampleDirectory { Samples = samples.ToArray() } }); }
public ICustomBSPConfigurator CreateConfigurator(LoadedBSP.ConfiguredMCU mcu, DebugMethod method) { return new AVaRICEDebugSettingsControl(method, mcu.BSP.Directory); }