1
0
Fork 0
mirror of https://git.rwth-aachen.de/acs/public/villas/node/ synced 2025-03-09 00:00:00 +01:00

ips/dma: use json_unpack

This commit is contained in:
Niklas Eiling 2022-11-07 10:33:00 -05:00 committed by Steffen Vogel
parent bac0b7309a
commit 7b4176a710

View file

@ -52,23 +52,6 @@ bool Dma::init()
logger->info("Scatter-Gather support: {}", hasScatterGather());
xConfig.BaseAddr = getBaseAddr(registerMemory);
if (!configSet) {
xConfig.HasStsCntrlStrm = 0;
xConfig.HasMm2S = 1;
xConfig.HasMm2SDRE = 0;
xConfig.Mm2SDataWidth = 32;
xConfig.HasS2Mm = 1;
xConfig.HasS2MmDRE = 0;
xConfig.HasSg = hasScatterGather();
xConfig.S2MmDataWidth = 32;
xConfig.Mm2sNumChannels = 1;
xConfig.S2MmNumChannels = 1;
xConfig.Mm2SBurstSize = 16;
xConfig.S2MmBurstSize = 16;
xConfig.MicroDmaMode = 0;
xConfig.AddrWidth = 32;
xConfig.SgLengthWidth = 14;
}
if (XAxiDma_CfgInitialize(&xDma, &xConfig) != XST_SUCCESS)
{
@ -612,92 +595,46 @@ bool
DmaFactory::configureJson(Core& ip, json_t* json)
{
auto &dma = dynamic_cast<Dma&>(ip);
enum DmaParameters {
HasStsCntrlStrm,
HasMm2S,
HasMm2SDRE,
Mm2SDataWidth,
HasS2Mm,
HasS2MmDRE,
S2MmDataWidth,
HasSg,
Mm2sNumChannels,
S2MmNumChannels,
MicroDmaMode,
AddrWidth,
SgLengthWidth
};
static const std::map<const char*, DmaParameters> ParaMap = {
{"c_sg_include_stscntrl_strm", HasStsCntrlStrm},
{"c_include_mm2s", HasMm2S},
{"c_include_mm2s_dre", HasMm2SDRE},
{"c_m_axi_mm2s_data_width", Mm2SDataWidth},
{"c_include_s2mm", HasS2Mm},
{"c_include_s2mm_dre", HasS2MmDRE},
{"c_m_axi_s2mm_data_width", S2MmDataWidth},
{"c_include_sg", HasSg},
{"c_num_mm2s_channels", Mm2sNumChannels},
{"c_num_s2mm_channels", S2MmNumChannels},
{"c_micro_dma", MicroDmaMode},
{"c_addr_width", AddrWidth},
{"c_sg_length_width", SgLengthWidth}
};
json_t* json_params = json_object_get(json, "parameters");
if (!json_is_object(json_params))
return true;
return false;
const char* paramName;
json_t* json_param;
json_object_foreach(json_params, paramName, json_param) {
auto it = ParaMap.find(paramName);
if (it == ParaMap.end())
continue;
switch (it->second) {
case HasStsCntrlStrm:
dma.xConfig.HasStsCntrlStrm = json_integer_value(json_param);
break;
case HasMm2S:
dma.xConfig.HasMm2S = json_integer_value(json_param);
break;
case HasMm2SDRE:
dma.xConfig.HasMm2SDRE = json_integer_value(json_param);
break;
case Mm2SDataWidth:
dma.xConfig.Mm2SDataWidth = json_integer_value(json_param);
break;
case HasS2Mm:
dma.xConfig.HasS2Mm = json_integer_value(json_param);
break;
case HasS2MmDRE:
dma.xConfig.HasS2MmDRE = json_integer_value(json_param);
break;
case S2MmDataWidth:
dma.xConfig.S2MmDataWidth = json_integer_value(json_param);
break;
case HasSg:
dma.xConfig.HasSg = json_integer_value(json_param);
break;
case Mm2sNumChannels:
dma.xConfig.Mm2sNumChannels = json_integer_value(json_param);
break;
case S2MmNumChannels:
dma.xConfig.S2MmNumChannels = json_integer_value(json_param);
break;
case MicroDmaMode:
dma.xConfig.MicroDmaMode = json_integer_value(json_param);
break;
case AddrWidth:
dma.xConfig.AddrWidth = json_integer_value(json_param);
break;
case SgLengthWidth:
dma.xConfig.SgLengthWidth = json_integer_value(json_param);
break;
default:
break;
}
// Sensible default configuration
dma.xConfig.HasStsCntrlStrm = 0;
dma.xConfig.HasMm2S = 1;
dma.xConfig.HasMm2SDRE = 0;
dma.xConfig.Mm2SDataWidth = 32;
dma.xConfig.HasS2Mm = 1;
dma.xConfig.HasS2MmDRE = 0;
dma.xConfig.HasSg = 1;
dma.xConfig.S2MmDataWidth = 32;
dma.xConfig.Mm2sNumChannels = 1;
dma.xConfig.S2MmNumChannels = 1;
dma.xConfig.Mm2SBurstSize = 16;
dma.xConfig.S2MmBurstSize = 16;
dma.xConfig.MicroDmaMode = 0;
dma.xConfig.AddrWidth = 32;
dma.xConfig.SgLengthWidth = 14;
int ret = json_unpack(json_params,
"{ s?: i, s?: i, s?: i, s?: i, s?: i, s?: i, s?: i, s?: i, s?: i, s?: i, s?: i, s?: i, s?: i }",
"c_sg_include_stscntrl_strm", &dma.xConfig.HasStsCntrlStrm,
"c_include_mm2s", &dma.xConfig.HasMm2S,
"c_include_mm2s_dre", &dma.xConfig.HasMm2SDRE,
"c_m_axi_mm2s_data_width", &dma.xConfig.Mm2SDataWidth,
"c_include_s2mm", &dma.xConfig.HasS2Mm,
"c_include_s2mm_dre", &dma.xConfig.HasS2MmDRE,
"c_m_axi_s2mm_data_width", &dma.xConfig.S2MmDataWidth,
"c_include_sg", &dma.xConfig.HasSg,
"c_num_mm2s_channels", &dma.xConfig.Mm2sNumChannels,
"c_num_s2mm_channels", &dma.xConfig.S2MmNumChannels,
"c_micro_dma", &dma.xConfig.MicroDmaMode,
"c_addr_width", &dma.xConfig.AddrWidth,
"c_sg_length_width", &dma.xConfig.SgLengthWidth
);
if (ret != 0) {
logger->error("Failed to parse DMA configuration");
return false;
}
dma.configSet = true;
return true;
}