public void Parse(Firmware firmware) { StreamReader sr = new StreamReader(mPath, Encoding.Default); Console.WriteLine("Parsing file: {0}...", mPath); while (sr.EndOfStream == false) { string line = sr.ReadLine(); // Parse line like: C:00000040 32 char[] split = { ':', ' ' }; string[] parts = line.Split(split); Char type = Convert.ToChar(parts[0]); UInt32 address = UInt32.Parse(parts[1], System.Globalization.NumberStyles.HexNumber); Byte value = Byte.Parse(parts[2], System.Globalization.NumberStyles.HexNumber); //Console.WriteLine("Parse a line: type={0}, address={1}, value={2}", type, address, value); //Console.ReadKey(); if (type.Equals('C')) { firmware.AddCode(address, value); } else { firmware.AddData(address, value); } } }
public static Firmware parse(string configFile) { Firmware firmware = null; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(configFile); string fwNodePath = ConfigXml.NODE_ROOT + "/" + ConfigXml.NODE_FIRMWARE; XmlNodeList nodeList = xmlDoc.SelectNodes(fwNodePath); // Just support one firmware in ConfigXml firmware = Firmware.CreateFromXml(nodeList.Item(0)); return(firmware); }
public FirmwareGenerator(Firmware firmware, string path, string name) { mPath = path; mName = name; mFirmware = firmware; }
public static Firmware CreateFromXml(XmlNode fwNode) { Firmware firmware = new Firmware(); XmlNode cur_node = null; UInt32 extDataMemStart = 0, extDataMemEnd = 0; UInt32 srcItcmStart = 0, srcItcmEnd = 0, dstItcmStart = 0; UInt32 srcDtcmStart = 0, srcDtcmEnd = 0, dstDtcmStart = 0; string extrFilePath = null; UInt32 extrFileAddr = 0; // Parse firmware information in ConfigXml string version = fwNode.SelectSingleNode(ConfigXml.ATTR_VERSION).InnerText.Trim(); string coreName = fwNode.SelectSingleNode(ConfigXml.ATTR_CORENAME).InnerText.Trim(); string toolsPath = fwNode.SelectSingleNode(ConfigXml.ATTR_TOOLSPATH).InnerText.Trim(); string compatiable = fwNode.SelectSingleNode(ConfigXml.ATTR_COMPATIBLE).InnerText.Trim(); string exeFilePath = fwNode.SelectSingleNode(ConfigXml.ATTR_EXEFILE).InnerText.Trim(); UInt32 maxCodeSize = (UInt32)Convert.ToInt32(fwNode.SelectSingleNode(ConfigXml.ATTR_MAX_CSIZE).InnerText.Trim(), 16); UInt32 maxDataSize = (UInt32)Convert.ToInt32(fwNode.SelectSingleNode(ConfigXml.ATTR_MAX_DSIZE).InnerText.Trim(), 16); cur_node = fwNode.SelectSingleNode(ConfigXml.ATTR_EXTRFILE); if (cur_node != null) { extrFilePath = cur_node.InnerText.Trim(); } cur_node = fwNode.SelectSingleNode(ConfigXml.ATTR_EXTRADDR); if (cur_node != null) { extrFileAddr = (UInt32)Convert.ToInt32(cur_node.InnerText.Trim(), 16); } /* itcm */ cur_node = fwNode.SelectSingleNode(ConfigXml.ATTR_SRC_ITCM_START); if (cur_node != null) { srcItcmStart = (UInt32)Convert.ToInt32(cur_node.InnerText.Trim(), 16); } cur_node = fwNode.SelectSingleNode(ConfigXml.ATTR_SRC_ITCM_END); if (cur_node != null) { srcItcmEnd = (UInt32)Convert.ToInt32(cur_node.InnerText.Trim(), 16); } cur_node = fwNode.SelectSingleNode(ConfigXml.ATTR_DST_ITCM_START); if (cur_node != null) { dstItcmStart = (UInt32)Convert.ToInt32(cur_node.InnerText.Trim(), 16); } /* dtcm */ cur_node = fwNode.SelectSingleNode(ConfigXml.ATTR_SRC_DTCM_START); if (cur_node != null) { srcDtcmStart = (UInt32)Convert.ToInt32(cur_node.InnerText.Trim(), 16); } cur_node = fwNode.SelectSingleNode(ConfigXml.ATTR_SRC_DTCM_END); if (cur_node != null) { srcDtcmEnd = (UInt32)Convert.ToInt32(cur_node.InnerText.Trim(), 16); } cur_node = fwNode.SelectSingleNode(ConfigXml.ATTR_DST_DTCM_START); if (cur_node != null) { dstDtcmStart = (UInt32)Convert.ToInt32(cur_node.InnerText.Trim(), 16); } /* extern data */ cur_node = fwNode.SelectSingleNode(ConfigXml.ATTR_EXTDMEM_START); if (cur_node != null) { extDataMemStart = (UInt32)Convert.ToInt32(cur_node.InnerText.Trim(), 16); } cur_node = fwNode.SelectSingleNode(ConfigXml.ATTR_EXTDMEM_END); if (cur_node != null) { extDataMemEnd = (UInt32)Convert.ToInt32(cur_node.InnerText.Trim(), 16); } #if OVERLAYS UInt32 codeLoadableStart = (UInt32)Convert.ToInt32(fwNode.SelectSingleNode(ConfigXml.ATTR_LOADABLE_CSTART).InnerText.Trim(), 16); UInt32 codeLoadableSize = (UInt32)Convert.ToInt32(fwNode.SelectSingleNode(ConfigXml.ATTR_LOADABLE_CSIZE).InnerText.Trim(), 16); UInt32 dataLoadableStart = (UInt32)Convert.ToInt32(fwNode.SelectSingleNode(ConfigXml.ATTR_LOADABLE_DSTART).InnerText.Trim(), 16); UInt32 dataLoadableSize = (UInt32)Convert.ToInt32(fwNode.SelectSingleNode(ConfigXml.ATTR_LOADABLE_DSIZE).InnerText.Trim(), 16); UInt32 externalCodeStart = (UInt32)Convert.ToInt32(fwNode.SelectSingleNode(ConfigXml.ATTR_EXTCMEM_START).InnerText.Trim(), 16); UInt32 externalCodeEnd = (UInt32)Convert.ToInt32(fwNode.SelectSingleNode(ConfigXml.ATTR_EXTCMEM_END).InnerText.Trim(), 16); UInt32 externalDataStart = (UInt32)Convert.ToInt32(fwNode.SelectSingleNode(ConfigXml.ATTR_EXTDMEM_START).InnerText.Trim(), 16); UInt32 externalDataEnd = (UInt32)Convert.ToInt32(fwNode.SelectSingleNode(ConfigXml.ATTR_EXTDMEM_END).InnerText.Trim(), 16); #endif firmware.SetVersion(version); firmware.SetCoreName(coreName); firmware.SetToolsPath(toolsPath); firmware.SetCompatible(compatiable); firmware.SetMaxCodeSize(maxCodeSize); firmware.SetMaxDataSize(maxDataSize); firmware.SetExecutableFile(new ExecutableFile(exeFilePath, coreName, toolsPath, extrFilePath, extrFileAddr)); firmware.SetExternalFile(extrFilePath); firmware.GetExecutableFile().SetTcmAddr(srcItcmStart, srcItcmEnd, dstItcmStart, srcDtcmStart, srcDtcmEnd, dstDtcmStart, extDataMemStart, extDataMemEnd); ArrayList secInfo = firmware.GetExecutableFile().Parser(); #if OVERLAYS firmware.SetCodeLoadableStart(codeLoadableStart); firmware.SetCodeLoadableSize(codeLoadableSize); firmware.SetDataLoadableStart(dataLoadableStart); firmware.SetDataLoadableSize(dataLoadableSize); #endif XmlNodeList nodeList = fwNode.SelectNodes(ConfigXml.NODE_IMAGE); if (nodeList.Count < 1) { Console.WriteLine("At least one image in firmware node"); return(null); } foreach (XmlNode node in nodeList) { Image image = null; int id = int.Parse(node.SelectSingleNode(ConfigXml.ATTR_ID).InnerText.Trim()); string name = node.SelectSingleNode(ConfigXml.ATTR_NAME).InnerText.Trim(); string type = node.SelectSingleNode(ConfigXml.ATTR_TYPE).InnerText.Trim(); #if OVERLAYS if (type.Equals(ImageType.LOADABLE_STRING)) { image = LoadableImage.CreateFromXml(node, id, name); image.SetInternalCodeRange(codeLoadableStart, codeLoadableStart + codeLoadableSize); image.SetInternalDataRange(dataLoadableStart, dataLoadableStart + dataLoadableSize); } else if (type.Equals(ImageType.PERMANENT_STRING)) { image = PermanentImage.CreateFromXml(node, id, name); image.SetInternalCodeRange(0, maxCodeSize); image.SetInternalDataRange(0, maxDataSize); image.SetExternalCodeRange(externalCodeStart, externalCodeEnd); image.SetExternalDataRange(externalDataStart, externalDataEnd); } #else image = PermanentImage.CreateFromXml(node, id, name, secInfo); image.SetInternalCodeRange(0, maxCodeSize); image.SetInternalDataRange(0, maxDataSize); #endif firmware.AddImage(image); } return(firmware); }