summaryrefslogtreecommitdiff
path: root/utils/regtools/desc_parser.cpp
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2013-06-13 01:50:14 +0200
committerAmaury Pouly <amaury.pouly@gmail.com>2013-06-13 02:25:08 +0200
commit73db73dbd3c5c6a27e022a5c724136ca6fc2ffe8 (patch)
tree5e73c4b4477b2f47f4581f68d800ef4cb7b8a37a /utils/regtools/desc_parser.cpp
parent7143ea681c377fe5901bd79801366a26ae0d394a (diff)
downloadrockbox-73db73dbd3c5c6a27e022a5c724136ca6fc2ffe8.zip
rockbox-73db73dbd3c5c6a27e022a5c724136ca6fc2ffe8.tar.gz
rockbox-73db73dbd3c5c6a27e022a5c724136ca6fc2ffe8.tar.bz2
rockbox-73db73dbd3c5c6a27e022a5c724136ca6fc2ffe8.tar.xz
regtools: modify description format and refactor tools
Change the XML description to unify multi dev/reg in a clean fashion. Move the description parser to its own library. Fix the tester and headergen tools to work with the new format and library. Move the STMP3700/3780 descriptions to the new format (and fixes many errors as well). Drop the hwemulgen tool in favor on the upcoming hwstub tools revamp. Change-Id: I7119a187aab5c8b083cc5228cb1b248ee29f184d
Diffstat (limited to '')
-rw-r--r--utils/regtools/lib/soc_desc.cpp (renamed from utils/regtools/desc_parser.cpp)81
1 files changed, 42 insertions, 39 deletions
diff --git a/utils/regtools/desc_parser.cpp b/utils/regtools/lib/soc_desc.cpp
index 940a619..413c309 100644
--- a/utils/regtools/desc_parser.cpp
+++ b/utils/regtools/lib/soc_desc.cpp
@@ -7,7 +7,7 @@
* \/ \/ \/ \/ \/
* $Id$
*
- * Copyright (C) 2002 by Amaury Pouly
+ * Copyright (C) 2012 by Amaury Pouly
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -18,7 +18,7 @@
* KIND, either express or implied.
*
****************************************************************************/
-#include "desc_parser.hpp"
+#include "soc_desc.hpp"
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <stdio.h>
@@ -150,74 +150,78 @@ bool parse_field_elem(xmlNode *node, soc_reg_field_t& field)
END_ATTR_MATCH()
BEGIN_NODE_MATCH(node->children)
- SOFT_MATCH_ELEM_NODE("value", field.values, parse_value_elem)
+ SOFT_MATCH_ELEM_NODE("value", field.value, parse_value_elem)
END_NODE_MATCH()
return true;
}
-bool parse_reg_elem(xmlNode *node, soc_reg_t& reg)
+bool parse_reg_addr_elem(xmlNode *node, soc_reg_addr_t& addr)
{
BEGIN_ATTR_MATCH(node->properties)
- MATCH_TEXT_ATTR("name", reg.name)
- MATCH_UINT32_ATTR("addr", reg.addr)
- SOFT_MATCH_SCT_ATTR("sct", reg.flags)
+ MATCH_TEXT_ATTR("name", addr.name)
+ MATCH_UINT32_ATTR("addr", addr.addr)
END_ATTR_MATCH()
- BEGIN_NODE_MATCH(node->children)
- MATCH_ELEM_NODE("field", reg.fields, parse_field_elem)
- END_NODE_MATCH()
-
return true;
}
-bool parse_multireg_elem(xmlNode *node, soc_multireg_t& mreg)
+bool parse_reg_formula_elem(xmlNode *node, soc_reg_formula_t& formula)
{
BEGIN_ATTR_MATCH(node->properties)
- MATCH_TEXT_ATTR("name", mreg.name)
- MATCH_UINT32_ATTR("base", mreg.base)
- MATCH_UINT32_ATTR("count", mreg.count)
- MATCH_UINT32_ATTR("offset", mreg.offset)
- SOFT_MATCH_SCT_ATTR("sct", mreg.flags)
+ MATCH_TEXT_ATTR("string", formula.string)
END_ATTR_MATCH()
- BEGIN_NODE_MATCH(node->children)
- MATCH_ELEM_NODE("reg", mreg.regs, parse_reg_elem)
- MATCH_ELEM_NODE("field", mreg.fields, parse_field_elem)
- END_NODE_MATCH()
+ formula.type = REG_FORMULA_STRING;
return true;
}
-bool parse_dev_elem(xmlNode *node, soc_dev_t& dev)
+bool parse_reg_elem(xmlNode *node, soc_reg_t& reg)
{
+ std::vector< soc_reg_formula_t > formulas;
BEGIN_ATTR_MATCH(node->properties)
- MATCH_TEXT_ATTR("name", dev.name)
- MATCH_UINT32_ATTR("addr", dev.addr)
- MATCH_TEXT_ATTR("long_name", dev.long_name)
- MATCH_TEXT_ATTR("desc", dev.desc)
+ MATCH_TEXT_ATTR("name", reg.name)
+ SOFT_MATCH_SCT_ATTR("sct", reg.flags)
END_ATTR_MATCH()
BEGIN_NODE_MATCH(node->children)
- MATCH_ELEM_NODE("multireg", dev.multiregs, parse_multireg_elem)
- MATCH_ELEM_NODE("reg", dev.regs, parse_reg_elem)
+ MATCH_ELEM_NODE("addr", reg.addr, parse_reg_addr_elem)
+ MATCH_ELEM_NODE("formula", formulas, parse_reg_formula_elem)
+ MATCH_ELEM_NODE("field", reg.field, parse_field_elem)
END_NODE_MATCH()
+ if(formulas.size() > 1)
+ {
+ fprintf(stderr, "Only one formula is allowed per register\n");
+ return false;
+ }
+ if(formulas.size() == 1)
+ reg.formula = formulas[0];
+
+ return true;
+}
+
+bool parse_dev_addr_elem(xmlNode *node, soc_dev_addr_t& addr)
+{
+ BEGIN_ATTR_MATCH(node->properties)
+ MATCH_TEXT_ATTR("name", addr.name)
+ MATCH_UINT32_ATTR("addr", addr.addr)
+ END_ATTR_MATCH()
+
return true;
}
-bool parse_multidev_elem(xmlNode *node, soc_multidev_t& dev)
+bool parse_dev_elem(xmlNode *node, soc_dev_t& dev)
{
BEGIN_ATTR_MATCH(node->properties)
MATCH_TEXT_ATTR("name", dev.name)
- MATCH_TEXT_ATTR("long_name", dev.long_name)
- MATCH_TEXT_ATTR("desc", dev.desc)
+ MATCH_TEXT_ATTR("version", dev.version)
END_ATTR_MATCH()
BEGIN_NODE_MATCH(node->children)
- MATCH_ELEM_NODE("dev", dev.devs, parse_dev_elem)
- MATCH_ELEM_NODE("multireg", dev.multiregs, parse_multireg_elem)
- MATCH_ELEM_NODE("reg", dev.regs, parse_reg_elem)
+ MATCH_ELEM_NODE("addr", dev.addr, parse_dev_addr_elem)
+ MATCH_ELEM_NODE("reg", dev.reg, parse_reg_elem)
END_NODE_MATCH()
return true;
@@ -231,22 +235,21 @@ bool parse_soc_elem(xmlNode *node, soc_t& soc)
END_ATTR_MATCH()
BEGIN_NODE_MATCH(node->children)
- MATCH_ELEM_NODE("dev", soc.devs, parse_dev_elem)
- MATCH_ELEM_NODE("multidev", soc.multidevs, parse_multidev_elem)
+ MATCH_ELEM_NODE("dev", soc.dev, parse_dev_elem)
END_NODE_MATCH()
return true;
}
-bool parse_root_elem(xmlNode *node, std::vector< soc_t >& socs)
+bool parse_root_elem(xmlNode *node, std::vector< soc_t >& soc)
{
BEGIN_NODE_MATCH(node)
- MATCH_ELEM_NODE("soc", socs, parse_soc_elem)
+ MATCH_ELEM_NODE("soc", soc, parse_soc_elem)
END_NODE_MATCH()
return true;
}
-bool parse_soc_desc(const std::string& filename, std::vector< soc_t >& socs)
+bool soc_desc_parse_xml(const std::string& filename, std::vector< soc_t >& socs)
{
LIBXML_TEST_VERSION