forked from len0rd/rockbox
headergen_v2: add ST generator for STM32 family
Change-Id: Id8f06a6f77cc58d3f0f94b72108dc91ba8037813
This commit is contained in:
parent
2db0627d38
commit
ecfc62cda6
1 changed files with 162 additions and 0 deletions
|
@ -2414,6 +2414,166 @@ class cortex_m_generator : public common_generator
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generator: st
|
||||||
|
*/
|
||||||
|
|
||||||
|
class st_generator : public common_generator
|
||||||
|
{
|
||||||
|
bool has_support_macros() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool has_selectors() const
|
||||||
|
{
|
||||||
|
return m_soc.size() >= 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool has_offsets() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string selector_soc_dir(const soc_ref_t& ref) const
|
||||||
|
{
|
||||||
|
return ref.get()->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string selector_include_header() const
|
||||||
|
{
|
||||||
|
return "select.h";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string selector_soc_macro(const soc_ref_t& ref) const
|
||||||
|
{
|
||||||
|
return toupper(ref.get()->name) + "_INCLUDE";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string register_header(const node_inst_t& inst) const
|
||||||
|
{
|
||||||
|
/* one register header per top-level block */
|
||||||
|
if(inst.is_root())
|
||||||
|
return "<error>";
|
||||||
|
if(inst.parent().is_root())
|
||||||
|
return tolower(inst.node().name()) + ".h";
|
||||||
|
else
|
||||||
|
return register_header(inst.parent());
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string macro_name(macro_name_t macro, bool relative) const
|
||||||
|
{
|
||||||
|
switch(macro)
|
||||||
|
{
|
||||||
|
case MN_REG_READ: return relative ? "st_readl" : "st_read";
|
||||||
|
case MN_FIELD_READ: return relative ? "st_readlf" : "st_readf";
|
||||||
|
case MN_FIELD_READX: return "st_vreadf";
|
||||||
|
case MN_REG_WRITE: return relative ? "st_writel" : "st_write";
|
||||||
|
case MN_FIELD_WRITE: return relative ? "st_writelf" : "st_writef";
|
||||||
|
case MN_FIELD_OVERWRITE: return relative ? "st_overwritelf" : "st_overwritef";
|
||||||
|
case MN_FIELD_WRITEX: return "st_vwritef";
|
||||||
|
case MN_FIELD_SET: return relative ? "st_setlf" : "st_setf";
|
||||||
|
case MN_FIELD_CLEAR: return relative ? "st_clrlf" : "st_clrf";
|
||||||
|
case MN_FIELD_OR: return "st_orf";
|
||||||
|
case MN_FIELD_OR_MASK: return "__st_orfm"; // internal macro
|
||||||
|
case MN_MASK_OR: return "st_orm";
|
||||||
|
case MN_GET_VARIANT: return "__st_variant"; // internal macro
|
||||||
|
case MN_VARIABLE: return relative ? "st_regl" : "st_reg";
|
||||||
|
default: return "<macro_name>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string macro_header() const
|
||||||
|
{
|
||||||
|
return "macro.h";
|
||||||
|
}
|
||||||
|
|
||||||
|
bool register_flag(const node_inst_t& inst, register_flag_t flag) const
|
||||||
|
{
|
||||||
|
/* make everything parametrized */
|
||||||
|
switch(flag)
|
||||||
|
{
|
||||||
|
case RF_GENERATE_ALL_INST: return false;
|
||||||
|
case RF_GENERATE_PARAM_INST: return true;
|
||||||
|
default: return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string type_xfix(macro_type_t type, bool prefix) const
|
||||||
|
{
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case MT_NODE_ADDR: /* fallthrough */
|
||||||
|
case MT_REG_ADDR: return prefix ? "STA_" : "";
|
||||||
|
case MT_REG_OFFSET: return prefix ? "STO_" : "";
|
||||||
|
case MT_REG_TYPE: return prefix ? "STT_" : "";
|
||||||
|
case MT_REG_NAME: return prefix ? "STN_" : "";
|
||||||
|
case MT_REG_VAR: return prefix ? "REG_" : "";
|
||||||
|
case MT_FIELD_BP: return prefix ? "BP_" : "";
|
||||||
|
case MT_FIELD_BM: return prefix ? "BM_" : "";
|
||||||
|
case MT_FIELD_BV: return prefix ? "BV_" : "";
|
||||||
|
case MT_FIELD_BF: return prefix ? "BF_" : "";
|
||||||
|
case MT_FIELD_BFM: return prefix ? "BFM_" : "";
|
||||||
|
case MT_FIELD_BFV: return prefix ? "BF_" : "_V";
|
||||||
|
case MT_FIELD_BFMV: return prefix ? "BFM_" : "_V";
|
||||||
|
case MT_IO_TYPE: return prefix ? "STIO_" : "";
|
||||||
|
default: return "<xfix>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string variant_xfix(const std::string& variant, bool prefix) const
|
||||||
|
{
|
||||||
|
/* variant X -> reg_X */
|
||||||
|
if(prefix)
|
||||||
|
return "";
|
||||||
|
else
|
||||||
|
return "_" + toupper(variant);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string inst_prefix(const node_inst_t& inst) const
|
||||||
|
{
|
||||||
|
/* separate blocks with _: block_reg */
|
||||||
|
return "_";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string field_prefix() const
|
||||||
|
{
|
||||||
|
/* separate fields with _: block_reg_field */
|
||||||
|
return "_";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string enum_prefix() const
|
||||||
|
{
|
||||||
|
/* separate enums with __: block_reg_field__enum */
|
||||||
|
return "__";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string enum_name(const enum_ref_t& enum_) const
|
||||||
|
{
|
||||||
|
return enum_.get()->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
access_type_t register_access(const std::string& variant, access_t access) const
|
||||||
|
{
|
||||||
|
if(access == WRITE_ONLY)
|
||||||
|
return AT_WO;
|
||||||
|
else if(access == READ_ONLY)
|
||||||
|
return AT_RO;
|
||||||
|
else
|
||||||
|
return AT_RW;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool has_sct() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string sct_variant(macro_name_t name) const
|
||||||
|
{
|
||||||
|
return "<variant>";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Driver
|
* Driver
|
||||||
*/
|
*/
|
||||||
|
@ -2428,6 +2588,8 @@ abstract_generator *get_generator(const std::string& name)
|
||||||
return new atj_generator();
|
return new atj_generator();
|
||||||
else if(name == "cortex_m")
|
else if(name == "cortex_m")
|
||||||
return new cortex_m_generator();
|
return new cortex_m_generator();
|
||||||
|
else if(name == "st")
|
||||||
|
return new st_generator();
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue