예제 #1
0
        static void Main(string[] args)
        {
            if (args.Length < 1)
            {
                throw new Exception("Usage: rm57x.exe <RM57x generated HAL directory>");
            }
            string DirSDK     = args[0];
            var    bspBuilder = new RM57xBSPBuilder(new BSPDirectories(args[0], @"..\..\Output", @"..\..\rules"));

            bool noPeripheralRegisters = args.Contains("/noperiph");
            bool noPack = args.Contains("/nopack");

            MCUFamilyBuilder famBuilder = new MCUFamilyBuilder(bspBuilder, XmlTools.LoadObject <FamilyDefinition>(Path.Combine(bspBuilder.Directories.RulesDir, "families\\rm57x.xml")));

            //string deviceDefinitionFile = @"DeviceDefinitions/CC_3220.xml";

            foreach (var name in new[] { "RM57L843ZWT" })
            {
                famBuilder.MCUs.Add(new MCUBuilder
                {
                    Core      = CortexCore.R5F,
                    FlashSize = 4096 * 1024,
                    RAMSize   = 512 * 1024,
                    Name      = name,
                    //MCUDefinitionFile = deviceDefinitionFile,
                    StartupFile = null
                });
            }


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

            var           famObj       = famBuilder.GenerateFamilyObject(MCUFamilyBuilder.CoreSpecificFlags.All & ~MCUFamilyBuilder.CoreSpecificFlags.PrimaryMemory);
            List <string> projectFiles = new List <string>();

            commonPseudofamily.CopyFamilyFiles(ref famObj.CompilationFlags, projectFiles);

            famObj.AdditionalSourceFiles = famObj.AdditionalSourceFiles.Concat(projectFiles).ToArray();

            foreach (var fw in commonPseudofamily.GenerateFrameworkDefinitions())
            {
                frameworks.Add(fw);
            }

            foreach (var sample in commonPseudofamily.CopySamples())
            {
                exampleDirs.Add(sample);
            }

            if (!noPeripheralRegisters)
            {
                famBuilder.AttachPeripheralRegisters(ParsePeripheralRegisters(famBuilder.Definition.PrimaryHeaderDir));
            }

            List <MCU> mcuDefinitions = new List <MCU>();

            foreach (var mcuDef in famBuilder.MCUs)
            {
                var mcu = mcuDef.GenerateDefinition(famBuilder, bspBuilder, !noPeripheralRegisters, true);
                mcuDefinitions.Add(mcu);
            }

            BoardSupportPackage bsp = new BoardSupportPackage
            {
                PackageID            = "com.sysprogs.arm.ti.rm57x",
                PackageDescription   = "TI RM57Lx Devices",
                GNUTargetID          = "arm-eabi",
                GeneratedMakFileName = "rm57x.mak",
                MCUFamilies          = new[] { famObj },
                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(),
                ConditionalFlags     = commonPseudofamily.Definition.ConditionalFlags,
                PackageVersion       = "1.0"
            };

            bspBuilder.Save(bsp, !noPack);

            //StandaloneBSPValidator.Program.Main(new[] { "..\\..\\cc3220.validatejob", "f:\\bsptest" });
        }
예제 #2
0
        static void Main(string[] args)
        {
            if (args.Length < 1)
            {
                throw new Exception("Usage: rm57x.exe <RM57x generated HAL directory>");
            }
            string DirSDK = args[0];


            using (var bspBuilder = new RM57xBSPBuilder(new BSPDirectories(args[0], @"..\..\Output", @"..\..\rules", @"..\..\log")))
            {
                var xml = new XmlDocument();
                xml.Load(Path.Combine(bspBuilder.Directories.InputDir, "NonRTOS\\NonRTOS.hcg"));

                var deviceID = xml.DocumentElement.SelectSingleNode("DEVICE/device")?.InnerText ?? throw new Exception("Failed to extract the device ID");
                var familyID = xml.DocumentElement.SelectSingleNode("DEVICE/family")?.InnerText ?? throw new Exception("Failed to extract the family ID");

                CortexCore core;
                bool       isBigEndian = false;
                bool       isThumb     = true;

                switch (deviceID)
                {
                case "RM57L843ZWT":
                    core = CortexCore.R5;
                    break;

                case "TMS570LS1224PGE":
                    core        = CortexCore.R4;
                    isBigEndian = true;
                    isThumb     = false;
                    break;

                default:
                    throw new Exception($"Unknown ARM Cortex core for {deviceID}. Please update the logic above.");
                }

                bool noPeripheralRegisters = args.Contains("/noperiph");
                bool noPack = args.Contains("/nopack");

                var nonRTOSDir       = Path.GetFullPath(Path.Combine(bspBuilder.Directories.InputDir, "NonRTOS"));
                var linkerScriptPath = Directory.GetFiles(nonRTOSDir, "*.ld", SearchOption.AllDirectories)[0];

                MCUFamilyBuilder famBuilder = new MCUFamilyBuilder(bspBuilder, XmlTools.LoadObject <FamilyDefinition>(Path.Combine(bspBuilder.Directories.RulesDir, "families\\rm57x.xml")));
                famBuilder.Definition.Name = familyID;

                if (isBigEndian)
                {
                    famBuilder.Definition.CompilationFlags.COMMONFLAGS += " -mbig-endian -mbe32";
                }

                //string deviceDefinitionFile = @"DeviceDefinitions/CC_3220.xml";

                var memories = LinkerScriptTools.ScanLinkerScriptForMemories(linkerScriptPath);

                famBuilder.MCUs.Add(new MCUBuilder
                {
                    Core      = core,
                    FPU       = FPUType.DP,
                    FlashSize = (int)memories.First(m => m.Name == "FLASH").Size,
                    RAMSize   = (int)memories.First(m => m.Name == "RAM").Size,
                    Name      = deviceID,
                    //MCUDefinitionFile = deviceDefinitionFile,
                    StartupFile = null
                });

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

                var           famObj       = famBuilder.GenerateFamilyObject(MCUFamilyBuilder.CoreSpecificFlags.All & ~MCUFamilyBuilder.CoreSpecificFlags.PrimaryMemory);
                List <string> projectFiles = new List <string>();
                commonPseudofamily.CopyFamilyFiles(ref famObj.CompilationFlags, projectFiles);

                famObj.AdditionalSourceFiles = famObj.AdditionalSourceFiles.Concat(projectFiles).ToArray();

                if (!Directory.Exists(Path.Combine(bspBuilder.Directories.InputDir, "FreeRTOS")))
                {
                    Console.WriteLine("Missing FreeRTOS directory. Skipping FreeRTOS framework and project sample...");
                    commonPseudofamily.Definition.AdditionalFrameworks = commonPseudofamily.Definition.AdditionalFrameworks.Where(f => !f.ID.Contains("freertos")).ToArray();
                    commonPseudofamily.Definition.SmartSamples         = commonPseudofamily.Definition.SmartSamples.Where(f => f.EmbeddedSample.Name.IndexOf("freertos", StringComparison.InvariantCultureIgnoreCase) == -1).ToArray();
                }

                foreach (var fw in commonPseudofamily.GenerateFrameworkDefinitions())
                {
                    frameworks.Add(fw);
                }

                foreach (var sample in commonPseudofamily.CopySamples())
                {
                    exampleDirs.Add(sample);
                }

                if (!noPeripheralRegisters)
                {
                    famBuilder.AttachPeripheralRegisters(ParsePeripheralRegisters(famBuilder.Definition.PrimaryHeaderDir, deviceID));
                }

                if (!isThumb)
                {
                    famObj.CompilationFlags.COMMONFLAGS = famObj.CompilationFlags.COMMONFLAGS.Replace("-mthumb", "-marm");
                }

                List <MCU> mcuDefinitions = new List <MCU>();
                foreach (var mcuDef in famBuilder.MCUs)
                {
                    var mcu = mcuDef.GenerateDefinition(famBuilder, bspBuilder, !noPeripheralRegisters, true);

                    mcu.AdditionalSystemVars = (mcu.AdditionalSystemVars ?? new SysVarEntry[0]).Concat(new[]
                    {
                        new SysVarEntry {
                            Key = "com.sysprogs.linker_script", Value = linkerScriptPath.Substring(nonRTOSDir.Length + 1).Replace('\\', '/')
                        },
                        CreateHeaderFileVariable(nonRTOSDir, "common.h"),
                        CreateHeaderFileVariable(nonRTOSDir, "gio.h"),
                        CreateHeaderFileVariable(nonRTOSDir, "het.h"),
                    }).ToArray();

                    mcuDefinitions.Add(mcu);
                }

                ApplyKnownPatches(bspBuilder.Directories.OutputDir);

                BoardSupportPackage bsp = new BoardSupportPackage
                {
                    PackageID            = "com.sysprogs.arm.ti." + deviceID,
                    PackageDescription   = $"TI {deviceID} Device",
                    GNUTargetID          = "arm-eabi",
                    GeneratedMakFileName = familyID + ".mak",
                    MCUFamilies          = new[] { famObj },
                    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.Values.ToArray(),
                    ConditionalFlags     = commonPseudofamily.Definition.ConditionalFlags,
                    PackageVersion       = "1.0"
                };
                bspBuilder.Save(bsp, !noPack);

                //StandaloneBSPValidator.Program.Main(new[] { "..\\..\\cc3220.validatejob", "f:\\bsptest" });
            }
        }