diff options
| author | Amaury Pouly <amaury.pouly@gmail.com> | 2013-06-13 01:50:14 +0200 |
|---|---|---|
| committer | Amaury Pouly <amaury.pouly@gmail.com> | 2013-06-13 02:25:08 +0200 |
| commit | 73db73dbd3c5c6a27e022a5c724136ca6fc2ffe8 (patch) | |
| tree | 5e73c4b4477b2f47f4581f68d800ef4cb7b8a37a /utils/regtools/desc_parser.cpp | |
| parent | 7143ea681c377fe5901bd79801366a26ae0d394a (diff) | |
| download | rockbox-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 |