summaryrefslogtreecommitdiff
path: root/utils/regtools/qeditor/backend.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'utils/regtools/qeditor/backend.cpp')
-rw-r--r--utils/regtools/qeditor/backend.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/utils/regtools/qeditor/backend.cpp b/utils/regtools/qeditor/backend.cpp
index 75c504a..fa107ec 100644
--- a/utils/regtools/qeditor/backend.cpp
+++ b/utils/regtools/qeditor/backend.cpp
@@ -1,6 +1,7 @@
#include <QFile>
#include <QTextStream>
#include <QDebug>
+#include <QFileInfo>
#include "backend.h"
/**
@@ -99,9 +100,38 @@ bool FileIoBackend::Reload()
else if(ok)
m_map[key] = val;
}
+
+ m_readonly = !QFileInfo(file).isWritable();
+ m_dirty = false;
+ return true;
+}
+
+bool FileIoBackend::WriteRegister(const QString& name, soc_word_t value)
+{
+ m_dirty = true;
+ m_map[name] = value;
return true;
}
+bool FileIoBackend::Commit()
+{
+ if(!m_dirty)
+ return true;
+ QFile file(m_filename);
+ if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text))
+ return false;
+ QTextStream out(&file);
+ out << "HW = " << m_soc << "\n";
+ QMapIterator< QString, soc_word_t > it(m_map);
+ while(it.hasNext())
+ {
+ it.next();
+ out << it.key() << " = " << it.value() << "\n";
+ }
+ out.flush();
+ return file.flush();
+}
+
#ifdef HAVE_HWSTUB
/**
* HWStubDevice
@@ -195,6 +225,14 @@ bool HWStubDevice::ReadMem(soc_addr_t addr, size_t length, void *buffer)
return ret >= 0 && (size_t)ret == length;
}
+bool HWStubDevice::WriteMem(soc_addr_t addr, size_t length, void *buffer)
+{
+ if(!m_hwdev)
+ return false;
+ int ret = hwstub_rw_mem(m_hwdev, 0, addr, buffer, length);
+ return ret >= 0 && (size_t)ret == length;
+}
+
bool HWStubDevice::IsValid()
{
return m_valid;
@@ -243,6 +281,11 @@ bool HWStubIoBackend::ReadRegister(soc_addr_t addr, soc_word_t& value)
return m_dev->ReadMem(addr, sizeof(value), &value);
}
+bool HWStubIoBackend:: WriteRegister(soc_addr_t addr, soc_word_t value)
+{
+ return m_dev->WriteMem(addr, sizeof(value), &value);
+}
+
bool HWStubIoBackend::Reload()
{
return true;