Пример #1
0
        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);
                }
        }
Пример #2
0
        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;
        }
Пример #3
0
        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)));
        }
Пример #4
0
        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));
        }
Пример #5
0
        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;
        }
Пример #6
0
        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);
        }
Пример #7
0
        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);
        }
Пример #8
0
        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
                }
            };
        }
Пример #9
0
 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,
     });
 }
Пример #10
0
        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";
            }
        }
Пример #11
0
        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));
        }
Пример #12
0
                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);
                }
Пример #13
0
        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);
        }
Пример #14
0
        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")));
        }
Пример #15
0
        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();
            }
        }
Пример #16
0
        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);
        }
Пример #17
0
 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;
 }
Пример #18
0
 public ConfigurationFixDatabaseBuilder(LoadedBSP bsp, string testDirectory, ReverseConditionTable reverseConditionTable)
 {
     _BSP                   = bsp;
     _TestDirectory         = testDirectory;
     _ReverseConditionTable = reverseConditionTable;
 }
Пример #19
0
        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()
                }
            });
        }
Пример #20
0
        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);
        }
Пример #21
0
        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
                                                                                                                     } });
                }
            }
        }
Пример #22
0
        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);
        }
Пример #23
0
        //----------------------------------------------
        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);
        }
Пример #24
0
        //===========================================================
        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);
            }
        }
Пример #25
0
        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();
        }
Пример #26
0
        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);
        }
Пример #27
0
        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);
        }
Пример #28
0
        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);
        }
    }
}
Пример #29
0
        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);
        }
Пример #30
0
 public void AdjustDebugMethod(LoadedBSP.ConfiguredMCU mcu, ConfiguredDebugMethod method)
 {
 }
Пример #31
0
        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;
        }
Пример #32
0
 public ICustomBSPConfigurator CreateConfigurator(LoadedBSP.ConfiguredMCU mcu, DebugMethod method)
 {
     return null;
 }
Пример #33
0
        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);
        }
Пример #34
0
        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);
        }
Пример #35
0
        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());
            }
        }
Пример #36
0
        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;
        }
Пример #37
0
        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);
        }
    }
Пример #38
0
        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);
        }
Пример #39
0
        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);
                }
            }
        }
Пример #40
0
        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()
                }
            });
        }
Пример #41
0
 public ICustomBSPConfigurator CreateConfigurator(LoadedBSP.ConfiguredMCU mcu, DebugMethod method)
 {
     return new AVaRICEDebugSettingsControl(method, mcu.BSP.Directory);
 }