Example #1
0
            public override MemoryLayout GetMemoryLayout(MCUBuilder mcu, MCUFamilyBuilder family)
            {
                //No additional memory information available for this MCU. Build a basic memory layout from known RAM/FLASH sizes.
                MemoryLayout layout = new MemoryLayout {
                    DeviceName = mcu.Name, Memories = new List <Memory>()
                };

                layout.Memories.Add(new Memory
                {
                    Name   = "FLASH",
                    Access = MemoryAccess.Undefined,
                    Type   = MemoryType.FLASH,
                    Start  = FLASHBase,
                    Size   = (uint)mcu.FlashSize,
                });

                layout.Memories.Add(new Memory
                {
                    Name   = "SRAM",
                    Access = MemoryAccess.Undefined,
                    Type   = MemoryType.RAM,
                    Start  = SRAMBase,
                    Size   = (uint)mcu.RAMSize,
                });

                return(layout);
            }
Example #2
0
        private void GenerateLinkerScripts(MCUFamilyBuilder mcuFamilyBuilder)
        {
            string ldsDirectory = Path.Combine(BSPRoot, mcuFamilyBuilder.Definition.FamilySubdirectory, "LinkerScripts");

            Directory.CreateDirectory(ldsDirectory);

            foreach (var mcu in mcuFamilyBuilder.MCUs)
            {
                var layout = GetMemoryLayout(mcu, mcuFamilyBuilder);
                GenerateLinkerScriptsAndUpdateMCU(ldsDirectory, mcuFamilyBuilder.FamilyFilePrefix, mcu, layout, layout.DeviceName);
            }
        }
Example #3
0
        static void Main(string[] args)
        {
            if (args.Length < 1)
            {
                throw new Exception("Usage: risc-v.exe <freedom-e-sdk directory>");
            }

            var bspBuilder = new RISCVBSPBuilder(new BSPDirectories(args[0], @"..\..\Output", @"..\..\rules"));

            PathTools.CopyDirectoryRecursive(@"..\..\bsp-template", bspBuilder.Directories.OutputDir);

            var bsp = XmlTools.LoadObject <BoardSupportPackage>(Path.Combine(bspBuilder.BSPRoot, "bsp.xml"));

            var commonPseudofamily = new MCUFamilyBuilder(bspBuilder, XmlTools.LoadObject <FamilyDefinition>(bspBuilder.Directories.RulesDir + @"\CommonFiles.xml"));

            List <string> projectFiles = new List <string>();
            PropertyList  unused       = null;

            if (commonPseudofamily.Definition.CoreFramework != null)
            {
                foreach (var job in commonPseudofamily.Definition.CoreFramework.CopyJobs)
                {
                    job.CopyAndBuildFlags(bspBuilder, projectFiles, null, ref unused);
                }
            }

            List <EmbeddedFramework> frameworks = new List <EmbeddedFramework>(bsp.Frameworks);

            frameworks.AddRange(commonPseudofamily.GenerateFrameworkDefinitions());
            bsp.Frameworks = frameworks.ToArray();

            var samples = commonPseudofamily.CopySamples(frameworks).ToArray();

            bsp.Examples = samples.Select(s => s.RelativePath).ToArray();


            var mainFamily = bsp.MCUFamilies.First();

            if (mainFamily.AdditionalSourceFiles != null || mainFamily.AdditionalHeaderFiles != null || bsp.FileConditions != null)
            {
                throw new Exception("TODO: merge lists");
            }

            mainFamily.AdditionalSourceFiles = projectFiles.Where(f => !MCUFamilyBuilder.IsHeaderFile(f)).ToArray();
            mainFamily.AdditionalHeaderFiles = projectFiles.Where(f => MCUFamilyBuilder.IsHeaderFile(f)).ToArray();
            bsp.FileConditions = bspBuilder.MatchedFileConditions.ToArray();

            XmlTools.SaveObject(bsp, Path.Combine(bspBuilder.BSPRoot, "BSP.XML"));
        }
Example #4
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);
                }
Example #5
0
            public override MemoryLayout GetMemoryLayout(MCUBuilder mcu, MCUFamilyBuilder family)
            {
                //No additional memory information available for this MCU. Build a basic memory layout from known RAM/FLASH sizes.
                MemoryLayout layout = new MemoryLayout {
                    DeviceName = mcu.Name, Memories = FindMemories(mcu.Name)
                };

                layout.Memories.Insert(0, new Memory
                {
                    Name   = "FLASH",
                    Access = MemoryAccess.Undefined,
                    Type   = MemoryType.FLASH,
                    Start  = FLASHBase,
                    Size   = (uint)mcu.FlashSize
                });

                if (mcu.Name.StartsWith("LPC4", StringComparison.CurrentCultureIgnoreCase))
                {
                    int sram = mcu.RAMSize / 1024;
                    if ((sram == 24) || (sram == 40) || (sram == 80) || (sram == 96) || (sram == 104) || (sram == 136) || (sram == 168) || (sram == 200) || (sram == 264) || (sram == 282) || (sram == 154))
                    {
                        if ((layout.Memories[0].Size / 1024) == 0)
                        {
                            layout.Memories[0].Size = 64 * 1024;
                        }
                    }
                    else
                    {
                        throw new Exception("Unknown LPC43xx memory configuration");
                    }
                }

                if (mcu.FlashSize == 0)
                {
                    layout.Memories[0].Size = 65536;
                }

                return(layout);
            }
Example #6
0
        private void ProcessCommonFiles()
        {
            _commonPseudofamily = new MCUFamilyBuilder(this, XmlTools.LoadObject <FamilyDefinition>(Directories.RulesDir + @"\CommonFiles.xml"));
            _commonPseudofamily.CopyFamilyFiles(ref _flags, _projectFiles);

            if (_commonPseudofamily.Definition.AdditionalFrameworks != null)
            {
                foreach (var framework in _commonPseudofamily.Definition.AdditionalFrameworks)
                {
                    SynthesizeAndAppendCopyJobFromCMakeFiles(framework);
                }
            }

            foreach (var fw in _commonPseudofamily.GenerateFrameworkDefinitions())
            {
                _frameworks.Add(fw);
            }

            foreach (var sample in _commonPseudofamily.CopySamples(_frameworks))
            {
                _exampleDirs.Add(sample);
            }
        }
Example #7
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);
                fam.GenerateLinkerScripts(false);
                if (!noPeripheralRegisters)
                    fam.AttachPeripheralRegisters(ParsePeripheralRegisters(bspBuilder.Directories.OutputDir , 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.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 = "1.0"
            };

            bspBuilder.Save(bsp, true);
        }
Example #8
0
 private static IEnumerable<MCUDefinitionWithPredicate> ParsePeripheralRegisters(string dir, MCUFamilyBuilder fam)
 {
     List<MCUDefinitionWithPredicate> RegistersPeriphs = new List<MCUDefinitionWithPredicate>();
     Dictionary<string, HardwareRegisterSet[]> periphs = PeripheralRegisterGenerator.GenerateFamilyPeripheralRegistersAtmel(dir +"\\"+ fam.Definition.FamilySubdirectory+ "\\Utils\\Include",fam.FamilyFilePrefix);
       //      Dictionary<string, HardwareRegisterSet[]> periphs;
         if (fam.FamilyFilePrefix.Contains("SAMl21"))
          periphs = periphs.Concat(PeripheralRegisterGenerator.GenerateFamilyPeripheralRegistersAtmel(dir + "\\" + fam.Definition.FamilySubdirectory + "\\Utils\\Include_b", fam.FamilyFilePrefix)).ToDictionary(v => v.Key, v => v.Value);
     foreach (var subfamily in periphs.Keys)
     {
         MCUDefinitionWithPredicate mcu_def = new MCUDefinitionWithPredicate { MCUName = subfamily, RegisterSets = periphs[subfamily], MatchPredicate = m => ( subfamily == m.Name.Substring(2)), };
         RegistersPeriphs.Add(mcu_def);
     }
     return RegistersPeriphs;
 }
Example #9
0
        //===========================================================
        static void Main(string[] args)
        {
            if (args.Length < 1)
                throw new Exception("Usage: InfineonXMC.exe <InfineonXMC SW package directory>");

            var bspBuilder = new InfineonXMCBSPBuilder(new BSPDirectories(args[0], @"..\..\Output", @"..\..\rules"));

            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(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));
                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);
            }

            UpdateNameMcuToSeggerFormat(ref mcuDefinitions);

            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.ToArray(),
                PackageVersion = "2.1.8"
            };

            bspBuilder.Save(bsp, true);
        }
Example #10
0
        private void ProcessCommonFiles()
        {
            _commonPseudofamily = new MCUFamilyBuilder(this, XmlTools.LoadObject<FamilyDefinition>(Directories.RulesDir + @"\CommonFiles.xml"));
            _commonPseudofamily.CopyFamilyFiles(ref _flags, _projectFiles);

            if (_commonPseudofamily.Definition.AdditionalFrameworks != null) {
                foreach (var framework in _commonPseudofamily.Definition.AdditionalFrameworks) {
                    SynthesizeAndAppendCopyJobFromCMakeFiles(framework);
                }
            }

            foreach (var fw in _commonPseudofamily.GenerateFrameworkDefinitions()) {
                _frameworks.Add(fw);
            }

            foreach (var sample in _commonPseudofamily.CopySamples(_frameworks)) {
                _exampleDirs.Add(sample);
            }
        }
Example #11
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.3.156"
            };

            bspBuilder.Save(bsp, true);
        }
Example #12
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);
        }
Example #13
0
            public override MemoryLayout GetMemoryLayout(MCUBuilder mcu, MCUFamilyBuilder family)
            {
                //No additional memory information available for this MCU. Build a basic memory layout from known RAM/FLASH sizes.
                MemoryLayout layout = new MemoryLayout();
                layout.Memories = new List<Memory>();
                layout.DeviceName = mcu.Name;
                string aFileName = family.BSP.Directories.InputDir + "\\Device\\SiliconLabs\\" + family.FamilyFilePrefix.Substring(0, family.FamilyFilePrefix.Length - 1) + "\\Include\\" + mcu + ".h";
                Match m;
                Regex rg = new Regex(@"(#define RAM_MEM_BASE[ \t]*.*0x)([0-9][U][L])+.*");
                int RAMStart = 0;
                foreach (var ln in File.ReadAllLines(aFileName))
                {
                    m = Regex.Match(ln, @"#define RAM_MEM_BASE[ \t]+.*0x([\d]+)UL.*");
                    RAMStart = 0;
                    if (m.Success)
                    {
                        RAMStart = Convert.ToInt32(m.Groups[1].Value, 16);
                        break;
                    }
                }
                if (RAMStart == 0)
                    throw new Exception("no RAM Start");
                layout.Memories.Insert(0, new Memory
                {
                    Name = "FLASH",
                    Access = MemoryAccess.Undefined,
                    Type = MemoryType.FLASH,
                    Start = FLASHBase,
                    Size = (uint)mcu.FlashSize
                });
                layout.Memories.Insert(0, new Memory
                {
                    Name = "SRAM",
                    Access = MemoryAccess.Undefined,
                    Type = MemoryType.RAM,
                    Start = (uint)RAMStart,
                    Size = (uint)mcu.RAMSize
                });

                return layout;
            }
Example #14
0
        static IEnumerable<StartupFileGenerator.InterruptVectorTable> ParseStartupFiles(string startupFileName, MCUFamilyBuilder fam)
        {
            List<StartupFileGenerator.InterruptVector[]> list = new List<StartupFileGenerator.InterruptVector[]>();
            list.Add(StartupFileGenerator.ParseInterruptVectors(startupFileName,
                     @"const pFunc __Vectors.*",
                     @"[ \t]*\};",
                     @"([^ \t,]+)[,]?[ \t]+// ([^\(]+)",
                     @"([^ \t,]+)[,]?.*",
                     @"^[ \t]*/.*",
                     null,
                     1,
                     2));
            List<StartupFileGenerator.InterruptVector> vectors = new List<StartupFileGenerator.InterruptVector>(list[0]);
            list.RemoveAt(0);

            //Fix the vector names from comments
            for (int i = 0; i < vectors.Count; i++)
            {
                if (vectors[i] == null)
                    continue;

                if (i == 0)
                {
                    vectors[i].Name = "_estack";
                    continue;
                }
                else if (i == 1)
                {
                    vectors[i].Name = "Reset_Handler";
                    continue;
                }
                else if (vectors[i].OptionalComment == "Reserved")
                {
                    vectors[i] = null;
                    continue;
                }
                else
                {
                    if (vectors[i] != null)
                        if (vectors[i].Name == "Default_Handler")
                            vectors[i] = null;
                }

            }
            yield return new StartupFileGenerator.InterruptVectorTable
            {
                FileName = Path.ChangeExtension(Path.GetFileName(startupFileName), ".c"),
                MatchPredicate = null,
                Vectors = vectors.ToArray()
            };
        }
Example #15
0
            public override MemoryLayout GetMemoryLayout(MCUBuilder mcu, MCUFamilyBuilder family)
            {
                foreach (var kv in _SpecialMemoryLayouts)
                    if (kv.Key.IsMatch(mcu.Name))
                        return kv.Value;

                MemoryLayout layout = new MemoryLayout { DeviceName = mcu.Name, Memories = new List<Memory>() };

                    layout.Memories.Add(new Memory
                    {
                        Name = "FLASH",
                        Access = MemoryAccess.Undefined,
                        Type = MemoryType.FLASH,
                        Start = FLASHBase,
                        Size = (uint)mcu.FlashSize,
                    });

                    layout.Memories.Add(new Memory
                    {
                        Name = "SRAM",
                        Access = MemoryAccess.Undefined,
                        Type = MemoryType.RAM,
                        Start = SRAMBase,
                        Size = (uint)mcu.RAMSize,
                    });

                return layout;
            }
Example #16
0
            public void GetMemoryMcu(MCUFamilyBuilder pfam)
            {
                if (pfam.FamilyFilePrefix.StartsWith("STM32W1"))
                {
                    string kvStr = "STM32W108HB";
                    MemoryLayout layoutW1 = new MemoryLayout { DeviceName = "STM32W108xx", Memories = new List<Memory>() };
                    layoutW1.Memories.Add(new Memory
                    {
                        Name = "FLASH",
                        Access = MemoryAccess.Undefined,// Readable | MemoryAccess.Writable | MemoryAccess.Executable
                        Type = MemoryType.FLASH,
                        Start = 0x08000000,
                        Size = 128 * 1024
                    });

                    layoutW1.Memories.Add(new Memory
                    {
                        Name = "SRAM",
                        Access = MemoryAccess.Undefined,// MemoryAccess.Writable,
                        Type = MemoryType.RAM,
                        Start = 0x20000000,
                        Size = 8 * 1024
                    });

                    _SpecialMemoryLayouts.Add(new KeyValuePair<Regex, MemoryLayout>(new Regex(kvStr.Replace('x', '.') + ".*"), layoutW1));

                }
                else {
                    string aDirIcf = pfam.Definition.StartupFileDir;
                    if (!aDirIcf.EndsWith("gcc"))
                        throw new Exception("No Gcc sturtup Tamplate");
                    aDirIcf = aDirIcf.Replace("\\gcc", "\\iar\\linker");
                    if (!Directory.Exists(aDirIcf))
                        throw new Exception("No dir " + aDirIcf);

                    foreach (var fnIcf in Directory.GetFiles(aDirIcf, "stm32*_flash.icf"))
                    {
                        string kvStr = Path.GetFileName(fnIcf).Replace("_flash.icf", "");
                        _SpecialMemoryLayouts.Add(new KeyValuePair<Regex, MemoryLayout>(new Regex(kvStr.Replace('x', '.') + ".*", RegexOptions.IgnoreCase), GetLayoutFromICF(fnIcf, kvStr)));
                    }
                }
            }
Example #17
0
        static IEnumerable<StartupFileGenerator.InterruptVectorTable> ParseStartupFiles(string dir, MCUFamilyBuilder fam)
        {
            var mainClassifier = fam.Definition.Subfamilies.First(f => f.IsPrimary);

            var allFiles = Directory.GetFiles(dir);

            foreach(var fn in allFiles)
            {
                string subfamily = Path.GetFileNameWithoutExtension(fn);
                if (!subfamily.StartsWith("startup_"))
                    continue;
                subfamily = subfamily.Substring(8);
                 yield return new  StartupFileGenerator.InterruptVectorTable{
                    FileName = Path.ChangeExtension(Path.GetFileName(fn), ".c"),
                    MatchPredicate = m => (allFiles.Length == 1) || StringComparer.InvariantCultureIgnoreCase.Compare(mainClassifier.TryMatchMCUName(m.Name), subfamily) == 0,
                    Vectors = StartupFileGenerator.ParseInterruptVectors(fn, "g_pfnVectors:", @"/\*{10,999}|^[^/\*]+\*/
                $", @"^[ \t]+\.word[ \t]+([^ ]+)", null, @"^[ \t]+/\*|[ \t]+stm32.*|[ \t]+STM32.*", ".equ[ \t]+([^ \t]+),[ \t]+(0x[0-9a-fA-F]+)", 1, 2)
                };
            }
        }
Example #18
0
        private static IEnumerable<MCUDefinitionWithPredicate> ParsePeripheralRegisters(string dir, MCUFamilyBuilder fam)
        {
            var mainClassifier = fam.Definition.Subfamilies.First(f => f.IsPrimary);
            List<Task<MCUDefinitionWithPredicate>> tasks = new List<Task<MCUDefinitionWithPredicate>>();
            Console.Write("Parsing {0} registers in background threads", fam.Definition.Name);
            RegisterParserErrors errors = new RegisterParserErrors();

            foreach (var fn in Directory.GetFiles(dir, "*.h"))
            {
                string subfamily = Path.GetFileNameWithoutExtension(fn);
                if (subfamily.Length != 11 && subfamily.Length != 12)
                    continue;

                /*if (subfamily != "stm32f301x8")
                 continue;*/

                Func<MCUDefinitionWithPredicate> func = () =>
                    {
                        RegisterParserConfiguration cfg = XmlTools.LoadObject<RegisterParserConfiguration>(fam.BSP.Directories.RulesDir + @"\PeripheralRegisters.xml");
                        var r = new MCUDefinitionWithPredicate
                            {
                                MCUName = subfamily,
                                RegisterSets = PeripheralRegisterGenerator.GenerateFamilyPeripheralRegisters(fn, cfg, errors,fam.MCUs[0].Core),
                                MatchPredicate = m => StringComparer.InvariantCultureIgnoreCase.Compare(mainClassifier.TryMatchMCUName(m.Name), subfamily) == 0,
                            };
                        Console.Write(".");
                        return r;
                    };

            //  func();
              tasks.Add(Task.Run(func));
            }

               Task.WaitAll(tasks.ToArray());
            var errorCnt = errors.ErrorCount;
            if (errorCnt != 0)
            {
                throw new Exception("Found " + errorCnt + " errors while parsing headers");

                //   for (int i = 0; i < errors.ErrorCount;i++)
                //     Console.WriteLine("\n er  " + i + "  -  " + errors.DetalErrors(i));

            }

            Console.WriteLine("done");
            return from r in tasks select r.Result;
        }
Example #19
0
        static void Main(string[] args)
        {
            if (args.Length < 2)
                throw new Exception("Usage: stm32.exe <SW package directory> <STM32Cube directory>");

            var bspBuilder = new STM32BSPBuilder(new BSPDirectories(args[0], @"..\..\Output", @"..\..\rules"), args[1]);
            var devices = BSPGeneratorTools.ReadMCUDevicesFromCommaDelimitedCSVFile(bspBuilder.Directories.RulesDir + @"\stm32devices.csv", "Part Number", "FLASH Size (Prog)", "Internal RAM Size", "Core", 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);

            if (rejects.Count > 0)
            {
                Console.WriteLine("Globally unsupported MCUs:");
                foreach (var r in rejects)
                    Console.WriteLine("\t{0}", r.Name);
            }

            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");

            var commonPseudofamily = new MCUFamilyBuilder(bspBuilder, XmlTools.LoadObject<FamilyDefinition>(bspBuilder.Directories.RulesDir + @"\CommonFiles.xml"));
            foreach (var fw in commonPseudofamily.GenerateFrameworkDefinitions())
                frameworks.Add(fw);

            foreach (var fam in allFamilies)
            {
                bspBuilder.GetMemoryMcu(fam);
                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));
                if (!noPeripheralRegisters)
                    fam.AttachPeripheralRegisters(ParsePeripheralRegisters(fam.Definition.PrimaryHeaderDir, fam));

                familyDefinitions.Add(fam.GenerateFamilyObject(true));
                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);
            }

            foreach (var sample in commonPseudofamily.CopySamples(null, allFamilies.Where(f => f.Definition.AdditionalSystemVars != null).SelectMany(f => f.Definition.AdditionalSystemVars)))
                exampleDirs.Add(sample);

            var prioritizer = new SamplePrioritizer(Path.Combine(bspBuilder.Directories.RulesDir, "SamplePriorities.txt"));
            exampleDirs.Sort((a,b) => prioritizer.Prioritize(a.RelativePath, b.RelativePath));

            BoardSupportPackage bsp = new BoardSupportPackage
            {
                PackageID = "com.sysprogs.arm.stm32",
                PackageDescription = "STM32 Devices",
                GNUTargetID = "arm-eabi",
                GeneratedMakFileName = "stm32.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 = "4.0",
                IntelliSenseSetupFile = "stm32_compat.h",
                FileConditions = bspBuilder.MatchedFileConditions.ToArray(),
                MinimumEngineVersion = "5.1",
                FirstCompatibleVersion = "3.0",
                InitializationCodeInsertionPoints = commonPseudofamily.Definition.InitializationCodeInsertionPoints,
            };

            File.Copy(@"..\..\stm32_compat.h", Path.Combine(bspBuilder.BSPRoot, "stm32_compat.h"), true);
            Console.WriteLine("Saving BSP...");
            bspBuilder.Save(bsp, true);
        }
Example #20
0
        static IEnumerable<StartupFileGenerator.InterruptVectorTable> ParseStartupFiles(string startupFileName, MCUFamilyBuilder fam)
        {
            string aStartNewName;
                string strPrefFam;
            if (fam.Definition.Name.StartsWith("AT"))
                strPrefFam = fam.Definition.Name.Substring(2, fam.Definition.Name.Length - 2);
            else
                strPrefFam = fam.Definition.Name;
            if(strPrefFam != "SAMG51")
                strPrefFam = strPrefFam.Substring(0, strPrefFam.Length - 1);

            if (strPrefFam == "SAM4cm3")
                strPrefFam = strPrefFam.Substring(0, strPrefFam.Length - 1);

            foreach (var fl in Directory.GetFiles(Path.GetDirectoryName(startupFileName), strPrefFam + "*.h", SearchOption.AllDirectories/* TopDirectoryOnly*/))
            {
                if (fl.Contains("\\pio\\"))
                    continue;
                string aNameFl = fl.Substring(fl.LastIndexOf("\\")+1, fl.Length - fl.LastIndexOf("\\")-1);
                if (Path.GetFileNameWithoutExtension(aNameFl).ToUpper() == strPrefFam.ToUpper())
                    continue;
                if (aNameFl.EndsWith("_1.h"))
                    continue;
                if (aNameFl.EndsWith("_0.h"))
                    aNameFl = aNameFl.Replace("_0.h", ".h");

                 aStartNewName = "startup_" + aNameFl;

                List<StartupFileGenerator.InterruptVector[]> list = new List<StartupFileGenerator.InterruptVector[]>();
                list.Add(StartupFileGenerator.ParseInterruptVectors(fl,
                         @"^typedef struct _DeviceVectors.*",
                         @"} DeviceVectors;.*",
                         @"[ \t]+void\*[ ]+([\w]+).*",
                         @"([^ \t,]+)[,]?.*",
                         @"^[ \t]*[/{]+.*",
                         null,
                         1,
                         2));
                List<StartupFileGenerator.InterruptVector> vectors = new List<StartupFileGenerator.InterruptVector>(list[0]);
                list.RemoveAt(0);

                //Fix the vector names from comments
                for (int i = 0; i < vectors.Count; i++)
                {
                    if (vectors[i] == null)
                        continue;

                    if (i == 0)
                    {
                        vectors[i].Name = "_estack";
                        continue;
                    }
                    else if (i == 1)
                    {
                        vectors[i].Name = "Reset_Handler";
                        continue;
                    }
                    else if (vectors[i].Name.StartsWith("pvReserved"))
                    {
                        vectors[i] = null;
                        continue;
                    }
                    else
                    {
                        if (vectors[i] == null)
                            continue;

                        if (!vectors[i].Name.StartsWith("pfn"))
                            throw new Exception("no pfn Func Startup Header");

                        vectors[i].Name = vectors[i].Name.Substring(3, vectors[i].Name.Length - 3);
                    }

                }
                yield return new StartupFileGenerator.InterruptVectorTable
                {
                    FileName = Path.ChangeExtension(Path.GetFileName(aStartNewName), ".c"),
                    MatchPredicate = m =>(Path.GetFileNameWithoutExtension(aNameFl).ToUpper() == m.Name.Substring(2).ToUpper()),
                    Vectors = vectors.ToArray()
                };
            }
        }
Example #21
0
        //---------------------------------
        static void Main(string[] args)
        {
            if (args.Length < 1)
                throw new Exception("Usage: cc3200.exe <cc3200 SW package directory>");
            string DirSDK = args[0];
            var bspBuilder = new CC3200BSPBuilder(new BSPDirectories(args[0], @"..\..\Output", @"..\..\rules"));

            List<string> additionalSources = new List<string> { "$$SYS:BSP_ROOT$$/StartupFiles/startup_gcc.c" };

            MCUFamily fam = new MCUFamily
            {
                ID = "CC3200",
                UserFriendlyName = "CC3200",
                CompilationFlags = new ToolFlags
                {
                    PreprocessorMacros = new string[] { "gcc" },
                    IncludeDirectories = new string[] {"$$SYS:BSP_ROOT$$/SDK/driverlib",
                                                        "$$SYS:BSP_ROOT$$/SDK/inc",
                                                        "$$SYS:BSP_ROOT$$/SDK",
                                                        "$$SYS:BSP_ROOT$$/common",
                                                        "$$SYS:BSP_ROOT$$/SDK/oslib",
                                                        "$$SYS:BSP_ROOT$$/netapps",
                                                        "$$SYS:BSP_ROOT$$/SDK/simplelink",
                                                        "$$SYS:BSP_ROOT$$/SDK/simplelink/include",
                                                        "$$SYS:BSP_ROOT$$/SDK/simplelink_extlib/provisioninglib",
                                                        "."
                                                        },
                    COMMONFLAGS = "-mcpu=cortex-m4 -mthumb",
                },
                AdditionalSourceFiles = additionalSources.ToArray(),
            };
            bool noPeripheralRegisters = args.Contains("/noperiph");
            string astrPathDefinition = "";
            if (!noPeripheralRegisters)
                astrPathDefinition = @"DeviceDefinitions/CC_3200.xml";
            fam.ConfigurableProperties = new PropertyList();
            List<MCUFamily> familyDefinitions = new List<MCUFamily>();
            familyDefinitions.Add(fam);
            List<MCU> mcuDefinitions = new List<MCU>();
            mcuDefinitions.Add(new MCU { MCUDefinitionFile = astrPathDefinition, FamilyID = "CC3200", ID = "XCC3200JR", RAMBase = 0x20004000, RAMSize = 240 * 1024, CompilationFlags = new ToolFlags { LinkerScript = "$$SYS:BSP_ROOT$$/LinkerScripts/XCC3200JR.lds" }, HierarchicalPath = @"TI ARM\CC3200" });
            mcuDefinitions.Add(new MCU { MCUDefinitionFile = astrPathDefinition, FamilyID = "CC3200", ID = "XCC3200HZ", RAMBase = 0x20004000, RAMSize = 176 * 1024, CompilationFlags = new ToolFlags { LinkerScript = "$$SYS:BSP_ROOT$$/LinkerScripts/XCC3200HZ.lds" }, HierarchicalPath = @"TI ARM\CC3200" });

            List<EmbeddedFramework> frameworks = new List<EmbeddedFramework>();
            List<MCUFamilyBuilder.CopiedSample> exampleDirs = new List<MCUFamilyBuilder.CopiedSample>();

            MCUFamilyBuilder commonPseudofamily = new MCUFamilyBuilder(bspBuilder, XmlTools.LoadObject<FamilyDefinition>(bspBuilder.Directories.RulesDir + @"\CommonFiles.xml"));

            //Embedded Frameworks
            var AddFrW = GenereteAddFrameWorks(bspBuilder.Directories, "EmbFrameworks.txt");
            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 mcuDef in mcuDefinitions)
                commonPseudofamily.MCUs.Add(new MCUBuilder { Name = mcuDef.ID });

            commonPseudofamily.Definition.FamilySubdirectory = "";
            if (!noPeripheralRegisters)
                commonPseudofamily.AttachPeripheralRegisters(ParsePeripheralRegisters(Path.Combine(DirSDK, @"cc3200-sdk\inc")));

            BoardSupportPackage bsp = new BoardSupportPackage
            {
                PackageID = "com.sysprogs.arm.ti.cc3200",
                PackageDescription = "TI CC3200 Devices",
                GNUTargetID = "arm-eabi",
                GeneratedMakFileName = "cc3200.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 = "1.3"
            };
            bspBuilder.Save(bsp, true);
        }
Example #22
0
            public override MemoryLayout GetMemoryLayout(MCUBuilder mcu, MCUFamilyBuilder family)
            {
                //No additional memory information available for this MCU. Build a basic memory layout from known RAM/FLASH sizes.
                MemoryLayout layout = new MemoryLayout();
                layout.Memories = new List<Memory>();
                layout.DeviceName = mcu.Name;
                string shName = mcu.Name;
                string aDirSam;
                if (mcu.Name.StartsWith("AT"))
                    shName = mcu.Name.Substring(2, mcu.Name.Length - 2);
                if (shName.StartsWith("SAMC") || shName.StartsWith("SAMD") || shName.StartsWith("SAMR") || shName.StartsWith("SAMB") || shName.StartsWith("SAML"))
                    aDirSam = "\\Sam0";
                else
                    aDirSam = "\\Sam";
                //  EAK                if (shName == "SAMD10D13A" || shName == "SAMD10D14A" || shName == "SAMD10D12A"|| shName == "SAMD11D14A")
                //  EAK                    shName = shName + "S";//Different Device ID (DID)
                string aFileName = family.BSP.Directories.InputDir + aDirSam +"\\Utils\\Cmsis\\" + family.FamilyFilePrefix + "\\Include\\" + shName;

                if (family.FamilyFilePrefix.ToUpper().StartsWith("SAMG"))
                    aFileName = family.BSP.Directories.InputDir + "\\Sam\\Utils\\Cmsis\\samg\\" + family.FamilyFilePrefix + "\\Include\\" + shName;

                if (family.Definition.Name.ToUpper() == "SAM4C" || family.Definition.Name.ToUpper() == "SAM4CM" || family.Definition.Name.ToUpper() == "SAM4CP" || family.Definition.Name.ToUpper() == "SAM4CM32")
                    aFileName = aFileName + "_0.h";
                else
                    aFileName = aFileName + ".h";

                int RAMStart = -1;
                int FLASHStart = -1;

                if (Regex.IsMatch(mcu.Name, "SAML21...B"))
                    aFileName = aFileName.Replace("\\Include\\S", "\\Include_b\\S");

                foreach (var ln in File.ReadAllLines(aFileName))
                {
                //                    var m = Regex.Match(ln, @"(#define [IH]?[HS]?[HMC]*RAM[C]?[0]?_ADDR[ \t]*.*0x)([0-9A-Fa-f]+[^uU]+)+.*");
                    var m = Regex.Match(ln, @"(#define [ID]*[IH]?[HS]?[HMC]*RAM[C]?[0]?_ADDR[ \t]*.*0x)([0-9A-Fa-f]+[^uU]+[L]?)+.*");

                    if (m.Success)
                    {
                        RAMStart = Convert.ToInt32(m.Groups[2].Value, 16);
                    }

                    m = Regex.Match(ln, @"(#define [I]?FLASH[0]?_ADDR[ \t]*.*0x)([0-9A-Fa-f]+[^u|U]+)+.*");
                    if (!m.Success)
                        m = Regex.Match(ln, @"(#define [I]?FLASH[0]?_CNC_ADDR[ \t]*.*0x)([0-9A-Fa-f]+[^u|U]+)+.*");
                    if (!m.Success)
                        m = Regex.Match(ln, @"(#define BOOTROM_ADDR[ \t]*.*0x)([0-9A-Fa-f]+[^u|U]+)+.*");//samb11
                    if (m.Success)
                    {
                        FLASHStart = Convert.ToInt32(m.Groups[2].Value, 16);
                    }
                    if (FLASHStart > -1 && RAMStart > -1)
                        break;
                }
                if (RAMStart == -1)
                    throw new Exception("no RAM Start");
                //    Console.WriteLine("RAMBase mcu {0} NO file :{1} ", mcu.Name, aFileName);
                if (FLASHStart == -1)
                    throw new Exception("no FLASH Start");
                 //   Console.WriteLine("FLASHBase mcu {0} NO file :{1} ",mcu.Name , aFileName);
                layout.Memories.Insert(0, new Memory
                {
                    Name = "FLASH",
                    Access = MemoryAccess.Undefined,
                    Type = MemoryType.FLASH,
                    Start = (uint)FLASHStart,
                    Size = (uint)mcu.FlashSize
                });
                layout.Memories.Insert(0, new Memory
                {
                    Name = "SRAM",
                    Access = MemoryAccess.Undefined,
                    Type = MemoryType.RAM,
                    Start = (uint)RAMStart,
                    Size = (uint)mcu.RAMSize
                });

                return layout;
            }
Example #23
0
        private static IEnumerable<MCUDefinitionWithPredicate> ParsePeripheralRegisters(string dir, MCUFamilyBuilder fam)
        {
            List<MCUDefinitionWithPredicate> RegistersPeriphs = new List<MCUDefinitionWithPredicate>();

            Dictionary<string, HardwareRegisterSet[]> periphs = PeripheralRegisterGenerator.GenerateFamilyPeripheralRegisters(dir);

            foreach (var subfamily in periphs.Keys)
            {
                MCUDefinitionWithPredicate mcu_def = new MCUDefinitionWithPredicate { MCUName = subfamily, RegisterSets = periphs[subfamily], MatchPredicate = m => GytTypMcuFile(subfamily,m.Name), };
                RegistersPeriphs.Add(mcu_def);
            }
                return RegistersPeriphs;
        }
Example #24
0
        static IEnumerable<StartupFileGenerator.InterruptVectorTable> ParseStartupFiles(string dir, string startupFileName, MCUFamilyBuilder fam)
        {
            FileInfo[] startups = (new DirectoryInfo(dir)).GetFiles(startupFileName, SearchOption.AllDirectories);
            List<StartupFileGenerator.InterruptVector[]> list = new List<StartupFileGenerator.InterruptVector[]>();

            // Read in all the relevant startup files
            foreach (var startup in startups)
            {
                if (!(startup.FullName.ToUpperInvariant().Contains(fam.Definition.Name.ToUpperInvariant()) || ((startup.FullName == "TM4C123") && startup.FullName.ToUpperInvariant().Contains("LM4F232"))))
                    continue;

                list.Add(StartupFileGenerator.ParseInterruptVectors(startup.FullName, @"void \(\* const g_pfnVectors\[\]\)\(void\) \=", @"[ \t]*\};", @"([^ \t/]+)[,]?[ \t]+// ([^\(]+)", @"[ \t]*\(void \(\*\)\(void\)\)\(\(uint32_t\)pui32Stack \+ sizeof\(pui32Stack\)\)\,", @"\{|^[ /t]*// (.*)", null, 1, 2));
            }

            List<StartupFileGenerator.InterruptVector> vectors = new List<StartupFileGenerator.InterruptVector>(list[0]);
            list.RemoveAt(0);
            foreach(var entry in list)
            {
                if ((entry.Length != vectors.Count) && (entry.Length != 224) && entry.Length != 138)//224 is length of two boot loader demo example interrupt tables, ignoring the extra entries there!
                    throw new Exception("Interrupt vector counts different!");

                for (int i = 0; i < vectors.Count; i++)
                {
                    if (entry[i].OptionalComment == vectors[i].OptionalComment)
                        continue;

                    throw new Exception();
                }
            }

            //Fix the vector names from comments
            for (int i = 0; i <vectors.Count; i++)
            {
                if(i == 0)
                {
                    vectors[i].Name = "_estack";
                    continue;
                }
                else if(i == 1)
                {
                    vectors[i].Name = "Reset_Handler";
                    continue;
                }
                else if(vectors[i].OptionalComment == "Reserved")
                {
                    vectors[i] = null;
                    continue;
                }

                TextInfo txt_info = new CultureInfo("").TextInfo;
                vectors[i].Name = txt_info.ToTitleCase(vectors[i].OptionalComment.Replace(" and "," ")).Replace(" ", "") + "ISR";
                if (vectors[i].Name.StartsWith("The"))
                    vectors[i].Name = vectors[i].Name.Substring(3);
                vectors[i].Name = vectors[i].Name.Replace('/', '_');
            }

            yield return new StartupFileGenerator.InterruptVectorTable
            {
                FileName = Path.GetFileName(startupFileName),
                MatchPredicate = m => true,
                Vectors = vectors.ToArray()
            };
        }
Example #25
0
            public override MemoryLayout GetMemoryLayout(MCUBuilder mcu, MCUFamilyBuilder family)
            {
                //No additional memory information available for this MCU. Build a basic memory layout from known RAM/FLASH sizes.
                MemoryLayout layout = new MemoryLayout { DeviceName = mcu.Name, Memories = FindMemories(mcu.Name) };

                layout.Memories.Insert(0, new Memory
                {
                    Name = "FLASH",
                    Access = MemoryAccess.Undefined,
                    Type = MemoryType.FLASH,
                    Start = FLASHBase,
                    Size = (uint)mcu.FlashSize
                });

                if (mcu.Name.StartsWith("LPC4", StringComparison.CurrentCultureIgnoreCase))
                {
                    int sram = mcu.RAMSize / 1024;
                    if ((sram == 24) || (sram == 40) || (sram == 80) || (sram == 96) || (sram == 104) || (sram == 136) || (sram == 168) || (sram == 200) || (sram == 264) || (sram == 282))
                    {
                        if ((layout.Memories[0].Size / 1024) == 0)
                            layout.Memories[0].Size = 64 * 1024;
                    }
                    else
                        throw new Exception("Unknown LPC43xx memory configuration");
                }

                if (mcu.FlashSize == 0)
                    layout.Memories[0].Size = 65536;

                return layout;
            }
Example #26
0
 public override MemoryLayout GetMemoryLayout(MCUBuilder mcu, MCUFamilyBuilder family)
 {
     throw new NotImplementedException();
 }
Example #27
0
            public override MemoryLayout GetMemoryLayout(MCUBuilder mcu, MCUFamilyBuilder family)
            {
                var layout = new MemoryLayout { DeviceName = mcu.Name, Memories = new List<Memory>() };

                layout.Memories.Add(new Memory
                {
                    Name = "FLASH",
                    Access = MemoryAccess.Undefined,
                    Type = MemoryType.FLASH,
                    Start = FLASHBase,
                    Size = (uint)mcu.FlashSize
                });

                layout.Memories.Add(new Memory
                {
                    Name = "SRAM",
                    Access = MemoryAccess.Undefined,
                    Type = MemoryType.RAM,
                    Start = SRAMBase,
                    Size = (uint)mcu.RAMSize
                });

                return layout;
            }
Example #28
0
        static void Main(string[] args)
        {
            if (args.Length < 1)
                throw new Exception("Usage: esp32.exe <esp-idf directory>");

            var bspBuilder = new ESP32BSPBuilder(new BSPDirectories(args[0], @"..\..\Output", @"..\..\rules"));
            PathTools.CopyDirectoryRecursive(@"..\..\bsp-template", bspBuilder.Directories.OutputDir);

            string registerSetFile = Path.Combine(bspBuilder.Directories.OutputDir, "registers.xml");
            var registers = PeripheralRegisterParser.ParsePeripheralRegisters(Path.Combine(bspBuilder.Directories.InputDir, "esp-idf"));
            XmlTools.SaveObject(new MCUDefinition { MCUName = "ESP32", RegisterSets = registers }, registerSetFile);

            var bsp = XmlTools.LoadObject<BoardSupportPackage>(Path.Combine(bspBuilder.BSPRoot, "bsp.xml"));

            var commonPseudofamily = new MCUFamilyBuilder(bspBuilder, XmlTools.LoadObject<FamilyDefinition>(bspBuilder.Directories.RulesDir + @"\CommonFiles.xml"));
            List<EmbeddedFramework> frameworks = new List<EmbeddedFramework>(bsp.Frameworks);
            frameworks.AddRange(commonPseudofamily.GenerateFrameworkDefinitions());
            bsp.Frameworks = frameworks.ToArray();

            List<string> projectFiles = new List<string>();

            if (commonPseudofamily.Definition.CoreFramework != null)
                foreach (var job in commonPseudofamily.Definition.CoreFramework.CopyJobs)
                    job.CopyAndBuildFlags(bspBuilder, projectFiles, null);

            var mainFamily = bsp.MCUFamilies.First();

            if (mainFamily.AdditionalSourceFiles != null || mainFamily.AdditionalHeaderFiles != null || bsp.FileConditions != null)
                throw new Exception("TODO: merge lists");

            mainFamily.AdditionalSourceFiles = projectFiles.Where(f => !MCUFamilyBuilder.IsHeaderFile(f)).ToArray();
            mainFamily.AdditionalHeaderFiles = projectFiles.Where(f => MCUFamilyBuilder.IsHeaderFile(f)).ToArray();
            bsp.FileConditions = bspBuilder.MatchedFileConditions.ToArray();

            foreach(var fn in Directory.GetFiles(Path.Combine(bspBuilder.Directories.OutputDir, @"esp-idf\components\nghttp"), "*.?", SearchOption.AllDirectories))
            {
                string ext = Path.GetExtension(fn).ToLower();
                if (ext != ".c" && ext != ".h")
                    continue;

                var lines = File.ReadAllLines(fn);
                bool changed = false;
                for (int i = 0; i < lines.Length; i++)
                {
                    if (lines[i].Contains("<config.h>"))
                    {
                        lines[i] = lines[i].Replace("<config.h>", "<nghttp-config.h>");
                        changed = true;
                    }
                }
                if (changed)
                    File.WriteAllLines(fn, lines);
            }

            foreach (var mcu in bsp.SupportedMCUs)
                mcu.MCUDefinitionFile = Path.GetFileName(registerSetFile);

            File.WriteAllText(Path.Combine(bspBuilder.Directories.OutputDir, @"esp-idf\components\nghttp\port\include\nghttp-config.h"), "#include \"config.h\"\n");

            string linkerScript = Path.Combine(bspBuilder.Directories.OutputDir, @"esp-idf\components\esp32\ld\esp32.common.ld");
            var lines2 = File.ReadAllLines(linkerScript).ToList();
            Regex rgLibrary = new Regex(@"(.*)\*lib([0-9a-zA-Z_]+).a:\(([^()]+)\)");
            Regex rgFileInLibrary = new Regex(@"(.*)\*lib([0-9a-zA-Z_]+).a:([0-9a-zA-Z]+\.o)\(([^()]+)\)");
            for (int i = 0; i < lines2.Count; i++)
            {
                var m = rgLibrary.Match(lines2[i]);
                if (m.Success)
                {
                    string dir = Path.Combine(bspBuilder.Directories.OutputDir, @"esp-idf\components\" + m.Groups[2].Value);
                    if (Directory.Exists(dir))
                    {
                        string[] fns = Directory.GetFiles(dir)
                            .Select(f => Path.GetFileName(f))
                            .Where(f => f.EndsWith(".S", StringComparison.InvariantCultureIgnoreCase) || f.EndsWith(".c", StringComparison.InvariantCultureIgnoreCase))
                            .Select(f=>Path.ChangeExtension(f, ".o"))
                            .OrderBy(f=>f)
                            .ToArray();

                        int j = 0;

                        foreach (var fn in fns)
                            lines2.Insert(i + ++j, $"{m.Groups[1].Value}*{fn}({m.Groups[3].Value})");
                        lines2.RemoveAt(i--);
                        continue;
                    }
                }
                m = rgFileInLibrary.Match(lines2[i]);
                if (m.Success)
                {
                    lines2[i] = $"{m.Groups[1].Value}*{m.Groups[3].Value}({m.Groups[4].Value})";
                }

            }
            File.WriteAllLines(linkerScript, lines2);

            XmlTools.SaveObject(bsp, Path.Combine(bspBuilder.BSPRoot, "BSP.XML"));
        }
Example #29
0
 public override MemoryLayout GetMemoryLayout(MCUBuilder mcu, MCUFamilyBuilder family)
 {
     return _mcuMemoryLayouts[mcu.Name];
 }
Example #30
0
            public override MemoryLayout GetMemoryLayout(MCUBuilder mcu, MCUFamilyBuilder family)
            {
                //No additional memory information available for this MCU. Build a basic memory layout from known RAM/FLASH sizes.
                MemoryLayout layout = new MemoryLayout { DeviceName = mcu.Name, Memories = new List<Memory>() };

                layout.Memories.Add(new Memory
                {
                    Name = "SRAM",
                    Access = MemoryAccess.Undefined,
                    Type = MemoryType.RAM,
                    Start = SRAMBase,
                    Size = (uint)mcu.RAMSize,
                });

                return layout;
            }
Example #31
0
        private void GenerateLinkerScripts(MCUFamilyBuilder mcuFamilyBuilder)
        {
            string ldsDirectory = Path.Combine(BSPRoot, mcuFamilyBuilder.Definition.FamilySubdirectory, "LinkerScripts");
            Directory.CreateDirectory(ldsDirectory);

            foreach (var mcu in mcuFamilyBuilder.MCUs) {
                var layout = GetMemoryLayout(mcu, mcuFamilyBuilder);
                GenerateLinkerScriptsAndUpdateMCU(ldsDirectory, mcuFamilyBuilder.FamilyFilePrefix, mcu, layout, layout.DeviceName);
            }
        }
Example #32
0
        static IEnumerable<StartupFileGenerator.InterruptVectorTable> ParseStartupFiles(string dir, string startupFileName, MCUFamilyBuilder fam)
        {
            string [] allFiles = Directory.GetFiles(dir);
               string aTemDir = fam.BSP.BSPRoot+"\\TempSource";
               foreach (var fn in allFiles)
            {
                string aFN = Path.GetFileNameWithoutExtension(fn);
                if (!aFN.StartsWith("cr_") || !aFN.EndsWith("x"))
                    continue;

                   UpdateMacrosFile(fn, aTemDir,"const g_pfnVectors[])(void) =", "};", "#error ");
            }

            allFiles = Directory.GetFiles(aTemDir);

            List<StartupFileGenerator.InterruptVector[]> list = new List<StartupFileGenerator.InterruptVector[]>();

            foreach (var fn in allFiles)
            {

                string subfamily = Path.GetFileNameWithoutExtension(fn);

                if (subfamily.StartsWith("CHIP_"))
                {
                    subfamily = subfamily.Substring(5, subfamily.IndexOf("_cr_start")-5);

                }else if (subfamily.StartsWith("ORIGINAL"))
                      {
                        int idx = subfamily.IndexOf("lpc");
                        subfamily = subfamily.Substring(idx, subfamily.Length - idx);
                      }
                       else
                              continue;

                list.Add(StartupFileGenerator.ParseInterruptVectors(fn,
                    @"void \(\* const g_pfnVectors\[\]\)\(void\) \=",
                    @"[ \t]*\};",
                    @"([^ \t,]+)[,]?[ \t]+// ([^\(]+)",

                    @"([^ \t,]+)[,]?.*",
                    @"^[ \t]*//.*",

                    @"(USE_LPCOPEN_IRQHANDLER_NAMES)",
                    1,
                    2));

                List<StartupFileGenerator.InterruptVector> vectors = new List<StartupFileGenerator.InterruptVector>(list[0]);
                list.RemoveAt(0);

                //Fix the vector names from comments
                for (int i = 0; i < vectors.Count; i++)
                {
                    if (vectors[i] == null)
                        continue;

                    if (i == 0)
                    {
                        vectors[i].Name = "_estack";
                        continue;
                    }
                    else if (i == 1)
                    {
                        vectors[i].Name = "Reset_Handler";
                        continue;
                    }
                    else if (vectors[i].OptionalComment == "Reserved")
                    {
                        vectors[i] = null;
                        continue;
                    }else
                    {

                        for(int c = 0; c < i; c++)
                        {
                            if (vectors[c] != null)
                                if (vectors[c].Name == vectors[i].Name)
                                {
                                    int idx = vectors[c].OptionalComment.IndexOf(" ");
                                    if (idx == -1) idx = 0;

                                    vectors[i].Name = "INT_"+i+ "_" + vectors[i].Name;

                                }
                        }
                    }

                }
                yield return new StartupFileGenerator.InterruptVectorTable
                {
                    FileName = Path.ChangeExtension(Path.GetFileName(fn), ".c"),

                    MatchPredicate = m => (allFiles.Length == 1) || (GytTypMcuFile(Path.ChangeExtension(Path.GetFileName(fn), ".c"), m.Name)),

                     Vectors = vectors.ToArray()
                };
            }
            Directory.Delete(aTemDir, true);
        }
Example #33
0
        private void GenerateStartupFiles(MCUFamilyBuilder mcuFamilyBuilder, StartupFileGenerator.InterruptVector[] vectorTable)
        {
            var startupFilesPath = Path.Combine(BSPRoot, mcuFamilyBuilder.Definition.FamilySubdirectory, STARTUP_FILES_FOLDER);
            Directory.CreateDirectory(startupFilesPath);
            File.Copy(Directories.RulesDir + "/" + "startup.c", startupFilesPath + "/" + "startup.c", true);

            using (var fs = File.CreateText(string.Format("{0}\\vectors_{1}.c", startupFilesPath, mcuFamilyBuilder.Definition.Name))) {
                fs.WriteLine("/*");
                fs.WriteLine("\tThis file contains the definitions of the interrupt handlers for {0} MCU family.", mcuFamilyBuilder.Definition.Name);
                fs.WriteLine("\tThe file is provided by Sysprogs under the BSD license.", mcuFamilyBuilder.Definition.Name);
                fs.WriteLine("*/");
                fs.WriteLine("");
                fs.WriteLine("");
                fs.WriteLine("extern void *_estack;");
                fs.WriteLine("#define NULL ((void *)0)");
                fs.WriteLine("#define {0} ((void *){1})", TRIM_VALUE_NAME, TRIM_VALUE);
                fs.WriteLine("");
                fs.WriteLine("void Reset_Handler();");
                fs.WriteLine("void Default_Handler();");
                fs.WriteLine("");

                List<string> tableContents = new List<string>();

                for (int i = 2; i < vectorTable.Length; i++) {
                    var interrupt = vectorTable[i];
                    if (interrupt != null) {
                        if (interrupt.Name != TRIM_VALUE_NAME) {
                            fs.WriteLine("void {0}() __attribute__ ((weak, alias (\"Default_Handler\")));", interrupt.Name);
                            tableContents.Add(string.Format("&{0}", interrupt.Name));
                        } else {
                            tableContents.Add(string.Format("{0}", interrupt.Name));
                        }

                    } else {
                        tableContents.Add("NULL");
                    }
                }

                fs.WriteLine("");
                fs.WriteLine("void * __vect_table[0x{0:x}] __attribute__ ((section (\".vectortable\"))) = ", vectorTable.Length);
                fs.WriteLine("{");
                fs.WriteLine("\t&_estack,");
                fs.WriteLine("\t&Reset_Handler,");
                for (int i = 0; i < tableContents.Count; i++) {
                    string comma = (i == tableContents.Count - 1) ? "" : ",";
                    fs.WriteLine("\t{0}{1}", tableContents[i], comma);
                }
                fs.WriteLine("};");
                fs.WriteLine("");
                fs.WriteLine("void Default_Handler()");
                fs.WriteLine("{");
                fs.WriteLine("\tasm(\"BKPT 255\");");
                fs.WriteLine("}");
            }
        }
Example #34
0
        static void Main(string[] args)
        {
            if (args.Length < 1)
                throw new Exception("Usage: nxp.exe <NXP SW package directory>");

            var bspBuilder = new NxpBSPBuilder(new BSPDirectories(args[0], @"..\..\Output", @"..\..\rules"));

            var devices = BSPGeneratorTools.ReadMCUDevicesFromCommaDelimitedCSVFile(bspBuilder.Directories.RulesDir + @"\McuNXPLpcDevices.csv",
                "Part Number", "Flash (KB)", "SRAM(kB)", "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<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);

            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, "cr_startup_lpc8xx.c", fam));
                if (!noPeripheralRegisters)
                    fam.AttachPeripheralRegisters(ParsePeripheralRegisters(fam.Definition.PrimaryHeaderDir +"\\" +fam.Definition.FamilySubdirectory,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);
                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.nxp_lpc",
                PackageDescription = "NXP LPC Devices",
                GNUTargetID = "arm-eabi",
                GeneratedMakFileName = "nxp_lpc.mak",
                MCUFamilies = familyDefinitions.ToArray(),
                SupportedMCUs = mcuDefinitions.ToArray(),
                Frameworks = frameworks.ToArray(),
                Examples = exampleDirs.ToArray(),
                FileConditions = bspBuilder.MatchedFileConditions.ToArray(),
                PackageVersion = "2.1"
            };

            bspBuilder.Save(bsp, true);
        }
Example #35
0
            public override MemoryLayout GetMemoryLayout(MCUBuilder mcu, MCUFamilyBuilder family)
            {
                MemoryLayout layout = new MemoryLayout { DeviceName = mcu.Name, Memories = new List<Memory>() };
                string aDir = Directories.InputDir + @"\CMSIS\Infineon\" + family.Definition.Name + @"_series\Source\GCC";
                Regex aRgFl1 = new Regex(@"((FLASH)[ \(]+RX[\) :]+ORIGIN[ =]+)(0x[A-F\d]*)[ ,\t\w]+[ =]+(0x[A-F\d]*)");
                Regex aRgFl2 = new Regex(@"((FLASH_1_uncached)[ \(]+RX[\) :]+ORIGIN[ =]+)(0x[A-F\d]*)[ ,\t\w]+[ =]+(0x[A-F\d]*)");
                Regex aRgRam1 = new Regex(@"((SRAM)[ \(!RWX\) :]+ORIGIN[ =]+)(0x[A-F\d]*)[ ,\t\w]+[ =]+(0x[A-F\d]*)");
                Regex aRgRam3 = new Regex(@"((PSRAM_1)[ \(!RWX\) :]+ORIGIN[ =]+)(0x[A-F\d]*)[ ,\t\w]+[ =]+(0x[A-F\d]*)");
                Regex aRgRam2 = new Regex(@"((SRAM_combined)[ \(!RWX\) :]+ORIGIN[ =]+)(0x[A-F\d]*)[ ,\t\w]+[ =]+(0x[A-F\d]*)");
                string aStartFlash = "";
                string aLenFlash = "";
                string aStartRam = "";
                string aLenRam = "";
                int idX = mcu.Name.IndexOf("x");
                string longMCUName = mcu.Name.Replace("_", "-");

                string expectedScriptPath = string.Format(@"{0}\{1}x{2:d4}.ld", aDir, family.Definition.Name, mcu.Name.Substring(idX + 1));
                if (!File.Exists(expectedScriptPath))
                {
                    expectedScriptPath = string.Format(@"{0}\{1}x{2:d4}.ld", aDir, longMCUName.Substring(0, longMCUName.IndexOf('-')), mcu.Name.Substring(idX + 1));
                    if (!File.Exists(expectedScriptPath))
                    {
                        throw new Exception("Failed to find linker script for " + mcu.Name);
                    }
                }

                Regex[] sramRegexes = new Regex[] { aRgRam1, aRgRam2, aRgRam3 };
                Match[] sramMatches = new Match[sramRegexes.Length];

                foreach (var line in File.ReadAllLines(expectedScriptPath))
                {
                    // Search Flash notes
                    var m = aRgFl1.Match(line);
                    if (!m.Success)
                        m = aRgFl2.Match(line);

                    if (m.Success)
                    {
                        aStartFlash = m.Groups[3].Value;
                        aLenFlash = m.Groups[4].Value;
                    }

                    for (int i = 0; i < sramRegexes.Length; i++)
                        if (sramMatches[i] == null)
                        {
                            m = sramRegexes[i].Match(line);
                            if (m.Success)
                                sramMatches[i] = m;
                        }

                    continue;
                }

                foreach(var m in sramMatches)
                {
                    if (m != null)
                    {
                        aStartRam = m.Groups[3].Value;
                        aLenRam = m.Groups[4].Value;
                        break;
                    }
                }

                if (string.IsNullOrEmpty(aStartFlash) || string.IsNullOrEmpty(aLenFlash) || string.IsNullOrEmpty(aStartRam) || string.IsNullOrEmpty(aLenRam))
                {
                    throw new Exception("Failed to find FLASH/RAM parameters");
                }

                layout.Memories.Add(new Memory
                {
                    Name = "FLASH",
                    Access = MemoryAccess.Undefined,
                    Type = MemoryType.FLASH,
                    Start = Convert.ToUInt32(aStartFlash, 16),
                    Size = Convert.ToUInt32(aLenFlash, 16),
                });

                layout.Memories.Add(new Memory
                {
                    Name = "SRAM",
                    Access = MemoryAccess.Undefined,
                    Type = MemoryType.RAM,
                    Start = Convert.ToUInt32(aStartRam, 16),
                    Size = Convert.ToUInt32(aLenRam, 16),
                });

                return layout;
            }