diff options
author | Amaury Pouly <amaury.pouly@gmail.com> | 2014-02-09 02:13:53 +0100 |
---|---|---|
committer | Amaury Pouly <amaury.pouly@gmail.com> | 2014-02-10 23:14:26 +0100 |
commit | 3d07706c05c46878533f55f26bbe02d7904efd75 (patch) | |
tree | f1b549c275f7a27f9e7038e5fc4eccb94bf8be45 /utils/regtools/qeditor/backend.cpp | |
parent | 8358707d8276dd297655395b922560e3c65631e1 (diff) | |
download | rockbox-3d07706c05c46878533f55f26bbe02d7904efd75.tar.gz rockbox-3d07706c05c46878533f55f26bbe02d7904efd75.zip |
regtools/qeditor: rewrite soc handling
The code was a mess with respect to soc handling: some code just plain copied
the SoC descriptor which are big objects, some was using indexes. The new soc
factor out everything in a few classes which hide these ugly details so that
descriptors are never copied.
Change-Id: I17af8b47f997a528b58221621389d42d24fded93
Diffstat (limited to 'utils/regtools/qeditor/backend.cpp')
-rw-r--r-- | utils/regtools/qeditor/backend.cpp | 73 |
1 files changed, 35 insertions, 38 deletions
diff --git a/utils/regtools/qeditor/backend.cpp b/utils/regtools/qeditor/backend.cpp index 22210916b1..75c504a6f6 100644 --- a/utils/regtools/qeditor/backend.cpp +++ b/utils/regtools/qeditor/backend.cpp | |||
@@ -19,12 +19,12 @@ QStringList Backend::GetSocNameList() | |||
19 | return sl; | 19 | return sl; |
20 | } | 20 | } |
21 | 21 | ||
22 | bool Backend::GetSocByName(const QString& name, soc_t& s) | 22 | bool Backend::GetSocByName(const QString& name, SocRef& s) |
23 | { | 23 | { |
24 | for(std::list< soc_t >::iterator it = m_socs.begin(); it != m_socs.end(); ++it) | 24 | for(std::list< soc_t >::iterator it = m_socs.begin(); it != m_socs.end(); ++it) |
25 | if(it->name == name.toStdString()) | 25 | if(it->name == name.toStdString()) |
26 | { | 26 | { |
27 | s = *it; | 27 | s = SocRef(&(*it)); |
28 | return true; | 28 | return true; |
29 | } | 29 | } |
30 | return false; | 30 | return false; |
@@ -326,7 +326,7 @@ bool HWStubBackendHelper::HasHotPlugSupport() | |||
326 | * BackendHelper | 326 | * BackendHelper |
327 | */ | 327 | */ |
328 | 328 | ||
329 | BackendHelper::BackendHelper(IoBackend *io_backend, const soc_t& soc) | 329 | BackendHelper::BackendHelper(IoBackend *io_backend, const SocRef& soc) |
330 | :m_io_backend(io_backend), m_soc(soc) | 330 | :m_io_backend(io_backend), m_soc(soc) |
331 | { | 331 | { |
332 | } | 332 | } |
@@ -345,75 +345,72 @@ bool BackendHelper::ReadRegister(const QString& dev, const QString& reg, soc_wor | |||
345 | } | 345 | } |
346 | 346 | ||
347 | 347 | ||
348 | bool BackendHelper::GetDeviceDesc(const QString& dev, soc_dev_t& dev_desc, size_t& index) | 348 | bool BackendHelper::GetDevRef(const QString& sdev, SocDevRef& ref) |
349 | { | 349 | { |
350 | for(size_t i = 0; i < m_soc.dev.size(); i++) | 350 | for(size_t i = 0; i < m_soc.GetSoc().dev.size(); i++) |
351 | { | 351 | { |
352 | for(size_t j = 0; j < m_soc.dev[i].addr.size(); j++) | 352 | const soc_dev_t& dev = m_soc.GetSoc().dev[i]; |
353 | if(m_soc.dev[i].addr[j].name.c_str() == dev) | 353 | for(size_t j = 0; j < dev.addr.size(); j++) |
354 | if(dev.addr[j].name.c_str() == sdev) | ||
354 | { | 355 | { |
355 | dev_desc = m_soc.dev[i]; | 356 | ref = SocDevRef(m_soc, i, j); |
356 | index = j; | ||
357 | return true; | 357 | return true; |
358 | } | 358 | } |
359 | } | 359 | } |
360 | return false; | 360 | return false; |
361 | } | 361 | } |
362 | 362 | ||
363 | bool BackendHelper::GetRegisterDesc(const soc_dev_t& dev, const QString& reg, | 363 | bool BackendHelper::GetRegRef(const SocDevRef& dev, const QString& sreg, SocRegRef& ref) |
364 | soc_reg_t& reg_desc, size_t& index) | ||
365 | { | 364 | { |
366 | for(size_t i = 0; i < dev.reg.size(); i++) | 365 | const soc_dev_t& sdev = dev.GetDev(); |
366 | for(size_t i = 0; i < sdev.reg.size(); i++) | ||
367 | { | 367 | { |
368 | for(size_t j = 0; j < dev.reg[i].addr.size(); j++) | 368 | const soc_reg_t& reg = sdev.reg[i]; |
369 | if(dev.reg[i].addr[j].name.c_str() == reg) | 369 | for(size_t j = 0; j < reg.addr.size(); j++) |
370 | { | ||
371 | if(reg.addr[j].name.c_str() == sreg) | ||
370 | { | 372 | { |
371 | index = j; | 373 | ref = SocRegRef(dev, i, j); |
372 | reg_desc = dev.reg[i]; | ||
373 | return true; | 374 | return true; |
374 | } | 375 | } |
376 | } | ||
375 | } | 377 | } |
376 | return false; | 378 | return false; |
377 | } | 379 | } |
378 | 380 | ||
379 | bool BackendHelper::GetFieldDesc(const soc_reg_t& reg_desc, const QString& field, | 381 | bool BackendHelper::GetFieldRef(const SocRegRef& reg, const QString& sfield, SocFieldRef& ref) |
380 | soc_reg_field_t& field_desc) | ||
381 | { | 382 | { |
382 | for(size_t i = 0; i < reg_desc.field.size(); i++) | 383 | for(size_t i = 0; i < reg.GetReg().field.size(); i++) |
383 | if(reg_desc.field[i].name.c_str() == field) | 384 | if(reg.GetReg().field[i].name.c_str() == sfield) |
384 | field_desc = reg_desc.field[i]; | 385 | { |
386 | ref = SocFieldRef(reg, i); | ||
387 | return true; | ||
388 | } | ||
385 | return false; | 389 | return false; |
386 | } | 390 | } |
387 | 391 | ||
388 | bool BackendHelper::GetRegisterAddress(const QString& dev, const QString& reg, | 392 | bool BackendHelper::GetRegisterAddress(const QString& dev, const QString& reg, |
389 | soc_addr_t& addr) | 393 | soc_addr_t& addr) |
390 | { | 394 | { |
391 | size_t dev_index, reg_index; | 395 | SocDevRef dev_ref; |
392 | soc_dev_t dev_desc; | 396 | SocRegRef reg_ref; |
393 | soc_reg_t reg_desc; | 397 | if(!GetDevRef(dev, dev_ref) || !GetRegRef(dev_ref, reg, reg_ref)) |
394 | if(!GetDeviceDesc(dev, dev_desc, dev_index)) | ||
395 | return false; | ||
396 | if(!GetRegisterDesc(dev_desc, reg, reg_desc, reg_index)) | ||
397 | return false; | 398 | return false; |
398 | addr = dev_desc.addr[dev_index].addr + reg_desc.addr[reg_index].addr; | 399 | addr = dev_ref.GetDevAddr().addr + reg_ref.GetRegAddr().addr; |
399 | return true; | 400 | return true; |
400 | } | 401 | } |
401 | 402 | ||
402 | bool BackendHelper::ReadRegisterField(const QString& dev, const QString& reg, | 403 | bool BackendHelper::ReadRegisterField(const QString& dev, const QString& reg, |
403 | const QString& field, soc_word_t& v) | 404 | const QString& field, soc_word_t& v) |
404 | { | 405 | { |
405 | size_t dev_index, reg_index; | 406 | SocDevRef dev_ref; |
406 | soc_dev_t dev_desc; | 407 | SocRegRef reg_ref; |
407 | soc_reg_t reg_desc; | 408 | SocFieldRef field_ref; |
408 | soc_reg_field_t field_desc; | 409 | if(!GetDevRef(dev, dev_ref) || !GetRegRef(dev_ref, reg, reg_ref) || |
409 | if(!GetDeviceDesc(dev, dev_desc, dev_index)) | 410 | !GetFieldRef(reg_ref, field, field_ref)) |
410 | return false; | ||
411 | if(!GetRegisterDesc(dev_desc, reg, reg_desc, reg_index)) | ||
412 | return false; | ||
413 | if(!GetFieldDesc(reg_desc, field, field_desc)) | ||
414 | return false; | 411 | return false; |
415 | if(!ReadRegister(dev, reg, v)) | 412 | if(!ReadRegister(dev, reg, v)) |
416 | return false; | 413 | return false; |
417 | v = (v & field_desc.bitmask()) >> field_desc.first_bit; | 414 | v = (v & field_ref.GetField().bitmask()) >> field_ref.GetField().first_bit; |
418 | return true; | 415 | return true; |
419 | } \ No newline at end of file | 416 | } \ No newline at end of file |