From 0e0c610df0d3d4044d0b21ddc1752a5dacd7f86e Mon Sep 17 00:00:00 2001 From: Amaury Pouly Date: Tue, 4 Feb 2014 00:18:51 +0100 Subject: 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 --- utils/regtools/qeditor/regtab.cpp | 65 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 62 insertions(+), 3 deletions(-) (limited to 'utils/regtools/qeditor/regtab.cpp') diff --git a/utils/regtools/qeditor/regtab.cpp b/utils/regtools/qeditor/regtab.cpp index 4f7a73cffc..8f64bbf48a 100644 --- a/utils/regtools/qeditor/regtab.cpp +++ b/utils/regtools/qeditor/regtab.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #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()]; -- cgit v1.2.3