コード例 #1
0
                public STM32MCUBuilder(ParsedMCU parsedMCU, DeviceMemoryDatabase db)
                {
                    MCU      = parsedMCU;
                    Memories = db.LookupMemories(parsedMCU.RPN, parsedMCU.RefName, out PredefinedLinkerScripts);
                    if (Memories.Length < 1)
                    {
                        if (parsedMCU.strCore != "")
                        {
                            Memories = db.LookupMemoriesTwoCore(parsedMCU.RPN, parsedMCU.strCore, parsedMCU.RefName);
                        }
                        if (Memories.Length < 1)
                        {
                            throw new Exception("Could not locate memories for " + parsedMCU.Name);
                        }
                    }

                    for (int i = 0; i < Memories.Length; i++)
                    {
                        Memories[i].SortWeight = 100 + i;
                        if (Memories[i].Name == "FLASH")
                        {
                            Memories[i].SortWeight = 0;
                        }
                        else if (Memories[i].Name == "RAM")
                        {
                            Memories[i].SortWeight = 1;
                        }
                    }

                    Memories = Memories.OrderBy(m => m.SortWeight).ToArray();
                }
コード例 #2
0
            public List <MCUBuilder> LoadDeviceList(Program.STM32BSPBuilder bspBuilder)
            {
                List <MCUBuilder> result    = new List <MCUBuilder>();
                XmlDocument       doc       = new XmlDocument();
                string            familyDir = Path.Combine(bspBuilder.STM32CubeDir, @"db\mcu");
                var db = new DeviceMemoryDatabase(bspBuilder.STM32CubeDir);

                doc.Load(Path.Combine(familyDir, @"families.xml"));
                var rawMCUs = doc.DocumentElement.SelectNodes("Family/SubFamily/Mcu").OfType <XmlElement>().Select(n => new ParsedMCU(n, familyDir, db)).ToArray();

                foreach (var grp in rawMCUs.GroupBy(m => m.RPN))
                {
                    //As of November 2017, some MCUs in sharing the same RPN (namely STM32F103RC) have different FLASH/RAM sizes.
                    //We need to detect this and create multiple MCU entries for them, e.g. STM32F103RCTx and STM32F103RCYx
                    var mcusByConfig = grp.GroupBy(m => m.Config).ToArray();
                    if (mcusByConfig.Length == 1)
                    {
                        result.Add(mcusByConfig.First().First().ToMCUBuilder(db));
                    }
                    else
                    {
                        foreach (var subGrp in mcusByConfig)
                        {
                            result.Add(subGrp.First().ToMCUBuilder(db, true));
                        }
                    }
                }

                return(result);
            }
コード例 #3
0
                public STM32MCUBuilder(ParsedMCU parsedMCU, DeviceMemoryDatabase db)
                {
                    MCU = parsedMCU;

                    Memories = parsedMCU.Memories.ToArray();
                    if (Memories.Length == 0)
                    {
                        throw new Exception("Could not locate memories for " + parsedMCU.Name);
                    }

                    for (int i = 0; i < Memories.Length; i++)
                    {
                        Memories[i].SortWeight = 100 + i;
                        if (Memories[i].Name == "FLASH")
                        {
                            Memories[i].SortWeight = 0;
                        }
                        else if (Memories[i].Name == "RAM")
                        {
                            Memories[i].SortWeight = 1;
                        }
                    }

                    Memories = Memories.OrderBy(m => m.SortWeight).ToArray();
                }
コード例 #4
0
                public ParsedMCU(XmlElement n, string familyDir, DeviceMemoryDatabase db, string[] cores, int coreIndex)
                {
                    Name    = n.GetAttribute("Name");
                    RefName = n.GetAttribute("RefName");
                    RPN     = n.GetAttribute("RPN");

                    const string prefix = "Arm Cortex-";

                    if (!cores[coreIndex].StartsWith(prefix, StringComparison.InvariantCultureIgnoreCase))
                    {
                        throw new Exception("Unknown core: " + cores[coreIndex]);
                    }

                    string shortCore = cores[coreIndex].Substring(prefix.Length);

                    Core = ParseCore(shortCore);

                    if (cores.Length > 1)
                    {
                        CoreSuffix = shortCore.Replace('+', 'p');

                        if (coreIndex > 0)
                        {
                            //Secondary core uses a special name.
                            Name += "_" + CoreSuffix;
                            RPN  += "_" + CoreSuffix;
                        }
                    }
                    else
                    {
                        CoreSuffix = null;
                    }

                    Memories = db.LookupMemories(RPN, RefName, CoreSuffix, out LinkerScripts, out Define, out string fpu);
                    FPU      = ParseFPU(fpu);

                    if (cores.Length > 1 && coreIndex > 0 && Core == CortexCore.M4)
                    {
                        FPU = FPUType.SP;
                    }

                    //RAMs = mcuDef.SelectNodes("mcu:Ram", nsmgr2).OfType<XmlElement>().Select(n2 => int.Parse(n2.InnerText)).ToArray();
                    RAMs = n.SelectNodes("Ram").OfType <XmlElement>().Select(n2 => int.Parse(n2.InnerText)).ToArray();
                    if (RAMs.Length < 1)
                    {
                        throw new Exception("No RAMs defined for " + Name);
                    }

                    var flash = n.SelectNodes("Flash").OfType <XmlElement>().Select(n2 => int.Parse(n2.InnerText)).ToArray();

                    if (flash.Length != 1)
                    {
                        throw new Exception("Multiple or missing FLASH definitions of " + Name);
                    }
                    FLASH = flash[0];
                }
コード例 #5
0
 public MCUBuilder ToMCUBuilder(DeviceMemoryDatabase db, bool useSpecializedName = false)
 {
     return(new STM32MCUBuilder(this, db)
     {
         Name = useSpecializedName ? RefName : RPN,
         FlashSize = FLASH * 1024,
         RAMSize = 0,    //This will be adjusted later in our override of GenerateDefinition()
         Core = Core
     });
 }
コード例 #6
0
 public MCUBuilder ToMCUBuilder(DeviceMemoryDatabase db, string nameOverride = null)
 {
     return(new STM32MCUBuilder(this, db, nameOverride)
     {
         Name = nameOverride ?? RPN,
         FlashSize = FLASH * 1024,
         RAMSize = 0,    //This will be adjusted later in our override of GenerateDefinition()
         Core = Core
     });
 }
コード例 #7
0
 public MCUBuilder ToMCUBuilder(DeviceMemoryDatabase db, string nameOverride = null)
 {
     return(new STM32MCUBuilder(this, db, nameOverride)
     {
         Name = nameOverride ?? RPN,
         FlashSize = FLASH * 1024,
         RAMSize = RAMs.First() * 1024,
         Core = Core
     });
 }
コード例 #8
0
                public ParsedMCU(XmlElement n, string familyDir, DeviceMemoryDatabase db)
                {
                    Name    = n.GetAttribute("Name");
                    RefName = n.GetAttribute("RefName");
                    RPN     = n.GetAttribute("RPN");

                    //var mcuDef = LoadMCUDefinition(familyDir, Name);
                    //var nsmgr2 = new XmlNamespaceManager(mcuDef.OwnerDocument.NameTable);
                    //nsmgr2.AddNamespace("mcu", "http://mcd.rou.st.com/modules.php?name=mcu");

                    var core = n.SelectSingleNode("Core").InnerText;

                    switch (core)
                    {
                    case "ARM Cortex-M0":
                        Core = CortexCore.M0;
                        break;

                    case "ARM Cortex-M0+":
                        Core = CortexCore.M0Plus;
                        break;

                    case "ARM Cortex-M3":
                        Core = CortexCore.M3;
                        break;

                    case "ARM Cortex-M4":
                        Core = CortexCore.M4;
                        break;

                    case "ARM Cortex-M7":
                        Core = CortexCore.M7;
                        break;

                    default:
                        throw new Exception("Don't know how to map core: " + core);
                    }

                    Memories = db.LookupMemories(RPN, RefName);

                    //RAMs = mcuDef.SelectNodes("mcu:Ram", nsmgr2).OfType<XmlElement>().Select(n2 => int.Parse(n2.InnerText)).ToArray();
                    RAMs = n.SelectNodes("Ram").OfType <XmlElement>().Select(n2 => int.Parse(n2.InnerText)).ToArray();
                    if (RAMs.Length < 1)
                    {
                        throw new Exception("No RAMs defined for " + Name);
                    }

                    var flash = n.SelectNodes("Flash").OfType <XmlElement>().Select(n2 => int.Parse(n2.InnerText)).ToArray();

                    if (flash.Length != 1)
                    {
                        throw new Exception("Multiple or missing FLASH definitions of " + Name);
                    }
                    FLASH = flash[0];
                }
コード例 #9
0
                public STM32MCUBuilder(ParsedMCU parsedMCU, DeviceMemoryDatabase db, string specializedName)
                {
                    MCU      = parsedMCU;
                    Memories = db.LookupMemories(specializedName ?? parsedMCU.RPN);
                    if (Memories.Length < 1)
                    {
                        throw new Exception("Could not locate memories for " + parsedMCU.Name);
                    }

                    for (int i = 0; i < Memories.Length; i++)
                    {
                        Memories[i].SortWeight = 100 + i;
                        if (Memories[i].Name == "FLASH")
                        {
                            Memories[i].SortWeight = 0;
                        }
                        else if (Memories[i].Name == "RAM")
                        {
                            Memories[i].SortWeight = 1;
                        }
                    }

                    Memories = Memories.OrderBy(m => m.SortWeight).ToArray();
                }