summaryrefslogtreecommitdiff
path: root/utils/regtools/qeditor/regtab.cpp
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2014-02-04 00:18:51 +0100
committerAmaury Pouly <amaury.pouly@gmail.com>2014-02-10 23:14:25 +0100
commit0e0c610df0d3d4044d0b21ddc1752a5dacd7f86e (patch)
treeaca4cf3c5dd86384ee8018d9049e2c3469d597ea /utils/regtools/qeditor/regtab.cpp
parent81dfed27cf7ca1008b9cf21c084310eaeae082ac (diff)
downloadrockbox-0e0c610df0d3d4044d0b21ddc1752a5dacd7f86e.tar.gz
rockbox-0e0c610df0d3d4044d0b21ddc1752a5dacd7f86e.zip
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.cpp65
1 files changed, 62 insertions, 3 deletions
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 @@
13#include <QTableWidget> 13#include <QTableWidget>
14#include <QHeaderView> 14#include <QHeaderView>
15#include <QFileDialog> 15#include <QFileDialog>
16#include <QDebug>
16#include "backend.h" 17#include "backend.h"
17#include "analyser.h" 18#include "analyser.h"
18 19
@@ -65,6 +66,9 @@ RegTab::RegTab(Backend *backend, QTabWidget *parent)
65 m_data_selector = new QComboBox; 66 m_data_selector = new QComboBox;
66 m_data_selector->addItem(QIcon::fromTheme("face-sad"), "None", QVariant(DataSelNothing)); 67 m_data_selector->addItem(QIcon::fromTheme("face-sad"), "None", QVariant(DataSelNothing));
67 m_data_selector->addItem(QIcon::fromTheme("document-open"), "File...", QVariant(DataSelFile)); 68 m_data_selector->addItem(QIcon::fromTheme("document-open"), "File...", QVariant(DataSelFile));
69#ifdef HAVE_HWSTUB
70 m_data_selector->addItem(QIcon::fromTheme("multimedia-player"), "Device...", QVariant(DataSelDevice));
71#endif
68 m_data_sel_edit = new QLineEdit; 72 m_data_sel_edit = new QLineEdit;
69 m_data_sel_edit->setReadOnly(true); 73 m_data_sel_edit->setReadOnly(true);
70 m_data_soc_label = new QLabel; 74 m_data_soc_label = new QLabel;
@@ -72,6 +76,10 @@ RegTab::RegTab(Backend *backend, QTabWidget *parent)
72 data_sel_reload->setIcon(QIcon::fromTheme("view-refresh")); 76 data_sel_reload->setIcon(QIcon::fromTheme("view-refresh"));
73 data_sel_layout->addWidget(m_data_selector); 77 data_sel_layout->addWidget(m_data_selector);
74 data_sel_layout->addWidget(m_data_sel_edit); 78 data_sel_layout->addWidget(m_data_sel_edit);
79#ifdef HAVE_HWSTUB
80 m_dev_selector = new QComboBox;
81 data_sel_layout->addWidget(m_dev_selector, 1);
82#endif
75 data_sel_layout->addWidget(m_data_soc_label); 83 data_sel_layout->addWidget(m_data_soc_label);
76 data_sel_layout->addWidget(data_sel_reload); 84 data_sel_layout->addWidget(data_sel_reload);
77 data_sel_group->setLayout(data_sel_layout); 85 data_sel_group->setLayout(data_sel_layout);
@@ -107,6 +115,10 @@ RegTab::RegTab(Backend *backend, QTabWidget *parent)
107 this, SLOT(OnAnalyserChanged(QListWidgetItem *, QListWidgetItem *))); 115 this, SLOT(OnAnalyserChanged(QListWidgetItem *, QListWidgetItem *)));
108 connect(m_analysers_list, SIGNAL(itemClicked(QListWidgetItem *)), this, 116 connect(m_analysers_list, SIGNAL(itemClicked(QListWidgetItem *)), this,
109 SLOT(OnAnalyserClicked(QListWidgetItem *))); 117 SLOT(OnAnalyserClicked(QListWidgetItem *)));
118#ifdef HAVE_HWSTUB
119 connect(m_dev_selector, SIGNAL(currentIndexChanged(int)),
120 this, SLOT(OnDevChanged(int)));
121#endif
110 122
111 OnSocListChanged(); 123 OnSocListChanged();
112 OnDataSelChanged(DataSelNothing); 124 OnDataSelChanged(DataSelNothing);
@@ -141,6 +153,10 @@ void RegTab::OnDataSelChanged(int index)
141 QVariant var = m_data_selector->itemData(index); 153 QVariant var = m_data_selector->itemData(index);
142 if(var == DataSelFile) 154 if(var == DataSelFile)
143 { 155 {
156 m_data_sel_edit->show();
157#ifdef HAVE_HWSTUB
158 m_dev_selector->hide();
159#endif
144 QFileDialog *fd = new QFileDialog(m_data_selector); 160 QFileDialog *fd = new QFileDialog(m_data_selector);
145 fd->setFilter("Textual files (*.txt);;All files (*)"); 161 fd->setFilter("Textual files (*.txt);;All files (*)");
146 fd->setDirectory(Settings::Get()->value("regtab/loaddatadir", QDir::currentPath()).toString()); 162 fd->setDirectory(Settings::Get()->value("regtab/loaddatadir", QDir::currentPath()).toString());
@@ -155,8 +171,20 @@ void RegTab::OnDataSelChanged(int index)
155 } 171 }
156 Settings::Get()->setValue("regtab/loaddatadir", fd->directory().absolutePath()); 172 Settings::Get()->setValue("regtab/loaddatadir", fd->directory().absolutePath());
157 } 173 }
174#ifdef HAVE_HWSTUB
175 else if(var == DataSelDevice)
176 {
177 m_data_sel_edit->hide();
178 m_dev_selector->show();
179 OnDevListChanged();
180 }
181#endif
158 else 182 else
159 { 183 {
184 m_data_sel_edit->show();
185#ifdef HAVE_HWSTUB
186 m_dev_selector->hide();
187#endif
160 delete m_io_backend; 188 delete m_io_backend;
161 m_io_backend = m_backend->CreateDummyIoBackend(); 189 m_io_backend = m_backend->CreateDummyIoBackend();
162 SetDataSocName(""); 190 SetDataSocName("");
@@ -204,7 +232,7 @@ void RegTab::OnAnalyserClicked(QListWidgetItem *current)
204 delete m_right_content; 232 delete m_right_content;
205 AnalyserFactory *ana = AnalyserFactory::GetAnalyserByName(current->text()); 233 AnalyserFactory *ana = AnalyserFactory::GetAnalyserByName(current->text());
206 m_right_content = ana->Create(m_cur_soc, m_io_backend)->GetWidget(); 234 m_right_content = ana->Create(m_cur_soc, m_io_backend)->GetWidget();
207 m_right_panel->addWidget(m_right_content); 235 m_right_panel->addWidget(m_right_content, 1);
208} 236}
209 237
210void RegTab::DisplayRegister(soc_dev_t& dev, soc_dev_addr_t& dev_addr, 238void 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,
256 top_layout->addStretch(); 284 top_layout->addStretch();
257 285
258 soc_word_t value; 286 soc_word_t value;
259 bool has_value = m_io_backend->ReadRegister(QString().sprintf("HW.%s.%s", 287 BackendHelper helper(m_io_backend, m_cur_soc);
260 dev_addr.name.c_str(), reg_addr.name.c_str()), value); 288 bool has_value = helper.ReadRegister(dev_addr.name.c_str(), reg_addr.name.c_str(), value);
261 289
262 QHBoxLayout *raw_val_layout = 0; 290 QHBoxLayout *raw_val_layout = 0;
263 if(has_value) 291 if(has_value)
@@ -348,6 +376,37 @@ void RegTab::OnSocListChanged()
348 m_soc_selector->addItem(socs[i]); 376 m_soc_selector->addItem(socs[i]);
349} 377}
350 378
379#ifdef HAVE_HWSTUB
380void RegTab::OnDevListChanged()
381{
382 m_dev_selector->clear();
383 QList< HWStubDevice* > list = m_hwstub_helper.GetDevList();
384 foreach(HWStubDevice *dev, list)
385 {
386 QString name = QString("Bus %1 Device %2: %3").arg(dev->GetBusNumber())
387 .arg(dev->GetDevAddress()).arg(dev->GetTargetInfo().bName);
388 m_dev_selector->addItem(QIcon::fromTheme("multimedia-player"), name,
389 QVariant::fromValue((void *)dev));
390 }
391 if(list.size() > 0)
392 m_dev_selector->setCurrentIndex(0);
393 else
394 SetDataSocName("");
395}
396
397void RegTab::OnDevChanged(int index)
398{
399 if(index == -1)
400 return;
401 HWStubDevice *dev = reinterpret_cast< HWStubDevice* >(m_dev_selector->itemData(index).value< void* >());
402 delete m_io_backend;
403 m_io_backend = m_backend->CreateHWStubIoBackend(dev);
404 SetDataSocName(m_io_backend->GetSocName());
405 OnDataSocActivated(m_io_backend->GetSocName());
406 OnDataChanged();
407}
408#endif
409
351void RegTab::FillDevSubTree(RegTreeItem *item) 410void RegTab::FillDevSubTree(RegTreeItem *item)
352{ 411{
353 soc_dev_t& sd = m_cur_soc.dev[item->GetDevIndex()]; 412 soc_dev_t& sd = m_cur_soc.dev[item->GetDevIndex()];