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