summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2014-09-30 15:51:02 +0200
committerAmaury Pouly <amaury.pouly@gmail.com>2014-12-15 22:53:15 +0100
commit1bcc4fc67bb0aa7b7fab9f9a098f3b473ea1637f (patch)
tree39182d98d25016db3b98fac7c5c1817f19ff4aef
parent4a711fee423b00698313ac9c9a8df4f25696f8dd (diff)
downloadrockbox-1bcc4fc67bb0aa7b7fab9f9a098f3b473ea1637f.tar.gz
rockbox-1bcc4fc67bb0aa7b7fab9f9a098f3b473ea1637f.zip
qeditor: introduce a new "RAM" backend, and refactor file backend
Change-Id: Icfbbc01b83d3592041803387e35f5aa6fb0fa813 Reviewed-on: http://gerrit.rockbox.org/997 Reviewed-by: Amaury Pouly <amaury.pouly@gmail.com>
-rw-r--r--utils/regtools/qeditor/backend.cpp60
-rw-r--r--utils/regtools/qeditor/backend.h40
2 files changed, 69 insertions, 31 deletions
diff --git a/utils/regtools/qeditor/backend.cpp b/utils/regtools/qeditor/backend.cpp
index e47df8e3a4..c2db1f2a3e 100644
--- a/utils/regtools/qeditor/backend.cpp
+++ b/utils/regtools/qeditor/backend.cpp
@@ -107,23 +107,14 @@ IoBackend *Backend::CreateHWStubIoBackend(HWStubDevice *dev)
107#endif 107#endif
108 108
109/** 109/**
110 * FileIoBackend 110 * RamIoBackend
111 */ 111 */
112 112RamIoBackend::RamIoBackend(const QString& soc_name)
113FileIoBackend::FileIoBackend(const QString& filename, const QString& soc_name)
114{ 113{
115 m_filename = filename;
116 m_soc = soc_name; 114 m_soc = soc_name;
117 m_valid = false;
118 Reload();
119} 115}
120 116
121QString FileIoBackend::GetSocName() 117bool RamIoBackend::ReadRegister(const QString& name, soc_word_t& value)
122{
123 return m_soc;
124}
125
126bool FileIoBackend::ReadRegister(const QString& name, soc_word_t& value)
127{ 118{
128 if(m_map.find(name) == m_map.end()) 119 if(m_map.find(name) == m_map.end())
129 return false; 120 return false;
@@ -131,13 +122,45 @@ bool FileIoBackend::ReadRegister(const QString& name, soc_word_t& value)
131 return true; 122 return true;
132} 123}
133 124
125void RamIoBackend::DeleteAll()
126{
127 m_map.clear();
128}
129
130bool RamIoBackend::WriteRegister(const QString& name, soc_word_t value, WriteMode mode)
131{
132 switch(mode)
133 {
134 case Write: m_map[name] = value; return true;
135 case Set: m_map[name] |= value; return true;
136 case Clear: m_map[name] &= ~value; return true;
137 case Toggle: m_map[name] ^= value; return true;
138 default: return false;
139 }
140}
141
142
143
144/**
145 * FileIoBackend
146 */
147
148FileIoBackend::FileIoBackend(const QString& filename, const QString& soc_name)
149 :RamIoBackend(soc_name)
150{
151 m_filename = filename;
152 m_valid = false;
153 Reload();
154}
155
156
134bool FileIoBackend::Reload() 157bool FileIoBackend::Reload()
135{ 158{
136 m_valid = false; 159 m_valid = false;
137 QFile file(m_filename); 160 QFile file(m_filename);
138 if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) 161 if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
139 return false; 162 return false;
140 m_map.clear(); 163 DeleteAll();
141 164
142 QTextStream in(&file); 165 QTextStream in(&file);
143 while(!in.atEnd()) 166 while(!in.atEnd())
@@ -152,7 +175,7 @@ bool FileIoBackend::Reload()
152 if(key == "HW") 175 if(key == "HW")
153 m_soc = line.mid(idx + 1).trimmed(); 176 m_soc = line.mid(idx + 1).trimmed();
154 else if(ok) 177 else if(ok)
155 m_map[key] = val; 178 RamIoBackend::WriteRegister(key, val, Write);
156 } 179 }
157 180
158 m_readonly = !QFileInfo(file).isWritable(); 181 m_readonly = !QFileInfo(file).isWritable();
@@ -164,14 +187,7 @@ bool FileIoBackend::Reload()
164bool FileIoBackend::WriteRegister(const QString& name, soc_word_t value, WriteMode mode) 187bool FileIoBackend::WriteRegister(const QString& name, soc_word_t value, WriteMode mode)
165{ 188{
166 m_dirty = true; 189 m_dirty = true;
167 switch(mode) 190 return RamIoBackend::WriteRegister(name, value, mode);
168 {
169 case Write: m_map[name] = value; return true;
170 case Set: m_map[name] |= value; return true;
171 case Clear: m_map[name] &= ~value; return true;
172 case Toggle: m_map[name] ^= value; return true;
173 default: return false;
174 }
175} 191}
176 192
177bool FileIoBackend::Commit() 193bool FileIoBackend::Commit()
diff --git a/utils/regtools/qeditor/backend.h b/utils/regtools/qeditor/backend.h
index 2dba4e2b08..c8adbc474f 100644
--- a/utils/regtools/qeditor/backend.h
+++ b/utils/regtools/qeditor/backend.h
@@ -102,9 +102,39 @@ public:
102 virtual bool Commit() { return false; } 102 virtual bool Commit() { return false; }
103}; 103};
104 104
105/** The RAM backend doesn't have any backend storage and stores all values in
106 * an associative map */
107class RamIoBackend : public IoBackend
108{
109 Q_OBJECT
110public:
111 RamIoBackend(const QString& soc_name = "");
112
113 virtual bool IsValid() { return m_soc != ""; }
114 virtual bool SupportAccess(AccessType type) { return type == ByName; }
115 virtual QString GetSocName() { return m_soc; }
116 virtual void SetSocName(const QString& soc_name) { m_soc = soc_name; }
117 virtual bool ReadRegister(const QString& name, soc_word_t& value);
118 virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value)
119 { Q_UNUSED(addr); Q_UNUSED(value); return false; }
120 virtual bool Reload() { return false; }
121 virtual bool IsReadOnly() { return false; }
122 virtual bool WriteRegister(const QString& name, soc_word_t value, WriteMode mode);
123 virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, WriteMode mode)
124 { Q_UNUSED(addr); Q_UNUSED(value); Q_UNUSED(mode); return false; }
125 virtual bool IsDirty() { return false; }
126 virtual bool Commit() { return false; }
127 /* clear all entries of the backend */
128 virtual void DeleteAll();
129
130protected:
131 QString m_soc;
132 QMap< QString, soc_word_t > m_map;
133};
134
105/** NOTE the File backend makes a difference between writes and commits: 135/** NOTE the File backend makes a difference between writes and commits:
106 * a write will *never* touch the underlying file unless it was committed. */ 136 * a write will *never* touch the underlying file unless it was committed. */
107class FileIoBackend : public IoBackend 137class FileIoBackend : public RamIoBackend
108{ 138{
109 Q_OBJECT 139 Q_OBJECT
110public: 140public:
@@ -112,26 +142,18 @@ public:
112 142
113 virtual bool IsValid() { return m_valid; } 143 virtual bool IsValid() { return m_valid; }
114 virtual bool SupportAccess(AccessType type) { return type == ByName; } 144 virtual bool SupportAccess(AccessType type) { return type == ByName; }
115 virtual QString GetSocName();
116 virtual bool ReadRegister(const QString& name, soc_word_t& value);
117 virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value)
118 { Q_UNUSED(addr); Q_UNUSED(value); return false; }
119 virtual bool Reload(); 145 virtual bool Reload();
120 virtual bool IsReadOnly() { return m_readonly; } 146 virtual bool IsReadOnly() { return m_readonly; }
121 virtual bool WriteRegister(const QString& name, soc_word_t value, WriteMode mode); 147 virtual bool WriteRegister(const QString& name, soc_word_t value, WriteMode mode);
122 virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, WriteMode mode)
123 { Q_UNUSED(addr); Q_UNUSED(value); Q_UNUSED(mode); return false; }
124 virtual bool IsDirty() { return m_dirty; } 148 virtual bool IsDirty() { return m_dirty; }
125 virtual bool Commit(); 149 virtual bool Commit();
126 QString GetFileName() { return m_filename; } 150 QString GetFileName() { return m_filename; }
127 151
128protected: 152protected:
129 QString m_filename; 153 QString m_filename;
130 QString m_soc;
131 bool m_readonly; 154 bool m_readonly;
132 bool m_dirty; 155 bool m_dirty;
133 bool m_valid; 156 bool m_valid;
134 QMap< QString, soc_word_t > m_map;
135}; 157};
136 158
137#ifdef HAVE_HWSTUB 159#ifdef HAVE_HWSTUB