diff options
| author | Amaury Pouly <amaury.pouly@gmail.com> | 2014-02-04 00:18:51 +0100 |
|---|---|---|
| committer | Amaury Pouly <amaury.pouly@gmail.com> | 2014-02-10 23:14:25 +0100 |
| commit | 0e0c610df0d3d4044d0b21ddc1752a5dacd7f86e (patch) | |
| tree | aca4cf3c5dd86384ee8018d9049e2c3469d597ea /utils/regtools/qeditor/regtab.cpp | |
| parent | 81dfed27cf7ca1008b9cf21c084310eaeae082ac (diff) | |
| download | rockbox-0e0c610df0d3d4044d0b21ddc1752a5dacd7f86e.zip rockbox-0e0c610df0d3d4044d0b21ddc1752a5dacd7f86e.tar.gz rockbox-0e0c610df0d3d4044d0b21ddc1752a5dacd7f86e.tar.bz2 rockbox-0e0c610df0d3d4044d0b21ddc1752a5dacd7f86e.tar.xz | |
utils/regtools: make qeditor able to poke directly at a hwstub device
This commit add the very handy feature of being able to read registers
directly from a device using hwstub. This is mostly trivial using the hwstub
library and the biggest change here is actually:
- being able to read registers by name and/or addresses
- being able to enumerate devives
The UI code currently doesn't handle hotplug but the backend does so it should
be trivial to add in the future. It also opens up the possibility the write
registers from hwstub or save the register values to a file.
Since it relies on both hwstub and libusb, a switch has been introduced in
qmake to disable it (use -config nohwstub).
Change-Id: I5d7d7a2a7c97ecd7407227357c8553c2773ea6cc
Diffstat (limited to 'utils/regtools/qeditor/regtab.cpp')
| -rw-r--r-- | utils/regtools/qeditor/regtab.cpp | 65 |
1 files changed, 62 insertions, 3 deletions
diff --git a/utils/regtools/qeditor/regtab.cpp b/utils/regtools/qeditor/regtab.cpp index 4f7a73c..8f64bbf 100644 --- a/utils/regtools/qeditor/regtab.cpp +++ b/utils/regtools/qeditor/regtab.cpp @@ -13,6 +13,7 @@ #include <QTableWidget> #include <QHeaderView> #include <QFileDialog> +#include <QDebug> #include "backend.h" #include "analyser.h" @@ -65,6 +66,9 @@ RegTab::RegTab(Backend *backend, QTabWidget *parent) m_data_selector = new QComboBox; m_data_selector->addItem(QIcon::fromTheme("face-sad"), "None", QVariant(DataSelNothing)); m_data_selector->addItem(QIcon::fromTheme("document-open"), "File...", QVariant(DataSelFile)); +#ifdef HAVE_HWSTUB + m_data_selector->addItem(QIcon::fromTheme("multimedia-player"), "Device...", QVariant(DataSelDevice)); +#endif m_data_sel_edit = new QLineEdit; m_data_sel_edit->setReadOnly(true); m_data_soc_label = new QLabel; @@ -72,6 +76,10 @@ RegTab::RegTab(Backend *backend, QTabWidget *parent) data_sel_reload->setIcon(QIcon::fromTheme("view-refresh")); data_sel_layout->addWidget(m_data_selector); data_sel_layout->addWidget(m_data_sel_edit); +#ifdef HAVE_HWSTUB + m_dev_selector = new QComboBox; + data_sel_layout->addWidget(m_dev_selector, 1); +#endif data_sel_layout->addWidget(m_data_soc_label); data_sel_layout->addWidget(data_sel_reload); data_sel_group->setLayout(data_sel_layout); @@ -107,6 +115,10 @@ RegTab::RegTab(Backend *backend, QTabWidget *parent) this, SLOT(OnAnalyserChanged(QListWidgetItem *, QListWidgetItem *))); connect(m_analysers_list, SIGNAL(itemClicked(QListWidgetItem *)), this, SLOT(OnAnalyserClicked(QListWidgetItem *))); +#ifdef HAVE_HWSTUB + connect(m_dev_selector, SIGNAL(currentIndexChanged(int)), + this, SLOT(OnDevChanged(int))); +#endif OnSocListChanged(); OnDataSelChanged(DataSelNothing); @@ -141,6 +153,10 @@ void RegTab::OnDataSelChanged(int index) QVariant var = m_data_selector->itemData(index); if(var == DataSelFile) { + m_data_sel_edit->show(); +#ifdef HAVE_HWSTUB + m_dev_selector->hide(); +#endif QFileDialog *fd = new QFileDialog(m_data_selector); fd->setFilter("Textual files (*.txt);;All files (*)"); fd->setDirectory(Settings::Get()->value("regtab/loaddatadir", QDir::currentPath()).toString()); @@ -155,8 +171,20 @@ void RegTab::OnDataSelChanged(int index) } Settings::Get()->setValue("regtab/loaddatadir", fd->directory().absolutePath()); } +#ifdef HAVE_HWSTUB + else if(var == DataSelDevice) + { + m_data_sel_edit->hide(); + m_dev_selector->show(); + OnDevListChanged(); + } +#endif else { + m_data_sel_edit->show(); +#ifdef HAVE_HWSTUB + m_dev_selector->hide(); +#endif delete m_io_backend; m_io_backend = m_backend->CreateDummyIoBackend(); SetDataSocName(""); @@ -204,7 +232,7 @@ void RegTab::OnAnalyserClicked(QListWidgetItem *current) delete m_right_content; AnalyserFactory *ana = AnalyserFactory::GetAnalyserByName(current->text()); m_right_content = ana->Create(m_cur_soc, m_io_backend)->GetWidget(); - m_right_panel->addWidget(m_right_content); + m_right_panel->addWidget(m_right_content, 1); } void RegTab::DisplayRegister(soc_dev_t& dev, soc_dev_addr_t& dev_addr, @@ -256,8 +284,8 @@ void RegTab::DisplayRegister(soc_dev_t& dev, soc_dev_addr_t& dev_addr, top_layout->addStretch(); soc_word_t value; - bool has_value = m_io_backend->ReadRegister(QString().sprintf("HW.%s.%s", - dev_addr.name.c_str(), reg_addr.name.c_str()), value); + BackendHelper helper(m_io_backend, m_cur_soc); + bool has_value = helper.ReadRegister(dev_addr.name.c_str(), reg_addr.name.c_str(), value); QHBoxLayout *raw_val_layout = 0; if(has_value) @@ -348,6 +376,37 @@ void RegTab::OnSocListChanged() m_soc_selector->addItem(socs[i]); } +#ifdef HAVE_HWSTUB +void RegTab::OnDevListChanged() +{ + m_dev_selector->clear(); + QList< HWStubDevice* > list = m_hwstub_helper.GetDevList(); + foreach(HWStubDevice *dev, list) + { + QString name = QString("Bus %1 Device %2: %3").arg(dev->GetBusNumber()) + .arg(dev->GetDevAddress()).arg(dev->GetTargetInfo().bName); + m_dev_selector->addItem(QIcon::fromTheme("multimedia-player"), name, + QVariant::fromValue((void *)dev)); + } + if(list.size() > 0) + m_dev_selector->setCurrentIndex(0); + else + SetDataSocName(""); +} + +void RegTab::OnDevChanged(int index) +{ + if(index == -1) + return; + HWStubDevice *dev = reinterpret_cast< HWStubDevice* >(m_dev_selector->itemData(index).value< void* >()); + delete m_io_backend; + m_io_backend = m_backend->CreateHWStubIoBackend(dev); + SetDataSocName(m_io_backend->GetSocName()); + OnDataSocActivated(m_io_backend->GetSocName()); + OnDataChanged(); +} +#endif + void RegTab::FillDevSubTree(RegTreeItem *item) { soc_dev_t& sd = m_cur_soc.dev[item->GetDevIndex()]; |