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.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.cpp | 65 |
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 | ||
210 | void RegTab::DisplayRegister(soc_dev_t& dev, soc_dev_addr_t& dev_addr, | 238 | 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, | |||
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 | ||
380 | void 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 | |||
397 | void 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 | |||
351 | void RegTab::FillDevSubTree(RegTreeItem *item) | 410 | void 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()]; |