diff options
author | Amaury Pouly <amaury.pouly@gmail.com> | 2016-02-06 15:08:43 +0000 |
---|---|---|
committer | Amaury Pouly <amaury.pouly@gmail.com> | 2016-02-06 15:20:48 +0000 |
commit | 6b9610fb908b27d1e0383c8d9bde3a88f35ed30c (patch) | |
tree | 1b0f5e2821b44d20f3704c584e309f5911357040 /utils/regtools/qeditor/backend.h | |
parent | 0f701a64bee43e79f95970ae9c0ec43ea7fcdf17 (diff) | |
download | rockbox-6b9610fb908b27d1e0383c8d9bde3a88f35ed30c.tar.gz rockbox-6b9610fb908b27d1e0383c8d9bde3a88f35ed30c.zip |
regtoosl/qeditor: port to the new description format
This big commit port qeditor from v1 to v2 register file format. Although
the display code was much simplified, the edit code had to be rewritten.
The new code also brings many improvement to the register display widget.
The new code also compiles with both Qt4 and Qt5, although it is recommended
to use Qt5 to get some improvements, especially in the layout of editor.
Change-Id: I24633ac37a144f25d9e705b565654269ec9cfbd3
Diffstat (limited to 'utils/regtools/qeditor/backend.h')
-rw-r--r-- | utils/regtools/qeditor/backend.h | 208 |
1 files changed, 73 insertions, 135 deletions
diff --git a/utils/regtools/qeditor/backend.h b/utils/regtools/qeditor/backend.h index 934c1c359b..17eeb44533 100644 --- a/utils/regtools/qeditor/backend.h +++ b/utils/regtools/qeditor/backend.h | |||
@@ -26,14 +26,17 @@ | |||
26 | #include <QMap> | 26 | #include <QMap> |
27 | #include <QVector> | 27 | #include <QVector> |
28 | #include <QMetaType> | 28 | #include <QMetaType> |
29 | #include <QAbstractItemModel> | ||
29 | #ifdef HAVE_HWSTUB | 30 | #ifdef HAVE_HWSTUB |
30 | #include "hwstub.h" | 31 | #include "hwstub.h" |
31 | #endif | 32 | #endif |
32 | #include "soc_desc_v1.hpp" | 33 | #include "soc_desc.hpp" |
33 | 34 | ||
34 | /* we don't want to import the entire soc_desc except for a few selected | 35 | /* we don't want to import the entire soc_desc except for a few selected |
35 | * pieces */ | 36 | * pieces */ |
36 | using namespace soc_desc_v1; | 37 | using soc_desc::soc_word_t; |
38 | using soc_desc::soc_addr_t; | ||
39 | using soc_desc::soc_id_t; | ||
37 | 40 | ||
38 | class IoBackend : public QObject | 41 | class IoBackend : public QObject |
39 | { | 42 | { |
@@ -47,35 +50,20 @@ public: | |||
47 | Write, Set, Clear, Toggle | 50 | Write, Set, Clear, Toggle |
48 | }; | 51 | }; |
49 | 52 | ||
50 | enum AccessType | ||
51 | { | ||
52 | ByName, | ||
53 | ByAddress, | ||
54 | }; | ||
55 | |||
56 | /** Register naming convention: name based access are of the form: | ||
57 | * HW.dev.reg | ||
58 | * where <dev> is the device name (including index like APPUART1) | ||
59 | * and <reg> is the register name (including index like PRIORITY29) */ | ||
60 | /* report whether backend is valid */ | 53 | /* report whether backend is valid */ |
61 | virtual bool IsValid() = 0; | 54 | virtual bool IsValid() = 0; |
62 | /* report whether backend supports register access type */ | ||
63 | virtual bool SupportAccess(AccessType type) = 0; | ||
64 | /* get SoC name */ | 55 | /* get SoC name */ |
65 | virtual QString GetSocName() = 0; | 56 | virtual QString GetSocName() = 0; |
66 | /* read a register by name or address */ | 57 | /* read a register */ |
67 | virtual bool ReadRegister(const QString& name, soc_word_t& value) = 0; | 58 | virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value, unsigned width) = 0; |
68 | virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value) = 0; | ||
69 | /* reload content (if it makes sense) */ | 59 | /* reload content (if it makes sense) */ |
70 | virtual bool Reload() = 0; | 60 | virtual bool Reload() = 0; |
71 | /* check whether backend supports writing */ | 61 | /* check whether backend supports writing */ |
72 | virtual bool IsReadOnly() = 0; | 62 | virtual bool IsReadOnly() = 0; |
73 | /* write a register by name or address | 63 | /* write a register by name or address |
74 | * NOTE: even on a read-only backend, a write is allowed be successful as long | 64 | * NOTE: even on a read-only backend, a write is allowed to be successful as long |
75 | * as commit fails */ | 65 | * as commit fails */ |
76 | virtual bool WriteRegister(const QString& name, soc_word_t value, | 66 | virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, unsigned width, |
77 | WriteMode mode = Write) = 0; | ||
78 | virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, | ||
79 | WriteMode mode = Write) = 0; | 67 | WriteMode mode = Write) = 0; |
80 | /* check whether backend contains uncommitted (ie cached) writes */ | 68 | /* check whether backend contains uncommitted (ie cached) writes */ |
81 | virtual bool IsDirty() = 0; | 69 | virtual bool IsDirty() = 0; |
@@ -87,23 +75,17 @@ class DummyIoBackend : public IoBackend | |||
87 | { | 75 | { |
88 | Q_OBJECT | 76 | Q_OBJECT |
89 | public: | 77 | public: |
90 | DummyIoBackend() {} | 78 | DummyIoBackend(); |
91 | 79 | ||
92 | virtual bool IsValid() { return false; } | 80 | virtual bool IsValid(); |
93 | virtual bool SupportAccess(AccessType type) { Q_UNUSED(type); return false; } | 81 | virtual QString GetSocName(); |
94 | virtual QString GetSocName() { return ""; } | 82 | virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value, unsigned width); |
95 | virtual bool ReadRegister(const QString& name, soc_word_t& value) | 83 | virtual bool Reload(); |
96 | { Q_UNUSED(name); Q_UNUSED(value); return false; } | 84 | virtual bool IsReadOnly(); |
97 | virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value) | 85 | virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, unsigned width, |
98 | { Q_UNUSED(addr); Q_UNUSED(value); return false; } | 86 | WriteMode mode); |
99 | virtual bool Reload() { return false; } | 87 | virtual bool IsDirty(); |
100 | virtual bool IsReadOnly() { return true; } | 88 | virtual bool Commit(); |
101 | virtual bool WriteRegister(const QString& name, soc_word_t value, WriteMode mode) | ||
102 | { Q_UNUSED(name); Q_UNUSED(value); Q_UNUSED(mode); return false; } | ||
103 | virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, WriteMode mode) | ||
104 | { Q_UNUSED(addr); Q_UNUSED(value); Q_UNUSED(mode); return false; } | ||
105 | virtual bool IsDirty() { return false; } | ||
106 | virtual bool Commit() { return false; } | ||
107 | }; | 89 | }; |
108 | 90 | ||
109 | /** The RAM backend doesn't have any backend storage and stores all values in | 91 | /** The RAM backend doesn't have any backend storage and stores all values in |
@@ -114,26 +96,22 @@ class RamIoBackend : public IoBackend | |||
114 | public: | 96 | public: |
115 | RamIoBackend(const QString& soc_name = ""); | 97 | RamIoBackend(const QString& soc_name = ""); |
116 | 98 | ||
117 | virtual bool IsValid() { return m_soc != ""; } | 99 | virtual bool IsValid(); |
118 | virtual bool SupportAccess(AccessType type) { return type == ByName; } | 100 | virtual QString GetSocName(); |
119 | virtual QString GetSocName() { return m_soc; } | 101 | virtual void SetSocName(const QString& soc_name); |
120 | virtual void SetSocName(const QString& soc_name) { m_soc = soc_name; } | 102 | virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value, unsigned width); |
121 | virtual bool ReadRegister(const QString& name, soc_word_t& value); | 103 | virtual bool Reload(); |
122 | virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value) | 104 | virtual bool IsReadOnly(); |
123 | { Q_UNUSED(addr); Q_UNUSED(value); return false; } | 105 | virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, unsigned width, |
124 | virtual bool Reload() { return false; } | 106 | WriteMode mode); |
125 | virtual bool IsReadOnly() { return false; } | 107 | virtual bool IsDirty(); |
126 | virtual bool WriteRegister(const QString& name, soc_word_t value, WriteMode mode); | 108 | virtual bool Commit(); |
127 | virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, WriteMode mode) | ||
128 | { Q_UNUSED(addr); Q_UNUSED(value); Q_UNUSED(mode); return false; } | ||
129 | virtual bool IsDirty() { return false; } | ||
130 | virtual bool Commit() { return false; } | ||
131 | /* clear all entries of the backend */ | 109 | /* clear all entries of the backend */ |
132 | virtual void DeleteAll(); | 110 | virtual void DeleteAll(); |
133 | 111 | ||
134 | protected: | 112 | protected: |
135 | QString m_soc; | 113 | QString m_soc; |
136 | QMap< QString, soc_word_t > m_map; | 114 | QMap< soc_addr_t, soc_word_t > m_map; |
137 | }; | 115 | }; |
138 | 116 | ||
139 | /** NOTE the File backend makes a difference between writes and commits: | 117 | /** NOTE the File backend makes a difference between writes and commits: |
@@ -144,14 +122,14 @@ class FileIoBackend : public RamIoBackend | |||
144 | public: | 122 | public: |
145 | FileIoBackend(const QString& filename, const QString& soc_name = ""); | 123 | FileIoBackend(const QString& filename, const QString& soc_name = ""); |
146 | 124 | ||
147 | virtual bool IsValid() { return m_valid; } | 125 | virtual bool IsValid(); |
148 | virtual bool SupportAccess(AccessType type) { return type == ByName; } | ||
149 | virtual bool Reload(); | 126 | virtual bool Reload(); |
150 | virtual bool IsReadOnly() { return m_readonly; } | 127 | virtual bool IsReadOnly(); |
151 | virtual bool WriteRegister(const QString& name, soc_word_t value, WriteMode mode); | 128 | virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, unsigned width, |
152 | virtual bool IsDirty() { return m_dirty; } | 129 | WriteMode mode); |
130 | virtual bool IsDirty(); | ||
153 | virtual bool Commit(); | 131 | virtual bool Commit(); |
154 | QString GetFileName() { return m_filename; } | 132 | QString GetFileName(); |
155 | 133 | ||
156 | protected: | 134 | protected: |
157 | QString m_filename; | 135 | QString m_filename; |
@@ -204,20 +182,16 @@ public: | |||
204 | HWStubIoBackend(HWStubDevice *dev); | 182 | HWStubIoBackend(HWStubDevice *dev); |
205 | virtual ~HWStubIoBackend(); | 183 | virtual ~HWStubIoBackend(); |
206 | 184 | ||
207 | virtual bool IsValid() { return m_dev->IsValid(); } | 185 | virtual bool IsValid(); |
208 | virtual bool SupportAccess(AccessType type) { return type == ByAddress; } | ||
209 | virtual QString GetSocName(); | 186 | virtual QString GetSocName(); |
210 | virtual bool ReadRegister(const QString& name, soc_word_t& value) | 187 | virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value, unsigned width); |
211 | { Q_UNUSED(name); Q_UNUSED(value); return false; } | ||
212 | virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value); | ||
213 | virtual bool Reload(); | 188 | virtual bool Reload(); |
214 | virtual bool IsReadOnly() { return false; } | 189 | virtual bool IsReadOnly(); |
215 | virtual bool WriteRegister(const QString& name, soc_word_t value, WriteMode mode) | 190 | virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, unsigned width, |
216 | { Q_UNUSED(name); Q_UNUSED(value); Q_UNUSED(mode); return false; } | 191 | WriteMode mode); |
217 | virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, WriteMode mode); | 192 | virtual bool IsDirty(); |
218 | virtual bool IsDirty() { return false; } | 193 | virtual bool Commit(); |
219 | virtual bool Commit() { return true; } | 194 | HWStubDevice *GetDevice(); |
220 | HWStubDevice *GetDevice() { return m_dev; } | ||
221 | 195 | ||
222 | protected: | 196 | protected: |
223 | QString m_soc; | 197 | QString m_soc; |
@@ -251,8 +225,6 @@ protected: | |||
251 | }; | 225 | }; |
252 | #endif | 226 | #endif |
253 | 227 | ||
254 | class SocRef; | ||
255 | |||
256 | class SocFile | 228 | class SocFile |
257 | { | 229 | { |
258 | public: | 230 | public: |
@@ -260,14 +232,14 @@ public: | |||
260 | SocFile(const QString& filename); | 232 | SocFile(const QString& filename); |
261 | bool IsValid(); | 233 | bool IsValid(); |
262 | 234 | ||
263 | SocRef GetSocRef(); | 235 | soc_desc::soc_ref_t GetSocRef(); |
264 | QString GetFilename(); | 236 | QString GetFilename(); |
265 | soc_t& GetSoc() { return m_soc; } | 237 | soc_desc::soc_t& GetSoc() { return m_soc; } |
266 | 238 | ||
267 | protected: | 239 | protected: |
268 | bool m_valid; | 240 | bool m_valid; |
269 | QString m_filename; | 241 | QString m_filename; |
270 | soc_t m_soc; | 242 | soc_desc::soc_t m_soc; |
271 | }; | 243 | }; |
272 | 244 | ||
273 | class SocFileRef | 245 | class SocFileRef |
@@ -283,56 +255,17 @@ protected: | |||
283 | 255 | ||
284 | Q_DECLARE_METATYPE(SocFileRef) | 256 | Q_DECLARE_METATYPE(SocFileRef) |
285 | 257 | ||
286 | class SocRef : public SocFileRef | 258 | Q_DECLARE_METATYPE(soc_desc::instance_t::type_t) |
287 | { | 259 | Q_DECLARE_METATYPE(soc_desc::range_t::type_t) |
288 | public: | ||
289 | SocRef() {} | ||
290 | SocRef(SocFile *file):SocFileRef(file) {} | ||
291 | soc_t& GetSoc() const { return GetSocFile()->GetSoc(); } | ||
292 | }; | ||
293 | |||
294 | Q_DECLARE_METATYPE(SocRef) | ||
295 | 260 | ||
296 | class SocDevRef : public SocRef | 261 | Q_DECLARE_METATYPE(soc_desc::soc_ref_t) |
297 | { | 262 | Q_DECLARE_METATYPE(soc_desc::node_ref_t) |
298 | public: | 263 | Q_DECLARE_METATYPE(soc_desc::register_ref_t) |
299 | SocDevRef() {} | 264 | Q_DECLARE_METATYPE(soc_desc::field_ref_t) |
300 | SocDevRef(const SocRef& soc, int dev_idx, int dev_addr_idx) | 265 | Q_DECLARE_METATYPE(soc_desc::node_inst_t) |
301 | :SocRef(soc), m_dev_idx(dev_idx), m_dev_addr_idx(dev_addr_idx) {} | ||
302 | int GetDevIndex() const { return m_dev_idx; } | ||
303 | soc_dev_t& GetDev() const { return GetSoc().dev[GetDevIndex()]; } | ||
304 | int GetDevAddrIndex() const { return m_dev_addr_idx; } | ||
305 | soc_dev_addr_t& GetDevAddr() const { return GetDev().addr[GetDevAddrIndex()]; } | ||
306 | protected: | ||
307 | int m_dev_idx, m_dev_addr_idx; | ||
308 | }; | ||
309 | |||
310 | class SocRegRef : public SocDevRef | ||
311 | { | ||
312 | public: | ||
313 | SocRegRef() {} | ||
314 | SocRegRef(const SocDevRef& dev, int reg_idx, int reg_addr_idx) | ||
315 | :SocDevRef(dev), m_reg_idx(reg_idx), m_reg_addr_idx(reg_addr_idx) {} | ||
316 | int GetRegIndex() const { return m_reg_idx; } | ||
317 | soc_reg_t& GetReg() const { return GetDev().reg[GetRegIndex()]; } | ||
318 | int GetRegAddrIndex() const { return m_reg_addr_idx; } | ||
319 | soc_reg_addr_t& GetRegAddr() const { return GetReg().addr[GetRegAddrIndex()]; } | ||
320 | protected: | ||
321 | int m_reg_idx, m_reg_addr_idx; | ||
322 | }; | ||
323 | |||
324 | class SocFieldRef : public SocRegRef | ||
325 | { | ||
326 | public: | ||
327 | SocFieldRef(){} | ||
328 | SocFieldRef(const SocRegRef& reg, int field_idx) | ||
329 | :SocRegRef(reg), m_field_idx(field_idx) {} | ||
330 | int GetFieldIndex() const { return m_field_idx; } | ||
331 | soc_reg_field_t& GetField() const { return GetReg().field[GetFieldIndex()]; } | ||
332 | protected: | ||
333 | int m_field_idx; | ||
334 | }; | ||
335 | 266 | ||
267 | /** NOTE the Backend stores soc descriptions in a way that pointers are never | ||
268 | * invalidated */ | ||
336 | class Backend : public QObject | 269 | class Backend : public QObject |
337 | { | 270 | { |
338 | Q_OBJECT | 271 | Q_OBJECT |
@@ -340,7 +273,7 @@ public: | |||
340 | Backend(); | 273 | Backend(); |
341 | 274 | ||
342 | QList< SocFileRef > GetSocFileList(); | 275 | QList< SocFileRef > GetSocFileList(); |
343 | QList< SocRef > GetSocList(); | 276 | QList< soc_desc::soc_ref_t > GetSocList(); |
344 | bool LoadSocDesc(const QString& filename); | 277 | bool LoadSocDesc(const QString& filename); |
345 | IoBackend *CreateDummyIoBackend(); | 278 | IoBackend *CreateDummyIoBackend(); |
346 | IoBackend *CreateFileIoBackend(const QString& filename); | 279 | IoBackend *CreateFileIoBackend(const QString& filename); |
@@ -349,33 +282,38 @@ public: | |||
349 | #endif | 282 | #endif |
350 | 283 | ||
351 | signals: | 284 | signals: |
352 | void OnSocListChanged(); | 285 | void OnSocAdded(const SocFileRef& ref); |
286 | |||
353 | private: | 287 | private: |
288 | /* store them as a list so that pointers are never invalidated */ | ||
354 | std::list< SocFile > m_socs; | 289 | std::list< SocFile > m_socs; |
355 | }; | 290 | }; |
356 | 291 | ||
357 | class BackendHelper | 292 | class BackendHelper |
358 | { | 293 | { |
359 | public: | 294 | public: |
360 | BackendHelper(IoBackend *io_backend, const SocRef& soc); | 295 | BackendHelper(IoBackend *io_backend, const soc_desc::soc_ref_t& soc); |
361 | bool ReadRegister(const QString& dev, const QString& reg, soc_word_t& v); | 296 | QString GetPath(const soc_desc::node_inst_t& inst); |
362 | bool ReadRegisterField(const QString& dev, const QString& reg, | 297 | soc_desc::node_inst_t ParsePath(const QString& path); |
298 | bool ReadRegister(const soc_desc::node_inst_t& inst, soc_word_t& v); | ||
299 | bool ReadRegisterField(const soc_desc::node_inst_t& inst, | ||
363 | const QString& field, soc_word_t& v); | 300 | const QString& field, soc_word_t& v); |
364 | bool WriteRegister(const QString& dev, const QString& reg, soc_word_t v, | 301 | bool WriteRegister(const soc_desc::node_inst_t& inst, soc_word_t v, |
365 | IoBackend::WriteMode mode = IoBackend::Write); | 302 | IoBackend::WriteMode mode = IoBackend::Write); |
366 | bool GetDevRef(const QString& dev, SocDevRef& ref); | 303 | bool GetRegisterAddress(const soc_desc::node_inst_t& inst, soc_addr_t& addr); |
367 | bool GetRegRef(const SocDevRef& dev, const QString& reg, SocRegRef& ref); | ||
368 | bool GetFieldRef(const SocRegRef& reg, const QString& field, SocFieldRef& ref); | ||
369 | bool GetRegisterAddress(const QString& dev, const QString& reg, soc_addr_t& addr); | ||
370 | /* NOTE: does not commit writes to the backend | 304 | /* NOTE: does not commit writes to the backend |
371 | * if ignore_errors is true, the dump will continue even on errors, and the | 305 | * if ignore_errors is true, the dump will continue even on errors, and the |
372 | * function will return false if one or more errors occured */ | 306 | * function will return false if one or more errors occured */ |
373 | bool DumpAllRegisters(IoBackend *backend, bool ignore_errors = true); | 307 | bool DumpAllRegisters(IoBackend *backend, bool ignore_errors = true); |
374 | bool DumpAllRegisters(const QString& filename, bool ignore_errors = true); | 308 | bool DumpAllRegisters(const QString& filename, bool ignore_errors = true); |
375 | 309 | ||
310 | protected: | ||
311 | bool DumpAllRegisters(BackendHelper *bh, const soc_desc::node_inst_t& inst, | ||
312 | bool ignore_errors); | ||
313 | |||
376 | private: | 314 | private: |
377 | IoBackend *m_io_backend; | 315 | IoBackend *m_io_backend; |
378 | const SocRef& m_soc; | 316 | const soc_desc::soc_ref_t& m_soc; |
379 | }; | 317 | }; |
380 | 318 | ||
381 | #endif /* __BACKEND_H__ */ | 319 | #endif /* __BACKEND_H__ */ |